ios - UIScrollView 减速过早

标签 ios uiscrollview uiscrollviewdelegate

我正在使用 scrollViewWillEndDragging:withVelocity:targetContentOffset: 将我的 ScrollView 捕捉到页面。我根据速度自定义了行为。它工作正常,只是 ScrollView 在大偏移量下过早减速。 contentOffset 最终到达了正确的位置,但是当滚动即将结束时,速度变得如此之低,以至于大约需要 3-4 秒才能到达目标。当尝试滚动 3-4 个全屏页面时,问题变得更加明显。下面的代码来自一个独立项目(创建新的 Single View 项目,在 Storyboard 中添加全屏 ScrollView ,仅设置 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

最佳答案

在与 WWDC 的一些 Apple 工程师交谈后,这似乎是 iOS 中的一个错误。它可能在 iOS 7 中没有修复

关于ios - UIScrollView 减速过早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16380795/

相关文章:

android - 如何使用cordova使手机铃声静音?

ios - 使用 CATiledLayer 翻译时抚摸 UIBezierPath 时出现 EXC_BAD_ACCESS

ios - 收到代码签名错误。它在我的本地机器上显示 "Provisioning profile could not be found"

ios - 如何关闭 UISearchController View ?

objective-c - 旋转、缩放 Cocos2d 继承层,以 2 个 Sprite 作为子级

objective-c - 在 UIScrollView 中获取 CATiledLayer 支持的 View 的图像快照

ios - UIScrollView 没有一直向下滚动

iphone - 如何在用户水平滚动时禁用垂直滚动?

ios - 在 UIScrollView 中检测突然的滚动停止

ios - 检查 UIScrollView 是否到达顶部或底部