UIScrollView减速太早



我使用scrollviewwillenddrag:withVelocity: targetcontenttoffset:来捕捉我的scrollview到页面。我根据速度定制了行为。它工作得很好,除了滚动视图减速太早与大偏移。contenttoffset在正确的位置结束,但是当滚动即将结束时,速度变得非常低,大约需要3- 45秒才能到达目标。当尝试滚动3-4个全屏页面时,问题变得更加明显。下面的代码来自一个独立的项目(创建新的单视图项目,在故事板中添加全屏滚动视图,设置仅iPad,横向模式)。

仅供参考,改变减速速率并不能解决问题(它只会使滚动更慢/更快)。

#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

在WWDC上与一些苹果工程师交谈后发现,这似乎是iOS的一个bug。在iOS 7中可能还没有修复

最新更新