Как UIScrollView крадет прикосновения из его подпредставлений? - PullRequest
5 голосов
/ 18 марта 2010

Я хотел бы иметь возможность создавать свои собственные контейнерные подклассы UIView, которые могут реагировать сначала на прикосновения, а не на их подвиды. Это сложно, потому что обычно подпредставление получает сенсорные события (через touchesBegan: и т. Д.) Перед суперпредставлением. Как UIScrollView меняет это?

Чтобы было ясно, я не спрашиваю, как UIScrollView ведет себя . Я понимаю, что он делает, и как вы обычно его используете. Я спрашиваю о том, как я мог бы реализовать мою собственную версию этого - не потому, что я хочу, а потому, что я пытаюсь создать многоразовые представления контейнеров, которые используют подобное поведение.

Ответы [ 3 ]

13 голосов
/ 18 марта 2010

Вы можете реализовать метод hitTest:withEvent: в своем подклассе UIView.

Этот метод вызывается для проверки того, какое подпредставление должно получить событие касания, чтобы вы могли выполнить какое-то действие до того, как оно действительно произойдет. Вы также можете изменить подпредставление, которое должно получить событие.

3 голосов
/ 18 марта 2010

[ Редактировать: Хорошо, я как-то прочитал вопрос как прямо противоположный тому, что на самом деле задавали. Я оставлю это здесь, если кому-то интересно, но это не относится к актуальному вопросу - TechZen]

Вид прокрутки перемещается как по горизонтали, так и по вертикали, поэтому он должен сэмплировать все касания, чтобы увидеть, касаются ли они прокрутки.

Например, у вас есть ползунок в виде прокрутки, который прокручивается по горизонтали. Пользователь касается слайдера. Касание предназначено для скольжения слайдера или это начало горизонтальной прокрутки? Какой должен иметь приоритет?

Несмотря на то, что программно цепочка респондента перемещается от самого нижнего вида (наиболее визуально сверху) вверх по цепочке, пока не находит объект, с которым он имеет дело, за кулисами обработка местоположения касания идет от самого верхнего вида ( который является окном приложения) вниз. Большинство представлений просто пересылают эту информацию подпредставлениям, которые затем активируют, а затем отправляют событие в цепочку респондента для обработки. Поскольку прокрутка всего представления является особым событием, которое на самом деле не относится к обычной цепочке респондента, представление прокрутки перехватывает нижний проход местоположения касания, чтобы определить, нужно ли выполнять прокрутку, прежде чем передать местоположения касания в подпредставления.

2 голосов
/ 17 апреля 2012

Вот очень простой способ, но эффективный

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard:)];
gestureRecognizer.delegate = self;
[scrollView addGestureRecognizer:gestureRecognizer];

-(void) hideKeyBoard:(id) sender
{
   // Do whatever such as hiding the keyboard
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...