2012-12-10 124 views
11

我正在檢測是否(不是何時)UIScrollView正在滾動。檢測UIScrollView是否滾動

BOOL isScrolling = myscrollview.scrolling; 

我怎麼會去實現呢?當使用setContentOffset:animated:時,.dragging.decelerating不適用。

+0

怎麼樣'scrollViewDidScroll'委託方法? – iDev

+0

只回答「何時」。 – Jonny

+1

有些複雜,但根據您需要這些信息的原因,您可以查看主運行循環的模式。例如,在沒有滾動視圖正在滾動或被拖動時,主運行循環可能會在'NSDefaultRunLoopMode'中。如果任何滾動視圖正在滾動/被拖動,則它將處於不同的模式,即'NSRunLoopCommonModes'的一部分。例如,如果你想等待滾動來結束做某件事,你可以使用'CFRunLoopPerformBlock(CFRunLoopGetMain(),kCFRunLoopDefaultMode,block);' – Guillaume

回答

6

我通常通過在scrollViewWillBeginDragging:scrollViewDidEndDragging:willDecelerate:事件中設置一個布爾變量來做到這一點。

UIScrollView Docs

+0

我沒有使用拖動...即使我想我仍然不會捕獲setContentOffset:animated – Jonny

+1

您還可以實現'scrollViewDidEndScrollingAnimation:',當'setContentOffset:animated:'發起的動畫結束時將調用... – Guillaume

+0

@Guillaume:我測試了它如果你使用動畫,它就可以工作。你是否使用同時調用'setContentOffset'設置的屬性?還是有另一種可能性來檢查滾動何時開始?還有沒有使用動畫的可能性? – testing

12

這可能是做這件事的稍微狡猾的方式,但我已經在我的代碼使用它之前,也沒有讓我失望呢。 :)

#import <QuartzCore/QuartzCore.h> 
--- 
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil; 

除了「self.contentOffset」一個UIScrollView的偏移存儲在了UIView的「bounds.origin」屬性,以及(我猜的,因爲它是在較低的水平,更方便一點碼)。當你調用[setContentOffset:animated:]時,它會把它作爲CABasicAnimation傳遞給UIScrollView,操作「bounds」屬性。

當然,如果scrollView本身的形狀是動畫,此檢查也會返回true。在這種情況下,您可能需要將邊界對象從動畫中拉出([CAAnimation toValue])並進行手動比較,以查看「原點」本身是否完全改變。

這不是最優雅的解決方案,但我喜歡能夠避免必須儘可能使用委託。特別是如果有問題的類是UIScrollView子類。 :)

+0

感謝您的回答TiM,您知道它是否通過了Apple的審覈流程嗎? – Randy

+1

不用擔心蘭迪!是的!它的確如此。它沒有觸及任何私人API。我已經在App Store中使用了這一行代碼超過2年的應用程序。 :) – TiM

0
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 

使用標誌來保存當前滾動狀態? 它只能解決setContentOffset:animated:問題。 「滾動」只是一種效果,有很多方式可以使滾動視圖「滾動」,例如,連續設置內容偏移。所以這個問題應該沒有答案。

1

不是一個非常乾淨的解決方案..但應該是最可靠:

var isScrolling = false 

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 
    isScrolling = true 
} 

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    if !decelerate { scrollViewDidEndScrolling(scrollView) } 
} 

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    scrollViewDidEndScrolling(scrollView) 
} 

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 
    scrollViewDidEndScrolling(scrollView) 
} 

func scrollViewDidEndScrolling(_ scrollView: UIScrollView) { 
    isScrolling = false 
}