UIScrollView无法滚动!

18

我在IB中有我的UIView。然后我有一个带UIScrollView为子视图的子UIView。然后UIScrollView有一个子UIImageView。UIScrollView和UIImageView的尺寸相同。它们比它们所属的父UIView要大得多。我以为这会使滚动工作。但是它并没有。是否需要某种代码才能使滚动视图工作?

11个回答

33

您需要设置UIScrollView.contentSize以匹配可滚动的总大小,这在此情况下是您的子视图框架大小。


1
我猜是这样。在IB中从未见过这种情况。 - tia
非常感谢。这真的帮了我很多。如果我没有找到这个,我本来考虑重新设计我的界面。 - Andrew
@Sha 内容插入是指插入的内容,不同于边框。 - tia
1
@Sha 使用API的第一条规则是应该按照API开发者建议的方式使用,否则现在或将来或在您没有想象到的情况下可能会出现问题。在这种情况下,内容插图用于内容填充,因此不应该用于调整内容区域。有什么不同吗?当然有。内容插图始终是固定的,即使缩放,这意味着如果您启用滚动视图的缩放,则在缩放时内容将被裁剪,并且在缩小时填充过多。 - tia
19
一个更好的问题可能是,为什么UIScrollView不能根据其子视图自行解决这个问题? - aroth
显示剩余3条评论

15

如已经在接受的答案中提到的,您必须设置UIScrollViewcontentSize属性。

这可以通过界面生成器来完成。

  1. 选择滚动视图
  2. 在右侧工具窗格中选择“标识检查”
  3. 在“用户定义的运行时属性”下单击“+”按钮
  4. 将“Key Path”值设置为“contentSize”
  5. 将“Type”值设置为“Size”
  6. 将“Value”值设置为“{width, height}”(例如:“{320, 600}”)

构建并运行,您的滚动视图将会滚动。

内容插入不影响滚动。请参阅UIScrollView contentInset属性是用来做什么的?


1
这个完美地运作了,是如何实现tia的初始答案的优秀解释! - Ryan
多好的答案! - HalR
你可以检测屏幕尺寸并使用它,对吧? - Brenden
@Brenden 在“用户定义的运行时属性”窗口中如何实现这一点? - Greg Hilston
最好以编程方式完成此操作,这样您可以考虑屏幕尺寸。 - Ethan Zhao
显示剩余3条评论

7

要滚动,您需要使滚动视图的框架小于其内容,即包含的图像或视图。


尝试过了,但没有成功。ScrollView的子视图(UIImageView)比ScrollView大。 - Marty
你是否将内容大小设置为与图像大小匹配?如果没有,那么你只是在裁剪图像...没有留下可以滚动的内容。 - hotpaw2
我在IB中设置了框架大小,这是你的意思吗?但我没有使用代码做任何事情。 - Marty
据我所知,内容大小是在框架内滚动的。您需要将其设置为大于框架的图像大小。 - hotpaw2
说得好!我正在改变滚动视图的宽度以及其内容大小。这不应该发生。 - Ahmed Elashker

4

这可能对大多数人来说很明显,但我花了很长时间才想明白为什么我的UIScrollView无法滚动,所以我在这里发布我遇到的问题,以帮助其他人:

UIScrollView必须具有您希望其呈现的可见区域的尺寸,而不是其内容的大小。

我知道这很荒谬,但如果能帮助到某个人的话,那就好了。


只是为了澄清一下:UIScrollView 应该是你想要在屏幕上显示的大小,而该滚动视图的 contentSize 属性应该设置为将要滚动的区域(内容)的大小。如果其 contentSize 小于或等于其框架大小,则滚动视图不会滚动。 - Olie

3

我通过以下答案解决了滚动问题:

https://dev59.com/mF8e5IYBdhLWcg3wNIJp#39945124

对我而言,诀窍是:

  1. 现在您需要设置内容UIView的高度。 您可以指定内容视图的高度(不好)或通过确保底部控件约束到内容视图的底部来使用其中包含的控件的高度。

我已经设置了scrollView内部视图的高度和宽度,并且使用了垂直和水平居中对齐,这就是为什么没有起作用的原因!

删除这些约束后,我需要添加相等的宽度(scrollView和scrollView内部视图),并且直接使用内容设置scrollView内部视图的高度。 这意味着:视图中的最后一个元素必须具有与视图的底部相关的约束!!


3

我把我的scrollview中的所有内容都放在IB(即Interface Builder)中。包括按钮、标签、文本框等。整个视图的高度为500。

然后在IB中,我将其调整为436的高度。

接着,在代码中,我在viewDidLoad方法中添加了以下代码:

optionsScrollView.contentSize = CGSizeMake(320,500);

那么我可以滚动的像素就剩下64个。它完美地工作。

我还在.h文件的@interface括号中放置了"UIScrollViewDelegate",并将滚动视图的代理输出口连接到IB中的文件所有者。


2
在这里没有提到的另一个重要事项是UIScrollView与自动布局(AutoLayout)不兼容。如果你觉得已经做了一切正确的事情,请检查你的ViewController是否已经打开了自动布局,如果是,请关闭它。(每次滚动时,视图都会重新布局,太可怕了!)
所以:
- 确保scrollview的contentSize比其frame.size大。 - 确保ViewController的自动布局(AutoLayout)已关闭。

1

更多,你启用了滚动吗? 查看属性

@property(nonatomic, getter=isScrollEnabled) BOOL scrollEnabled

1

请确保以下三点:

  • 检查scrollView的frame和contentView的frame,你可能会找到答案

  • scrollView.isScrollEnabled = true

  • scrollView的contentView的高度未与scrollView的高度进行约束


1

UIScrollView无法滚动!

  • 原因:contentSize与(子)视图相同
    • 应该:contentSize比(子)视图
      • -> UIScrollView 可以滚动

如何设置UIScrollView的contentSize?

两种方法:

在代码中

- (void)viewDidLoad {
    [super viewDidLoad];
    。。。
    //[(UIScrollView *)self.view setContentSize:CGSizeMake(375, 1000)];
    CGSize curScreenSize = UIScreen.mainScreen.bounds.size;
    CGFloat scrollWidth = curScreenSize.width;
    CGFloat scrollHeight = curScreenSize.height * 2;
    [(UIScrollView *)self.view setContentSize:CGSizeMake(scrollWidth, scrollHeight)];

在UI中(Storyboard)

故事板 -> 身份验证检查器 -> 用户定义的运行时属性 -> 添加新属性:

  • 内容大小
    • 类型:大小
    • 值:{375, 1000}

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接