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。它有一些指向如何以编程方式设置约束的示例的链接。

另外,你用什么方法设置framecontentSize?由于您使用的是故事板,如果它位于 viewDidLoadviewWillAppear: 中,最好将此代码移至 viewDidLayoutSubviews

【讨论】:

我确实在viewDidLayoutSubviews 中有代码(根据我的问题历史记录)。今天晚些时候我会试试这个。 约束是要走的路。我实际上发现最好的方法是在 Interface Builder 中为约束添加一个出口,然后编辑 constant 属性。 @Jumhyn 是的,如果故事板中已经存在约束,我还发现这是一种更改约束的简单方法。很高兴你成功了! @StepSharp 如果我在自定义视图中的滚动视图不是没有自动布局的视图控制器,我应该使用哪种方法设置滚动视图的内容和内容大小?谢谢。

以上是关于UIScrollView 神秘地改变框架和内容大小的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 框架没有改变

UIScrollView 内的 UIWebView 框架不会拉伸大小以适应所有内容

当 UIScrollView 位于自定义 UITableViewCell 中时,将 UIScrollView 的内容大小设置为其框架宽度

UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)

在 UIScrollView 中调整视图大小后,滚动视图不知道它改变了

尽管内容大小正确,但 UIScrollview 不会滚动; textview 子视图框架也表现得很奇怪