У IB є можливість зняти прапорець вертикальної прокрутки в режимі прокрутки, але, схоже, це не працює.
Як можна встановити для прокручування перегляд лише горизонтально, а не вертикально в коді, а не IB?
У IB є можливість зняти прапорець вертикальної прокрутки в режимі прокрутки, але, схоже, це не працює.
Як можна встановити для прокручування перегляд лише горизонтально, а не вертикально в коді, а не IB?
Відповіді:
Спробуйте встановити висоту contentSize на висоту scrollView. Тоді вертикальну прокрутку слід відключити, тому що не було б чого прокручувати вертикально.
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
з iOS7:
по-перше: ширина розміру вмісту повинна дорівнювати ширині перегляду прокрутки
друге: у вашому initWithNibName:
self.automaticallyAdjustsScrollViewInsets = NO;
Це воно.
так, відповідь pt2ph8 правильна,
але якщо з якихось дивних причин розмір вашого вмісту повинен бути вищим, ніж UIScrollView, ви можете відключити вертикальну прокрутку, реалізуючи метод протоколу UIScrollView
-(void)scrollViewDidScroll:(UIScrollView *)aScrollView;
просто додайте це у свій UIViewController
float oldY; // here or better in .h interface
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
// or if you are sure you wanna it always on top:
// [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}
це просто метод, що викликається, коли користувач прокручує ваш UIScrollView, і, роблячи це, ви змушуєте вміст його мати завжди однаковий .y
float oldY;
посилання на наведений код. Це символ змінної в стилі C для кожної програми, змінна ПОВИННА бути оголошена як член екземпляра класу контролера.
Включіть наступний метод
-(void)viewDidLayoutSubviews{
self.automaticallyAdjustsScrollViewInsets = NO;
}
та встановіть ширину розміру вмісту подання прокрутки, рівну ширині подання прокрутки.
Вам потрібно передати 0 за розміром вмісту, щоб відключити, у якому напрямку ви хочете.
Щоб вимкнути вертикальну прокрутку
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
Щоб вимкнути горизонтальну прокрутку
scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
Я оновив розмір вмісту, щоб вимкнути вертикальну прокрутку, і можливість прокрутки все ще залишалася. Потім я зрозумів, що мені потрібно також відключити вертикальний відмов, щоб повністю відключити прокрутку.
Можливо, теж є люди з цією проблемою.
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];
}
ви, мабуть, підтвердили UIScrollViewDelegate
aScrollView.delegate = self;
Просто встановіть y, щоб він завжди був зверху. Потрібно відповідати UIScrollViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Це збереже ефект уповільнення / прискорення прокрутки.
У iOS 11, будь ласка, не забудьте додати наступне, якщо ви зацікавлені у створенні прокрутки, яка чіпляється до меж екрана, а не до безпечної зони.
if (@available(iOS 11.0, *)) {
[self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
З iOS11 можна використовувати наступну властивість
let frameLayoutGuide: UILayoutGuide
Якщо ви встановите обмеження для frameLayoutGuide.topAnchor і frameLayoutGuide.bottomAnchor для тих самих прив'язок деякого підвиду вашого scrollView тоді вертикальна прокрутка буде вимкнена, а висота scrollView буде дорівнює висоті її подання.
Найбільш очевидне рішення - заборонити зміни координат y у вашому підкласі.
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
super.contentOffset = CGPoint(x: newValue.x, y: 0)
}
}
Це єдине підходяще рішення в ситуаціях, коли:
Багато відповідей включають встановлення значення contentOffset
0. У мене був випадок, коли я хотів, щоб вид всередині scrollView був центрований. Це зробило роботу для мене:
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = -scrollView.contentInset.top
}