Wie füge ich einem UIView ein Touch-Ereignis hinzu?
Ich versuche:
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:'
Ich möchte keine Unterklasse erstellen und überschreiben
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Antworten:
In iOS 3.2 und höher können Sie Gestenerkenner verwenden. So würden Sie beispielsweise mit einem Tap-Ereignis umgehen:
Es gibt auch eine Reihe von eingebauten Gesten. Lesen Sie die Dokumente zur Behandlung von iOS-Ereignissen und
UIGestureRecognizer
. Ich habe auch eine Menge Beispielcode auf Github , der helfen könnte.quelle
CGPoint
repräsentiert die Position des Wasserhahns in der Übersicht der getippten Ansicht. Mit diesem Punkt können Sie die getippte Ansicht (oder eine Geschwisteransicht) an die getappte Position verschieben. Dies ist im Handler nützlicher,UIPanGestureRecognizer
wenn Sie die Ansicht über den Bildschirm ziehen möchten.Gestenerkenner
Es gibt eine Reihe häufig verwendeter Berührungsereignisse (oder Gesten), über die Sie benachrichtigt werden können, wenn Sie Ihrer Ansicht einen Gestenerkenner hinzufügen . Die folgenden Gestenarten werden standardmäßig unterstützt:
UITapGestureRecognizer
Tippen Sie auf (kurz oder mehrmals kurz auf den Bildschirm tippen)UILongPressGestureRecognizer
Lange Berührung (langes Berühren des Bildschirms)UIPanGestureRecognizer
Schwenken (Bewegen Sie Ihren Finger über den Bildschirm)UISwipeGestureRecognizer
Streichen (Finger schnell bewegen)UIPinchGestureRecognizer
Prise (zwei Finger zusammen oder auseinander bewegen - normalerweise zum Zoomen)UIRotationGestureRecognizer
Drehen (zwei Finger in kreisförmiger Richtung bewegen)Darüber hinaus können Sie Ihren eigenen Gestenerkenner erstellen.
Hinzufügen einer Geste im Interface Builder
Ziehen Sie einen Gestenerkenner aus der Objektbibliothek in Ihre Ansicht.
Steuern Sie das Ziehen von der Geste in der Dokumentübersicht auf Ihren View Controller-Code, um ein Outlet und eine Aktion zu erstellen.
Dies sollte standardmäßig festgelegt sein, aber stellen Sie auch sicher, dass User Action Enabled für Ihre Ansicht auf true festgelegt ist.
Programmgesteuertes Hinzufügen einer Geste
Um eine Geste programmgesteuert hinzuzufügen, erstellen Sie (1) eine Gestenerkennung, (2) fügen Sie sie einer Ansicht hinzu und (3) erstellen Sie eine Methode, die aufgerufen wird, wenn die Geste erkannt wird.
Anmerkungen
sender
Parameter ist optional. Wenn Sie keinen Verweis auf die Geste benötigen, können Sie ihn weglassen. Wenn Sie dies jedoch tun, entfernen Sie den(sender:)
Namen der Methode nach der Aktion.handleTap
Methode war willkürlich. Nennen Sie es wie Sie wollen .action: #selector(someMethodName(sender:))
Mehr Beispiele
Sie können die Gestenerkenner untersuchen, die ich diesen Ansichten hinzugefügt habe, um zu sehen, wie sie funktionieren.
Hier ist der Code für dieses Projekt:
Anmerkungen
quelle
UIView
, müssen Sie auch hinzufügen:self.isUserInteractionEnabled = true;
Ich denke, Sie können einfach verwenden
Ich meine, HeaderView erstreckt sich von UIControl.
quelle
UITapGestureRecognizer
ist kein Ersatz fürUIControlEventTouchDown
. A bestehtTap
normalerweise ausUIControlEventTouchDown
undUIControlEventTouchUpInside
.UIView
ist kein aUIControl
und hat daher keinen Zugriff aufaddTarget:action:forControlEvents:
.Swift 3 & Swift 4
Verwenden
quelle
Basierend auf der akzeptierten Antwort können Sie ein Makro definieren:
Dieses Makro verwendet ARC, daher gibt es keinen
release
Aufruf.Beispiel für die Verwendung von Makros:
quelle
Sie können dies erreichen, indem Sie Gestenerkenner in Ihren Code einfügen.
Schritt 1: ViewController.m:
Schritt 2: ViewController.m:
HINWEIS: Hier war yourView in meinem Fall
@property (strong, nonatomic) IBOutlet UIView *localView;
BEARBEITEN : * localView ist das weiße Feld in Main.storyboard von unten
quelle
In Swift 4.2 und Xcode 10
Verwenden Sie UITapGestureRecognizer zum Hinzufügen eines Berührungsereignisses
Wenn Sie SharedClass verwenden möchten
Ich habe 3 Ansichten in meinem ViewController mit den Namen view1, view2 und view3.
quelle
Hier ist eine schnelle Version:
quelle
BlockTap
?Swift 3:
quelle
Scheint heutzutage ganz einfach. Dies ist die Swift-Version.
quelle
Hier ist ios tapgesture; Zuerst müssen Sie eine Aktion für GestureRecognizer erstellen, nachdem Sie den folgenden Code unter die Aktion geschrieben haben, wie unten gezeigt
quelle
Eine andere Möglichkeit ist das Hinzufügen einer transparenten Schaltfläche zur Ansicht
Und dann Handle Click:
quelle
Erstellen Sie einen Gestenerkenner (Unterklasse), der Berührungsereignisse wie z
touchesBegan
. Danach können Sie es der Ansicht hinzufügen.Auf diese Weise verwenden Sie die Komposition anstelle der Unterklasse (was die Anforderung war).
quelle
Warum probiert ihr SSEventListener nicht aus ?
Sie müssen keine Gestenerkennung erstellen und Ihre Logik von einer anderen Methode trennen.
SSEventListener
Unterstützt das Festlegen von Listener-Blöcken in einer Ansicht, um auf eine Geste mit einem Tippen, eine Geste mit zwei Tippen und eine Geste mit N-Tippen zu warten, wenn Sie möchten, sowie auf eine Geste mit langem Drücken. Das Einstellen eines einzelnen Tippgesten-Listeners wird folgendermaßen:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];
quelle
Ziel c:
Schnell:
Die Frage lautet:
Es wird nicht nach einem Tap- Ereignis gefragt .
Insbesondere möchte OP implementieren
UIControlEventTouchDown
Umschalten der
UIView
aufUIControl
die richtige Antwort hier , weilGesture Recognisers
ich weiß nichts über.touchDown
,.touchUpInside
,.touchUpOutside
usw.Darüber hinaus erbt UIControl von UIView, sodass Sie keine Funktionalität verlieren.
Wenn Sie nur tippen möchten, können Sie den Gestenerkenner verwenden. Wenn Sie jedoch eine genauere Kontrolle wünschen, wie in dieser Frage gefordert, benötigen Sie UIControl.
https://developer.apple.com/documentation/uikit/uicontrol?language=objc https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc
quelle