У меня есть UIView
трамплин как у iPhone. Я создал его с помощью UIScrollView
и UIButtons
. Я хочу отключить горизонтальную прокрутку в указанном scrollview. Хочу только вертикальную прокрутку. Как мне этого добиться?
У меня есть UIView
трамплин как у iPhone. Я создал его с помощью UIScrollView
и UIButtons
. Я хочу отключить горизонтальную прокрутку в указанном scrollview. Хочу только вертикальную прокрутку. Как мне этого добиться?
Ответы:
Вы должны установить contentSize
свойство UIScrollView
. Например, если ваш UIScrollView
размер составляет 320 пикселей (ширина экрана), вы можете сделать это:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Затем он UIScrollView
будет прокручиваться только по вертикали, потому что он уже может отображать все по горизонтали.
ОБНОВЛЕНО: (после того, как @EranMarom указал на свой комментарий)
Вы можете остановить горизонтальную или вертикальную прокрутку в ScrollViewDelegate
методе. Вот как,
Останавливает горизонтальную прокрутку:
Если вы хотите прокручивать по горизонтали, вам нужно увеличить contentOffset.x. Предотвращение остановки прокрутки в горизонтальном направлении.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
Останавливает вертикальную прокрутку:
Если вы хотите прокрутить по вертикали, вам нужно увеличить contentOffset.y. Предотвращение остановки прокрутки в вертикальном направлении.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Приведенный выше код предотвращает изменения в x
и y
из scrollview contentOffset
и это приводит к остановить прокрутку в scrollViewDidScroll:
методе.
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
для отключения горизонтальной прокрутки. Я считаю его более читаемым, он меньше по размеру, и нет смысла проводить тест на ноль, потому что практически нет накладных расходов на код, который запускается так редко (то есть несколько десятков раз в секунду максимум).
scrollView.contentOffset.y = 0.0
чтобы остановить вертикальную прокрутку и scrollView.contentOffset.x = 0.0
остановить горизонтальную прокрутку в scrollViewDidScroll()
функции делегата. Однако я считаю, что проверка scrollView.contentSize
равенства scrollView.frame.size
- лучшее (правильное) решение. См. Ответ @danbeaulieu.
с iOS7 использовать
self.automaticallyAdjustsScrollViewInsets = NO;
// и создадим вам скроллер с 3 страницами
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
помогли решить проблему с плавной прокруткой (не перетаскиванием). Проблема заключалась в методе scrollViewWillEndDragging:
- targetContentOffset был таким же, как scrollView.contentOffset, и логика обнаружения страницы не работает должным образом.
Быстрое решение
Создайте два выхода, один для вашего представления и один для представления прокрутки:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Затем в вашем viewDidLayoutSubviews вы можете добавить следующий код:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Мы собрали высоту и ширину представления и установили соответствующий размер содержимого scrollViews. Это остановит вашу прокрутку от горизонтальной прокрутки.
Еще мысли:
CGSizeMake принимает ширину и высоту с помощью CGFloats. Возможно, вам потребуется использовать существующую высоту UIScrollViews для второго параметра. Это выглядело бы так:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
В моем случае с Swift 4.2 вы можете использовать:
Отключить вертикальную прокрутку:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Отключить горизонтальную прокрутку:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
В моем случае ширина contentView была больше ширины UIScrollView, и это было причиной нежелательной горизонтальной прокрутки. Я решил это, установив ширину contentView равной ширине UIScrollView.
Надеюсь, это кому-то поможет
У меня был tableview contentInset, установленный в viewDidLoad (как показано ниже), что вызывает горизонтальную прокрутку
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Проверьте, есть ли какой-либо tableview contentInset, установленный по разным причинам, и отключите его
Я боролся с этим в течение некоторого времени, безуспешно пытаясь различные предложения в этом и других потоках.
Однако в другом потоке (не уверен, где) кто-то предположил, что использование отрицательного ограничения для UIScrollView сработало для него.
Поэтому я пробовал различные комбинации ограничений с противоречивыми результатами. Что в конечном итоге сработало для меня, так это добавить ведущие и конечные ограничения -32 к просмотру прокрутки и добавить (невидимое) текстовое представление шириной 320 (и по центру).
В iOS 11 добавлено новое свойство UIScrollView
var contentLayoutGuide: UILayoutGuide
В документации указано, что вы:
Используйте это руководство по макету, если вы хотите создать ограничения автоматического макета, связанные с областью содержимого прокрутки.
Наряду с другими ограничениями Autolayout , которые могут быть добавляющими вы хотите ограничить widthAnchor
из UIScrollView
«с contentLayoutGuide
таким же размером , как„кадр“. Вы можете использовать frameLayoutGuide
ширину (также введенную в iOS 11) или любую внешнюю ширину (например, вашу superView
.)
пример:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Документация: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Как только я сделал это, заменив UIScrollView на UITableView только с одной ячейкой, все заработало.