2010-03-18 3 views
4

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

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

ответ

12

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

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

+0

Brilliant. Ум-потрясающе блестящий. – Tyler

+0

Но какова реализация этого метода? Если это простое касание, 'UIScrollView' сделает его subview в качестве ответчика. Но если это событие прокрутки, 'UIScrollView' будет отвечать и обрабатывать событие прокрутки. Как реализовать в ней эту логику? –

+0

@EdwardAnthony, откровенно говоря через 7 лет после того, как я сказал бы, что добавление UIGestureRecognizers к вашему пользовательскому представлению - это, вероятно, правильный путь (вы можете проверить, что стандартный UIScrollView имеет несколько распознавателей жестов, прикрепленных по умолчанию) – Vladimir

3

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

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

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

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

+0

wow - это хорошая информация! – eugene

2

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

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 
}