У меня есть UIScrollView, и я хочу, чтобы он мог прокручиваться в обоих направлениях (в настоящее время он), но только по одному. Так, например, если вы начнете прокручивать его по горизонтали, он не будет перемещаться вертикально вообще, пока вы не отпустите и не начнете перемещать его по вертикали. Как я могу это сделать?
Прокрутка UIScrollView только в одном направлении за раз
Ответ 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)
}
}