2012-12-10 14 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

ドラッグを使用していません...アニメーション – Jonny

+1

'setContentOffset:animated:'によって起動されたアニメーションが終了したときに呼び出される 'scrollViewDidEndScrollingAnimation:'を実装することもできます。 – Guillaume

+0

@Guillaume:私はそれをテストしましたアニメーションを使用すると機能します。 'setContentOffset'を呼び出すと同時に設定されるプロパティを使用していますか?または、スクロールが開始されたときにもう一度チェックする可能性はありますか?アニメーションを使わない可能性もありますか? – testing

12

これはそれを行うの少し危険な方法かもしれないが、私は前に私のコードでそれを使用しました、それはまだ私を失敗していません。 :)「self.contentOffset」に加え

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

UIScrollViewのオフセットは、それが低レベルのビットより便利なので、私は推測する(同様のUIViewの「bounds.origin」プロパティに格納されます。コード)。 [setContentOffset:animated:]を呼び出すと、それはUIScrollViewにCABasicAnimationとして渡され、「境界」プロパティを操作します。

このチェックは、scrollView自体の形状がアニメーション化されている場合にtrueを返します。この場合、アニメーション([CAAnimation toValue])から境界オブジェクトを実際に引き出し、手動で比較して「起点」自体が全く変化していないかどうかを確認する必要があります。

これは最も洗練された解決策ではありませんが、私は可能な限りデリゲートを使用する必要はありません。特に問題のクラスがUIScrollViewサブクラスである場合:)

+0

その答えTiMのおかげで、Appleのレビュープロセスに合格したかどうか分かりますか? – Randy

+1

心配なしランディ!うん!します。プライベートAPIには触れていません。私は2年以上App Storeにこのコードラインのアプリケーションを持っていました。 :) – 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 
} 
関連する問題