我需要在启动ViewController时将UIView
(B)的宽度放在其他(A)中(在我附加的图像中,B是选择的UIView,父母(A)是带有白色边框的UIView)。我正在使用autolayout,因此UIView(B)的尾随空间(A)
我想在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的正确尺寸,我必须调用什么委托方法?
感谢。
答案 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
之后将设置子视图边界。