Подтвердить что ты не робот

Обнаружение события касания на 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;

Большое спасибо Чжэн.

4b9b3361

Ответ 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 (_)))