3

のより正確なバージョンを取得する方法、または (できれば) の 1 次導関数をcontentOffset推定/計算する方法があるかどうか疑問に思っていました。の変化率が非常に小さい場合にアクションを実行しようとしていますが、0.5f では十分な精度が得られません。contentOffsetcontentOffsetUIScrollViewcontentOffsetUIScrollView

どんな助けでも大歓迎です。

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;
}

ただし、非常にハッキーだと感じていて、コードを安全UIScrollViewでないものにしたい場合は、このカテゴリを使用して、の速度iVarを直接確認できます。

@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 に答える