Часы строки состояния были обрезаны на iPhoneX - PullRequest
0 голосов
/ 02 января 2019

После добавления слоя градиента в строку состояния и сделать его светлым или темным для разных контроллеров представления, в какой-то случайный момент в навигации мои часы в строке состояния айфонов-надрезов стали усеченными.например, 1 ... или ...

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

this:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.barStyle = .blackOpaque
        self.setNeedsStatusBarAppearanceUpdate()
}

или this:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

Оба они меняют цвет строки состояния моего содержимого,Любая идея о том, что является причиной этого поведения ???

clock problem

и вот как я делаю градиент строки состояния:

extension UIViewController {
    func makeStatusBarGradient(){
        let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
        let gradientLayer1 = CAGradientLayer()
        gradientLayer1.frame = statusBarView.frame
        gradientLayer1.colors = [UIColor.APColors.redGradient.cgColor, UIColor.APColors.orangeGradient.cgColor]
        gradientLayer1.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradientLayer1.endPoint = CGPoint(x: 1.0, y: 0.5)
        gradientLayer1.cornerRadius = 0
        gradientLayer1.zPosition = -10
        gradientLayer1.name = "gradient"
        //Change status bar color
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView{
            statusBar.layer.addSublayer(gradientLayer1)
        }
        setNeedsStatusBarAppearanceUpdate()
    }
    func clearStatusBarGradient(){
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView{
            if let layers = statusBar.layer.sublayers?.filter({$0.name == "gradient"}){
                if (layers.count > 0){
                    layers.first?.removeFromSuperlayer()
                }
            }
        }
        setNeedsStatusBarAppearanceUpdate()
    }
}

и APColors:

extension UIColor {
      struct APColors {
            static var redGradient : UIColor { return UIColor(red: 1.00, green: 0.42, blue: 0.24, alpha: 1) }
            static var orangeGradient : UIColor { return UIColor(red: 0.95, green: 0.19, blue: 0.42, alpha: 1)}

      }
}

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы используете расширение на UILabel, которое переопределяет его intrinsicContentSize. (или, может быть, вы используете этот метод). Значит, метка часов в строке состояния запустила его и ошиблась intrinsicContentSize. Попробуйте исправить вычисление textSize в этом переопределенном методе или по возможности избегайте переопределения.

Полагаю, вы используете UILabel + Padding из популярного SO-ответа, поэтому проверьте, есть ли у вас это:

if let insets = padding {
  insetsWidth += insets.left + insets.right
  insetsHeight += insets.top + insets.bottom
  textWidth -= insetsWidth
}

если вы это сделаете, просто измените его:

if let insets = padding {
  insetsWidth += insets.left + insets.right
  insetsHeight += insets.top + insets.bottom
  textWidth -= insetsWidth
} else {
  return contentSize
}
0 голосов
/ 02 января 2019

Поскольку я не знаю, что такое APColor, я изменил строку ниже, и все работает нормально.

gradientLayer1.colors = [UIColor.red.cgColor, UIColor.orange.cgColor]
  1. Попробуйте изменить ту же строку и проверьте, решена ли ваша проблема или нет. Скорее всего, APColor не вызвал проблему.

  2. Проверьте, есть ли у вас несколько материалов Статусная строка доступна или нет. например индикатор и т. д.

  3. Если вы добавили что-нибудь еще в строку состояния, дайте мне знать.

выход

enter image description here

...