iOS自动布局:获取ViewController中视图内的视图宽度

时间:2015-01-19 09:06:38

标签: ios uiviewcontroller ios8 autolayout nslayoutconstraint

我需要在启动ViewController时将UIView(B)的宽度放在其他(A)中(在我附加的图像中,B是选择的UIView,父母(A)是带有白色边框的UIView)。我正在使用autolayout,因此UIView(B)的尾随空间(A)

enter image description here

我想在viewDidLayoutSubview中获得真正的宽度:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    NSLog(@"Layout %f --- %f --- %f ",self.oksPanel.frame.size.width,self.oksBar.frame.size.width);
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        //code to be executed on the main queue after delay
    NSLog(@"Layout %f --- %f --- %f ",self.oksPanel.frame.size.width,self.oksBar.frame.size.width);
    });
}

oksPanel是父UIView(A),oksBar是孩子(B)。第一个NSLog打印以下内容:

Layout 538.000000 --- 378.000000

第一个数字没问题,但第二个数字是Interface Builder中子UIView的宽度,而不是在设置约束之后。但是,当执行代码延迟时,我得到正确的数字:

Layout 538.000000 --- 508.000000

为了获得孩子UIView的正确尺寸,我必须调用什么委托方法?

感谢。

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题并通过将子视图(B)向上移动一级来修复它,作为ViewController视图的直接子项,使其成为(A)的兄弟。在此配置中,ViewController.viewDidLayoutSubviews将具有(A)和&的基于约束的边界。 (B)。

为了说明,原始布局是:

ViewController.view
  -> (A)
    -> (B)

我的新布局是:

ViewController.view
  -> (A)
  -> (B)

注意:此部分未经测试)如果需要ViewController.view -> (A) -> (B)层次结构,则可以为(A)创建自定义UIView并覆盖UIView回调以获取边界。我的第一个猜测是:

class CustomViewA: UIView {
   @IBOutlet weak var subviewB: UIView!

    override func layoutSubviews() {
        super.layoutSubviews()
        let setBounds = subviewB.bounds
        // Do stuff with bounds...
    }
}

我认为这是因为UIView.layoutSubviews docs指定:

  

默认实现使用您设置的任何约束来确定任何子视图的大小和位置。

所以我假设在调用super.layoutSubviews之后将设置子视图边界。