2017-09-28 28 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

相關問題