无法将 UIScrollView 添加到视图的一部分

Posted

技术标签:

【中文标题】无法将 UIScrollView 添加到视图的一部分【英文标题】:Can't add a UIScrollView to a part of the view 【发布时间】:2014-01-30 19:49:42 【问题描述】:

UIViewController 中,我需要让下半部分可滚动。所以我添加了一个UIScrollView 并将其放置在视图高度的中间位置。而在viewDidAppear方法中,我放了下面两行代码让它可以滚动。

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

如果滚动视图填满整个视图,这种方式有效,我已经测试过了。但是这种方法不能满足我的需要。滚动视图会自动向上移动并占据整个屏幕。我认为这是导致此问题的第二行代码。

所以我删除了滚动视图,在视图控制器中添加了两个UIViews。在底部视图中,我添加了UIScrollView。在viewDidAppear 方法中,我将相同的两行代码更改为第二行以引用包含滚动视图的UIView 的框架。

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

但它也不会滚动。

谁能告诉我如何正确地做到这一点?

谢谢。

【问题讨论】:

viewDidAppear 似乎是设置框架的错误位置。请改用 viewDidLoad。加上CGSizeMake(self.view.frame.size.width, self.scrollView.frame.size.height); 如果证明的尺寸不大于 scrollView 尺寸,它不会滚动。检查那些。 @JeslyVarghese 小进步。在我将代码移动到 viewDidLoad 之前,它看起来像 this。但之后,它变成了this。但遗憾的是它仍然没有滚动。我检查了self.scrollView.frame.size.height,它大于视图的高度。 @Isuru Dude,大声笑不要为您的内容大小设置绝对值。您不希望代码中到处都是幻数,这会使您的应用程序对下一个程序员不可读。最好根据滚动视图中实际内容的大小来设置它,以便滚动视图始终滚动以覆盖其中的所有内容。 @Isuru:我可能错了。但暂时关闭自动布局。 @Isuru 另外,请记住,只有在 contentsize 大于滚动视图的框架时,滚动视图才会滚动。正如我在回答中明确指出的那样,您不需要 contentSize 的绝对值,请根据滚动视图内的内容计算 contentSize,例如在向滚动视图添加内容时保留高度标签。 【参考方案1】:

老兄,你不断将 scrollView 的框架设置为与你实际想要实现的完全不同的东西。

如果您只想设置滚动视图,使其仅占据一半空间,那么您为什么不设置frame 以便height 仅覆盖您想要的屏幕部分覆盖;然后设置x & y 坐标,以便从正确的位置绘制滚动视图。

做这样的事情:

//Shortcut to view's frame.
CGRect viewsFrame = self.view.frame;

/**
CGRectMake takes 4 parameters: x, y, width, height
x: is set to 0 since you want the scrollview to start from the left with no margin
y: you want the y position to start half way, so we grab the view's height and divide by 2  
width: you want your scrollview to span from left to right, so simply grab the view's width
height: you want your scrollview's height to be half of your screen height, so get view's height and divide by 2.
*/
CGRect frameForSV = CGRectMake(0, viewsFrame.size.height/2, viewsFrame.size.width, viewsFrame.size.height/2);

UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:frameForSV];
[self.view addSubview:myScrollView];

然后设置您的内容大小,而不是基于 ansolute 值,最好根据滚动视图中实际内容的大小设置它,以便滚动视图始终滚动以覆盖其中的所有内容。

另外,请记住,您的 scrollview 只有在 contentsize 大于滚动视图的框架时才会滚动

更新 1 阅读您在这篇文章中的评论后,只需在您的 viewController.m 文件中注释掉与您的 scrollview 相关的任何代码,因为您在界面生成器中设置了所有内容。

这是结果:

【讨论】:

感谢您的描述性回答。滚动视图是我在 ios 开发中的祸根。我设法让它几乎工作。我不想以编程方式创建滚动视图,所以我在 IB 中做了。现在它可以完美滚动,除了this 问题。如您所见,上述UIViewUIScrollView 之间的差距。当它运行时,它们之间存在巨大的差距。我已经添加了所有必要的约束,但没有运气。知道是什么导致了这个问题吗? 你能发布你的 xcode 项目或其他东西,以便我快速浏览一下吗? 关于内容大小,滚动视图内的内容不会改变。它会有一个固定的高度。我还需要根据内容更改它以获取大小吗?你也可以举个例子吗? 如果它是固定的然后很酷,没问题 :) 通常人们会做这样的事情:***.com/questions/3046449/… 所以他们可以获得动态 contentSize 如果内容每次都在滚动视图中更新 Here's 有问题的测试项目。

以上是关于无法将 UIScrollView 添加到视图的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图

将 viewController 视图添加到 UIScrollView

无法将 UIContainerView 添加到 UIScrollView

缩放时,UIScrollview 子视图无法识别手势

UIScrollview 子视图在缩放后无法识别平移手势

无法触摸 UIScrollView 中的 UIButton