我正在檢測是否(不是何時)UIScrollView
正在滾動。檢測UIScrollView是否滾動
即
BOOL isScrolling = myscrollview.scrolling;
我怎麼會去實現呢?當使用setContentOffset:animated:
時,.dragging
和.decelerating
不適用。
我正在檢測是否(不是何時)UIScrollView
正在滾動。檢測UIScrollView是否滾動
即
BOOL isScrolling = myscrollview.scrolling;
我怎麼會去實現呢?當使用setContentOffset:animated:
時,.dragging
和.decelerating
不適用。
我通常通過在scrollViewWillBeginDragging:
和scrollViewDidEndDragging:willDecelerate:
事件中設置一個布爾變量來做到這一點。
這可能是做這件事的稍微狡猾的方式,但我已經在我的代碼使用它之前,也沒有讓我失望呢。 :)
#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子類。 :)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
使用標誌來保存當前滾動狀態? 它只能解決setContentOffset:animated:問題。 「滾動」只是一種效果,有很多方式可以使滾動視圖「滾動」,例如,連續設置內容偏移。所以這個問題應該沒有答案。
不是一個非常乾淨的解決方案..但應該是最可靠:
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
}
怎麼樣'scrollViewDidScroll'委託方法? – iDev
只回答「何時」。 – Jonny
有些複雜,但根據您需要這些信息的原因,您可以查看主運行循環的模式。例如,在沒有滾動視圖正在滾動或被拖動時,主運行循環可能會在'NSDefaultRunLoopMode'中。如果任何滾動視圖正在滾動/被拖動,則它將處於不同的模式,即'NSRunLoopCommonModes'的一部分。例如,如果你想等待滾動來結束做某件事,你可以使用'CFRunLoopPerformBlock(CFRunLoopGetMain(),kCFRunLoopDefaultMode,block);' – Guillaume