Подтвердить что ты не робот

Ios 8 - кнопки в горизонтальном прокрутке, перехватывающие событие панорамы - прокрутка не работает

У меня есть горизонтальное представление прокрутки с помощью строки кнопок. Прокрутка не будет прокручиваться, если я не сделаю очень быстрое прокручивание.

Если я устанавливаю кнопки userInteractionEnabled = NO, прокрутка работает так, как ожидалось, но, конечно же, кнопки не работают вообще.

Это приложение отлично работало в iOS 7 и ранее. Кажется, это iOS 8 "feature". Я заметил, что я могу поймать событие перетаскивания кнопок, но я не знаю, как перенаправить его обратно в scrollView.

Я думаю, что мне нужно будет заменить мои кнопки на UIViews и самостоятельно управлять событиями, но я был бы признателен, если бы у кого-то были другие идеи или решения.

4b9b3361

Ответ 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;
}

Надеюсь, что это сработает для вас.