Обнаружение события касания на UIScrollView и на компонентах UIView [который размещен внутри UIScrollView]
У меня есть UIViewController в моем проекте простой раскадровки IPad, который содержит UIScrollView, который размещается по всей поверхности (1024 x 768). Я создал 3 файла XIB, которые представляют собой UIViews, которые мое приложение загружает при запуске в viewDidLoad и добавляет их в UIScrollView. Каждый из этих 3 файлов XIB содержит только один UIButton.
Это иерархия:
~ UIViewController ( UIViewControllerClass является классом для этого UIViewController)
~~ UIScrollView (содержит 3 идентичных UIViews)
~~~ UIView ( UIViewClass является файловым владельцем для этого файла XIB)
~~~~ UIButton
Мне бы хотелось, чтобы мой UIViewControllerClass узнал обо всех: касайтесь в любом месте компонента UIScrollView. И если коснется UIScrollView, если UIButton внутри UIView в UIScrollView коснулся, чтобы получить информацию о том, что именно эта кнопка была затронута.
Я сделал IBAction внутри UIViewClass для касания UIButton внутри UIView в UIScrollView, и когда я установил User Interaction Enabled = YES для всех элементов (UIViewController, UIView и UIScrollView), этот метод вызывается как следует.
Но в этот момент мой UIViewControllerClass не знает, что в UIScrollView на этом UIButton произошел штрих. Я сделал сенсорный распознаватель следующим образом:
UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)];
touch.numberOfTouchesRequired = 1;
и добавил его в компонент UIScrollView. Таким образом, я могу обнаружить событие касания на компоненте UIScrollView в UIViewControllerClass, но обработчик событий для UIButton в UIView, который находится внутри UIScrollView, больше не вызывается.
Итак, мне нужно иметь эти две информации в UIViewControllerClass:
- Прикосновение к компоненту UIScrollView было сделано
- Нажмите на UIButton в UIView, который находится внутри UIScrollView (если эта кнопка была затронута) была сделана
Я полагаю, что добавление распознавателя распознавания событий для всего компонента UIScrollView не является решением, поскольку оно отключает все обработчики событий касания, которые я написал внутри UIViewClass.
Я думаю, что решение заключается в том, что каким-то образом затрагиваются компоненты, которые выполняются на UIView внутри UIScrollView, должны быть отправлены до UIViewControllerClass, но я не нашел способ сделать это.
Если кто-нибудь может мне помочь, я буду очень благодарен. Спасибо заранее.
[edit # 1: ANSWER by Zheng]
У жестов Tap должен быть параметр отмененTouchesInView установлен на НЕТ!
В моем случае выше эта строка решает все:
touch.cancelsTouchesInView = NO;
Большое спасибо Чжэн.
Ответы
Ответ 1
Я не знаю, работает ли это для вас или нет, но я дал ответ о событиях касания для просмотров внутри scrollview:
Отключение клавиатуры в UIScrollView
Идея состоит в том, чтобы сказать scrollView не проглатывать все жесты касания в области просмотра прокрутки.
Я буду вставлять код здесь в любом случае, надеюсь, он исправит вашу проблему:
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;
[pageScrollView addGestureRecognizer:tapGesture];
[tapGesture release];
...
// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
[myTextFieldInScrollView resignFirstResponder];
}
Ответ 2
Вы можете подклассифицировать свой UIScrollView и переопределить метод - hitTest:withEvent:
, который вызывается системой, чтобы определить, какое представление обработает событие. Всякий раз, когда он вызывается, вы можете предположить, что в представлении прокрутки произошло событие касания, и, вызвав супер-реализацию, вы можете получить представление, которое обычно обрабатывает событие.
Ответ 3
вы можете записывать любые жесты в UIscrollView. Убедитесь, что вы также обрабатываете некоторые свойства по умолчанию, а также устанавливаете для параметра cancelsTouchesInView значение false, по умолчанию оно истинно. Также дайте некоторые теги nos для ваших подходов, чтобы различать в селекторах. а также включить их взаимодействие с пользователем.
let tap = UITapGestureRecognizer (target: self, action:
селектор (didTapByUser (_)))