UIScrollView神秘地改变框架和内容大小

6

我在我的应用程序中有一个滚动视图,通过storyboard初始化,并且我正在尝试更改它的框架。一切似乎都可以工作,但是如果在它们被设置后不久但在我的方法返回之后访问框架和内容大小,则它们将不同!下面是代码:

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); ... >

然而,如果我在另一个方法中设置断点,当该方法被调用时,记录scrollView的输出如下:
<UIScrollView: 0x808de00; frame = (0 0; 320 416); ... >

此外,内容大小也随之改变:
(width=320, height=416)

to

(width=320, height=504)

这两个值似乎会自动恢复为视图首次布局时的值。我在滚动视图的getter和setter中设置了断点,并没有发现任何意外的访问,因此我得出结论该更改必须来自内部。这个结论合理吗?可能出了什么问题?


您能将自动调整大小设置为可调高度吗? - Jamie
我应该在哪里找到它? - Jumhyn
这是由于自动布局的原因。要么关闭它,要么通过调整约束而不是设置框架来更改滚动视图的大小。 - rdelmar
你是用哪个方法来做这件事的? - Manish Agrawal
在UIBarButtonItem被点击后的方法中。 @rdelmar,故事板的自动布局特性真的会影响视图吗?当我从NSNotification调用的方法中调用此代码时,它可以工作(用于键盘出现)。 - Jumhyn
如果您在自动布局开启时更改了一个框架,每当视图进行另一次布局时,该框架将恢复到约束定义的状态。这可能是由几乎任何用户交互引起的。 - rdelmar
1个回答

7

如果你正在使用自动布局,应该更改约束而不是设置scrollview的框架。

请参阅我对类似问题的回答这里。它包含一些示例链接,展示如何通过编程方式设置约束。

此外,你在哪个方法中设置了framecontentSize?由于你正在使用故事板,如果是在viewDidLoadviewWillAppear:中设置,则最好将此代码移至viewDidLayoutSubviews中。


我确实在viewDidLayoutSubviews中有代码(如我的问题历史记录所述)。我今天稍后会尝试一下。 - Jumhyn
1
约束是最好的方法。我发现在界面构建器中向约束添加一个插座,然后编辑“常量”属性是最好的方法。 - Jumhyn
@Jumhyn 是的,我也发现这是一种很容易的方法来改变一个在storyboard中已经存在的约束。很高兴你解决了它! - Steph Sharp
@StepSharp 如果我的scrollView在一个没有自动布局的自定义视图中,应该使用哪种方法来设置scrollView的内容和contentSize呢?谢谢。 - Jerome

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