我有一个UIScrollView
,其中UIView
标题粘贴在滚动视图的顶部,并随着用户向下滚动而从全尺寸缩小为小尺寸。当然,这些都是通过滚动视图代理实现的:UIScrollViewDelegate scrollViewDidScroll方法跟不上高速滚动(轻弹)?
// 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%)。为了验证这一点,我将滚动视图的偏移量打印到控制台,并注意到当用户缓慢滚动时,控制台可能会打印100行当前偏移量。当用户快速滚动时,控制台可以打印25行当前偏移量。代表根本无法跟上高速滚动。
有没有办法确保横幅缩小,而不管滚动速度如何,或者这只是与UIKit
的方式?
你想'banner.frame.size.height'为*至少* 64?还是应该缩小到零? – DonMag
至少64(状态栏+导航栏) – sconewolf
ok - 并且...如果在scrollview内容一直位于顶部时拉下来,所以'.contentOffset.y <0',横幅应该向下移动顶端?或者保持“固定”到顶部,并保持其原始大小? – DonMag