iOS Autolayout - 未在viewDidLayoutSubviews中设置帧大小

bee*_*eef 18 iphone xcode ios autolayout

我正在使用Autolayout在iOS 8的键盘上工作,将按钮放在视图上.
当我使用约束更改布局时,一切都在屏幕上正确显示,但是当我想知道视图的帧大小时,我得不到合适的大小.

例如:我按一个键,键盘布局会根据我的约束更改并布局所有内容.然后我想知道屏幕上任何按钮的大小 - 我在"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}}
Run Code Online (Sandbox Code Playgroud)

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

当我的代码在viewDidLayoutSubviews中不起作用时,我必须在哪里放置代码?

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

ren*_*ene 40

我遇到了一个非常相似的问题(upvoted问题),并发现beeef的答案指向了正确的方向.鉴于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...
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,在我的情况下,mySubView是一个UIScrollView,我需要获取其子视图的框架,以便我可以在视图出现之前相应地设置contentOffset.我不确定viewDidLayoutSubviews()是否是最好的地方,但它确保mySubView已经布局.


bee*_*eef 10

是! 我自己解决了这个问题.

我不确定我是否做对了,但这就是我的想法:

  • 每次布局更改时都会调用viewDidLayoutSubviews
  • viewDidLayoutSubviews在我的视图的直接子视图布局时调用,但该子视图的子视图在那时没有布局,因此您无法获得它们的大小.

我现在的解决方案是在我的所有视图上手动调用.layoutSubviews(),其中包含键盘的所有按钮.之后,我得到了我想要的所有按钮的大小.

如果我错了,请纠正我.