我想知道是否有任何方法可以获得更准确的contentOffset
版本,或估算/计算contentOffset
或(最好)contentOffset
的{{1}}的一阶导数UIScrollView
。当我contentOffset
UIScrollView
的变化率非常小时,我试图执行一个动作,但0.5f不够精确。
非常感谢任何帮助。
答案 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
。请注意,您将获得的值似乎有不同的缩放比例。我再一次重申:虽然这可能是(可能)速度的最佳值,但它非常脆弱,不能面向未来。