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已被布局.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...