Umieściłem obraz (UIImageView) na pasku nawigacyjnym. Teraz chcę wykryć zdarzenie dotyku i obsłużyć zdarzenie. Czy możesz dać mi znać, jak mam to zrobić?
Dzięki.
Umieściłem obraz (UIImageView) na pasku nawigacyjnym. Teraz chcę wykryć zdarzenie dotyku i obsłużyć zdarzenie. Czy możesz dać mi znać, jak mam to zrobić?
Dzięki.
Odpowiedzi:
W praktyce nie rób tego.
Zamiast tego dodaj przycisk ze stylem niestandardowym (bez grafiki przycisku, chyba że określisz obrazy) w UIImageView. Następnie dołącz dowolne metody, które chcesz do tego wywołać.
Możesz użyć tej techniki w wielu przypadkach, w których naprawdę chcesz, aby jakiś obszar ekranu działał jak przycisk, zamiast bawić się dotykiem.
A UIImageView
wywodzi się z a UIView
który pochodzi z, UIResponder
więc jest gotowy do obsługi zdarzeń dotykowych. Będziemy chcieli, aby zapewnić touchesBegan
, touchesMoved
oraz touchesEnded
metody i skąd będą wywoływane, gdy użytkownik kliknie obraz. Jeśli chcesz tylko zdarzenia dotknięcia, łatwiej jest po prostu użyć niestandardowego przycisku z obrazem ustawionym jako obraz przycisku. Ale jeśli chcesz mieć dokładniejszą kontrolę nad stuknięciami, ruchami itp., To jest droga.
Będziesz także chciał przyjrzeć się kilku innym rzeczom:
Zastąp canBecomeFirstResponder
i zwróć TAK, aby wskazać, że widok może stać się punktem skupienia zdarzeń dotykowych (domyślnie NIE).
Ustaw userInteractionEnabled
właściwość na TAK. Wartość domyślna dla UIViews
to TAK, ale dla UIImageViews
jest NIE, więc należy ją wyraźnie włączyć.
Jeśli chcesz reagować na zdarzenia wielodotykowe (np. Szczypanie, powiększanie itp.), Wybierz ustawienie multipleTouchEnabled
TAK.
userInteractionEnabled
TAK w widoku rodzica. Zobacz stackoverflow.com/questions/5887305/…
Aby dodać zdarzenie dotyku do UIImageView, użyj następujących elementów w pliku .m
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
mam nadzieję, że to pomoże.
Możesz również dodać UIGestureRecognizer. Nie wymaga dodawania dodatkowego elementu w hierarchii widoków, ale nadal zapewnia cały ładnie napisany kod do obsługi zdarzeń dotykowych z dość prostym interfejsem:
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];
W ciągu ostatnich kilku godzin byłem w różnych wątkach, próbując znaleźć rozwiązanie mojego problemu, ale bezskutecznie. Widzę, że wielu deweloperów podziela ten problem i myślę, że ludzie tutaj o tym wiedzą. Mam wiele obrazów w środku UIScrollView
, próbując uzyskać na nich zdarzenia dotknięcia.
nie otrzymuję żadnych zdarzeń z obiektu UIImangeView
, ale otrzymuję zdarzenie z podobnego UILable
z bardzo podobnymi parametrami, które ustawiam. pod IOS 5.1.
Wykonałem już następujące czynności:
UIImageView
.UIImageView
, nic nie pomogło.Załączam kod poniżej, w tym kodzie inicjalizuję zarówno UIImageView
a UILabel
, jak i , etykieta działa dobrze pod względem zdarzeń odpalania. Próbowałem unikać nieistotnego kodu. Dzięki chłopaki, 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;
Oraz metoda obsługująca zdarzenie:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@",[tappedView class]);
}
Jak powiedziano, odebrano dotknięcie etykiety.
Zamiast tworzyć dotykalny widok UIImageView, a następnie umieszczać go na pasku nawigacyjnym, należy po prostu utworzyć UIBarButtonItem, który tworzy się z UIImageView.
Najpierw utwórz widok obrazu:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Następnie usuń element z kolcem z widoku obrazu:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Następnie dodaj przycisk paska do paska nawigacji:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Pamiętaj, że ten kod trafia do kontrolera widoku, który znajduje się w tablicy kontrolera widoku kontrolera nawigacji. Zasadniczo więc ten „dotykowy przycisk paska przypominający obraz” pojawi się na pasku nawigacji tylko wtedy, gdy ten kontroler widoku jest wyświetlany. Po naciśnięciu innego kontrolera widoku ten przycisk paska nawigacji zniknie ~
To, co możesz chcieć zrobić, to przesłonić touchesBegan:withEvent:
metodę UIView
(lub podklasy), która zawiera Twój UIImageView
widok podrzędny.
W ramach tej metody sprawdź, czy którykolwiek z UITouch
dotknięć znajduje się w granicach UIImageView
instancji (powiedzmy, że jest wywoływany imageView
).
To znaczy, czy CGPoint
element [touch locationInView]
przecina się z CGRect
elementem [imageView bounds]
? Zajrzyj do funkcji, CGRectContainsPoint
aby uruchomić ten test.
Dla tych z Was, którzy szukają rozwiązania Swift 4 na tę odpowiedź. Możesz użyć następujących, aby wykryć zdarzenie dotyku w UIImageView.
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
Następnie musisz zdefiniować swój selektor w następujący sposób:
@objc func imageViewTapped() {
// Image has been tapped
}
Dodaj gest do tego widoku. Dodaj obraz do tego widoku, a następnie wykryje gest również na obrazie. Czy możesz spróbować z metodą delegata zdarzenia dotykowego, a następnie w takim przypadku może to również wykrywać. Dzięki