有没有更好的方法来获取内容

时间:2014-01-25 12:06:33

标签: ios objective-c uiscrollview lifecycle

所以这是我的问题,我有一个scrollview包含一些子视图,其中包含一些与布局相关的动态内容。我想设置scrollview的contentsize正好是子视图大小的总和。

单词rootview-> scrollview->带动态内容的一些子视图(让我们说多用途UILabel)

所以这就是我所做的:

根据viewDidLayoutSubviews中的文档,此方法被调用并不表示已调整视图子视图的各个布局。每个子视图都负责调整自己的布局。

所以当这种方法发生时,我的UILabel没有布局。

然后在viewdidappear中我设置了contentSize,但是一个新问题是当我们切换到横向时这个问题没有激活,所以我在viewDidLayoutSubview和viewdidappear中都进行了设置。

我的问题是 1.有更好的方法吗? 2.根视图的子视图完成子视图布局的确切时刻在哪里,以及如何进入它?(子类看起来有点沉重)

我在ios7中使用了自动布局和约束,我尝试了setviewNeedLayout并在viewwilllayoutsubviews中进行了布局,但是没有用。

在viewdidlayoutsubviews中将layoutifneeded切换到方向时会崩溃

这里有一些代码:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self adjustScrollViewContentSize];
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self adjustScrollViewContentSize];
}

- (void)adjustScrollViewContentSize
{
    UIView *bottomUIView = [self getBottomUIView];
    CGRect superRect = [bottomUIView convertRect:bottomUIView.bounds toView:self.scrollView];
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, superRect.origin.y + superRect.size.height);
}

1 个答案:

答案 0 :(得分:1)

使用AutoLayout,您应该能够添加约束,这样您就不需要手动更新contentSize - scrollView将根据其内容的大小自行调整它。

关键是确保您具有将内部子视图附加到scrollview的所有4个内部边缘的内部约束。例如,使用可视格式语言:

  • 水平:|[myLabel]|
  • 垂直:V:|[myLabel]-[someOtherLabel]|

基本上,只要你有明确的约束通过你的子视图将左边缘连接到右边缘(并且从上到下相同),那么scrollview将从那些推断出它的contentSize。