Powiedzmy, że mamy kontroler widoku z jednym widokiem podrzędnym. Widok podrzędny zajmuje środek ekranu z marginesami 100 pikseli ze wszystkich stron. Następnie dodajemy kilka drobiazgów do kliknięcia w tym podwidoku. Używamy tylko widoku podrzędnego, aby skorzystać z nowej klatki (x = 0, y = 0 wewnątrz widoku podrzędnego to w rzeczywistości 100,100 w widoku nadrzędnym).
Następnie wyobraź sobie, że mamy coś w podglądzie, na przykład menu. Chcę, aby użytkownik mógł wybrać dowolne „małe rzeczy” w podglądzie, ale jeśli nic tam nie ma, chcę, aby dotknięcia przechodziły przez to (ponieważ tło i tak jest czyste) do przycisków za nim.
W jaki sposób mogę to zrobić? Wygląda na to, że przeszedł przez dotknięcie, ale przyciski nie działają.
ios
objective-c
iphone
cocoa-touch
ipad
Sean Clark Hess
źródło
źródło
UIButton
która jest pod półprzezroczystą,UIView
podczas gdy nieprzezroczysta częśćUIView
będzie nadal reagować na zdarzenia dotykowe.Odpowiedzi:
Utwórz niestandardowy widok dla swojego kontenera i nadpisz pointInside: komunikat, aby zwracał fałsz, gdy punkt nie znajduje się w odpowiednim widoku podrzędnym, na przykład:
Szybki:
Cel C:
Używanie tego widoku jako kontenera pozwoli każdemu z jego dzieci na otrzymanie dotknięć, ale sam widok będzie przezroczysty dla wydarzeń.
źródło
Ja też używam
Nie ma potrzeby podklasy. Działa w porządku.
źródło
Od Apple:
Najlepsze praktyki dotyczące jabłek :
zamiast tego możesz zastąpić:
w podklasie UIView i zwróć NIE, jeśli chcesz, aby to dotknięcie zostało przesłane w górę łańcucha responderów (tj. do widoków za twoim widokiem bez niczego).
źródło
NO
;O wiele prostszym sposobem jest „odznaczenie” włączonej interakcji użytkownika w kreatorze interfejsu. „Jeśli używasz scenorysu”
źródło
Opierając się na tym, co opublikował John, oto przykład, który pozwoli zdarzeniom dotykowym na przechodzenie przez wszystkie podglądy widoku z wyjątkiem przycisków:
źródło
UIView
podklasy,PassThroughView
która po prostu nadpisuje,-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; }
jeśli chcesz przekazać wszystkie zdarzenia dotyku do poniższych widoków.Ostatnio napisałem zajęcia, które pomogą mi właśnie w tym. Użycie jej jako klasy niestandardowej dla
UIButton
lubUIView
spowoduje przekazanie zdarzeń dotykowych, które zostały wykonane na przezroczystym pikselu.To rozwiązanie jest nieco lepsze niż zaakceptowana odpowiedź, ponieważ nadal możesz kliknąć element
UIButton
znajdujący się pod półprzezroczystą,UIView
podczas gdy nieprzezroczysta częśćUIView
nadal będzie reagować na zdarzenia dotykowe.Jak widać na GIF-ie, przycisk Żyrafa jest prostym prostokątem, ale zdarzenia dotykowe na przezroczystych obszarach są przenoszone na żółty
UIButton
pod spodem.Link do zajęć
źródło
Najlepiej ocenione rozwiązanie nie działało w pełni dla mnie, myślę, że to dlatego, że miałem TabBarController w hierarchii (jak wskazuje jeden z komentarzy), w rzeczywistości przekazywało poprawki do niektórych części interfejsu użytkownika, ale mieszało Zdolność tableView do przechwytywania zdarzeń dotykowych, ostatecznie nadpisuje hitTest w widoku Chcę zignorować dotknięcia i pozwolić, aby podwidoki tego widoku obsłużyły je
źródło
Szybki 3
źródło
Zgodnie z „Przewodnikiem programowania aplikacji na iPhone'a”:
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html
Zaktualizowano : Usunięto przykład - ponownie przeczytaj pytanie ...
Czy masz jakieś przetwarzanie gestów na widokach, które mogą przetwarzać stuknięcia, zanim przycisk je otrzyma? Czy przycisk działa, gdy nie masz nad nim przezroczystego widoku?
Jakieś próbki kodu niedziałającego kodu?
źródło
O ile wiem, powinieneś być w stanie to zrobić, zastępując metodę hitTest:. Próbowałem, ale nie mogłem sprawić, by działał poprawnie.
Na koniec stworzyłem serię przezroczystych widoków wokół dotykalnego obiektu, tak aby go nie zakrywały. Trochę hack do mojego problemu, to działało dobrze.
źródło
Biorąc wskazówki z innych odpowiedzi i czytając dokumentację Apple, stworzyłem tę prostą bibliotekę, aby rozwiązać Twój problem:
https://github.com/natrosoft/NATouchThroughView
Ułatwia to rysowanie widoków w Interface Builder, które powinny przejść do podstawowy pogląd.
Myślę, że zawijanie metod jest przesadą i bardzo niebezpieczne w kodzie produkcyjnym, ponieważ bezpośrednio mieszasz w podstawową implementację Apple i wprowadzasz zmianę w całej aplikacji, która może spowodować niezamierzone konsekwencje.
Jest projekt demonstracyjny i miejmy nadzieję, że README dobrze się spisuje, wyjaśniając, co należy zrobić. Aby rozwiązać problem, należy zmienić przejrzysty UIView, który zawiera przyciski, na klasę NATouchThroughView w programie Interface Builder. Następnie znajdź przejrzysty UIView, który nakłada się na menu, które chcesz, aby można było kliknąć. Zmień to UIView na klasę NARootTouchThroughView w programie Interface Builder. Może to być nawet główny UIView kontrolera widoku, jeśli zamierzasz te dotknięcia przejść do podstawowego kontrolera widoku. Sprawdź projekt demonstracyjny, aby zobaczyć, jak to działa. To naprawdę całkiem proste, bezpieczne i nieinwazyjne
źródło
Stworzyłem kategorię, aby to zrobić.
trochę zawirowania metody i widok jest złoty.
Nagłówek
Plik implementacji
Będziesz musiał dodać mój Swizz.h i Swizz.m
znajduje się tutaj
Następnie wystarczy zaimportować plik UIView + PassthroughParent.h do pliku {Project} -Prefix.pch, a każdy widok będzie miał taką możliwość.
każdy widok przyjmie punkty, ale żadne puste miejsce nie.
Polecam również użycie przezroczystego tła.
EDYTOWAĆ
Stworzyłem własną torbę z majątkiem, która wcześniej nie była dołączana.
Plik nagłówkowy
Plik implementacyjny
źródło
pointInside: withEvent:
?Jeśli nie możesz zawracać sobie głowy użyciem kategorii lub podklasy UIView, możesz po prostu przesunąć przycisk do przodu, tak aby znajdował się przed przezroczystym widokiem. W zależności od aplikacji nie zawsze będzie to możliwe, ale dla mnie zadziałało. Zawsze możesz przywrócić przycisk z powrotem lub go ukryć.
źródło
Spróbuj tego
źródło
Spróbuj ustawić
backgroundColor
twoichtransparentView
jakUIColor(white:0.000, alpha:0.020)
. Następnie możesz uzyskać zdarzenia dotykowe wtouchesBegan
/touchesMoved
Methods. Umieść poniższy kod w miejscu, w którym jest uruchamiany widok:źródło
Używam tego zamiast nadpisywania punktu metody (wewnątrz: CGPoint, z: UIEvent)
źródło