【问题标题】:auto layout issues with multiple storyboards多个故事板的自动布局问题
【发布时间】:2016-07-07 23:21:27
【问题描述】:

如果我创建一个带有 1 个 uiviewcontroller 的简单应用程序,并将其嵌入导航栏中,则以下代码的输出

override func viewDidAppear(animated: Bool) {

print ("...app height is \(UIScreen.mainScreen().bounds.height)")
print ("...win height is \(self.view.frame.size.height)")

}

结果如下:

...app height is 1024.0 
...win height is 980.0

我猜是有道理的,因为大小的差异说明了导航栏的高度,即 44 磅。

现在,我遇到了一个使用多个故事板的应用程序的问题,当我从一个故事板过渡到下一个故事板时,将返回相同的代码:

...app height is 1024.0
...win height is 1024.0

很奇怪,因为两个故事板都有一个嵌入在导航控制器中的 uiview。这会导致自动布局问题,因为没有考虑导航栏的大小。但是,如果我旋转视图或远离它,问题似乎会自行解决。

最后,问题是:如何确保正确计算导航栏,以便在故事板之间导航时不会出现布局问题?我试过强制 setNeedsDisplay() 和 setNeedsLayout() 无济于事。任何想法/想法/更正将不胜感激。

【问题讨论】:

    标签: ios xcode swift2 autolayout storyboard


    【解决方案1】:

    我真的不明白为什么会发生这种情况,(即视图没有注册导航栏的存在来设置其大小)。但是,正如this 线程所指出的,更改视图框架的大小和注册似乎可以解决问题。将以下代码添加到 viewDidLoad() 可以解决这个问题:

    var viewFrame = self.view.frame
    let viewNavBarHeight = self.navigationController?.navigationBar.frame.height
    viewFrame.origin.y = viewNavBarHeight!
    viewFrame.size.height = viewFrame.height - viewNavBarHeight!
    self.view.frame = viewFrame
    

    【讨论】:

      【解决方案2】:

      如果您希望视图位于导航栏下方(即始终与屏幕具有相同的高度),请设置 self.edgesForExtendedLayout = UIRectEdgeAll (Objc-C),然后执行相反操作(不隐藏在任何栏后面): self.edgesForExtendedLayout = UIRectEdgeNone

      编辑

      也加self.extendedLayoutIncludesOpaqueBars = YES

      对不起,我把所有的代码都放在了 Objective-C 中,我对 Swift 不是很熟悉,但是方法应该是一样的,它们只是可以用不同的名字来定义

      【讨论】:

      • 谢谢@jackal。您的答案应该有效,但似乎我的问题来自我使用 UIViewControllerAnimatedTransitioning 设置的自定义转换,它破坏了 edgesForExtendedLayout 的行为。我将在下面进一步解释。
      • 这是一个奇怪的...我正在使用使用 UIViewControllerAnimatedTransitioning 的自定义动画。这样做会破坏 edgeForExtendedLayout。这个post 描述了我看到的行为。
      • @Plutovman,在那篇文章中我觉得一切都是正确的。我已经编辑了答案并添加了与不透明条相关的缺失部分
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      相关资源
      最近更新 更多