【问题标题】:iOS Autolayout - Frame size not set in viewDidLayoutSubviewsiOS Autolayout - viewDidLayoutSubviews 中未设置帧大小
【发布时间】:2014-12-25 02:12:12
【问题描述】:

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

【问题讨论】:

    标签: ios iphone xcode autolayout


    【解决方案1】:

    我遇到了一个非常相似的问题(赞成的问题),并发现 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...
    }
    

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

    【讨论】:

      【解决方案2】:

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

      我不确定我是否正确,但我是这样认为的:

      • viewDidLayoutSubviews 每次在布局发生变化时被调用
      • viewDidLayoutSubviews 在我的视图的直接子视图进行布局时被调用,但该子视图的子视图此时没有布局,因此您无法获取它们的大小。

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

      如果我错了,请纠正我。

      【讨论】:

      • 我喜欢这个答案。我的问题是关于没有正确布局内部有子视图的组件。所以我确实调用了 self.viewController.exampleBaseView.layoutSubviews() 。 ExampleBaseView 内部有 3 个不同的视图,直到 viewdidappear 才正确设置。
      猜你喜欢
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多