Одиночное нажатие не обнаруживается на динамически созданных uibuttons

Необходимо было создать подкласс UIButton, назовем его subButton. Эти subButtons создаются один за другим и динамически добавляются в объект UIScrollView.

К сожалению, subButtons не реагируют должным образом. После прокрутки от первых динамически сгенерированных подкнопок и последующего возврата к ним. Они теряют свою реакцию на одиночное постукивание. Я не могу объяснить это поведение. Может кто-нибудь объяснить, почему он так себя ведет?

Большое спасибо.

Исходный код

self.subButton = [[SubButton alloc]initWithFrame:CGRectMake(69.5, y, 201, 114)];
[self.subButton setBackgroundColor:[UIColor blueColor]];
self.subButton.imageData = imageData;
self.subButton.videoPath = videoPath;
self.subButton.vidIndex = _indexVideo +1;
[self.subButton drawVidPreview];
[self.subButton setTag:(_indexVideo +1)];
[self.subButton addTarget:self action:@selector(handleSingleTap:) forControlEvents:UIControlEventTouchUpInside];
[self.videoScroll addSubview:self.subButton];
[_videoPreviews addObject:self.subButton];

Метод subButton drawVidPreview добавляет к себе несколько подпредставлений.


person BCI    schedule 12.12.2013    source источник
comment
Можете добавить код своих кнопок?   -  person amb    schedule 12.12.2013


Ответы (3)


Кнопки вообще не реагируют или просто не на одинарное нажатие? Это может помочь нам помочь вам.

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

person Fluffhead    schedule 12.12.2013
comment
Это хорошие вопросы. На самом деле они реагируют на одиночные нажатия, если я изменю код на [self.subButton addTarget:self action:@selector(handleSingleTap:) forControlEvents:UIControlEventTouchUpOutside]; Но реакция слишком чувствительна. Это конфликтует с прокруткой. - person BCI; 12.12.2013
comment
Да мне нужны обе строчки, скорее всего от незнания в этом плане. Я не знаю, как получить подпредставления объекта UIScrollview, поэтому я добавляю их в NSMutableArray, чтобы иметь возможность изменять их положение при выборе. - person BCI; 12.12.2013
comment
Может быть, попробуйте: UIControlEventTouchDown, посмотрите, как это работает для вас. - person Fluffhead; 13.12.2013
comment
Спасибо, именно это я и имел в виду, у меня не сработало. Как тот (UIControlEventTouchUpOutside) я случайно записал. - person BCI; 13.12.2013

Убедитесь, что вы не добавляете один и тот же экземпляр UIGestureRecognizer ко всем UIButtons, вместо этого для каждого UIButton вам нужно добавить отдельный экземпляр, однако все экземпляры жестов могут указывать на одну и ту же цель.

person Balram Tiwari    schedule 12.12.2013
comment
Спасибо за напоминание, но это не так. - person BCI; 12.12.2013

Наконец-то я смог решить проблему. Причина, по которой первые подкнопки не реагировали на одиночное касание с помощью UIControlEventTouchDown, заключается в том, что для смещения содержимого uiScrollview было установлено отрицательное значение y. Это прежде всего было не нужно и делалось из чистой лени. Я исправил это, придав ему положительное значение.

Итак, мой вывод: если вы неправильно установите смещение содержимого или размер содержимого scrollView, некоторые динамически добавленные кнопки в scrollView могут не реагировать на нажатие соответствующим образом. Это даже в том случае, если все кнопки полностью размещены на объекте uiScrollview.

Это я мог подтвердить, поэкспериментировав с размером содержимого экземпляра uiScrollview. Я изменил размер значения y экземпляра uiScrollviews всего на несколько пунктов, а затем некоторые из последних кнопок больше не реагировали на нажатие.

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

person BCI    schedule 13.12.2013