- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 UIScrollView
和一个 UIView
header ,它贴在 ScrollView 的顶部,并在用户向下滚动时从全尺寸缩小到小尺寸。当然,这些都是通过 ScrollView 委托(delegate)实现的:
// scroll view delegate
extension SomeViewController {
// scroll view did scroll
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffsetY = scrollView.contentOffset.y
// make banner sticky
banner.frame.origin.y = max(0, contentOffsetY)
// shrink banner
if contentOffsetY > 0 && contentOffsetY <= bannerHeight! - 64 {
banner.frame.size.height = bannerHeight! - contentOffsetY
bannerGraphic.frame = banner.bounds
}
}
}
效果很好...如果用户不高速滚动。如果用户轻弹向下滚动(高速),代表似乎没有跟上,横幅永远不会完全缩小(可能缩小 85-90%)。为了验证这一点,我将 ScrollView 的偏移量打印到控制台,并注意到当用户缓慢滚动时,控制台可能会打印 100 行当前偏移量。当用户快速滚动时,控制台可能会打印 25 行当前偏移量。委托(delegate)根本跟不上高速滚动。
有没有一种方法可以确保无论滚动速度如何,横幅都会缩小,或者这只是 UIKit
的方式?
最佳答案
ScrollView Delegate 不会收到 View 滚动的每个点的通知。而且您真的不希望那样……这会造成太多不必要的处理。
因此,在快速滚动时完全有可能出现较大的间隙。事实上,在快速测试中,我刚刚将 .contentOffsetY
值从 0 跳到 75 再到 300...
您的代码很接近。您要做的是在您超过您的最大值时处理该情况。
试一试(我认为它只会插入并替换您的函数):
extension TestViewController: UIScrollViewDelegate {
// scroll view did scroll
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffsetY = scrollView.contentOffset.y
// make banner sticky
banner.frame.origin.y = max(0, contentOffsetY)
// if scrollView content is all the way at the top
// (or pulled down, waiting to "bounce back up")
if contentOffsetY <= 0 {
// set banner to original height
banner.frame.size.height = bannerHeight
bannerGraphic.frame = banner.bounds
} else {
// view has scrolled (user has dragged *up*)
// set banner height to originalHeight - y offset,
// but keep it a minimum of 64
banner.frame.size.height = max(bannerHeight! - contentOffsetY, 64)
bannerGraphic.frame = banner.bounds
}
}
}
关于ios - UIScrollViewDelegate scrollViewDidScroll 方法跟不上高速滚动(轻弹)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474503/
我有一个下拉菜单,我希望在下拉菜单打开和关闭时显示按比例缩小的动画。我有一个 CODEPEN here带有供您试验的代码。 我将它减慢到 10 秒的动画(显然不是最终速度)只是为了让你明白我的意思。这
我是一名优秀的程序员,十分优秀!