2013-06-13 31 views
9

Tôi đang cố gắng di chuyển chế độ xem phụ trên màn hình hoạt động, nhưng tôi cũng muốn thêm quán tính hoặc động lượng vào đối tượng.
Mã UIPanGestureRecognizer của tôi mà tôi đã có ở bên dưới.thêm quán tính vào một UIPanGestureRecognizer

Xin cảm ơn trước.

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self  action:@selector(handlePan:)]; 
[self addGestureRecognizer:panGesture]; 

(void)handlePan:(UIPanGestureRecognizer *)recognizer 
{ 

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

    if (recognizer.state == UIGestureRecognizerStateEnded) { 
     [self.delegate card:self.tag movedTo:self.frame.origin]; 
    } 
} 

Xin cảm ơn lần nữa.

Trả lời

4

Hãy xem RotationWheelAndDecelerationBehaviour. có một ví dụ về cách thực hiện giảm tốc cho cả chuyển động tuyến tính và chuyển động quay. Thủ thuật là để xem vận tốc khi người dùng kết thúc chạm và tiếp tục theo hướng đó với sự giảm tốc nhỏ.

+0

Đây không phải là câu trả lời rất kỹ lưỡng. Tôi đề nghị bạn đọc qua [** cách trả lời **] (http://stackoverflow.com/questions/how-to-answer) và mở rộng nó. – brandonscript

+0

Đây là câu trả lời hay hơn http://stackoverflow.com/a/6614319/558575 – amergin

1

Vâng, tôi không phải là chuyên gia nhưng, kiểm tra nhiều câu trả lời, tôi đã quản lý để tạo mã của riêng mình mà tôi hài lòng.

Vui lòng cho tôi biết cách cải thiện và nếu có bất kỳ hành vi xấu nào tôi đã sử dụng.

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

CGPoint translatedPoint = [recognizer translationInView:self.postViewContainer]; 
CGPoint velocity = [recognizer velocityInView:recognizer.view]; 

float bottomMargin = self.view.frame.size.height - containerViewHeight; 
float topMargin = self.view.frame.size.height - scrollViewHeight; 

if ([recognizer state] == UIGestureRecognizerStateChanged) { 

    newYOrigin = self.postViewContainer.frame.origin.y + translatedPoint.y; 

    if (newYOrigin <= bottomMargin && newYOrigin >= topMargin) { 
     self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, self.postViewContainer.center.y + translatedPoint.y); 
    } 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.postViewContainer]; 
} 

if ([recognizer state] == UIGestureRecognizerStateEnded) { 

    __block float newYAnimatedOrigin = self.postViewContainer.frame.origin.y + (velocity.y/2.5); 

    if (newYAnimatedOrigin <= bottomMargin && newYAnimatedOrigin >= topMargin) { 
     [UIView animateWithDuration:1.2 delay:0 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^ { 
          self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, self.postViewContainer.center.y + (velocity.y/2.5)); 
         } 
         completion:^(BOOL finished) { 
          [self.postViewContainer setFrame:CGRectMake(0, newYAnimatedOrigin, self.view.frame.size.width, self.view.frame.size.height - newYAnimatedOrigin)]; 
         } 
     ]; 
    } 
    else { 
     [UIView animateWithDuration:0.6 delay:0 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^ { 
          if (newYAnimatedOrigin > bottomMargin) { 
           self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, bottomMargin + self.postViewContainer.frame.size.height/2); 
          } 

          if (newYAnimatedOrigin < topMargin) { 
           self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, topMargin + self.postViewContainer.frame.size.height/2); 
          } 
         } 
         completion:^(BOOL finished) { 
          if (newYAnimatedOrigin > bottomMargin) 
           [self.postViewContainer setFrame:CGRectMake(0, bottomMargin, self.view.frame.size.width, scrollViewHeight)]; 

          if (newYAnimatedOrigin < topMargin) 
           [self.postViewContainer setFrame:CGRectMake(0, topMargin, self.view.frame.size.width, scrollViewHeight)]; 
         } 
     ]; 
    } 
} 

}

Tôi đã sử dụng hai hình ảnh động khác nhau, một là quán tính mặc định một và khác nếu vì khi người dùng vứt cái thùng containerView với vận tốc cao.

Nó hoạt động tốt trong iOS 7.

Các vấn đề liên quan