2012-12-20 6 views
2

보기를 이동할 때 이것이 왜 움직이지 않는지 확실하지 않습니다. 에서이 팬 제스처 인식기 동작의 문제점은 무엇입니까?

CGPoint translation = [recognizer translationInView:self.view]; 


    if ((recognizer.view.frameY + translation.y >= self.view.frameHeight - recognizer.view.frameHeight)) { 
     CGPoint newOrigin = CGPointMake(self.view.bounds.size.width, roundf(recognizer.view.frameY + translation.y)); 
     recognizer.view.frameOrigin = newOrigin; 
     NSLog(@"FRAME ORIGIN %@", NSStringFromCGPoint(recognizer.view.frameOrigin)); 
    } 
+0

나는'등 frameY','frameHeight','frameOrigin'을 인식하지 못하는 실제 코드이 단지 속기 (예 :'frame.origin.y','frame.size.height' ,'frame.origin' 등). 그러나 저는 리바이의 직감에 동의합니다. 그것은 불평등이 뒤로 향하는 것입니다. 또한'translation.y'를'frame.origin.y'에 반복해서 추가하는 것을 발견했습니다. 뷰의 원래 '출처'를 사용합니다 (매번 번역을 재설정하지 않는 한, 미쳐하지 않은 관행). 마지막으로'frame.origin.x'가'self.view.bounds.size.width'의 _x_를 갖도록 설정하고 있습니다. 화면에서 꺼내겠습니까? NSLog가 보이니? – Rob

답변

6

나는 사용자 정의 변수의 일부 등으로 불분명, 그래서보다는 코드를 디버깅, 나는 내가 UIPanGestureRecognizer를 사용하여 뷰의 드래그를 할 거라고하는 방법을 보여 줄 알았는데.

따라서 (a) 제스처가 드래그되는 뷰에 추가되었다고 가정하십시오. 위에서 특정 단순함을 즐기는 동안 나는 우리가를 개선 할 수 있다고 생각,

- (void)handlePan:(UIPanGestureRecognizer *)gesture 
{ 
    static CGRect originalFrame; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     originalFrame = gesture.view.frame; 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint translate = [gesture translationInView:gesture.view.superview]; 
     CGRect newFrame = CGRectMake(originalFrame.origin.x + translate.x, 
            originalFrame.origin.y + translate.y, 
            originalFrame.size.width, 
            originalFrame.size.height); 

     if (CGRectContainsRect(gesture.view.superview.bounds, newFrame)) 
      gesture.view.frame = newFrame; 
    } 
} 

: 및 (b)에 해당 뷰가 당신이보기의 움직임을 제한하고자하는 수퍼 내에 포함되어, 코드처럼 보일 수 있습니다 사용자 경험. 특히 위의 코드는 사용자가 슈퍼 뷰 외부로보기를 드래그하면 (예 : 왼쪽 테두리를지나 드래그하여 손가락을 위아래로 움직여도 화면이 정지해도 매우 우아하지는 않음) 아무 것도하지 않습니다. 다음은 좀 더 우아한 사용자 인터페이스입니다 (코드를 읽는 데 좀 더 복잡합니다). 사용자가 손가락을 드래그 할 때 수퍼 뷰에서 가장 가까운 지점으로 객체를 드래그하여 사용자의 손가락은이다.

- (void)handlePan:(UIPanGestureRecognizer *)gesture 
{ 
    static CGRect originalFrame; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     originalFrame = gesture.view.frame; 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint translate = [gesture translationInView:gesture.view.superview]; 
     CGRect newFrame = CGRectMake(fmin(gesture.view.superview.frame.size.width - originalFrame.size.width, fmax(originalFrame.origin.x + translate.x, 0.0)), 
            fmin(gesture.view.superview.frame.size.height - originalFrame.size.height, fmax(originalFrame.origin.y + translate.y, 0.0)), 
            originalFrame.size.width, 
            originalFrame.size.height); 

     gesture.view.frame = newFrame; 
    } 
} 
+0

위대한 작품입니다, 감사합니다! – zic10

0

if 팬 제스처 메서드가 호출나요 기원은 왼쪽 상단 모서리

1

에 있기 때문에 당신이 대신 >=<=를 작성해야? 설정되지 않은 경우 사용자 상호 작용이 사용 설정됩니다. 아래 코드를 사용할 수 있습니다.

- (void)handlePan:(UIPanGestureRecognizer *)recognizer { 


CGPoint translation = [recognizer translationInView:recognizer.view.superview]; 

recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
            recognizer.view.center.y + translation.y); 
[recognizer setTranslation:CGPointMake(0, 0) inView:recognizer.view.superview]; 

if (recognizer.state == UIGestureRecognizerStateEnded) { 

    CGPoint velocity = [recognizer velocityInView:recognizer.view.superview]; 
    CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); 
    CGFloat slideMult = magnitude/200; 
    NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); 

    float slideFactor = 0.1 * slideMult; // Increase for more of a slide 
    CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), 
            recognizer.view.center.y + (velocity.y * slideFactor)); 
    finalPoint.x = MIN(MAX(finalPoint.x, 0), recognizer.view.superview.bounds.size.width); 
    finalPoint.y = MIN(MAX(finalPoint.y, 0), recognizer.view.superview.bounds.size.height); 

    [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     recognizer.view.center = finalPoint; 
    } completion:nil]; 

} 



} 
관련 문제