Невозможно сделать стиль строки состояния SFSafariViewController lightContent - PullRequest
6 голосов
/ 16 мая 2019

У меня есть требование содержания света в строке состояния с черным фоном, однако для некоторых экранов требуется содержание строки состояния черного цвета с белым фоном, поэтому я сохранил Просмотр внешнего вида строки состояния на основе контроллера для ДА в 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)
    }
}

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Установите 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, вы задаете внешний вид строки состояния представленных элементов управления контроллера представления, даже если они представлены не в полноэкранном режиме.

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

enter image description here

0 голосов
/ 20 мая 2019

iOS 10.0 +

favouriteBarTintColor

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

Ref: 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
    }
}
...