2012-11-27 39 views
3

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

任何帮助,非常感谢。

回答

3

你不能得到比contentOffset提供的更好的精度。直接使用此类别

- (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的速度高德:你可以使用常规ds/dt方程来计算速度

@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 

为了获得水平速度与_horizontalVelocity取代_verticalVelocity。请注意,您将看到的值似乎有所不同。我再重复一次:虽然这可能是(可能)速度的最佳值,但它非常脆弱,并且不能适应未来发展。

+0

好的。我认为没有任何安全的方法可以获得更精确的价值,但是您的答案似乎涵盖了任何人都可能需要解决的问题。非常感谢!不过,我会尝试一下iVars的速度。 – RileyE

+0

这可能是一个愚蠢的问题,但你究竟如何处理速度以获得精确的内容偏移?看起来你所做的任何计算都会让你回到相同的不祥值。 –

+1

你是对的。作者试图获得更精确的'contentOffset'读数来计算*速度*,所以我的答案只是简单地将中间人“contentOffset”全部削减 –