iOS Autolayout – 框架大小未在viewDidLayoutSubviews中设置

我正在使用一个键盘iOS 8,使用Autolayout将按钮放在视图上.
当我使用约束更改布局时,所有内容都在屏幕上正确显示,但是当我想知道视图的帧大小时,我没有得到正确的大小.

例如:我按一个键,键盘布局根据我的限制改变和布局一切.然后我想知道屏幕上任何按钮的大小 – 我在“viewDidLayoutSubviews”中执行此操作,并在控制台中获取该结果:

2014-10-29 12:27:09.088 Keyboard[2193:60674] view did layout subviews
2014-10-29 12:27:09.088 Keyboard[2193:60674] {{inf,inf},{0,0}}

该按钮具有正确的大小和正确的位置,但是当尝试获取其框架时,尺寸未设置.

在ViewDidLayoutSubviews中无法使用代码的时候,该怎么办?

我在stackoverflow和其他网站上发现了很多问题,但没有一个涵盖了我的问题.

解决方法

我遇到了一个非常类似的问题(upVoted的问题),并发现 beeef’s answer指向正确的方向.鉴于Apple的文档不直接调用layoutSubviews(),所以我做了如下(mySubView是self.view的直接子视图):
override func viewDidLayoutSubviews() {
    // self.view's direct subviews are laid out.
    // force my subview to layout its subviews:
    self.mySubView.setNeedsLayout()
    self.mySubView.layoutIfNeeded()

    // here we can get the frame of subviews of mySubView
    // and do useful things with that...
}

只是FYI,在我的情况下mySubView是一个UIScrollView,我需要得到其一个子视图的框架,这样我可以在视图出现之前相应地设置contentOffset.我不知道viewDidLayoutSubviews()是否是最佳的做法,但它确保mySubView已被布局.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...