2

scrollViewWillEndDragging:withVelocity:targetContentOffset: を使用して、スクロールビューをページにスナップしています。速度に基づいて動作をカスタマイズしました。オフセットが大きいとスクロールビューの減速が早すぎることを除けば、問題なく動作します。contentOffset は正しい場所で終了しますが、スクロールが終了しようとすると、速度が非常に遅くなり、ターゲットに到達するのに約 3 ~ 4 秒かかります。この問題は、3 ~ 4 ページのフル スクリーン ページをスクロールしようとすると、より明白になります。以下のコードは、スタンドアロン プロジェクトからのものです (新しいシングル ビュー プロジェクトを作成し、ストーリーボードにフルスクリーン スクロール ビューを追加し、iPad のみをセットアップし、ランドスケープ モード)。

参考までに、decelerateRate を変更しても問題は解決しません (スクロールが遅くなったり速くなったりするだけです)。

#import "ViewController.h"

@implementation ViewController
@synthesize scrollView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    pages_ = 30;
    UIView* arr[pages_];
    for (int i = 0; i < pages_; ++i) {
        CGRect frame = CGRectMake(1024 * i, 0, 1024, 768);
        arr[i] = [[UIView alloc] initWithFrame:frame];
        [scrollView addSubview:arr[i]];
        arr[i].backgroundColor = (i%2) ? [UIColor redColor] : [UIColor greenColor];
    }

    scrollView.contentSize = CGSizeMake(1024 * pages_, 768);
    scrollView.delegate = self;
    scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
}

- (void)scrollViewWillEndDragging:(UIScrollView *)sv
                     withVelocity:(CGPoint)velocity
              targetContentOffset:(inout CGPoint *)targetContentOffset {
    CGFloat pageWidth = scrollView.frame.size.width;
    unsigned int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

    int scrollToPage = page + velocity.x*1.5;
    scrollToPage = MAX(0, MIN(scrollToPage, (int)pages_ - 1));
    NSLog(@"Scrolling by %d pages", abs(page-scrollToPage));

    targetContentOffset->x = scrollView.frame.size.width * scrollToPage;
    targetContentOffset->y = 0;
    NSLog(@"Scrolling to offset %f", targetContentOffset->x);
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv {
    NSLog(@"scrollViewDidEndDecelerating");
}

@end
4

1 に答える 1

0

WWDC で何人かの Apple エンジニアと話し合ったところ、これは iOS のバグのようです。おそらくiOS 7では修正されていません

于 2013-07-03T20:29:46.113 に答える