Mam widok nałożony na wiele innych widoków. Używam tylko overaly, aby wykryć pewną liczbę dotknięć ekranu, ale poza tym nie chcę, aby widok zatrzymywał zachowanie innych widoków pod spodem, którymi są przewijane widoki itp. Jak mogę przekazać wszystkie dotknięcia przez ten widok nakładki? Jest to podskala UIView.
141
Odpowiedzi:
Wyłączenie interakcji z użytkownikiem było wszystkim, czego potrzebowałem!
Cel C:
Szybki:
źródło
myWebView.isUserInteractionEnabled = false
Aby przekazać dotknięcia z widoku nakładki do widoków poniżej, zaimplementuj następującą metodę w UIView:
Cel C:
Swift 5:
źródło
To stary wątek, ale pojawił się podczas wyszukiwania, więc pomyślałem, że dodam 2c. Mam obejmujące UIView z podglądami podrzędnymi i chcę przechwytywać tylko dotknięcia, które trafiły w jeden z podglądów podrzędnych, więc zmodyfikowałem odpowiedź PixelCloudSt na
źródło
Ulepszona wersja odpowiedzi @fresidue. Tej
UIView
podklasy można używać jako widoku przezroczystego, który przechodzi przez dotknięcia poza jego podwidok. Wdrożenie w celu C :.
iw Swift:
WSKAZÓWKA:
Powiedzmy, że masz duży panel z uchwytami, być może z widokiem na stół z tyłu. Tworzysz panel „uchwyt”
PassthroughView
. Teraz będzie działać, możesz przewijać tabelę „przez” „uchwyt”.Ale!
W górnej części panelu „uchwyt” znajdują się etykiety lub ikony. Nie zapominaj, oczywiście, że muszą one być po prostu oznaczone jako opcja interakcji użytkownika włączona.
W górnej części panelu „uchwytu” znajdują się przyciski. Nie zapomnij, oczywiście, że muszą one być po prostu zaznaczone jako włączone interakcja użytkownika!
Uwaga że nieco myląco, „obsady” Sam - widok użyć
PassthroughView
na - muszą być oznaczone interakcji użytkownika włączona ON ! To jest włączone !! (W przeciwnym razie kod w PassthroughView po prostu nigdy nie zostanie wywołany).źródło
$0.isUserInteractionEnabled
Miałem podobny problem z UIStackView (ale może to być dowolny inny widok). Moja konfiguracja była następująca:
To klasyczny przypadek, w którym mam pojemnik, który należało umieścić w tle, z przyciskami z boku. Dla celów układu umieściłem przyciski w UIStackView, ale teraz środkowa (pusta) część przechwytywania stackView dotyka :-(
To, co zrobiłem, to utworzenie podklasy UIStackView z właściwością definiującą subView, który powinien być dotykalny. Teraz każde dotknięcie przycisków bocznych (zawartych w tablicy * viewsWithActiveTouch *) zostanie przypisane do przycisków, podczas gdy jakiekolwiek dotknięcie widoku stosu w dowolnym miejscu poza tymi widokami nie zostanie przechwycone, a zatem przekazane do tego, co znajduje się poniżej stosu widok.
źródło
Jeśli widok, do którego chcesz przekazać dotknięcia, nie jest widokiem podrzędnym / nadzorem, możesz skonfigurować właściwość niestandardową w podklasie UIView, na przykład:
Upewnij się, że zsyntetyzujesz go w swoim .m:
Następnie uwzględnij następujące elementy w dowolnej z metod UIResponder, takich jak:
Gdziekolwiek tworzysz wystąpienie swojego UIView, ustaw właściwość forwardableTouchee na dowolny widok, do którego mają być przekazywane zdarzenia:
źródło
W Swift 5
źródło
Musiałem przejść dotknięcia przez UIStackView. UIView wewnątrz był przezroczysty, ale UIStackView pochłaniał wszystkie dotknięcia. To zadziałało dla mnie:
Wszystkie zaaranżowane podglądy nadal są dotykane, ale dotknięcia samego UIStackView przeszły do widoku poniżej (dla mnie mapView).
źródło
Wygląda na to, że nawet ty masz tutaj sporo odpowiedzi, nie ma nikogo, kto by był czysty w szybkim tempie, którego potrzebowałem. Więc wziąłem odpowiedź z @fresidue tutaj i przekonwertowałem ją na szybką, ponieważ jest to coś, czego teraz chcą tutaj używać głównie programiści.
To rozwiązało mój problem, w którym mam przezroczysty pasek narzędzi z przyciskiem, ale chcę, aby pasek narzędzi był niewidoczny dla użytkownika, a zdarzenia dotykowe powinny przechodzić.
isUserInteractionEnabled = false, jak niektórzy stwierdzili, nie jest opcją opartą na moich testach.
źródło
Miałem kilka etykiet w StackView i nie odniosłem większego sukcesu z powyższymi rozwiązaniami, zamiast tego rozwiązałem swój problem za pomocą poniższego kodu:
Podklasa UIStackView:
Wtedy możesz zrobić coś takiego:
źródło
Spróbuj czegoś takiego ...
Na przykład powyższy kod w metodzie touchesBegan przekazuje dotknięcia do wszystkich podwidoków widoku.
źródło
Sytuacja, którą próbowałem zrobić, polegała na zbudowaniu panelu sterowania przy użyciu kontrolek wewnątrz zagnieżdżonych UIStackView. Niektóre kontrolki miały UITextField, inne z UIButton. Były też etykiety identyfikujące kontrole. To, co chciałem zrobić, to umieścić duży „niewidoczny” przycisk za panelem sterowania, aby jeśli użytkownik dotknął obszaru poza przyciskiem lub polem tekstowym, mógłbym to złapać i podjąć działanie - przede wszystkim odrzucić każdą klawiaturę, jeśli tekst pole było aktywne (resignFirstResponder). Jednak dotknięcie etykiety lub innego pustego obszaru w panelu sterowania nie spowoduje przejścia. Powyższe dyskusje były pomocne w sformułowaniu mojej odpowiedzi poniżej.
Zasadniczo podklasowałem UIStackView i nadpisałem procedurę „point (inside: with)” w celu wyszukania typu elementów sterujących, które wymagały dotknięcia i „zignorowania” rzeczy, takich jak etykiety, które chciałem zignorować. Sprawdza również wewnętrzne UIStackView, aby rzeczy mogły powtarzać się w strukturze panelu sterowania.
Kod jest być może trochę bardziej rozwlekły niż powinien. Ale był pomocny w debugowaniu i, miejmy nadzieję, zapewnia większą jasność w tym, co robi rutyna. Po prostu upewnij się, że w programie Interface Builder zmienisz klasę UIStackView na PassThruStack.
}
źródło
Jak sugeruje @PixelCloudStv, jeśli chcesz rzucać dotknięte z jednego widoku do drugiego, ale z dodatkową kontrolą nad tym procesem - podklasa UIView
//nagłówek
//realizacja
Następnie w interfaceBuilder po prostu ustaw klasę View na TouchView i ustaw aktywny prostokąt swoim prostokątem. Możesz także zmienić i wdrożyć inną logikę.
źródło