无法将 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;
如果滚动视图填满整个视图,这种方式有效,我已经测试过了。但是这种方法不能满足我的需要。滚动视图会自动向上移动并占据整个屏幕。我认为这是导致此问题的第二行代码。
所以我删除了滚动视图,在视图控制器中添加了两个UIView
s。在底部视图中,我添加了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 问题。如您所见,上述UIView
和UIScrollView
之间的差距。当它运行时,它们之间存在巨大的差距。我已经添加了所有必要的约束,但没有运气。知道是什么导致了这个问题吗?
你能发布你的 xcode 项目或其他东西,以便我快速浏览一下吗?
关于内容大小,滚动视图内的内容不会改变。它会有一个固定的高度。我还需要根据内容更改它以获取大小吗?你也可以举个例子吗?
如果它是固定的然后很酷,没问题 :) 通常人们会做这样的事情:***.com/questions/3046449/… 所以他们可以获得动态 contentSize 如果内容每次都在滚动视图中更新
Here's 有问题的测试项目。以上是关于无法将 UIScrollView 添加到视图的一部分的主要内容,如果未能解决你的问题,请参考以下文章
如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图
将 viewController 视图添加到 UIScrollView