旋转时状态栏隐藏时如何调整视图

3

我浏览了一些相关问题的解答,但是并没有找到确切的解决方法,希望这里能有人能够帮助我!

我有一个iPad应用,在iPad上,当你竖屏或横屏时,状态栏(包括时钟和电池)总是显示的。因此,我在一些视图控制器的顶部放置了一些自定义工具栏来占用这20个像素的高度。

现在我正在开发一个通用的应用程序。第一件事是,我发现当iPhone处于竖屏模式时,状态栏就会显示,但是当它处于横屏模式时,状态栏会隐藏,这样我的工具栏就会多出20个像素的高度。

我并不想始终隐藏或始终显示状态栏。我认为在手机的横屏模式下隐藏它的功能是可以接受的。我想做的是能够检测状态栏何时被隐藏,以便我可以调整我的工具栏的Y位置(使其为0或-20)。更好的解决方案是,如果有一种方式可以设置我的布局约束来处理这种情况。

1个回答

22

正确的方法是:

  • 使用普通高度的普通工具栏-不要对高度设置任何约束。

  • 添加前导约束0到superview(而不是superview margin),添加后续约束0到superview(而不是superview margin)。

  • 添加顶部约束0到顶部布局指南(或安全区域的顶部)。这将显示在工具栏上方留下20像素的空间,但你需要冷酷地微笑并继续进行。

  • 将视图控制器设置为工具栏的代理(这个目的有一个委托输出口)。

  • 使视图控制器采用UIBarPositioningDelegate并实现委托方法如下:

    class ViewController: UIViewController, UIBarPositioningDelegate {
        func position(for bar: UIBarPositioning) -> UIBarPosition {
            return .topAttached
        }
    }
    

当有状态栏时,这将导致工具栏的表面高度扩展到状态栏后面,但当没有状态栏时,它将具有正常的高度并紧贴顶部。

输入图像描述 输入图像描述 输入图像描述


谢谢!这是我第一次使用自动布局,我将我的顶部约束设置为父视图的顶部而不是你所说的“顶部布局指南”。通过相对于它对齐,它就像你的截图一样神奇地工作了。我不需要添加你添加的代码,我能够保留自己的工具栏。再次感谢! - Rob
在Swift 4中,它已经更改为".topAttached"(小写T)。 - Marco Weber
1
@MarcoWeber 好的,我会更改它。这个答案仍然正确,可能仍然有用! - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接