Нажмите на uibutton внутри изображения, внутри прокрутки - PullRequest
0 голосов
/ 06 марта 2012

В моем приложении у меня есть UIScrollview, в котором пользователь может просматривать карту (.PNG) a UIImageView.UIScrollView используется для управления панорамированием и прокруткой по карте.

Я хочу, чтобы пользователь мог «добавлять» дополнительные точки интереса (кнопки) на карту, когда они касаются ее, чтобы сделатьДля этого я добавил прослушиватель касаний на UIScrollView;

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];

[myScrollview addGestureRecognizer:tap];

. Когда регистрируется касание, я создаю кнопку UIB и добавляю эту кнопку UIImageView внутри UIScrollView:

   [plattegrondImageview addSubview:plattegrondPunt];

Таким образом, элемент хорошо прокручивается вместе с изображением (остается на месте при заданных координатах).Пока все хорошо.

Тем не менее, теперь я хочу, чтобы пользователь мог нажать «кнопку» (а затем открыть всплывающее окно для ввода комментария, например).

У меня естьдобавили цель к кнопке для прослушивания касания:

[poi addTarget:self action:@selector(puntTap:) forControlEvents:UIControlEventTouchUpInside];

Теперь к проблеме:

Всякий раз, когда пользователь нажимает на кнопку, селектор (puntTap) срабатывает правильно, нотакже срабатывает основной жест касания UIScrollview.

Таким образом, открывается не только представление popover, но и дополнительный элемент UIButton, помещаемый на экран.

Теоретически логично, что UIScrollview также регистрирует ответвление, но в этом случае это нежелательное поведение.Когда пользователь нажимает на UIButton внутри scrollview, сам scrollview не должен отвечать.

Для визуализации слоев:

-> UIScrollview

-----> UIImageView

----------> UIButton

Я уже включил следующие свойства для просмотра прокрутки;

myScrollview.userInteractionEnabled = YES;
myScrollview.canCancelContentTouches = YES;
myScrollview.delaysContentTouches = YES;

Полагаю, я мог бы сделать что-то вроде хит-теста (с жестом касания UIScrollview), чтобы проверить, не нажата ли кнопка - но, может быть, у кого-то естьЧистое решение?

(Если что-то неясно относительно способа настройки экрана, скажите, пожалуйста)

Суммировано : когда пользователь нажимает на UIButton, GestureRecognizer из scrollview также стреляет!

Ответы [ 4 ]

1 голос
/ 06 марта 2012

Вы можете установить userInteractionEnabled для scrollView в False / No в начале прикосновения uibutton и повторно включить его в прикосновении uibuttonEnded.

другой, возможно, лучший вариант - установить для свойства uibutton exclusiveTouch значение YES.

Изменить: только что видел ваш комментарий выше. Похоже, что прикосновение распространяется на ваш uibutton из прокрутки. В этом случае вам, возможно, придется проверять координаты касания в просмотре прокрутки и добавлять новые кнопки только в том случае, если кнопка не существует в этой области (вероятно, хорошая идея идентификатора в любом случае?). Я предполагаю, что вы сохраняете расположение кнопок, так как это просто проверить текущий список.

1 голос
/ 06 марта 2012

Просто идея (не проверено):

Если вы хотите придерживаться своих GesutureRecognizer, попробуйте использовать другой на кнопке, вместо того, чтобы устанавливать цель напрямую.Таким образом, вы можете настроить первый распознаватель на отмену другого:

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

Другая идея состоит в том, чтобы перезаписать hitTest: путем подкласса UIScrollView для проверки,если кнопка нажата.

0 голосов
/ 06 марта 2012

Я думаю, что проблема вызвана нашей неполной реализацией цепочки респондента.

Поскольку вы зарегистрировали UIScrollView для tapGesture, поэтому он будет обрабатывать все жесты касания, которые выполняются на нем.Но он также будет обрабатывать жесты, которые выполняются на его subviews, но не обрабатываются сами по себе.В вашем случае кнопка попадет в категорию подпредставления, так как ее немедленное superview (imageView) не отвечает на это событие, поэтому сенсорное событие перейдет в просмотр прокрутки.

Но в настоящее время button зарегистрирован только для события касания типа UIControlEventTouchUpInside и не для всех событий касания, поэтому другой UIControlEvents будет передан отвечающему superview, в данном случае UIScrollView.

Итак, если button handles all types of touch event, то он не будет запрашивать у superview их обработки.

0 голосов
/ 06 марта 2012

Установите это свойство для кнопки.

myButton.exclusiveTouch = YES;

, чтобы предотвратить перемещение касания для просмотра под ним.

...