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中获取视图内的视图宽度的主要内容,如果未能解决你的问题,请参考以下文章

iOS自动布局

iOS 视图高度和自动布局

在 IOS 8 中使用自动布局调整单元格大小

UITableview 没有在 iOS 中使用自动布局调整大小

具有动态大小的ios自动布局

IOS7:Pop ViewController 强制 UIImageView 掉落