2017-09-28 26 views
0

我有一个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的方式?

+0

你想'banner.frame.size.height'为*至少* 64?还是应该缩小到零? – DonMag

+0

至少64(状态栏+导航栏) – sconewolf

+0

ok - 并且...如果在scrollview内容一直位于顶部时拉下来,所以'.contentOffset.y <0',横幅应该向下移动顶端?或者保持“固定”到顶部,并保持其原始大小? – DonMag

回答

1

滚动查看代表确实不是接收的每个单一点的通知,视图滚动。而你真的不希望这样......这将是太多的不必要的处理。

因此,当滚动速度非常快时,完全有可能出现大的间隙。事实上,在一个快速测试中,我只是将.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 

     } 

    } 

} 
+0

天才,非常感谢你。 – sconewolf

+0

很高兴帮助:) – DonMag

相关问题