iOS自动布局:在ViewController中获取视图内的视图宽度
Posted
技术标签:
【中文标题】iOS自动布局:在ViewController中获取视图内的视图宽度【英文标题】:iOS autolayout: get width of views inside a view in ViewController 【发布时间】:2015-01-19 09:06:38 【问题描述】:在 ViewController 启动时,我需要在其他 (A) 中获取 UIView
(B) 的宽度(在我附加的图像中,B 是所选的 UIView,父级 (A) 是 UIView带白色边框)。我正在使用自动布局,因此 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
是子 UIView (B)。第一个 NSLog
打印以下内容:
Layout 538.000000 --- 378.000000
第一个数字是可以的,但第二个是Interface Builder中子UIView的宽度,不是在设置约束之后。但是,当延迟的代码被执行时,我得到了正确的数字:
Layout 538.000000 --- 508.000000
为了获得子 UIView 的正确尺寸,我必须调用什么委托方法?
谢谢。
【问题讨论】:
你试过 viewDidAppear 吗? 是的,我也试过了 【参考方案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
之后设置。
【讨论】:
以上是关于iOS自动布局:在ViewController中获取视图内的视图宽度的主要内容,如果未能解决你的问题,请参考以下文章