2010-04-11 2 views
7

настоящее время я использую ...обнаружить любое прикосновение в представлении (iPhone SDK)

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

обнаружить пойло. У меня все работает. Единственная проблема заключается в том, что пользователь прикасается к чему-то (например, UIButton или что-то еще) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { не вызывается. Есть ли что-то вроде touchhesBegan, но будет работать, если я коснусь ЛЮБОГО на вид?

Спасибо заранее, Дэвид

ответ

13

Сенсорных событий размножить, как это:

  1. UIViews присылают -hitTest: withEvent: рекурсивен до тех пор некоторые UIView не решит, что прикосновение находится внутри его границ а не внутри любого поднабора, поддерживающего взаимодействие с пользователем.
  2. UIWindow отправляет -touchesBegan: withEvent: и друзья UIView, возвращенные на шаге 1, игнорируя любую иерархию представлений.

Другими словами, -hitTest: withEvent: используется для определения целевой вид на ощупь, после чего целевая точка зрения получает все -touches ...: withEvent: сообщения. Если вам нужно перехватить жестом салфетки, который может начаться в UIButton, вам придется переопределить -hitTest: withEvent:, чтобы вернуть self.

Но есть проблема с этим подходом. Как только вы это сделаете, ваша кнопка перестанет работать, потому что она не получит -touches ...: withEvent: сообщений. Вам придется переадресовать касания в подпункты вручную, если вы не обнаружите жестом салфетки. Это серьезная боль в прикладе и не гарантируется вообще работа. Вот для чего предназначены UIGestureRecognizers.

Другой подход заключается в подклассе UIWindow и переопределении -sendEvent:, который может работать лучше в вашем случае.

В любом случае, обязательно прочитайте документацию Event Handling. Среди других страшных предупреждений он говорит:

Классы каркаса UIKit является не предназначен для приема штрихов, которые не связаны с ними; в программных условиях это означает, что объект объекта UITouch должен иметь ссылку на каркас объект для касания .

+0

эта ссылка сейчас изменилась .. обновление plz :) –

+0

GREAT ANSWER ..... THANKS ...... –

0

Я думаю, что вы должны иметь один или другой. Вы хотите, чтобы iPhone обнаружил касание сверху кнопки или касание поверх представления? Я не думаю, что вы можете сделать оба в одно и то же время, и я был бы удивлен, если бы мог. Извините за не имея лучший ответ для вас ...

+0

У вас может быть и то и другое, потому что очередь событий провоцирует события на верхний вид, а затем вниз по иерархии представлений. –

+0

Джейкоб, как бы вы это сделали? – bobbypage

Смежные вопросы