Установите непрозрачную панель навигации UIImagePickerController в iOS 13 - PullRequest
2 голосов
/ 01 октября 2019

Я представляю UIImagePickerController, чтобы выбрать изображение. Мой код прост:

private lazy var imagePicker: UIImagePickerController = {
    let picker = UIImagePickerController()
    picker.navigationBar.isTranslucent = false
    return picker
}()

func presentPicker() {
    imagePicker.sourceType = .photoLibrary
    imagePicker.modalPresentationStyle = .fullScreen        
    present(self.imagePicker, animated: true, completion: nil)
}

Я устанавливаю picker.navigationBar.isTranslucent = false, чтобы иметь непрозрачную панель навигации в контроллере сборщика. К сожалению, это не работает на iOS 13, и навигация и строки состояния прозрачны.

Частичное решение :

private func setOpaqueNavigationiOS13() {
    UINavigationBar.appearance().backgroundColor = .white
}

private func resetNavigationiOS13() {
    UINavigationBar.appearance().backgroundColor = .clear
}

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

РЕДАКТИРОВАТЬ : я также попытался настроить внешний вид панели навигации с помощью новогоUINavigationBarAppearance:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = .white
    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().compactAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
}

Или:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = .white
    imagePicker.navigationBar.standardAppearance = appearance
    imagePicker.navigationBar.compactAppearance = appearance
    imagePicker.navigationBar.scrollEdgeAppearance = appearance
}

Кто-нибудь, кто придумал исправление? Спасибо

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Я публикую свое решение на случай, если оно будет полезным для других. Хотя ответ Мэтта является полностью правильным, он применяется, когда все вашей настройки панели навигации выполнены через UINavigationBarAppearance. Это не помогло в моем случае, потому что я уже сделал это в AppDelegate:

// Make navigation bar transparent throughout whole app
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

И так как мое приложение демонстрирует много стилей навигационной панели, и мне нужно было быстрое исправление, чтобы удовлетворить изменения iOS 13. просто сделал это:

// Set nav bar to opaque 
if #available(iOS 13.0, *) {
    UINavigationBar.appearance().setBackgroundImage(nil, for: .default)
}

Только не забудьте вернуть его к прозрачному при необходимости.

0 голосов
/ 01 октября 2019

В iOS 13 правильный способ настроить внешний вид панели навигации - через архитектуру UIBarAppearance (на панели навигации standardAppearance и т. Д.). Вы можете применить это непосредственно к панели навигации или использовать внешний прокси UINavigationBar.

...