Есть ли способ передать прикосновения на iPhone? - PullRequest
23 голосов
/ 10 марта 2009

У меня есть несколько UIButton с, которые я использую для установки текущего действия при нажатии в основной области. Я также хотел бы позволить пользователю перетащить кнопку непосредственно в основную область и выполнить то же действие; по существу, прикосновения Beg и touchesMoved должны передаваться на главный экран при прикосновении к кнопкам UIB, но также должны отправлять действие нажатия кнопки.

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

Однако на этом этапе touchesMoved и touchesEnded явно не вызываются, потому что касания возникли на UIButton.

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

Ответы [ 3 ]

36 голосов
/ 05 мая 2011

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

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

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
    [super touchesBegan:touches withEvent:event];
    [self.nextResponder touchesBegan:touches withEvent:event]; 
}
24 голосов
/ 11 марта 2009

В документации ищите Объекты респондента и цепь респондента

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

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

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

Вместо удаления события касания оно передается.

Подклассифицированный 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
17 голосов
/ 05 января 2012

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

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...