Mam widok z UITapGestureRecognizer
. Więc kiedy stukam w widok, nad tym widokiem pojawia się inny widok. Ten nowy widok ma trzy przyciski. Kiedy teraz naciskam jeden z tych przycisków, nie otrzymuję akcji przycisków, dostaję tylko akcję gestu stuknięcia. Nie mogę już używać tych przycisków. Co mogę zrobić, aby uzyskać dostęp do zdarzeń za pomocą tych przycisków? Dziwne jest to, że przyciski wciąż są podświetlane.
Nie mogę po prostu usunąć UITapGestureRecognizer po otrzymaniu go z kranu. Ponieważ dzięki niemu nowy widok można również usunąć. Oznacza, że chcę takie zachowanie, jak kontrolki wideo na pełnym ekranie .
void
taki sposób, aby nie pozostawiał żadnych informacji w czasie wykonywania w celu użycia do wykrywania. Ale możesz przejść do hierarchii widoków, przetestowaćUIControl
i powrócić,NO
jeśli znajdziesz jakieś elementy sterujące.Jako kontynuacja odpowiedzi Caseya na odpowiedź Kevina Ballarda:
Zasadniczo działa to na wszystkie typy elementów sterujących wprowadzanych przez użytkownika, takie jak przyciski, suwaki itp
źródło
setCancelsTouchesInView = NO
brak wyzwalania gestu stuknięcia podczas interakcji z elementami sterującymi. Można to jednak lepiej napisać:return ![touch.view isKindOfClass:[UIControl class]];
Znalazłem tę odpowiedź tutaj: link
Możesz także użyć
Co uniemożliwia rozpoznanie kranu jako jedynego, który przechwytuje wszystkie krany
AKTUALIZACJA - Michael wspomniał o linku do dokumentacji opisującej tę właściwość: cancelsTouchesInView
źródło
W odpowiedzi na odpowiedź Kevina Ballarda miałem ten sam problem i ostatecznie wykorzystałem ten kod:
Ma ten sam efekt, ale zadziała na każdym UIButtonie na dowolnej głębokości widoku (mój UIButton miał kilka widoków głębokich, a delegat UIGestureRecognizer nie miał do niego odniesienia).
źródło
W systemie iOS 6.0 i nowszych domyślne czynności kontrolne zapobiegają zachodzeniu na siebie rozpoznawania gestów. Na przykład domyślną czynnością dla przycisku jest pojedyncze dotknięcie. Jeśli do widoku rodzica przycisku jest podłączone rozpoznawanie gestów jednego dotknięcia, a użytkownik stuknie przycisk, wówczas metoda działania przycisku odbiera zdarzenie dotykowe zamiast rozpoznawania gestu. Dotyczy to tylko rozpoznawania gestów, które nakładają się na domyślną akcję dla kontrolki, która obejmuje: .....
Z dokumentu API Apple
źródło
Te odpowiedzi były niepełne. Musiałem przeczytać wiele postów, jak korzystać z tej operacji boolowskiej.
Dodaj do pliku * .h
Dodaj do pliku * .m
źródło
Znalazłem inny sposób na zrobienie tego stąd . Wykrywa dotyk, czy wewnątrz każdego przycisku, czy nie.
(1) pointInside: withEvent: (2) locationInView:
źródło
Oto szybka wersja odpowiedzi Lily Ballard, która zadziałała dla mnie:
źródło
Szybki 5
Przycisk podglądu z tapgesture
W moim przypadku wdrożenie hitTest działało dla mnie. Miałem widok kolekcji z przyciskiem
Ta metoda przegląda hierarchię widoków, wywołując
point(inside:with:)
metodę każdego podviewu w celu ustalenia, który podview powinien otrzymać zdarzenie dotykowe. Jeślipoint(inside:with:)
zwróci wartość true, hierarchia widoku podrzędnego jest podobnie przechodzona, dopóki nie zostanie znaleziony widok z przodu zawierający określony punkt.źródło
Możesz zatrzymać UITapGestureRecognizer przed anulowaniem innych zdarzeń (takich jak dotknięcie przycisku), ustawiając następującą wartość logiczną:
źródło
Jeśli twój scenariusz jest taki:
Masz prosty widok i niektóre przyciski UIB, elementy sterujące UITextField dodane jako widoki podrzędne do tego widoku. Teraz chcesz zamknąć klawiaturę po dotknięciu dowolnego miejsca w widoku, z wyjątkiem elementów sterujących (dodanych widoków podrzędnych)
Zatem rozwiązaniem jest:
Dodaj następującą metodę do XYZViewController.m (która ma twój widok)
źródło
Dostajesz optymalizację odpowiedzi cdasher
źródło