在UIScrollView中禁用垂直滚动


Answers:


121

尝试将contentSize的高度设置为scrollView的高度。然后,应该禁用垂直滚动,因为没有任何东西可以垂直滚动。

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

您节省了我很多时间来调试这个奇怪的问题。谢谢!
2013年

2
@fabb如何知道何时更换框架?
山姆

137

从iOS7开始:

首先:内容大小的宽度必须等于滚动视图的宽度

第二:在您的initWithNibName中:

self.automaticallyAdjustsScrollViewInsets = NO;

而已。


很棒的解决方案。像魅力一样工作。它会影响ViewController中其余视图的大小吗?(按钮,标签。)我的意思是,“ self”在我的情况下是一个UIViewController
voghDev 2014年

@voghDev否,它对滚动视图中的子视图没有影响。
Mirko Brunner 2014年

Amazing将其添加到出现问题的视图控制器上的viewdidload方法中。
StackRunner

如果您使用的是NavigationController,并且您的滚动视图位于navigationBar标题的后面,例如在viewDidLoad方法下的我的用法。解决。
EFE 2015年

1
您可以在情节提要设置中直接实现相同功能,而无需任何代码。只需选择滚动视图控制器,然后在属性检查器中取消选中“调整滚动视图插图”即可。
Morpheus78

49

是的,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


6
神!请不要在.m文件中声明oldY变量,例如float oldY;参考上面的代码。这是每个应用程序的C样式变量符号,必须将变量声明为控制器类的实例成员。
Itachi 2015年

21

包括以下方法

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

并将滚动视图的内容大小宽度设置为等于滚动视图的宽度。


1
这也可以在Storyboard中完成,方法是选择“视图控制器”,然后取消选中该属性
justColbs 2016年

1
我不喜欢它,因为它为所有滚动视图设置了它……希望您可以特定于图中的一个滚动视图,而
无需

20

您需要在内容大小上传递0才能禁用所需的方向。

禁用垂直滚动

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);

禁用水平滚动

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);

1
这会将视图的contentSize设置为在您设置的轴上为0。ContentSize指的是内容的大小,因此我们要传递屏幕的高度以禁用垂直滚动到该帧之外。标为正确的解决方案是正确的。
系统

这对我来说很好。将高度设置为contentSize的高度仍然可以使我垂直滚动。
KoreanXcodeWorker

1
这对我没有用。还尝试了self.automaticallyAdjustsScrollViewInsets
StackRunner

就是这个!设置为Scroll View的高度对我而言不起作用,但是确实如此
Echizzle

18

我更新了内容大小以禁用垂直滚动,并且仍然可以滚动。然后我发现我也需要禁用垂直反弹,以完全禁用滚动。

也许有些人也有这个问题。


你救了我。我的contentSize和frame相同,我一生都无法找出问题所在。谢谢一大堆!
yuf 2012年

2
您的答案就是为什么我喜欢stackoverflow!:-)神圣的烟雾...这让我发疯了!你是对的。这是反弹效果。我想要弹跳效果,但是不需要滚动时不需要,所以我现在打算根据是否需要滚动来在代码中禁用/重新启用该效果。
Erik van der Neut

2
好的,在运行时非常容易在UIScrollView上启用/禁用反弹。就我而言,我只在乎滚动内容的高度,这确实可以解决问题:self.scrollView.bounces =(BOOL)(self.scrollView.contentSize.height> self.scrollView.frame.size.height);
Erik van der Neut

12
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

您必须已确认 UIScrollViewDelegate

aScrollView.delegate = self;

4

只需将y设置为始终位于最前面即可。需要符合UIScrollViewDelegate

func scrollViewDidScroll(scrollView: UIScrollView) {
        scrollView.contentOffset.y = 0.0
}

这将保持滚动的减/加速效果。


4

在iOS 11上,如果您有兴趣创建固定在屏幕边界而不是安全区域的滚动视图,请记住添加以下内容:

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

1
毕竟。谢谢千倍先生!您保存了我的一天
ha100

0

iOS11开始,可以使用以下属性

let frameLayoutGuide: UILayoutGuide

如果您设置的限制frameLayoutGuide.topAnchorframeLayoutGuide.bottomAnchor到一些相同的锚子视图您的滚动视图,然后垂直滚动将被禁用和高度滚动视图将等于其子视图的高度。


0

最明显的解决方案是禁止子类中的y坐标更改。

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: newValue.x, y: 0)
  }
}

在以下情况下,这是唯一合适的解决方案:

  1. 您被禁止或者只是不想使用委托。
  2. 您的内容高度大于容器高度

0

很多答案都包括将设置contentOffset为0。我有一种情况,我想让scrollView内的视图居中。这为我做了工作:

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.