2012-07-07 28 views
6

Tôi đang thêm mã sau vào phương thức onEnter.Thêm nhiều UITapGestureRecognizers vào chế độ xem đơn (Cocos2d)

doubleTapRecognizer_ = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 
    doubleTapRecognizer_.numberOfTapsRequired = 2; 
    doubleTapRecognizer_.cancelsTouchesInView = NO; 
    [[[CCDirector sharedDirector] view] addGestureRecognizer:doubleTapRecognizer_]; 

Tôi có nhiều phiên bản của lớp này, nhưng chỉ có phiên bản được chọn được gọi là trường hợp cuối cùng được thêm vào. UIView Class Reference dẫn tôi tin rằng có thể thêm nhiều UIGestureRecognizer vào một chế độ xem duy nhất. Thuộc tính "gestureRecognizers" trả về một NSArray.

Trong thực tế, tôi đã có UIPanGestureRecognizer hoạt động với cùng một chế độ xem từ một lớp khác. Vì vậy, tôi nhận được ít nhất hai UIGestureRecognizers để làm việc cùng một lúc.

Trả lời

11

Bạn có thể thêm nhiều trình nhận dạng cử chỉ vào cùng một chế độ xem. Những gì bạn không thể (dễ dàng) làm là thêm nhiều phiên bản của cùng một loại trình nhận dạng cử chỉ (xoay, vuốt, nhấn đúp, v.v.) vào cùng một chế độ xem.

Tại sao?

Vì ngay sau khi trình nhận dạng cử chỉ đầu tiên nhận ra cử chỉ (nhấn đúp trong trường hợp này), nó sẽ hủy tất cả các sự kiện chạm. Do đó những người nhận dạng cử chỉ còn lại sẽ không bao giờ kết thúc sự công nhận, và sẽ không bao giờ bắn các sự kiện của họ.

Bạn không cần nhiều trình nhận dạng cử chỉ cùng loại. Trong trường hợp của bạn, khi bạn đã nhận được sự kiện nhấn đúp, điều đó tùy thuộc vào bạn để báo hiệu đúng đối tượng mà nó đã được nhấn đúp. Sử dụng vị trí của trình nhận dạng và các thuộc tính khác để tìm kiếm, ví dụ, sprite đã được khai thác hai lần và sau đó có nó làm bất cứ điều gì nó cần làm.

Vì lý do đó, thiết kế tốt để cho phép các cử chỉ được nhận diện bởi nút cấp cao hơn trong phân cấp cảnh của bạn (tức là lớp giao diện người dùng), sau đó chuyển các sự kiện đến các nút thích hợp hoặc đơn giản là bỏ qua nó.

+0

Giải pháp của bạn nghe có vẻ tuyệt vời và dễ thực hiện, nhưng vì lợi ích của việc tìm hiểu điểm của doubleTapRecognizer_.cancelsTouchesInView = NO; Đó không phải là nghĩa vụ phải tắt liên lạc hủy bỏ? –

2

Để thêm nhiều hơn một UIGestureRecognizer lên quan điểm tương tự, bạn cần phải thiết lập các delegate tài sản của người nhận cử chỉ bạn thêm vào quan điểm và thực hiện các phương pháp sau đây trong các đại biểu:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

Bằng cách trên, bạn có thể thêm nhiều trình nhận dạng cử chỉ vào cùng một chế độ xem, cho dù trình nhận dạng cử chỉ có cùng loại hay không.

Ví dụ: bạn có thể thêm hai UITapGestureRecognizer vào cùng một chế độ xem và các cuộc gọi lại của hai trình nhận dạng cử chỉ nhấn sẽ được gọi. Và cuộc gọi lại được thêm gần đây nhất sẽ được gọi trước.

Hy vọng điều này sẽ hữu ích.

+0

Đôi khi, chúng tôi thực sự cần phải thêm trình nhận dạng cử chỉ thứ hai cùng loại với trình nhận dạng cử chỉ hiện có. Ví dụ, đối với một 'MKMapView', đã có một cử chỉ chụm vào nó, và tôi muốn làm một số thứ khác khi tôi phóng to bản đồ bằng cách thực hiện cử chỉ chụm. Trong trường hợp này, tôi cần thêm một trình nhận dạng cử chỉ chụm khác vào 'MKMapView' và đồng thời làm cho công cụ nhận dạng cử chỉ hiện tại. – HongchaoZhang

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