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

标签 ios iphone xcode autolayout

我正在为 iOS 8 开发键盘,使用自动布局将按钮放置在 View 上。
当我使用约束更改布局时,所有内容都正确显示在屏幕上,但当我想知道 View 的框架大小时,却无法获得正确的大小。

例如:我按下一个键,键盘布局会根据我的约束进行更改和布局。然后我想知道屏幕上任何按钮的大小 - 我在“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 和其他网站上发现了很多问题,但没有一个能涵盖我的问题。

最佳答案

我遇到了一个非常相似的问题(已投票的问题)并找到了 beeef's answer指向正确的方向。鉴于 Apple 的文档说不要直接调用 layoutSubviews(),我改为执行以下操作(其中 mySubView 是 self.view 的直接 subview ):

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,我需要获取其 subview 之一的框架,以便我可以在 View 出现之前相应地设置 contentOffset。我不确定 viewDidLayoutSubviews() 是否是执行此操作的最佳位置,但它确保已布置 mySubView。

关于iOS Autolayout - 框架大小未在 viewDidLayoutSubviews 中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26629240/

相关文章:

iphone - iOS 中的 Asyncsocket 断开连接事件

ios - 如何在iOS中显示UIImage的NSArray中的图像名称

xcode - Swift NSTimer 编码

ios - UISplitViewController 在 iPhone 设备上显示详细 View 而不是主视图

ios - 如何在一个函数中运行 2 个异步代码并转义它们?

iphone - 如何在主视图中显示新 View 时相对移动其他对象

ios - 如何检查 Swift/Xcode 中的线程/队列层次结构?

ios - iPad GCDAsyncSocket 无法读取

ios - Safari 与 UIWebView 字体大小差异

iphone - iOS 开发 : How can I cause a UITableViewCell to change into an editable UITextField when it's tapped?