2012-08-07 19 views
9

Korzystam z XCode 4.4, który rozwija się na iOS 5 na iPadzie i używam layoutu Storyboard podczas tworzenia mojego przycisku niestandardowego.Jak uzyskać współrzędne stuknięcia na niestandardowym UIButton?

Mam zdarzenie dotykowe poprawnie działające i rejestrowane, ale teraz chcę uzyskać współrzędne x/y dotknięcia na moim przycisku niestandardowym.

Jeśli to możliwe, chciałbym, aby współrzędne były względne do przycisku niestandardowego zamiast względnego do całego ekranu iPada.

Oto mój kod w pliku .h:

- (IBAction)getButtonClick:(id)sender; 

i mój kod w pliku .m:

- (IBAction)getButtonClick:(id)sender { 

     NSLog(@"Image Clicked."); 
    } 

Jak powiedziałem, że poprawnie rejestruje kiedy dotknąć obrazu.

Jak mogę uzyskać współrzędne kranu?

Próbowałem już kilka różnych przykładów z Internetu, ale zawsze zawiesza się, gdy wyświetla kilka liczb (może współrzędne) w oknie dziennika. Jestem NAJNOWSZYM nowicjuszem w rozwoju iOS, więc proszę, aby był tak prosty, jak to tylko możliwe. Dzięki!

+1

Dlaczego trzeba współrzędne? –

+0

Artern zadaje właściwe pytanie. Czy naprawdę potrzebujesz znać współrzędne w przycisku, czy chcesz tylko wiedzieć, który przycisk został kliknięty (w takim przypadku nie potrzebujesz doskonałej sugestii Vladimira "Nadawca i wydarzenie"), ale możesz po prostu wyglądać w "nadawcy", aby określić, który przycisk został kliknięty. – Rob

+2

Potrzebuję współrzędne, ponieważ wyświetlam obraz jako UIButton i muszę wiedzieć, gdzie na tym zdjęciu użytkownik stuknął. Już wiem, jak powiedzieć, który przycisk został kliknięty. – twbbas

Odpowiedz

28

Aby uzyskać dotykowy lokalizację można wykorzystać inną odmianę sposobu działania przycisku: myAction:forEvent: (jeśli go utworzyć z IB interfejsu nocie opcję „nadawcy i zdarzeń” w polu argumenty enter image description here)

Następnie w swojej obsługi akcji, można uzyskać od parametru dotykowy lokalizację zdarzenia, na przykład:

- (IBAction)myAction:(UIButton *)sender forEvent:(UIEvent *)event { 
    NSSet *touches = [event touchesForView:sender]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:sender]; 
    NSLog(@"%@", NSStringFromCGPoint(touchPoint)); 
} 
+1

Dziękujemy za szczegółową odpowiedź. Jednak nadal otrzymuję ten sam błąd, który wystąpił, gdy próbowałem innego kodu z Internetu. "nierozpoznany selektor wysłany do instancji 0xde26e40 2012-08-07 10: 29: 36.126 Różnice [41044: 707] *** Kończenie aplikacji ze względu na nieprzechwycony wyjątek" NSInvalidArgumentException ", powód: '- [DifferencesViewController getButtonClick:]: nierozpoznany selektor wysłany na przykład 0xde26e40 "" Masz jakieś pomysły? – twbbas

+1

@ user1262552, nadal masz metodę getButtonClick: dołączoną do akcji przycisku, sprawdź plik scenariusza lub kod, aby upewnić się, że działanie przycisku jest powiązane z istniejącą metodą kontrolera widoku. – Vladimir

+0

Aplikacja wydaje się zamarzać po dotknięciu obrazu. – twbbas

0

dla ogólnego współrzędnych (w odniesieniu do ekranu), trzeba utworzyć CGPoint zawierający współrzędne dotyk. Ale aby to zrobić, musisz najpierw uzyskać ten dotyk. Zacznij od pobrania zdarzenia dotykowego, a następnie za pomocą metody locationInView. Teraz, w zależności od tego, kiedy chcesz zarejestrować dotyk - kiedy użytkownik dotknie, lub gdy podniesie palec - musisz zaimplementować ten kod w metodzie touchesBegan lub touchesEnded. Powiedzmy, że robisz touchesEnded, która przekazuje "dotknięcia" NSSet zawierające wszystkie zdarzenia dotykowe.

UITouch *tap = [touches anyObject]; 
CGPoint touchPoint = [tap locationInView:self.view]; 

"touchPoint" będzie teraz zawierał punkt, w którym użytkownik podnosi palec. Aby wydrukować współrzędne, wystarczy uzyskać dostęp do właściwości x i y tego punktu:

CGFloat pointX = touchPoint.x; 
CGFloat pointY = touchPoint.y; 
NSLog(@" Coordinates are: %f, %f ", pointX, pointY); 

Powinno to wypisać współrzędne dotyku. Teraz, aby mieć odniesienie do dowolnego przycisku, którego używasz, proponuję po prostu ręcznie odjąć wartości współrzędnych przycisku od punktu. Wydaje się, że jest to proste rozwiązanie, i szczerze mówiąc, nie znam sposobu na uzyskanie współrzędnych w odniesieniu do innego obiektu, chyba że zrobisz widok oparty na tym obiekcie i przekaż go do locationInView zamiast self.view.

Aby uzyskać więcej informacji o dotknięciach, istnieje duży zestaw samouczków here.

1

Incase of Swift 3.0 przyjętą odpowiedź działa samo z wyjątkiem składni zostanie zmieniony w następujący sposób:

Swift 3.0:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) { 
    let myButton = sender as! UIButton 
    let touches = event.touches(for: myButton) 
    let touch = touches?.first 
    let touchPoint = touch?.location(in: myButton) 
    print("touchPoint\(touchPoint)") 
    } 
Powiązane problemy