UIScrollView:更准确/精确的contentOffset值?

时间:2012-11-27 20:48:59

标签: objective-c ios uiscrollview contentoffset

我想知道是否有任何方法可以获得更准确的contentOffset版本,或估算/计算contentOffset或(最好)contentOffset的{​​{1}}的一阶导数UIScrollView。当我contentOffset UIScrollView的变化率非常小时,我试图执行一个动作,但0.5f不够精确。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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;
}

但是,如果您感觉非常苛刻,并且希望代码不安全,则可以使用此类别直接查看UIScrollView的速度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。请注意,您将获得的值似乎有不同的缩放比例。我再一次重申:虽然这可能是(可能)速度的最佳值,但它非常脆弱,不能面向未来。