在UIScrollView中禁用垂直滚动

jar*_*ryd 83 iphone uiscrollview ios

在IB中有一个选项可以取消选中滚动视图上的垂直滚动,但它似乎不起作用.

如何将scrollview设置为仅水平滚动,而不是在代码而不是IB中垂直滚动?

Mir*_*ner 137

从iOS7开始:

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

第二:在你的initWithNibName中:

self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)

而已.


pt2*_*ph8 119

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

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
Run Code Online (Sandbox Code Playgroud)

  • 每次更改帧时都必须更新. (4认同)
  • @fabb如何知道帧何时被更改? (2认同)

mer*_*nix 49

是的,pt2ph8的答案是对的,

但是如果由于某些奇怪的原因你的contentSize应该高于UIScrollView,你可以禁用实现UIScrollView协议方法的垂直滚动

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;
Run Code Online (Sandbox Code Playgroud)

只需在你的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)];
}
Run Code Online (Sandbox Code Playgroud)

它只是用户滚动UIScrollView时调用的方法,这样做会强制它的内容始终保持相同.y

  • 神!请不要在.m文件中声明oldY变量,如`float oldY;`参考上面的代码.这是每个应用程序的C风格变量符号,变量必须声明为控制器类的实例成员. (4认同)

Feb*_*n P 22

包括以下方法

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 19

您需要在内容大小上传递0以禁用您想要的方向.

禁用垂直滚动

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
Run Code Online (Sandbox Code Playgroud)

禁用水平滚动

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
Run Code Online (Sandbox Code Playgroud)


bol*_*onn 17

我更新了内容大小以禁用垂直滚动,并且仍然保持滚动的能力.然后我发现我也需要禁用垂直反弹,以完全禁用滚动.

也许有人也有这个问题.

  • 你的回答是我喜欢stackoverflow的原因!:-)圣烟......这让我疯了!你是对的.这是反弹效应.我想要弹跳效果,但不需要滚动时,所以我现在要在代码中禁用/重新启用该效果,具体取决于是否需要滚动. (2认同)
  • 好的,很容易在运行时启用/禁用 UIScrollView 上的弹跳。在我的情况下,我只关心滚动内容的高度,这做到了: self.scrollView.bounces = (BOOL)(self.scrollView.contentSize.height > self.scrollView.frame.size.height); (2认同)

小智 13

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

}
Run Code Online (Sandbox Code Playgroud)

你必须得到确认 UIScrollViewDelegate

aScrollView.delegate = self;
Run Code Online (Sandbox Code Playgroud)


小智 5

只需将 y 设置为始终位于顶部即可。需要符合UIScrollViewDelegate

func scrollViewDidScroll(scrollView: UIScrollView) {
        scrollView.contentOffset.y = 0.0
}
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*ael 5

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

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