Есть ли способ передать прикосновения на iPhone?
У меня есть несколько UIButton
s, которые я использую, чтобы установить текущее действие при нажатии в основной области. Я также хотел бы позволить пользователю перетащить кнопку непосредственно в основную область и выполнить то же действие; по существу, прикосновения Beg и touchesMoved должны передаваться на основной экран при прикосновении к кнопкам UIB, но также должны отправлять действие нажатия кнопки.
Прямо сейчас у меня есть подкрашивание внутри, меняющее управление. Выход при перетаскивании вызывает внутреннюю секцию касания для установки элемента управления, затем вызывает секцию начала касаний, чтобы начать операцию касания основной области.
Однако на этом этапе touchesMoved и touchesEnded явно не вызываются, потому что касания возникли на UIButton.
Есть ли способ наполовину игнорировать прикосновения, чтобы они передавались в основную область, но также разрешить мне сначала установить элемент управления?
3 ответа
В документации ищите Объекты Ответчика и Цепочку Ответчика.
Вы можете "делиться" касаниями между объектами, пересылая цепочку респондента. Ваш 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
Я знаю, что этому вопросу два года (и уже ответил), но тем не менее...
Когда я попробовал это сам, прикосновения были перенаправлены, но кнопки больше не вели себя как кнопки. Я также передал прикосновения к "супер", и теперь все хорошо.
Итак, для начинающих, которые могут наткнуться на это, вот как должен выглядеть код:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
[self.nextResponder touchesBegan:touches withEvent:event];
}
Нет необходимости также создавать подклассы! Просто прикрепите это поверх вашей реализации, прежде чем что-то еще:
#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