如何在 iOS 11 上的 iPhone X 上获得黑色状态栏

Posted

技术标签:

【中文标题】如何在 iOS 11 上的 iPhone X 上获得黑色状态栏【英文标题】:How to get a black statusbar on iPhone X on iOS 11 【发布时间】:2018-02-23 14:40:17 【问题描述】:

默认情况下,iPhone X 上的状态栏如下所示:

但我想实现这个:

我尝试将preferredStatusBarStyle 设置为lightContent,但它仅在将状态栏后面的背景设置为黑色后才有效。

为了修复圆角,我最终添加了另一个带有圆角的子视图。

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        view.backgroundColor = .black

        let roundedView = UIView(
            frame: CGRect(
                x: 0,
                y: UIApplication.shared.statusBarFrame.height,
                width: view.frame.width,
                height: view.frame.height
            )
        )
        roundedView.layer.cornerRadius = 10
        roundedView.layer.masksToBounds = true
        roundedView.backgroundColor = .white
        view.addSubview(roundedView)

        let label = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 60))
        label.text = "Black statusbar!"
        label.textAlignment = .center
        roundedView.addSubview(label)
    

    override var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent
    

我想知道这是否是最好的方法.. 必须有更好的方法来实现这一点。


更新

这是一个糟糕的主意,因为:

正如@Moritz 指出的那样,Apple's guidelines 明确禁止这样做:

不要掩盖或特别注意关键显示功能。不要试图隐藏设备的圆角、传感器外壳或 用于访问主屏幕的指示器,通过在 屏幕的顶部和底部。不要使用视觉装饰,例如 方括号、边框、形状或说明性文字以称为特殊 也请注意这些领域。

视图顶部的圆角可能看起来不错,但您必须在代码中添加例外以确保圆角不会显示在其他 iPhone 上。你需要把它放在你所有的 ViewControllers / Storyboards 中。这不是很好。

视图底部的圆角将在屏幕截图中直接显示,但顶部的角(手动设置)不会。当用户共享您的应用程序时,这将是丑陋的。

【问题讨论】:

安全区域已经在向后兼容方面造成了很多麻烦,这只会火上浇油。 【参考方案1】:

安全区域布局可以解决您的问题。

我尝试在现有项目中遵循该解决方案,并且效果很好。

将黑色背景颜色(或任何您想要的颜色)设置为视图控制器的主视图。 现在添加子视图(白色背景)并设置其相对于安全区域布局的约束(如果 Xcode 版本低于 9,则遵循顶部和底部布局指南)。 将此子视图(白色背景)视为主视图并使用它进行进一步设计。

这是带有结果的示例快照,通过启用或禁用安全区域布局,我测试并实现了。

仅供参考:在这些快照中,主视图具有红色背景,子视图具有蓝色背景。

安全区域布局:

自动布局

【讨论】:

谢谢!我更新了我的问题,也许这毕竟不是一个好主意。但要继续练习:这比用代码做的要好一些,但你仍然需要为每个视图控制器重复这个..不理想对吧? 我创建了一个 IBDesignable 自定义视图接口类并使用了相同的.. 你和你的方法是绝对正确的,这可能需要对每个视图控制器进行手动练习。但这不会很难手动完成。而且,这个想法可以控制你的界面区域,超出了苹果在其指导方针范围内的限制。在这个阶段,直到我们找到永久的解决方案,这可能是一个很好的解决方案。祝你有美好的一天:)

以上是关于如何在 iOS 11 上的 iPhone X 上获得黑色状态栏的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 Swift 4 iPhone X Safe Area 支持全屏ScrollView

如何在 iOS 11 和 iPhone X 上实现隐藏 UITabBar 以显示 UIToolbar

如何在 iPhone 5 上获取 IMEI

如何在 OS X 上的 iPhone 4 模拟器中测试我的应用程序?

iOS 上的 OpenCV 对象检测 (HOGDescriptor)

通过 Iphone 上的蓝牙发送数据 (iOS 5.x)