UIScrollView 神秘地改变框架和内容大小
Posted
技术标签:
【中文标题】UIScrollView 神秘地改变框架和内容大小【英文标题】:UIScrollView mysteriously changing frame and content size 【发布时间】:2013-07-16 03:45:10 【问题描述】:我的应用中有一个滚动视图,通过情节提要进行了初始化,我正在尝试更改框架。一切似乎都正常,但如果框架和内容大小在设置后不久就被访问,但在我的方法返回后,它们就不同了!代码如下:
CGFloat inputHeight = inputView.frame.size.height;
originalContentHeight = self.scrollableContentView.frame.size.height;
NSLog(@"%f", self.scrollableContentView.frame.size.height-inputHeight);
[self.scrollableContentView setFrame:CGRectMake(self.scrollableContentView.frame.origin.x, self.scrollableContentView.frame.origin.y, self.scrollableContentView.frame.size.width, self.scrollableContentView.frame.size.height-inputHeight)];
NSLog(@"%f", self.scrollableContentView.frame.size.height);
NSLog(@"%@", self.scrollableContentView);
这些日志的输出都符合预期,即:
<UIScrollView: 0x808de00; frame = (0 0; 320 81); ... >
但是,如果我在另一个方法中设置断点,则在调用时,记录滚动视图会显示:
<UIScrollView: 0x808de00; frame = (0 0; 320 416); ... >
此外,内容大小也会发生变化:
(width=320, height=416)
到
(width=320, height=504)
这两个值似乎都自动恢复为视图首次布局时的值。我在滚动视图的 getter 和 setter 中设置了断点,并且找不到任何意外访问,因此我得出结论,更改必须来自内部。这是一个合理的结论吗?可能出了什么问题?
【问题讨论】:
能否将自动调整大小的弹簧设置为可调节高度? 我在哪里可以找到那个? 这是因为自动布局。要么关闭它,要么通过调整约束而不是设置框架来更改滚动视图的大小。 你是用什么方法做的? 在点击 UIBarButtonItem 之后的方法中。 @rdelmar,故事板的自动布局功能在实例化后真的会影响我的视图吗?当我从 NSNotification 调用方法(对于出现的键盘)调用此代码时,此代码有效。 【参考方案1】:如果您使用自动布局,您应该更改约束,而不是设置滚动视图的框架。
查看我对类似问题的回答here。它有一些指向如何以编程方式设置约束的示例的链接。
另外,你用什么方法设置frame
和contentSize
?由于您使用的是故事板,如果它位于 viewDidLoad
或 viewWillAppear:
中,最好将此代码移至 viewDidLayoutSubviews
。
【讨论】:
我确实在viewDidLayoutSubviews
中有代码(根据我的问题历史记录)。今天晚些时候我会试试这个。
约束是要走的路。我实际上发现最好的方法是在 Interface Builder 中为约束添加一个出口,然后编辑 constant
属性。
@Jumhyn 是的,如果故事板中已经存在约束,我还发现这是一种更改约束的简单方法。很高兴你成功了!
@StepSharp 如果我在自定义视图中的滚动视图不是没有自动布局的视图控制器,我应该使用哪种方法设置滚动视图的内容和内容大小?谢谢。以上是关于UIScrollView 神秘地改变框架和内容大小的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 内的 UIWebView 框架不会拉伸大小以适应所有内容
当 UIScrollView 位于自定义 UITableViewCell 中时,将 UIScrollView 的内容大小设置为其框架宽度
UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)