Кнопка UIB, которая игнорирует «перетаскивание» и передает его в UIScrollView - PullRequest
8 голосов
/ 13 мая 2011

Я знаю, что в Stack есть похожие посты, но ничего из того, что я нашел, не помогло мне найти решение.

  • У меня есть прокрутка , добавленная к UIView .
  • Я добавил UIButton к тому же UIView над просмотром прокрутки .

    1. Я хочу, чтобы кнопка UIB реагировала на касание и запускала событие.
    2. Если кто-то DRAGS на UIButton, я хочу, чтобы он передавал событие в scrollView и перетаскивал UIScrollView, не вызывая событие кнопки.

Я знаю, как передать прикосновение с помощью hitTest, возвращающего представление прокрутки, но это не дает ничего попасть в UIButton.

Я не хочу добавить UIButton в UIScrollView.

У кого-нибудь есть предложенное решение?

Ответы [ 4 ]

1 голос
/ 12 августа 2015

Попробуйте это: создайте подкласс UIScrollView, верните YES в методе touchesShouldCancelInContentView:.

1 голос
/ 28 июля 2011

Попробуйте добавить UIPanGestureRecognizer к UIBUtton.В обратном вызове, который вы указываете для обработки панорамирования (перетаскивания), вам не нужно ничего реализовывать.Затем установите cancelsTouchesInView на ДА.Это заставит вашу кнопку передавать жесты перетаскивания другим видам.

        UIPanGestureRecognizer *gr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan)];
        [gr setCancelsTouchesInView:YES];
        [myButton addGestureRecognizer:gr];
        [gr release];

А вот handlePan:

-(void)handlePan
{
    // Do nothing
}

Я столкнулся с аналогичной ситуацией, когда у меня был UIScrollView с двумя UIView подпредставлениями.Каждый UIView содержал UISlider.Я хотел поймать (и отбросить) вертикальные перетаскивания (вот где появился распознаватель жестов), но мне также потребовались горизонтальные прокрутки для работы в ползунке, как и следовало ожидать, и панорамирование вида прокрутки влево и вправо.Это было решение.(Распознаватель жестов был прикреплен к каждому UIView.)

1 голос
/ 07 июля 2011

Попробуйте это:

  1. Добавьте прозрачный, настраиваемый UIView размером с весь вид прокрутки contentSize к представлению прокрутки поверх всех остальных представлений. (Или, наоборот, сделайте его равным ширине / высоте представления прокрутки и просто перемещайте его при каждом перемещении представления прокрутки.) Когда представление прокрутки решает передать свои прикосновения своим подпредставлениям вместо перетаскивания, это будет первым делом hitTested.
  2. Переопределить метод hitTest для UIView. Проверьте, находится ли касание в пределах вашей рамки кнопки. Если это так, верните кнопку; если нет, верните ноль.

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

0 голосов
/ 28 июля 2011

Как объяснено в этом ответе , UIButton или другой UIControl, который является подпредставлением представления прокрутки, будет автоматически реагировать на нажатия, позволяя перетаскивать ручку представления прокрутки.Однако кнопки, которые являются подпредставлениями прокрутки, также будут перемещаться вместе с прокручиваемым контентом, а не оставаться в том же положении на экране, что и прокрутка контента под ними.Я предполагаю, что именно поэтому вы не хотите помещать кнопки в представление прокрутки.

Если это так, вы можете получить желаемое поведение еще одним шагом.Поместите все свои кнопки в UIView, который является подпредставлением представления прокрутки, затем в методе scrollViewDidScroll делегата представления прокрутки установите для frame.origin этого представления значение contentOffset представления прокрутки.Я только что реализовал это в своем приложении, и оно отлично работает, без необходимости делать подклассы или участвовать в цепочке респондента или сенсорных событиях.

...