3

次のデリゲート メソッド内でスクロールの contentOffset を変更しようとしています。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

次の両方を試しました。

[UIView animateWithDuration:.2 animations:^ {
   [scrollView setContentOffset:CGPointZero animated:NO];
}];

[UIView animateWithDuration:.2 animations:^ {
   CGRect svBounds = self.bounds;
   svBounds.origin.y = 0;
   self.bounds = svBounds; 
}];

問題は、これによりオフセットがすぐに変更されますが (アニメーションの完了後にログで証明されています)、表示されるスクロール位置が変更されないことです。これは、境界が実際にまったく変更されていないことを示す、スクロール ビューの後続のデリゲート メソッドによってさらに証明されます。y 位置が 0 ではないことを意味します。

この特定のデリゲート メソッドでコンテンツ オフセットを変更することは禁止されていますか? その場合、いつオフセットを変更できますか? ユーザーがドラッグを終了すると(一定量の後)、表示されているスクロール領域を一番上に戻すアニメーションを実行しようとしています。

ありがとう!

4

3 に答える 3

5

私が最終的に行ったことは、メインキューに再度ディスパッチすることです。意味:

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"END DRAG");
CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity < 0) {
    NSLog(@"Up");
} else {
    NSLog(@"Down");
}

if (yVelocity < 0 && scrollView.contentOffset.y < -100 && scrollView.contentOffset.y > -200) //UP - Hide
{
    NSLog(@"hiding");
    dispatch_async(dispatch_get_main_queue(), ^{
        [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
    });
}
else if (yVelocity > 0 && scrollView.contentOffset.y < -100) //DOWN - Show
{
    NSLog(@"showing");
    dispatch_async(dispatch_get_main_queue(), ^{
        [scrollView setContentOffset:CGPointMake(0, -300) animated:YES];
    });
}

}

そしてそれは実際に動作します:-)

于 2014-11-23T12:19:42.433 に答える
1

アニメーションの前に scrollView デリゲートを「nil」にする必要があります。コンテンツ オフセットを設定すると、デリゲートscrollViewDidEndDragging:willDecelerate:が繰り返されます。

self.scrollView.delegate = nil;
[self.scrollView setContentOffset:CGPointMake(x, y) animated:YES];
self.scrollView.delegate = self;
于 2013-11-30T17:24:23.310 に答える
0

達成しようとしている効果によっては、次のデリゲート メソッドを使用するとうまくいく場合があります。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

ユーザーがドラッグを停止したときに減速するスクロール ビューに使用するターゲット コンテンツ オフセットを選択できます。

于 2013-11-30T17:43:04.257 に答える