У мене є UIView
схожий на трамплін iPhone. Я створив його за допомогою UIScrollView
і UIButtons
. Я хочу відключити горизонтальну прокрутку на вказаному прокручуваному перегляді. Я хочу лише вертикальну прокрутку. Як мені це досягти?
У мене є UIView
схожий на трамплін iPhone. Я створив його за допомогою UIScrollView
і UIButtons
. Я хочу відключити горизонтальну прокрутку на вказаному прокручуваному перегляді. Я хочу лише вертикальну прокрутку. Як мені це досягти?
Відповіді:
Ви повинні встановити 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
a, 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.
Сподіваюся, це допоможе комусь
Я певний час боровся з цим, безуспішно намагаючись різні пропозиції в цій та інших темах.
Однак в іншому потоці (не впевнений де) хтось припустив, що використання негативного обмеження на UIScrollView спрацювало для нього.
Тож я спробував різні комбінації обмежень з непослідовними результатами. Що врешті-решт у мене спрацювало, це додати провідні та кінцеві обмеження -32 до перегляду прокрутки та додати (невидимий) перегляд тексту шириною 320 (і по центру).
Введено в iOS 11 - це нова властивість на UIScrollView
var contentLayoutGuide: UILayoutGuide
У документації зазначено, що ви:
Використовуйте цей посібник із макету, коли ви хочете створити обмеження для автоматичного макета, пов’язані з областю вмісту подання прокрутки.
Поряд з будь-якими іншими обмеженнями авторозкладки, які ви могли б додати, ви хочете обмежити widthAnchor
значення UIScrollView
'' s 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 лише з 1 коміркою, він працював нормально.