В IB есть возможность снять флажок с вертикальной прокрутки при просмотре прокрутки, но, похоже, это не работает.
Как можно настроить scrollview для прокрутки только по горизонтали, а не по вертикали в коде, а не в IB?
В IB есть возможность снять флажок с вертикальной прокрутки при просмотре прокрутки, но, похоже, это не работает.
Как можно настроить scrollview для прокрутки только по горизонтали, а не по вертикали в коде, а не в IB?
Ответы:
Попробуйте установить высоту contentSize равной высоте scrollView. Затем следует отключить вертикальную прокрутку, потому что вертикально прокручивать нечего.
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
начиная с iOS7:
сначала: ширина размера содержимого должна быть равна ширине вашего прокрутки
второй: в вашем initWithNibName:
self.automaticallyAdjustsScrollViewInsets = NO;
Это оно.
да, ответ pt2ph8 правильный,
но если по какой-то странной причине ваш contentSize должен быть выше, чем 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
}