UIButton внутри UIScrollView не срабатывает при нажатии - PullRequest
23 голосов
/ 28 июня 2010

Кнопка UIB внутри UIScrollView не срабатывает при нажатии. Пожалуйста, помогите решить.

 // Add a button
 UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
 btn1.frame = CGRectMake(0, 0, 26, 18); 
 btn1.bounds = CGRectMake(0, 0, 30.0, 30.0); 
 [btn1 addTarget:self action:@selector(buttonClick1:) 
                      forControlEvents:UIControlEventTouchUpInside];
 [scrollView addSubview:btn1];


- (void)buttonClick1:(id)sender {
     int dd = 4; 
 }

Ответы [ 6 ]

15 голосов
/ 08 октября 2010

Я нашел этот материал:

Но прокрутка заблокирует касается кнопки, если вы не установили userInteractionEnabled и Свойства exclusiveTouch для NO на Scrollview. Но это победит Цель прокрутки внутри кнопка, я думаю.

(См. Можем ли мы поместить UIButton в UIScrollView и наоборот в iPhone )

Но как это сделать?

Скажем, у вас есть UIScrollView * sv ... then

sv.userInteractionEnabled = YES;
sv.exclusiveTouch = YES;

Я бы тоже добавил

sv.canCancelContentTouches = YES;
sv.delaysContentTouches = YES;
12 голосов
/ 08 апреля 2013

Вы должны установить размер содержимого вашего просмотра.Это должно быть больше или равно размеру содержимого scrollView.

Поскольку размер вашего представления по умолчанию составляет 320 x 480 (сетчатка 3,5 ") и 320 x 568 (сетчатка 4").Таким образом, увеличение высоты просмотра как:

self.view.frame=CGRectMake(0, 0, 320, 700);

Затем добавление этого в качестве подпредставления вашего scrollView приведет вас к решению.

6 голосов
/ 06 августа 2014

СТАРЫЙ ОТВЕТ: Все, что мне нужно было сделать в iOS 7, было установлено

[_scrollView setDelaysContentTouches:NO];

ОБНОВЛЕНИЕ: После небольшого исследования выясняется, что если ваша проблема заключается в том, что клик UIButton кажется только вызванным иногда , то это, вероятно, на самом деле желаемый поведение внутри UIScrollView. UIScrollView использует свойство delaysContentTouches , чтобы автоматически определять, пытался ли пользователь прокрутить или пытался нажать кнопку в представлении прокрутки. Я бы предположил, что лучше не изменять это поведение по умолчанию на NO, так как это приведет к невозможности прокрутки, если палец пользователя находится над кнопкой.

4 голосов
/ 30 января 2017

Я столкнулся с той же проблемой: вместо добавления кнопки в представление контейнера я добавил ее в представление прокрутки в верхней части представления контейнера:

scrollView.insertSubview(buttonA, aboveSubview: containerView)

Myструктура была:

-View
--ScrollView
---ContainerView

Я надеюсь, что это может помочь любому.

3 голосов
/ 11 марта 2018

У меня была та же структура, что и у Джованни, и я использую Snapkit. Моя проблема заключалась в том, что мой ContainerView на самом деле имел высоту 0. Я смог это заметить, установив ClipsToBounds = true в ContainerView (ничего не отображалось после этого, поскольку у границ была высота 0).

Любое представление за пределами родительских представлений не будет обрабатываться внутри событий.

Мое исправление состояло в том, чтобы установить левый правый и нижний якорь ContainerView равным View, а верхний - ScrollView (верхняя часть моего ScrollView смещена от моего корневого View).

1 голос
/ 21 июня 2017

Это работает для меня в iOS 10

scrollView.delaysContentTouches = false

От Apple:

Логическое значение, которое определяет, задерживает ли представление прокрутки обработку жестов касания.

https://developer.apple.com/documentation/uikit/uiscrollview/1619398-delayscontenttouches

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...