Ios 8 - кнопки в горизонтальном прокрутке, перехватывающие событие панорамы - прокрутка не работает
У меня есть горизонтальное представление прокрутки с помощью строки кнопок. Прокрутка не будет прокручиваться, если я не сделаю очень быстрое прокручивание.
Если я устанавливаю кнопки userInteractionEnabled = NO, прокрутка работает так, как ожидалось, но, конечно же, кнопки не работают вообще.
Это приложение отлично работало в iOS 7 и ранее. Кажется, это iOS 8 "feature". Я заметил, что я могу поймать событие перетаскивания кнопок, но я не знаю, как перенаправить его обратно в scrollView.
Я думаю, что мне нужно будет заменить мои кнопки на UIViews и самостоятельно управлять событиями, но я был бы признателен, если бы у кого-то были другие идеи или решения.
Ответы
Ответ 1
Я обнаружил, что в iOS 8 UIScrollView, лежащий в основе UIPanGestureRecognizer, не соблюдает свойство UIScrollView delayaysContentTouches. Я считаю это ошибкой iOS 8. Вот мой способ:
theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
Ответ 2
У меня была эта проблема с UITableView, на котором пользовательский UITableViewCells с UIButtons на нем. Я поместил это в свой класс UITableview.
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
Решила мою проблему.
EDIT: просто чтобы очистить, вы можете создать подкласс UIScrollview и добавить это, чтобы решить проблему.
Ответ 3
Этот хак работает для меня:
UITapGestureRecognizer *nothingTap = [[UITapGestureRecognizer alloc] init];
nothingTap.delaysTouchesBegan = YES;
[_scrollView addGestureRecognizer:nothingTap];
кредит: https://devforums.apple.com/thread/241467
Ответ 4
Я сделал подкласс UIScrollView
, чтобы исправить эту проблему. Вам нужен только этот метод:
- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
{
UITouch *touch = [touches anyObject];
if(touch.phase == UITouchPhaseMoved)
{
return NO;
}
else
{
return [super touchesShouldBegin:touches withEvent:event inContentView:view];
}
}
Тогда просто не забудьте установить класс в свой подкласс в раскадровке, если вы используете его, и вам хорошо идти.
Ответ 5
У меня такая же проблема, и я решил ее, создав подкласс UIScrollView
и установив значение cancelContentTouches
в TRUE
и его работоспособность.
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
Надеюсь, что это сработает для вас.