のより正確なバージョンを取得する方法、または (できれば) の 1 次導関数をcontentOffset
推定/計算する方法があるかどうか疑問に思っていました。の変化率が非常に小さい場合にアクションを実行しようとしていますが、0.5f では十分な精度が得られません。contentOffset
contentOffset
UIScrollView
contentOffset
UIScrollView
どんな助けでも大歓迎です。
のより正確なバージョンを取得する方法、または (できれば) の 1 次導関数をcontentOffset
推定/計算する方法があるかどうか疑問に思っていました。の変化率が非常に小さい場合にアクションを実行しようとしていますが、0.5f では十分な精度が得られません。contentOffset
contentOffset
UIScrollView
contentOffset
UIScrollView
どんな助けでも大歓迎です。
によって提供されるものよりも優れた精度を得ることができません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
。取得する値は、スケーリングが異なるように見えることに注意してください。もう一度繰り返します。これは(おそらく)取得できる速度の最良の値ですが、非常に壊れやすく、将来にわたって利用できるわけではありません。