2010-04-11 12 views
7

obecnie używam ...wykryć każdy dotyk w widoku (iPhone SDK)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

wykryć swipes. Mam wszystko działa. Jedynym problemem jest to, że użytkownik dotyka czegoś (np. Uibutton lub coś podobnego), nie jest wywoływany - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {. Czy jest coś takiego jak touchBegan, ale będzie działać, jeśli dotknę Dowolnego GDZIEGO w widoku?

Dzięki z góry, David

Odpowiedz

13

zdarzenia dotykowe propagacji tak:

  1. UIViews wysyłane -hitTest: withEvent: rekurencyjnie aż niektóre UIView zdecyduje, że dotyk jest wewnątrz jej granic a nie wewnątrz podglądu z włączoną obsługą użytkownika.
  2. UIWindow wysyła -touchesBegan: withEvent: i znajomych do UIView zwróconych w kroku 1, ignorując wszelkie hierarchie widoków.

Innymi słowy, -hitTest: withEvent: służy do określenia widoku docelową w dotyku, po którym widok docelowy pobiera wszystkie -touches ...: withEvent: wiadomości. Jeśli chcesz przechwycić gest przesunięcia, który może się rozpocząć w Uibuttonie, musisz zastąpić -hitTest: withEvent:, aby zwrócić self.

Istnieje jednak problem z tym podejściem. Gdy to zrobisz, przycisk przestanie działać, ponieważ nie dostanie żadnych komunikatów -touches ...: withEvent:. Będziesz musiał ręcznie przesuwać elementy do podstron, chyba że wykryjesz gest machnięcia. To jest poważny ból w tyłku i nie ma gwarancji, że zadziała w ogóle. Do tego służą UIGestureRecognizers.

Innym podejściem jest podklasa UIWindow i przesłanianie -sendEvent:, która może działać lepiej w twoim przypadku.

W każdym razie upewnij się, że dokładnie przeczytałeś dokumentację Event Handling. Wśród innych przerażających ostrzeżeń mówi:

Klasy ramach UIKit są nie przeznaczona do odbioru detali które nie są zobowiązane do nich; w terminach programowych oznacza to, że właściwość widoku obiektu UITouch musi zawierać odwołanie do obiektu ramowego , aby dotknięcie było obsługiwane za pomocą dotyku .

+0

ten link się teraz zmienił .. update plz :) –

+0

WIELKA ODPOWIEDŹ ..... DZIĘKI ...... –

0

myślę, trzeba mieć jedną lub drugą stronę. Czy iPhone ma wykrywać dotyk na górze przycisku lub dotknąć ekranu? Nie sądzę, żebyś mógł robić obie naraz w tym samym czasie i byłbym zaskoczony, gdybyś mógł. Przepraszamy za nie mający lepszą odpowiedź dla Ciebie ...

+0

Możesz mieć oba, ponieważ kolejka zdarzeń przesyła zdarzenia do widoku z góry, a następnie do hierarchii widoków. –

+0

Jacob, jak byś to zrobił? – bobbypage

Powiązane problemy