ページにいくつかのUIScrollView
があります。それらを個別にスクロールすることも、一緒にロックして1つのものとしてスクロールすることもできます。問題は、ロックされているときに発生します。
UIScrollViewDelegate
とscrollViewDidScroll:
を使用して動きを追跡します。変更したcontentOffset
のUIScrollView
を照会し、contentOffset
プロパティを一致するように設定して、他のスクロールビューへの変更を反映します。
素晴らしい....余分な呼び出しがたくさんあることに気づいたこと以外は。スクロールビューのcontentOffset
をプログラムで変更すると、デリゲートメソッドscrollViewDidScroll:
が呼び出されます。代わりにsetContentOffset:animated:
を使用しようとしましたが、デリゲートでトリガーを取得しています。
scrollViewDidScroll:
をトリガーしないようにcontentOffsetsをプログラムで変更するにはどうすればよいですか?
実装ノート...各UIScrollView
は、デリゲートパターンを使用して、さまざまなUIView
値の調整を処理する提示UIViewController
サブクラスにコールバックするカスタムcontentOffset
の一部です。
デリゲートコールバックをトリガーせずにUIScrollView
のコンテンツオフセットを変更することは可能ですscrollViewDidScroll:
、UIScrollView
の境界を設定し、Originを目的のコンテンツオフセットに設定します。
CGRect scrollBounds = scrollView.bounds;
scrollBounds.Origin = desiredContentOffset;
scrollView.bounds = scrollBounds;
試して
id scrollDelegate = scrollView.delegate;
scrollView.delegate = nil;
scrollView.contentOffset = point;
scrollView.delegate = scrollDelegate;
私のために働いた。
UIScrollViewの既存のプロパティの使用はどうですか?
if(scrollView.isTracking || scrollView.isDragging || scrollView.isDecelerating) {
//your code
}
@Tarkの答えを単純化すると、次のようにscrollViewDidScroll
を1行で起動せずにスクロールビューを配置できます。
scrollView.bounds.Origin = CGPoint(x:0, y:100); // whatever values you'd like
別のアプローチは、ScrollViewDidScrollデリゲートにロジックを追加して、コンテンツオフセットの変更がプログラムによってまたはユーザーのタッチによってトリガーされたかどうかを判断することです。
これは質問に対する直接的な答えではありませんが、そのようなメッセージを見せかけのように見えるものを得ている場合は、境界を変更しているためである可能性もあります。私はいくつかのAppleを使用して、スクロールビューへのサブビューを削除および追加する「tilePages」メソッドを使用します。私の場合、クラッシュを見つけるのは非常に不可能でした。
私がやったことは、メインキューでコールをキューイングすることでした:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if(scrollView == yourScrollView) {
// dispatch fixes some recursive call to scrollViewDidScroll in tilePages (related to removeFromSuperView)
// The reason can be found here: http://stackoverflow.com/questions/9418311
dispatch_async(dispatch_get_main_queue(), ^{ [self tilePages]; });
}
}