Jak dodać zdarzenie dotykowe do UIView?
Próbuję:
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'
Nie chcę tworzyć podklasy i nadpisywać
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Odpowiedzi:
W iOS 3.2 i nowszym możesz używać rozpoznawania gestów. Na przykład w ten sposób poradzisz sobie ze zdarzeniem z kranu:
Istnieje również kilka wbudowanych gestów. Sprawdź dokumenty dotyczące obsługi zdarzeń na iOS i
UIGestureRecognizer
. Mam również kilka przykładowych kodów na github, które mogą pomóc.źródło
CGPoint
reprezentuje lokalizację kranu w widoku podglądu podsłuchu. Za pomocą tego punktu można przenieść widok stuknięty (lub widok rodzeństwa) do lokalizacji stukniętej. Jest to bardziej przydatne w module obsługiUIPanGestureRecognizer
do przeciągania widoku po ekranie.Rozpoznawanie gestów
Istnieje wiele często używanych zdarzeń dotykowych (lub gestów), o których możesz zostać powiadomiony, gdy dodasz do widoku Gesture Recognizer . Domyślnie obsługiwane są następujące typy gestów:
UITapGestureRecognizer
Stuknij (dotykając ekranu raz lub więcej razy)UILongPressGestureRecognizer
Długi dotyk (dotykanie ekranu przez długi czas)UIPanGestureRecognizer
Pan (przesuwając palcem po ekranie)UISwipeGestureRecognizer
Przesuń (szybko przesuwając palec)UIPinchGestureRecognizer
Zsuń palce ( rozsuń lub rozsuń dwa palce - zwykle w celu powiększenia)UIRotationGestureRecognizer
Obracanie (poruszanie dwoma palcami w kierunku kołowym)Oprócz tego możesz także stworzyć własny rozpoznawanie gestów.
Dodawanie gestu w Konstruktorze interfejsów
Przeciągnij rozpoznawanie gestów z biblioteki obiektów do swojego widoku.
Kontroluj przeciąganie z gestu w konspekcie dokumentu do kodu kontrolera widoku, aby utworzyć ujście i akcję.
Powinno to być ustawione domyślnie, ale należy również upewnić się, że opcja User Action Enabled jest ustawiona na true dla twojego widoku.
Programowe dodawanie gestu
Aby programowo dodać gest, (1) utworzysz rozpoznawanie gestów, (2) dodasz go do widoku i (3) stworzysz metodę wywoływaną po rozpoznaniu gestu.
Notatki
sender
parametr jest opcjonalny. Jeśli nie potrzebujesz odniesienia do gestu, możesz go pominąć. Jeśli to zrobisz, usuń(sender:)
nazwę metody po akcji.handleTap
metody było dowolne. Nazwij go, jak chcesz .action: #selector(someMethodName(sender:))
Więcej przykładów
Możesz przestudiować rozpoznawanie gestów, które dodałem do tych widoków, aby zobaczyć, jak działają.
Oto kod tego projektu:
Notatki
źródło
UIView
, musisz również dodać:self.isUserInteractionEnabled = true;
Myślę, że możesz po prostu użyć
mam na myśli headerView rozszerza się z UIControl.
źródło
UITapGestureRecognizer
nie zastępujeUIControlEventTouchDown
.Tap
Zazwyczaj komponujeUIControlEventTouchDown
iUIControlEventTouchUpInside
.UIView
nie jest a,UIControl
a zatem nie ma dostępu doaddTarget:action:forControlEvents:
.Swift 3 i Swift 4
Posługiwać się
źródło
Na podstawie zaakceptowanej odpowiedzi możesz zdefiniować makro:
To makro używa ARC, więc nie ma
release
połączenia.Przykład użycia makra:
źródło
Możesz to osiągnąć, dodając do kodu Gogure Recogniser.
Krok 1: ViewController.m:
Krok 2: ViewController.m:
UWAGA: tutaj Twój widok w moim przypadku był
@property (strong, nonatomic) IBOutlet UIView *localView;
EDYCJA: * localView to białe pole w Main.storyboard od dołu
źródło
W Swift 4.2 i Xcode 10
Użyj UITapGestureRecognizer, aby dodać zdarzenie dotykowe
Jeśli chcesz użyć SharedClass
Mam 3 widoki w moim ViewController o nazwie view1, view2 i view3.
źródło
Oto wersja Swift:
źródło
BlockTap
?Swift 3:
źródło
W dzisiejszych czasach wydaje się to dość proste. To jest wersja Swift.
źródło
Oto iost tapureure; Najpierw musisz utworzyć akcję dla GestureRecognizer po napisaniu poniższego kodu pod akcją, jak pokazano poniżej
źródło
Innym sposobem jest dodanie przezroczystego przycisku do widoku
A następnie kliknij przycisk obsługi:
źródło
Utwórz funkcję rozpoznawania gestów (podklasę), która będzie realizować zdarzenia dotykowe, takie jak
touchesBegan
. Następnie możesz dodać go do widoku.W ten sposób użyjesz kompozycji zamiast podklasy (co było żądaniem).
źródło
Dlaczego nie spróbujecie SSEventListener ?
Nie musisz tworzyć żadnego rozpoznawania gestów i oddzielać logikę od innej metody.
SSEventListener
obsługuje ustawianie bloków detektora w widoku, aby nasłuchiwać gestu pojedynczego stuknięcia, gestu dwukrotnego stuknięcia i gestu stuknięcia w N, jeśli chcesz, oraz gestu długiego naciśnięcia. Ustawienie nasłuchiwania gestu pojedynczego dotknięcia staje się w ten sposób:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];
źródło
Cel C:
Szybki:
Pytanie brzmi:
To nie prosi o zdarzenie z kranu .
W szczególności OP chce wdrożyć
UIControlEventTouchDown
Przełączanie
UIView
sięUIControl
jest dobrym rozwiązaniem tutaj, boGesture Recognisers
nie wiem nic na temat.touchDown
,.touchUpInside
,.touchUpOutside
itd.Dodatkowo UIControl dziedziczy z UIView, więc nie tracisz żadnej funkcjonalności.
Jeśli wszystko, czego potrzebujesz, to dotknij, możesz użyć narzędzia do rozpoznawania gestów. Ale jeśli chcesz mieć lepszą kontrolę, tak jak to pytanie, potrzebujesz UIControl.
https://developer.apple.com/documentation/uikit/uicontrol?language=objc https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc
źródło