Невозможно сделать стиль строки состояния SFSafariViewController lightContent

У меня есть требование, чтобы в строке состояния было светлое содержимое с черным фоном, однако на некоторых экранах требуется черный контент строки состояния с белым фоном, поэтому я оставил для параметра Просмотр внешнего вида строки состояния на основе контроллера значение ДА в info.plist, чтобы принять стиль строки состояния на основе требований контроллеров представления.

Моя проблема в том, что всякий раз, когда я представляю SFSafariViewController из любого контроллера представления, он по умолчанию принимает содержимое строки состояния и белый фон, т.е. стиль строки состояния всегда равен .default.

Я попытался переопределить предпочтительныйStatusBarStyle в подклассе SFSafariViewController, но пока не смотрел.

Ниже мой код


import UIKit
import SafariServices

extension SFSafariViewController {

    override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? .lightContent
    }
}

class MyViewController: UIViewController, SFSafariViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.navigationBar.barTintColor = UIColor.lightGray
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    @IBAction func presentSafari(sender: AnyObject) {

        let safari = SFSafariViewController(url: URL(string: "https://www.google.com/")!)
        safari.delegate = self
        present(safari, animated: true) {
        }
    }

    // MARK: - SFSafariViewControllerDelegate
    func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
        dismiss(animated: true, completion: nil)
    }
}


person Dhaval H. Nena    schedule 16.05.2019    source источник


Ответы (2)


Настройте modalPresentationCapturesStatusBarAppearance, чтобы управлять внешним видом строки состояния из представления. контроллер.

@IBAction func presentSafari(sender: AnyObject) {

    let safari = SFSafariViewController(url: URL(string: "https://www.google.com/")!)
    safari.delegate = self
    safari.modalPresentationCapturesStatusBarAppearance = true
    if #available(iOS 10.0, *) {
        safari.preferredBarTintColor = .yellow
    } else {
        // Fallback on earlier versions
        safari.view.tintColor = .yellow
    }
    present(safari, animated: true) {
    }
}

extension SFSafariViewController {
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

Когда вы представляете контроллер представления, вызывая метод present(_:animated:completion:), управление внешним видом строки состояния передается из представления в представленный контроллер представления только в том случае, если значение modalPresentationStyle представленного контроллера равно UIModalPresentationStyle.fullScreen. Устанавливая для этого свойства значение true, вы определяете внешний вид панели состояния элементов управления представленного контроллера представления, даже если он представлен не в полноэкранном режиме.

Вывод: снимок экрана.

введите здесь описание изображения

person Rocky    schedule 20.05.2019
comment
Пытался установить указанное выше свойство, но безуспешно. Благодарность - person Dhaval H. Nena; 23.05.2019
comment
@ DhavalH.Nena - обновите ответ кодом и снимком экрана, это работает для вас? - person Rocky; 23.05.2019
comment
Вместо черного вы можете установить цвет панели навигации следующим образом: safari.preferredBarTintColor = self.navigationController? .NavigationBar.tintColor или safari.view.tintColor = safari.preferredBarTintColor = self.navigationController? .NavigationBar, но это работает для меня. - person BhargavR; 23.05.2019
comment
Привет, @Rocky, ваш ответ отлично работает с черным цветом, однако цвет моей темы приложения отличается, и это не работает. При дальнейшем тестировании я обнаружил странное поведение с точки зрения использования разных цветов, то есть некоторые цвета работают нормально, а некоторые нет. Например, собственные цвета, такие как черный, пурпурный, работают должным образом, а цвет строки состояния меняется на белый, однако для других цветов, таких как желтый, зеленый не работают, а цвет строки состояния всегда остается черным. ПРОДОЛЖЕНИЕ СЛЕДУЕТ.. - person Dhaval H. Nena; 27.05.2019
comment
Даже из моих пользовательских цветов один работает, а другой нет. Swift static let blue = UIColor(red: 61, green: 140, blue: 255). // WORKING static let blueLight = UIColor(red: 0, green: 177, blue: 240) // NOT WORKING Я подозреваю, что SFSafariViewController управляет отображением цвета строки состояния на основе некоторых значений RGB, хотя я не уверен в этом. Сообщите мне свои мысли о том же. И спасибо за помощь! - person Dhaval H. Nena; 27.05.2019
comment
Да, lightContent Светлый контент для использования только на темном фоне и default Темный контент для использования на светлом фоне. - person Rocky; 27.05.2019
comment
@Rocky есть ли предложения, чтобы сделать его lightContent на моем пользовательском цвете? - person Dhaval H. Nena; 27.05.2019
comment
НЕТ, в качестве моей работы :) Я просто попробовал это с изображением, но не повезло, Apple управляет им самостоятельно, потому что, если строка состояния и панель навигации оба цвета загорятся, тогда проблема в пользовательском опыте. - person Rocky; 27.05.2019

iOS 10.0+

предпочтительныйBarTintColor

Цвет для окрашивания фона панели навигации и панели инструментов.

Ссылка: https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller/2274394-preferredbartintcolor


Поскольку ваш View controller-based status bar appearance установлен на YES в Info.plist, вам нужно будет применить информацию о цвете к preferredBarTintColor, например:

let safari = SFSafariViewController(url: URL(string: "https://google.com")!)

//This:
safari.preferredBarTintColor = .black

present(safari, animated: true, completion: nil)

И ... нет необходимости в следующем:

extension SFSafariViewController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .default
    }
}
person staticVoidMan    schedule 20.05.2019
comment
нет, у меня есть минимальная цель развертывания iOS для iOS 9.0, и решение выше не работает. Благодарность - person Dhaval H. Nena; 23.05.2019
comment
спасибо за ответ, но вы можете попробовать желтый или зеленый цвет. Они не работают, для подробного ответа просмотрите мои комментарии в ответе ниже. Ценю вашу помощь! - person Dhaval H. Nena; 27.05.2019
comment
@ DhavalH.Nena Верно, я проверил safari.view.tintColor в симуляторе iOS 9, и вы правы. Он не меняет backgroundColor navigationBar, он просто меняет цвет оттенка barButtonItems. - person staticVoidMan; 27.05.2019
comment
@ DhavalH.Nena Я пробовал пару вещей, даже встроил safari в navigationController с настройками, но у этого тоже есть свои предостережения. Наконец, мне кажется, что в iOS 9 нет элегантного способа справиться с этим, поэтому на этом этапе я бы применил цвет на preferredBarTintColor для iOS 10+ и оставил его по умолчанию для iOS9-. - person staticVoidMan; 27.05.2019
comment
Цвет панели навигации в порядке, меня беспокоит изменение цвета строки состояния SFSafariViewController при его представлении. Для черного, красный цвет меняется на белый, для других цветов - нет. Если у вас есть другое решение, поделитесь. Спасибо :) - person Dhaval H. Nena; 27.05.2019