2012-02-14 33 views
35

Tôi đang di chuyển quan điểm của tôi bằng cáchKết hợp cử chỉ nhấn và giữ và kéo cử chỉ cùng

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveRight:)]; 
[panRecognizer setMinimumNumberOfTouches:1]; 
[panRecognizer setMaximumNumberOfTouches:1]; 
[panRecognizer setDelegate:self]; 
[bubbleView[rightCnt] addGestureRecognizer:panRecognizer]; 
[panRecognizer release]; 

Bây giờ, tôi muốn làm điều tương tự bằng cách kéo với báo chí dài.

Bất kỳ ý tưởng nào?

Trả lời

74

UILongPressGestureRecognizer đã làm những gì bạn muốn cho bạn. Hãy xem tài sản UIGestureRecognizerState. Từ số documentation:

Cử chỉ báo chí dài liên tục. Cử chỉ bắt đầu (UIGestureRecognizerStateBegan) khi số lượng ngón tay cho phép (numberOfTouchesRequired) đã được nhấn trong khoảng thời gian được chỉ định (minimumPressDuration) và chạm không vượt ra ngoài phạm vi cho phép di chuyển (allowableMovement) . Cử chỉ bộ nhận dạng chuyển sang trạng thái Thay đổi bất cứ khi nào một ngón tay di chuyển, và nó kết thúc (UIGestureRecognizerStateEnded) khi bất kỳ ngón tay nào được dỡ bỏ.

Vì vậy, về cơ bản sau selector UILongPressGestureRecognizer bạn được gọi là bạn nghe UIGestureRecognizerStateBegan, UIGestureRecognizerStateChanged, UIGestureRecognizerStateEnded. Tiếp tục thay đổi khung nhìn của bạn trong thời gian UIGestureRecognizerStateChanged.

- (void)moveRight:(UILongPressGestureRecognizer *)gesture 
{ 
    if(gesture.state == UIGestureRecognizerStateBegan) 
    { 
     //if needed do some initial setup or init of views here 
    } 
    else if(gesture.state == UIGestureRecognizerStateChanged) 
    { 
     //move your views here. 
     [yourView setFrame:]; 
    } 
    else if(gesture.state == UIGestureRecognizerStateEnded) 
    { 
     //else do cleanup 
    } 
} 
+3

tôi đang sử dụng \t CGPoint translatedPoint = [(UILongPressGestureRecognizer *) người gửi translationInView: self.view] ; nhưng tor nhấn lâu những gì tôi phải sử dụng? – PJR

+0

thử '[yourView setFrame: CGRectMake (xCoord, yCoord, chiều cao, chiều rộng)]' –

+3

nhưng bằng cách này tôi có thể được dịch như thế nào – PJR

33
@implementation MyViewController { 
    CGPoint _priorPoint; 
} 

- (void)moveRight:(UILongPressGestureRecognizer *)sender { 
    UIView *view = sender.view; 
    CGPoint point = [sender locationInView:view.superview]; 
    if (sender.state == UIGestureRecognizerStateChanged) { 
     CGPoint center = view.center; 
     center.x += point.x - _priorPoint.x; 
     center.y += point.y - _priorPoint.y; 
     view.center = center; 
    } 
    _priorPoint = point; 
} 
+0

:rob: đó là câu trả lời đúng! cảm ơn rất nhiều! – rockstarberlin

2

Bạn không cần phải khai báo _priorPoint;

Trong trường hợp của tôi, tôi chỉ muốn chế độ xem di chuyển theo chiều ngang nên tôi chỉ thay đổi tọa độ x.

Đây là giải pháp của tôi:

if (longpressGestRec.state == UIGestureRecognizerStateChanged) 
    { 
     UIView *view = longpressGestRec.view; 

     // Location of the touch within the view. 
     CGPoint point = [longpressGestRec locationInView:view]; 

     // Calculate new X position based on the amount the gesture 
     // has moved plus the size of the view we want to move. 
     CGFloat newXLoc = (item.frame.origin.x + point.x) - (item.frame.size.width/2); 
     [item setFrame:CGRectMake(newXLoc, 
            item.frame.origin.y, 
            item.frame.size.width, 
            item.frame.size.height)]; 
    } 
+2

giải pháp của bạn chỉ hoạt động đối với 'UIView' theo ngón tay. Hãy tưởng tượng bạn bắt đầu 'UILongPress' từ góc của một bức ảnh và bạn muốn vuốt sang trái, bức ảnh này sẽ nhảy đến vị trí của ngón tay bạn. Trong trường hợp của tôi, tôi đã phải sử dụng một giải pháp '_priorPoint'. – Fabio

+0

Điểm rất tốt! Hoàn toàn bỏ lỡ điều đó, cảm ơn bạn! – Andrew

1

Trong Swift này có thể đạt được bằng mã dưới đây

class DragView: UIView { 
    // Starting center position 
    var initialCenter: CGPoint? 

    override func didMoveToWindow() { 
    super.didMoveToWindow() 
    // Add longPress gesture recognizer 
    let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPressAction(gesture:))) 
    addGestureRecognizer(longPress) 
    } 

    // Handle longPress action 
    func longPressAction(gesture: UILongPressGestureRecognizer) { 
    if gesture.state == .began { 
     guard let view = gesture.view else { 
      return 
     } 
     initialCenter = gesture.location(in: view.superview) 
    } 
    else if gesture.state == .changed { 
     guard let originalCenter = initialCenter else { 
      return 
     } 

     guard let view = gesture.view else { 
      return 
     } 

     let point = gesture.location(in: view.superview) 

     // Calculate new center position 
     var newCenter = view.center; 
     newCenter.x += point.x - originalCenter.x; 
     newCenter.y += point.y - originalCenter.y; 

     // Update view center 
     view.center = newCenter 
    } 
    else if gesture.state == .ended { 
     ... 
    } 
} 
Các vấn đề liên quan