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

Прокрутка UIScrollView только в одном направлении за раз

У меня есть UIScrollView, и я хочу, чтобы он мог прокручиваться в обоих направлениях (в настоящее время он), но только по одному. Так, например, если вы начнете прокручивать его по горизонтали, он не будет перемещаться вертикально вообще, пока вы не отпустите и не начнете перемещать его по вертикали. Как я могу это сделать?

4b9b3361

Ответ 1

Задайте для свойства directionalLockEnabled значение YES. Из документов Apple:

Если это свойство НЕТ, прокрутка разрешена в горизонтальном и вертикальном направлениях. Если это свойство ДА, и пользователь начинает перетаскивать в одном общем направлении (по горизонтали или по вертикали), вид прокрутки отключает прокрутку в другом направлении. Если направление перетаскивания является диагональным, прокрутка не будет заблокирована, и пользователь может перетащить в любом направлении до завершения перетаскивания. Значение по умолчанию: NO

Ответ 2

Принятый ответ на этот вопрос не совсем корректен. Согласно текущей документации для directionalLockEnabled (как указано в исходном ответе):

Если направление перетаскивания диагонально, прокрутка не будет заблокирована и пользователь может перетащить в любом направлении до завершения перетаскивания.

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

Для одного способа совершения истинной одноосной блокировки см. эту ссылку: http://bogdanconstantinescu.com/blog/proper-direction-lock-for-uiscrollview.html

Ответ 3

простой способ достичь этого - установить directionalLockEnabled в YES и реализовать делегат UIScrollerView, подобный этому

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.x != 0 &&
        scrollView.contentOffset.y != 0) {
        scrollView.contentOffset = CGPointMake(0, 0);
    }
}

Ответ 4

Это работало для меня на основе ответа @Joe xi. Swift 3.0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0 {
        scrollView.contentOffset = CGPoint(x: 0, y: 0)
    }
}