Swift 自动布局:视图中出现不正确的帧大小

Swift 自动布局:视图中出现不正确的帧大小,swift,ios8,xcode6,autolayout,ios-autolayout,Swift,Ios8,Xcode6,Autolayout,Ios Autolayout,我有一个UIViewController,我通过IB使用Autolayout来定位和调整其子视图的大小 由于某些原因,我没有得到正确的UIView布局,我决定在VC中记录所有子视图的大小 我将子视图大小记录在: viewDidLoad{ self.view.layoutIfNeeded() print(uiview.size) } viewDidLayoutSubviews{ print(uiview.size) } viewWillAppear{ print(uiview.s

我有一个UIViewController,我通过IB使用Autolayout来定位和调整其子视图的大小

由于某些原因,我没有得到正确的UIView布局,我决定在VC中记录所有子视图的大小

我将子视图大小记录在:

viewDidLoad{
   self.view.layoutIfNeeded()
   print(uiview.size)
}

viewDidLayoutSubviews{
 print(uiview.size)
}
viewWillAppear{
 print(uiview.size)

}
viewDidAppear{
 print(uiview.size)
}
子视图的大小在以下方面是正确的:

  • viewDidLoad
  • viewDidLayoutSubviews
  • 视图将出现
  • viewDidLayoutSubviews
  • 但它在以下方面变得不正确:

  • viewDidLayoutSubviews
  • 视图显示
  • 如何从视图中使用正确的子视图大小?为什么我的尺寸在最终的viewDidLayoutSubviews调用和ViewDidDisplay中不正确?

    您的“正确尺寸”来自自动布局完成工作之前。这些框架将是Interface Builder文档中的框架。你需要修正你的约束来实现你所期望的任何框架

    自动布局直到在viewDidLayoutSubviews最终调用之后才完成。您的“正确大小”是在自动布局完成工作之前生成的。这些框架将是Interface Builder文档中的框架。你需要修正你的约束来实现你所期望的任何框架


    自动布局直到在viewDidLayoutSubviews最终调用之后才完成,就在ViewDid出现之前。

    我解决了自己的问题

    我约束视图与VC的高度成比例

    我显示的VC有一个导航栏。所有视图大小都是正确的(即使在viewDidLoad中,因为我调用LayoutIfNeed()),直到VC开始绘制导航栏并缩小Superview的高度;因此,缩小其子视图的高度


    我所要做的就是通过勾选VC的属性检查器中的相应框来扩展顶部栏下的边。这样VC就不会缩小我的子视图的超级视图。

    我解决了自己的问题

    我约束视图与VC的高度成比例

    我显示的VC有一个导航栏。所有视图大小都是正确的(即使在viewDidLoad中,因为我调用LayoutIfNeed()),直到VC开始绘制导航栏并缩小Superview的高度;因此,缩小其子视图的高度


    我所要做的就是通过勾选VC的属性检查器中的相应框来扩展顶部栏下的边。这样VC就不会收缩我的子视图的superview。

    如果是这样,那么自动布局如何达到正确的帧大小,直到它达到ViewDidDisplay。此外,我100%确信我的约束是正确的。最终的viewDidLayoutSubviews和ViewDidDisplay是查看AutoLayout完成的帧的唯一正确位置。视图将出现太早。检查控制台,确保没有违反任何约束。以下是关于viewDidLoad/ViewWillDisplay/ViewDidDisplay@Btitus的先前答案供您参考,如何知道它是否是ViewDidDisplay之前的最终viewDidLayoutSubviews?如果是这种情况,则自动布局如何达到正确的帧大小,直到达到ViewDidDisplay。此外,我100%确信我的约束是正确的。最终的viewDidLayoutSubviews和ViewDidDisplay是查看AutoLayout完成的帧的唯一正确位置。视图将出现太早。检查控制台并确保没有违反任何约束。以下是关于viewDidLoad/ViewWillDisplay/ViewDidDisplay@Btitus的先前答案供您参考,我如何知道它是否是ViewDidDisplay之前的最终viewDidLayoutSubviews?