iOS自动布局 - 视图大小未在viewDidLayoutSubviews中设置

20

我正在为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和其他网站上找到了很多问题,但没有一个涵盖了我的问题。

2个回答

46

我遇到了非常类似的问题(点赞的问题),并找到beeef的答案指向了正确的方向。鉴于苹果的文档说不要直接调用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...
}

只是提供信息,在我的情况下,mySubView是一个UIScrollView,我需要获取其中一个子视图的框架,以便在视图出现之前设置contentOffset。我不确定viewDidLayoutSubviews()是否是最好的地方来执行此操作,但它确保了mySubView已被布局。


12

是的!我自己解决了那个问题。

我不确定是否理解正确,但我认为如下:

  • 每次布局改变时,都会调用viewDidLayoutSubviews
  • 当我的视图的直接子视图完成布局时,会调用viewDidLayoutSubviews,但是该子视图的子视图此时尚未布局,因此无法获取它们的大小。

我现在的解决方案是手动对包含键盘所有按钮的所有视图调用.layoutSubviews()。这之后,我可以获取想要的所有按钮的大小。

如果我理解有误,请纠正我。


我喜欢这个答案。我的问题是关于无法正确获取包含子视图的组件布局。所以我调用了self.viewController.exampleBaseView.layoutSubviews()。ExampleBaseView内有3个不同的视图,直到viewdidappear才能正确设置。 - Alex Delgado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接