2009-03-10 4 views
23

У меня есть несколько UIButton s, которые я использую для установки текущего действия при нажатии в основной области. Я также хотел бы позволить пользователю перетащить из кнопки непосредственно в основную область и предпринять те же действия; по существу, прикосновенияBegan и touchsMoved должны быть переданы на главный вид при касании UIButtons, но также должны отправить действие нажатия кнопки.Есть ли способ передать штрихи на iPhone?

Прямо сейчас, у меня есть прикосновение внутри смены элемента управления. Вывод перетаскивания вызывает касание внутренней части, чтобы установить элемент управления, затем вызывает раздел касаний, чтобы начать операцию касания основной области.

Однако на данный момент штрихиMoved и touchesEnded, очевидно, не вызываются, поскольку штрихи возникли на UIButton.

Есть ли способ частично игнорировать штрихи, чтобы они были переданы в основную область, но также разрешите мне сначала установить управление?

ответ

24

В документации, искать Responder Objects and the Responder Chain

Вы можете «поделиться» прикасается между объектами путем направления подправить респондеров цепи. У вашего UIButton есть ответчик/контроллер, который принимает события UITouch, я предполагаю, что после того, как он подготовил свою интерпретацию сообщения, которое он возвращает, касание было обработано и удалено.

Apple, предлагает что-то вроде этого (в зависимости от типа осязания, конечно):

[self.nextResponder touchesBegan:touches withEvent:event];

Вместо утилизации сенсорного события он передается дальше.

Sub классифицироваться UIButton:

MyButton.h

#import <Foundation/Foundation.h> 

@interface MyButton : UIButton { 

} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ; 

@end 

MyButton.m

#import "MyButton.h" 

@implementation MyButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    printf("MyButton touch Began\n"); 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Итак, в этом случае я должен был бы подклассифицировать UIButton, чтобы передать штрихи, я полагаю? –

+0

Подкласс не должен быть необходимым, вам нужно немного исследовать цепь. Вид или элемент управления, который содержит вашу кнопку, будет следующим ответчиком в цепочке. – Paxic

+1

Боюсь, я не совсем понимаю, как захватить сообщения из UIButton и передать их в UIView без подкласса UIButton, чтобы получить сообщение. –

35

Я знаю, что этот вопрос два года (и уже ответил), но тем не менее ...

Когда я сам это пробовал, касания были перенаправлены, но кнопки больше не вели себя как кнопки. Я также передал прикосновения к «супер», и теперь все хорошо.

Таким образом, для начинающих, которые могут наткнуться на это, это то, что код должен выглядеть следующим образом:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
+0

Фантастический! У меня была такая же проблема, и это решило! Приготовьтесь! – EmphaticArmPump

+2

Будет ли этот метод находиться в подклассе UIButton? –

+1

Да, он будет использоваться в подклассе UIButton. – daveMac

17

Нет необходимости подкласс либо! Просто придерживайтесь этого в верхней части своей реализации прежде всего:

#pragma mark PassTouch 

@interface UIButton (PassTouch) 
@end 

@implementation UIButton (PassTouch) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    [self.nextResponder touchesMoved:touches withEvent:event]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
    [self.nextResponder touchesCancelled:touches withEvent:event]; 
} 
@end 
+0

Работает как шарм :-) Спасибо много! –

+3

Кстати, все еще может потребоваться подкласс. Например, что делать, если вам нужно смешивать кнопки, которые нужно передавать по касаниям в одном представлении с помощью кнопок, по какой-то причине вы не хотите иметь эту функциональность? Когда я впервые попробовал это, я создал категорию на UIButton, но обнаружил, что из-за самой причины, о которой я говорил выше, было безопаснее использовать подкласс, поэтому я точно знаю, когда я использую кнопку, которая перенаправляет штрихи. – daveMac

+1

Также вы должны сделать то же самое с 'touchhesCancelled'. –

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