Truyền các sự kiện cảm ứng cho anh chị em thích hợp UIViews


12

Tôi đang cố gắng xử lý các sự kiện chạm với touchesBegan trong lớp phủ cho phụ huynh UIView nhưng cũng cho phép đầu vào cảm ứng đi qua bên anh em UIView s bên dưới. Tôi hy vọng sẽ có một số cách thẳng thắn để xử lý một sự kiện cảm ứng và sau đó nói "bây giờ gửi nó cho người trả lời tiếp theo như thể cái này không tồn tại", nhưng tất cả những gì tôi có thể tìm thấy là phương pháp nextResponder. quay lại chế độ xem của lớp phủ. Sau đó, cha mẹ đó không thực sự truyền nó vào người anh em tiếp theo của chế độ xem lớp phủ đó, vì vậy tôi không chắc chắn cách làm những gì có vẻ như một nhiệm vụ đơn giản thường được thực hiện với một cuộc gọi lại có giá trị trả về True hoặc False có nên tiếp tục xử lý phân cấp tiện ích hay không.

Tôi có thiếu thứ gì đó hiển nhiên không?

3

Câu trả lời muộn, nhưng tôi nghĩ bạn nên ghi đè hitTest:withEvent: thay vì touchesBegan. Dường như với tôi rằng touchesBegan là một phương pháp "cấp cao" khá đơn giản để chỉ làm một việc đơn giản, vì vậy bạn không thể thay đổi ở cấp độ đó nếu sự kiện được truyền bá thêm. Nơi thích hợp để làm điều đó là hitTest:withEvent:.

Ngoài ra, hãy xem this S.O. answer để biết thêm chi tiết về điểm này.


1

Tôi hiểu hành vi mong muốn mà bạn đang tìm kiếm Joey - Tôi chưa tìm thấy thứ gì đó trong API hỗ trợ hành vi nhắn tin tự động này với chế độ xem anh chị em.

Điều tôi viết ban đầu dưới đây là liên quan đến việc chỉ thông báo cho phụ huynh UIView về một lần chạm. Điều này vẫn áp dụng, nhưng tôi tin rằng bạn cần phải tiến thêm một bước nữa và yêu cầu cha mẹ UIView sử dụng kỹ thuật thử nghiệm hit mà Sergio mô tả trên mỗi tiểu sử của nó là anh chị em của lớp phủ và có cha mẹ UIView tự gọi một cái gì đó "phương pháp trên mỗi tiểu thuyết của nó mà vượt qua các bài kiểm tra hit. Mỗi người trong số những quan điểm anh chị em này có thể trả lại giá trị BOOL về việc có nên hủy thông báo cho anh chị em khác hoặc tiếp tục chuỗi.

Nếu bạn thấy mình sử dụng mẫu này rất nhiều, hãy cân nhắc thêm phương pháp danh mục trên UIView đóng gói thử nghiệm lần truy cập và yêu cầu xem để thực hiện công cụ chọn.

My Original trả lời

Với một chút công việc thủ công, bạn có thể dây này cùng chính mình. Tôi đã phải làm điều này, và nó làm việc cho tôi, bởi vì tôi đã có một trường hợp sử dụng lặp đi lặp lại (một cái nhìn lớp phủ trên một nút), nơi nó có ý nghĩa để tạo ra một số lớp tùy chỉnh. Nếu tình huống của bạn là tương tự, một trong những kỹ thuật này sẽ đủ.

Lựa chọn 1: Nếu lớp phủ không cần phải làm bất cứ điều gì nhưng nhìn khá, có nó không tham gia vào xử lý hoàn toàn với userInteractionEnabled = NO cảm ứng. Điều này sẽ làm cho nó để các sự kiện liên lạc đi đến nó là cha mẹ UIView (một trong đó là một lớp phủ để).

Phương án 2: Có lớp phủ hấp thụ sự kiện liên lạc (vì nó sẽ theo mặc định), và sau đó gọi một phương thức trên UIView mẹ chỉ ra rằng một liên lạc hoặc cử chỉ nào đó đã được công nhận, và đây là nó là gì. Bằng cách này, UIView đằng sau lớp phủ vẫn được thực hiện trên sự công nhận cảm ứng, ngay cả khi người khác đã thực hiện việc chặn.

Với tùy chọn 2, nó phù hợp hơn với các loại đơn giản UIControlEvent đơn giản, như UIControlEventTouchDownUIControlEventTouchUpInside.Trong trường hợp của tôi (một lớp con tùy chỉnh UIButton với chế độ xem lớp phủ tùy chỉnh ở trên cùng), tôi sẽ chạm vào dây và chạm vào các sự kiện trên nút đến hai phương pháp riêng biệt. Những đám cháy nếu chạm xuống hoặc chạm vào bên trong sự kiện xảy ra trên nút chính nó. Nhưng, chúng cũng là móc mà tôi có thể gọi từ chế độ xem lớp phủ nếu tôi cần mô phỏng rằng một lần nhấn nút xảy ra.

Tùy thuộc vào nhu cầu của bạn, bạn có thể có giao thức đã biết giữa lớp phủ và đó là UIView gốc hoặc chỉ có lớp phủ kiểm tra UIView một cách không chính thức, với kiểm tra respondsToSelector: trước khi gọi performSelector: trên đó bằng phương thức tùy chỉnh mà bạn muốn gọi đã tự động kích hoạt nếu UIView không bị che phủ bởi lớp phủ.