2012-11-27 173 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」全部削減 –