2012-11-27 1 views
3

contentOffset의 더 정확한 버전을 얻거나 contentOffset 또는 contentOffset의 (가장 바람직하게) 1 차 도함수를 예측/계산하는 방법이 있다면 UIScrollView입니다. 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

당신은 절대적으로 옳습니다. 저자는 * velocity *를 계산하기 위해 더 정확한 'contentOffset' 판독 값을 얻으려고 시도했기 때문에 내 대답은 단순히 중개자와'contentOffset '을 모두 잘라 버렸습니다. –

관련 문제