У меня есть UIView
трамплин как у iPhone. Я создал его с помощью UIScrollView
и UIButtons
. Я хочу отключить горизонтальную прокрутку в указанном scrollview. Хочу только вертикальную прокрутку. Как мне этого добиться?
ios
objective-c
uiscrollview
Рахул Вьяс
источник
источник
Ответы:
Вы должны установить
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 }
источник
Вы можете выбрать вид, а затем
Attributes Inspector
снять флажокUser Interaction Enabled
.источник
В моем случае ширина contentView была больше ширины UIScrollView, и это было причиной нежелательной горизонтальной прокрутки. Я решил это, установив ширину contentView равной ширине UIScrollView.
Надеюсь, это кому-то поможет
источник
У меня был tableview contentInset, установленный в viewDidLoad (как показано ниже), что вызывает горизонтальную прокрутку
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Проверьте, есть ли какой-либо tableview contentInset, установленный по разным причинам, и отключите его
источник
Я боролся с этим в течение некоторого времени, безуспешно пытаясь различные предложения в этом и других потоках.
Однако в другом потоке (не уверен, где) кто-то предположил, что использование отрицательного ограничения для UIScrollView сработало для него.
Поэтому я пробовал различные комбинации ограничений с противоречивыми результатами. Что в конечном итоге сработало для меня, так это добавить ведущие и конечные ограничения -32 к просмотру прокрутки и добавить (невидимое) текстовое представление шириной 320 (и по центру).
источник
Попробуй это:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight); [scrollView setContentSize: scrollSize];
источник
Отключите горизонтальную прокрутку, переопределив
contentOffset
свойство в подклассе.override var contentOffset: CGPoint { get { return super.contentOffset } set { super.contentOffset = CGPoint(x: 0, y: newValue.y) } }
источник
В 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 только с одной ячейкой, все заработало.
источник
Используйте эту единственную строку.
self.automaticallyAdjustsScrollViewInsets = NO;
источник