У меня есть UIView
с 4 кнопками на нем и еще один UIView
поверх представления кнопок. Самый верхний вид содержит UIImageView
с UITapGestureRecognizer
на нем.
Поведение, которое я пытаюсь создать, заключается в том, что когда пользователь касается UIImageView
, он переключается между маленьким в правом нижнем углу экрана и анимацией, чтобы стать больше. Когда он большой, я хочу, чтобы кнопки на нижнем экране были отключены, а когда он маленький и находится в правом нижнем углу, я хочу, чтобы касания передавались кнопкам и чтобы они работали как обычно. Я почти достиг цели, но не могу добиться того, чтобы касания передавались кнопкам, пока не отключу UserInteractions
верхнего вида.
Это у меня в initWithFrame:
вида сверху:
// Add a gesture recognizer to the image view
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
tapGestureRecognizer.cancelsTouchesInView = NO;
[imageView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
и это у меня в imageTapped:
методе:
- (void) imageTapped:(UITapGestureRecognizer *) gestureRecognizer {
// Toggle between expanding and contracting the image
if (expanded) {
[self contractAnimated:YES];
expanded = NO;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = NO;
self.exclusiveTouch = NO;
}
else {
[self expandAnimated:YES];
expanded = YES;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = YES;
self.exclusiveTouch = YES;
}
}
С приведенным выше кодом, когда изображение большое, кнопки неактивны, когда я касаюсь изображения, оно уменьшается и кнопки становятся активными. Однако маленькое изображение не получает прикосновений и поэтому не расширяется.
Если я установлю self.userInteractionEnabled = YES
в обоих случаях, то изображение расширяется и сжимается при касании, но кнопки не получают касаний и действуют как неактивные.
Можно ли сделать так, чтобы изображение расширялось и сжималось при касании, но кнопки под ним принимали касания, только если изображение находится в сжатом состоянии? Я делаю что-то глупое и упускаю что-то очевидное?
Я схожу с ума, пытаясь заставить это работать, поэтому любая помощь будет принята с благодарностью,
Dave
UPDATE:
Для дальнейшего тестирования я переопределил методы touchesBegan:
и touchesCancelled:
и вызвал их суперреализации на моем представлении, содержащем UIImageView. С приведенным выше кодом, touchesCancelled:
никогда не вызывается, а touchesBegan:
вызывается всегда.
Таким образом, получается, что представление получает касания, просто они не передаются в представление снизу.
UPDATE
Это происходит из-за того, как работает цепочка ответчиков? Моя иерархия представлений выглядит следующим образом:
VC - View1
-View2
-imageView1 (has tapGestureRecogniser)
-imageView2
-View3
-button1
-button2
Я думаю, что ОС сначала делает hitTest, который говорит, что View2 находится впереди, поэтому должен получать все прикосновения, и они никогда не передаются View3, если только userInteractions не установлен в NO для View2, в этом случае imageView1 также не получает прикосновений. Так ли это, и есть ли способ для View2 передать касания View3?