【问题标题】:Incorrect Frame Position when defined in ViewDidLayoutSubviews在 ViewDidLayoutSubviews 中定义的帧位置不正确
【发布时间】:2018-03-25 22:59:48
【问题描述】:

我在 ovalView 内有一个 imageView,并受到自动布局的限制。

viewDidLayoutSubviews() 内部,我正在创建一个UILabel

let label = UILabel(frame: imageView.frame)
imageView.superview?.addSubview(label)

label 的边框与 imageView 稍微偏离中心。

但是,如果我将上面的代码移动到 viewDidAppear() 中,标签将完全以 imageView 为中心,但用户会看到不希望出现的变化。

如何将我的代码保存在 viewDidLayoutSubviews() 中并使其正常工作?

【问题讨论】:

  • 你知道设置框架会改变原点,成为视图的左上角锚点吗?也就是说,您必须减去标签宽度的一半才能使其在 x 轴上居中。
  • 那么为什么它在 ViewDidAppear 中起作用?

标签: swift viewdidappear viewdidlayoutsubviews


【解决方案1】:

viewDidLayoutSubviews 被调用时,你不能假设你的视图在调用该方法之前已经有了它们的最终帧。在你的情况下,这就是发生的事情。当您调用viewDidAppear 时,您的视图已经绘制了所有框架,并且您获得了正确的框架,这就是它适合您的原因。所以请改用viewDidAppear

【讨论】:

  • 如果您不希望用户看到更改,也可以在 viewDidLoadviewWillAppear 中。
  • @LinusGeffarth,确实如此。但我会在viewWillappear 中添加它。
  • 它在 viewDidLoad 或 viewWillAppear 中不起作用。它仅在 viewDidAppear 中有效,用户可以看到正在发生的变化(不受欢迎)。
  • 在这种情况下,您确实需要显示更多代码。我们不知道发生了什么。比如,发布你的整个 VC(至少所有可能重要的内容)。
  • @Kashif,那么您的视图显然由于某种原因还没有完成绘图。要么你重新绘制它,否则它应该可以工作。
【解决方案2】:

对于可能面临类似问题的其他人。我可以通过添加

将我的代码保留在 viewDidLayoutSubviews()
self.view.layoutIfNeeded() 

在我的代码之后

let label = UILabel(frame: imageView.frame)
imageView.superview?.addSubview(label)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多