2012-01-30 17 views
7

Tôi có chế độ xem mà người dùng có thể chụm để tăng hoặc thu nhỏ. Tôi muốn điều này để làm việc dọc theo hai trục - nếu pinch là chủ yếu là ngang, nó sẽ phát triển/thu nhỏ đối tượng theo chiều ngang, nhưng nếu pinch chủ yếu là dọc, nó sẽ phát triển/thu nhỏ đối tượng theo chiều dọc.Tôi có thể sử dụng UIPinchGestureRecognizers để phân biệt giữa pinch ngang và dọc không?

Tôi có thể đạt được điều này với một hoặc hai công cụ nhận dạng pinch không và nếu có thì làm cách nào?

Trả lời

12

Bạn có thể sử dụng một số UIPinchGestureRecognizer cho điều này, nhưng bạn sẽ phải viết mã để tìm hiểu xem pinch có nằm ngang hay dọc không. Tôi chưa thử nghiệm điều này:

typedef enum { 
    PinchAxisNone, 
    PinchAxisHorizontal, 
    PinchAxisVertical 
} PinchAxis; 

PinchAxis pinchGestureRecognizerAxis(UIPinchGestureRecognizer *r) { 
    UIView *view = r.view; 
    CGPoint touch0 = [r locationOfTouch:0 inView:view]; 
    CGPoint touch1 = [r locationOfTouch:1 inView:view]; 
    CGFloat tangent = fabsf((touch1.y - touch0.y)/(touch1.x - touch0.x)); 
    return 
     tangent <= 0.2679491924f ? PinchAxisHorizontal // 15 degrees 
     : tangent >= 3.7320508076f ? PinchAxisVertical // 75 degrees 
     : PinchAxisNone; 
} 
+0

Cách tiếp cận tuyệt vời! – perrohunter

+0

Tốt, nhưng 1. Tôi đoán bạn có nghĩa là 'fabsf ((touch1.y - touch0.y)/(touch1.x - touch0.x))', với 'x' cho thành phần cuối cùng. 2. Trước tiên, bạn nên kiểm tra hoàn toàn theo chiều dọc, 'if (touch1.x == touch0.x) trả về PinchAxisVertical;' để tránh chia cho 0; 3. Lưu ý rằng điều này kiểm tra góc của hai ngón tay của bạn đối với nhau, không phải là chuyển động tương đối của các ngón tay của bạn. Lượng giác cơ bản có thể được áp dụng cho một cái gì đó thực sự nhìn vào đồng bằng, nhưng điều này là nhiều hơn "góc của vị trí của ngón tay của bạn" hơn là "góc của sự chuyển động của các ngón tay của bạn". – Rob

+0

Bạn đúng về 'y' cuối cùng cần phải là' x'. Tôi đã sửa nó. Cảm ơn vì đã chú ý đến nó. Tuy nhiên, không cần kiểm tra phân chia bằng 0, vì nó sẽ tạo ra vô cực dấu phẩy động, mà biểu thức điều kiện tiếp theo xử lý chính xác. –

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