Как получить черную статусную строку на iPhone X на iOS 11

По умолчанию панель состояния на iPhone X выглядит так:

enter image description here

Но я хотел бы добиться этого:

enter image description here

Я попробовал установить 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 прямо запрещает это:

Не маскируйте и не обращайте особое внимание на функции отображения клавиш. Не пытайтесь скрыть устройство округлыми углами, корпусом датчика или индикатором для доступа к главному экрану, поместив черные полосы вверху и внизу экрана. Не используйте визуальные украшения, такие как скобки, рамки, фигуры или учебный текст, чтобы обратить особое внимание на эти области.

  • Округлые углы в верхней части представления могут выглядеть красиво, но вам придется добавлять исключения в код, чтобы убедиться, что закругленные углы не показаны на других iPhone. Вам нужно будет поместить это во все ваши ViewControllers/Storyboards.. Это не так здорово.

  • Округленные углы в нижней части изображения будут отображаться прямо на скриншотах, но углы наверху (заданные вручную) не будут. Это будет некрасиво, если пользователи делят ваше приложение.

Ответ 1

Макет безопасной области - это решение вашей проблемы.

Я попытался выполнить решение в моих существующих проектах, и он отлично работает.

  • Установите черный цвет фона (или то, что вы хотите) на главный вид вашего контроллера.
  • Теперь добавьте дочерний вид (с белым фоном) и установите его ограничения относительно плана безопасной зоны (или следуйте руководству по началу и внизу макета, если версия Xcode ниже 9).
  • Рассмотрим этот вид ребенка (с белым фоном) в качестве основного вида и обработайте его с последующим дизайном.

Вот пример моментального снимка с результатом. Включив или отключив макет Safe Area, я тестировал и реализовывал.

FYI: в этих моментальных снимках основной вид имеет красный фон, а дочерний вид имеет синий цвет фона.

Схема безопасного расположения: enter image description here

AutoLayout

enter image description here