Есть ли у кого-нибудь образец кода для обнаружения касаний динамически созданного UIView? Я нашел несколько ссылок на touchBegan, но не могу понять, как его реализовать...
Коснитесь события на UIView
Ответ 1
Весьма общий способ доступа - это переопределить эти методы в пользовательском подклассе UIView:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
Официальные документы для этих методов находятся в разделе "Ответы на события касания" в документы класса UIResponder (UIView наследует эти методы, поскольку это подкласс UIResponder). Более длинные и более вводные документы можно найти в Руководство по обработке событий для iOS.
Если вы просто хотите обнаружить кран (touch-down, затем touch-up в вашем представлении), проще всего добавить UIButton
в качестве подсмотра вашего представления и добавить свой собственный пользовательский метод в качестве целевого/для этой кнопки. Пользовательские кнопки по умолчанию невидимы, поэтому это не повлияет на внешний вид вашего представления.
Если вы ищете более продвинутые взаимодействия, также хорошо знать о классе UIGestureRecognizer
.
Ответ 2
Создайте событие касания с UIAnimation на UIView, вы можете управлять касаниями UIView где угодно.
Следующий код: здесь self.finalScore - это UIView, а чаша - UIImageView. Я обрабатываю
событие касания на UIImageView, оно присутствует внутри UIView.
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch1 = [touches anyObject];
CGPoint touchLocation = [touch1 locationInView:self.finalScore];
CGRect startRect = [[[cup layer] presentationLayer] frame];
CGRectContainsPoint(startRect, touchLocation);
[UIView animateWithDuration:0.7
delay:0.0
options:UIViewAnimationCurveEaseOut
animations:^{cup.transform = CGAffineTransformMakeScale(1.25, 0.75);}
completion:^(BOOL finished) {
[UIView animateWithDuration:2.0
delay:2.0
options:0
animations:^{cup.alpha = 0.0;}
completion:^(BOOL finished) {
[cup removeFromSuperview];
cup = nil;}];
}];
}
Подобно UITapGestureRecognizer - это еще один способ обработки событий касания на UIView....
UITapGestureRecognizer *touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(releaseButAction)] autorelease];
// Set required taps and number of touches
[touchOnView setNumberOfTapsRequired:1];
[touchOnView setNumberOfTouchesRequired:1];
// Add the gesture to the view
[[self view] addGestureRecognizer:touchOnView];
Ответ 3
Создайте свой собственный UIView
из подкласса, созданного путем наследования UIView
, и переопределите следующий метод внутри подкласса,
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
}
Ответ 4
Мой метод просто меняет класс UIView
на UIControl
в InterfaceBuilder IdentityInspector, тогда ConnectionsInspector мгновенно получит событие касания к крюку.
изменения нулевого кода.
Ответ 5
Вместо того, чтобы захватывать сенсорный жест, я предлагаю изменить родительский класс UIView на UIControl, чтобы он мог обрабатывать событие touchUpInside
From:
@interface MyView : UIView
To:
@interface MyView : UIControl
а затем добавьте эту строку для просмотра -
[self addTarget:self action:@selector(viewTapped:) forControlEvents:UIControlEventTouchUpInside];
Так как жест может создавать проблемы при прокрутке.
Ответ 6
С помощью recongnizer для прослушивания вы можете легко поймать события касания.
Найти один из компонентов библиотеки компонентов в раскадровке:
Например, перетащите указатель Gothure Gesture Recognizer в ваше представление. Он не показан в представлении UI. Вы можете найти его из схемы документа на левой панели в раскадровке:
Последний шаг - связать его (с помощью управления) с представлением в качестве делегата, на котором отслеживается касание, и перетащить управление в класс контроллера вида в качестве действия. Вот изображение связей ссылок.
и код действия:
@IBAction func tapAction(_ sender: Any) {
// touch is captured here.
}