3

我想知道是否有任何方法contentOffset可以获得更准确contentOffset的 当我的变化率非常小时,我试图执行一个动作,但是 0.5f 不够精确。contentOffsetUIScrollViewcontentOffsetUIScrollView

任何帮助是极大的赞赏。

4

1 回答 1

3

您无法获得比contentOffset. 您可以使用常规ds/dt方程计算速度:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    static CGFloat prevPos = 0.0; //you can store those in iVars
    static NSTimeInterval prevTime = 0.0;

    CGFloat newPos = scrollView.contentOffset.y;
    NSTimeInterval newTime = [NSDate timeIntervalSinceReferenceDate];

    double v = (newPos - prevPos)/(newTime - prevTime);

    prevPos = newPos;
    prevTime = newTime;
}

但是,如果您感觉非常hacky,并且希望您的代码不安全,您可以UIScrollView使用此类别直接查看 的velocity iVars

@interface UIScrollView(UnsafeVelocity)
- (double) unsafeVerticalVelocty;
@end

@implementation UIScrollView(UnsafeVelocity)

- (double) unsafeVerticalVelocty
{
    double returnValue = 0.0;
    id verticalVel = nil;

    @try {
        verticalVel = [self valueForKey:@"_verticalVelocity"];
    }
    @catch (NSException *exception) {
        NSLog(@"KVC peek failed!");
    }
    @finally {
        if ([verticalVel isKindOfClass:[NSNumber class]]) {
            returnValue = [verticalVel doubleValue];
        }
    }

    return returnValue;
}

@end

要获得水平速度,请替换_verticalVelocity_horizontalVelocity. 请注意,您将获得的值似乎以不同的方式缩放。我再重复一遍:虽然这(可能)是你能获得的最佳速度值,但它非常脆弱,而且不能保证未来的发展。

于 2012-11-27T22:18:45.203 回答