2012-12-14 27 views
10

Tôi đang cố gắng tạo GestureRecognizer để kéo UIView từ phải sang trái. Nếu người dùng kéo View đến nửa màn hình, View sẽ tự động được kéo vào góc trái để loại bỏ nó, nhưng nếu người dùng không kéo tới nửa màn hình thì nó sẽ trở lại góc phải màn hình. Ít bị mất ở đây, bất kỳ hướng dẫn hay gì đó? Cảm ơnUIGestureRecognizer để kéo UIView

EDIT: Heres một số mã, nó một UIImageView, bên trong một UIScrollView, tôi cần phải kéo toàn bộ cuộn hay chỉ là hình ảnh bên trong nó:

_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)]; 

_tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]]; 
_tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial]; 

_tutorial.userInteractionEnabled = YES; 
    UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)]; 
[_tutorial addGestureRecognizer:recognizer]; 

    [self.window addSubview:_myScroll]; 

Và phương pháp này tôi cố gắng để kéo số UIImageView

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

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

} 
+0

Tôi đã trả lời câu hỏi của bạn, nhưng bạn nên cung cấp thêm chi tiết về những gì bạn đã thử, như "Tôi có thể kéo chế độ xem, nhưng không biết cách làm cho nó đi đúng vị trí", ... – rdurand

+0

@ rdurand có, tôi có thể kéo chế độ xem bằng cách sử dụng UIPanGestureRecognizer, nhưng tôi không biết chính xác cách phát hiện vị trí và sau đó gửi chế độ xem đến vị trí mong muốn. Và vấn đề thứ hai là, làm thế nào để kéo chế độ xem, chỉ theo chiều ngang – darkman

+0

Cung cấp một số mã. Hãy cho chúng tôi biết những gì bạn đã thử, những gì * không * làm việc. – rdurand

Trả lời

22

Hãy xem qua here. Đây là hướng dẫn UIGestureRecognizer sẽ cung cấp cho bạn những điều cơ bản để xử lý cử chỉ chụm và cử động. Một khi bạn đã học được những điều cơ bản, nó thực sự dễ dàng để thực hiện những gì bạn muốn. Tất cả những gì bạn cần là kiểm tra vị trí của khung nhìn sau khi chảo được hoàn thành để gửi nó đến đúng vị trí. Hãy xem this other tutorial trên UIScrollViews, nó có thể giúp bạn tìm đường của bạn thông qua phần thứ hai.

Cả hai hướng dẫn đến từ raywenderlich.com, có thể là trang web hướng dẫn iOS hữu ích nhất mà tôi biết.


Dưới đây là một số mã trên phương pháp handlePan: của bạn, bạn có thể làm việc trên:

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

    CGPoint translation = [recognizer translationInView:_myScroll]; 

    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 

    if (recognizer.state == UIGestureRecognizerStateEnded) { 

     // Check here for the position of the view when the user stops touching the screen 

     // Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch 

     // Use this to animate the position of your view to where you want 
     [UIView animateWithDuration: aDuration 
           delay: 0 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
      CGPoint finalPoint = CGPointMake(finalX, finalY); 
      recognizer.view.center = finalPoint; } 
         completion:nil]; 
    } 


    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; 

} 

tôi sẽ không cung cấp cho bạn câu trả lời hoàn hảo ở đây, bạn sẽ phải làm việc trên các mã để tìm một để làm cho nó hoạt động như bạn muốn.

Đây là một mẹo cuối cùng. Bạn có thể làm một số loại hoạt hình "mượt mà" bằng cách sử dụng một slideFactor. Nó sẽ giúp hoạt hình của bạn trở nên "thực tế" hơn. Làm việc trên mã này, mà bạn thêm ngay từ đầu của "nếu":

CGPoint velocity = [recognizer velocityInView:self.view]; 
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); 
CGFloat slideMult = magnitude/200; 

float slideFactor = 0.1 * slideMult; // Increase for more slide 

Sau đó, trong UIView animateWithDuration:, sử dụng slideFactor như thời gian.

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