Ich habe ein Bild (UIImageView) in der Navigationsleiste platziert. Jetzt möchte ich das Berührungsereignis erkennen und das Ereignis behandeln. Könnten Sie mich wissen lassen, wie ich das machen kann?
Vielen Dank.
Ich habe ein Bild (UIImageView) in der Navigationsleiste platziert. Jetzt möchte ich das Berührungsereignis erkennen und das Ereignis behandeln. Könnten Sie mich wissen lassen, wie ich das machen kann?
Vielen Dank.
Antworten:
In der Praxis tun Sie das nicht.
Fügen Sie stattdessen eine Schaltfläche mit benutzerdefiniertem Stil (keine Schaltflächengrafiken, es sei denn, Sie geben Bilder an) über UIImageView hinzu. Fügen Sie dann die gewünschten Methoden hinzu.
Sie können diese Technik in vielen Fällen verwenden, in denen Sie wirklich möchten, dass ein Bereich des Bildschirms als Schaltfläche fungiert, anstatt mit dem Touch-Material herumzuspielen.
A UIImageView
wird von a abgeleitet, von UIView
dem abgeleitet wird, UIResponder
damit es Berührungsereignisse verarbeiten kann. Hier finden Sie die zur Verfügung stellen möchten touchesBegan
, touchesMoved
und touchesEnded
Methoden und diese aufgerufen werden , wenn der Benutzer das Bild tippt. Wenn Sie nur ein Tap-Ereignis wünschen, ist es einfacher, einfach eine benutzerdefinierte Schaltfläche zu verwenden, bei der das Bild als Schaltflächenbild festgelegt ist. Wenn Sie jedoch eine feinere Kontrolle über Wasserhähne, Bewegungen usw. wünschen, ist dies der richtige Weg.
Sie sollten sich noch ein paar Dinge ansehen:
Überschreiben Sie canBecomeFirstResponder
und geben Sie JA zurück, um anzuzeigen, dass die Ansicht im Mittelpunkt von Berührungsereignissen stehen kann (die Standardeinstellung ist NEIN).
Setzen Sie die userInteractionEnabled
Eigenschaft auf YES. Der Standardwert für UIViews
ist JA, aber für UIImageViews
ist NEIN, daher müssen Sie ihn explizit aktivieren .
Wenn Sie auf Multitouch-Ereignisse (z. B. Prise, Zoom usw.) reagieren möchten, sollten Sie multipleTouchEnabled
auf JA setzen.
userInteractionEnabled
ich in meiner übergeordneten Ansicht auf JA gesetzt habe. Siehe stackoverflow.com/questions/5887305/…
Um einem UIImageView ein Touch-Ereignis hinzuzufügen, verwenden Sie Folgendes in Ihrer .m
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
hoffentlich hilft das.
Sie können auch einen UIGestureRecognizer hinzufügen. Es ist nicht erforderlich, dass Sie ein zusätzliches Element in Ihre Ansichtshierarchie einfügen, bietet Ihnen jedoch den gesamten gut geschriebenen Code für die Behandlung von Berührungsereignissen mit einer relativ einfachen Oberfläche:
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[imgView_ addGestureRecognizer:swipeRight];
[swipeRight release];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[imgView_ addGestureRecognizer:swipeLeft];
[swipeLeft release];
Ich war in den letzten Stunden in verschiedenen Threads und habe erfolglos versucht, eine Lösung für mein Problem zu finden. Ich sehe, dass viele Entwickler dieses Problem teilen, und ich denke, die Leute hier wissen davon. Ich habe mehrere Bilder in einem UIScrollView
und versuche, Tap-Ereignisse darauf abzurufen.
UIImangeView
Ich bekomme keine Ereignisse von einem , aber ich bekomme ein Ereignis von einem ähnlichen UILable
mit sehr ähnlichen Parametern, die ich darauf einstelle. unter IOS 5.1.
Ich habe bereits folgendes getan:
UIImageView
.UIImageView
, hat keiner geholfen.Wenn ich unten einen Code anhänge, initialisiere ich in diesem Code sowohl a UIImageView
als auch UILabel
, und die Beschriftung funktioniert in Bezug auf Auslöseereignisse einwandfrei. Ich habe versucht, irrelevanten Code fernzuhalten. Danke Jungs, Ilan
UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled=YES;
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;
Und die Methode, die das Ereignis behandelt:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@",[tappedView class]);
}
Wie gesagt, der Etikettentipp wird empfangen.
Anstatt eine berührbare UIImageView zu erstellen und sie dann in der Navigationsleiste zu platzieren, sollten Sie einfach ein UIBarButtonItem erstellen, das Sie aus einer UIImageView erstellen.
Machen Sie zuerst die Bildansicht:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Machen Sie dann das Barbutton-Element aus Ihrer Bildansicht:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Fügen Sie dann das Element der Balkentaste zu Ihrer Navigationsleiste hinzu:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Denken Sie daran, dass dieser Code in den View Controller eingeht, der sich in einem Viewcontroller-Array des Navigationscontrollers befindet. Im Grunde genommen wird dieses "berührbare Bildschaltflächen-Schaltflächenelement" nur in der Navigationsleiste angezeigt, wenn dieser Ansichts-Controller angezeigt wird. Wenn Sie einen anderen Ansichts-Controller drücken, verschwindet diese Schaltfläche in der Navigationsleiste ~
Möglicherweise möchten Sie die touchesBegan:withEvent:
Methode der UIView
(oder Unterklasse) überschreiben , die Ihre UIImageView
Unteransicht enthält .
Testen Sie bei dieser Methode, ob eine der UITouch
Berührungen innerhalb der Grenzen der UIImageView
Instanz liegt (sagen wir, sie wird aufgerufen imageView
).
Das heißt, schneidet sich das CGPoint
Element [touch locationInView]
mit dem CGRect
Element [imageView bounds]
? Schauen Sie sich die Funktion CGRectContainsPoint
an, um diesen Test auszuführen.
Zuerst sollten Sie einen UIButton platzieren, dann können Sie entweder ein Hintergrundbild für diese Schaltfläche hinzufügen oder Sie müssen eine UIImageView über der Schaltfläche platzieren.
oder
Sie können die Tippgeste zu einer UIImageView hinzufügen, damit die Klickaktion beim Tippen auf die UIImageView angezeigt wird.
Für diejenigen unter Ihnen, die nach einer Swift 4-Lösung für diese Antwort suchen. Sie können Folgendes verwenden, um ein Berührungsereignis in einer UIImageView zu erkennen.
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
Sie müssen dann Ihren Selektor wie folgt definieren:
@objc func imageViewTapped() {
// Image has been tapped
}
Fügen Sie dieser Ansicht eine Geste für dieses view.add-Bild hinzu, dann wird auch eine Geste für das Bild erkannt. Könnten Sie es mit der delegierten Methode des Berührungsereignisses versuchen, wird sie in diesem Fall möglicherweise auch erkannt. Vielen Dank