状态栏时钟在iPhoneX上已被截断

时间:2019-01-02 08:13:03

标签: ios swift statusbar clock iphone-x

在状态栏上添加渐变层并为不同的视图控制器使其变亮或变暗后,在导航中的某个随机点,缺口iPhone的状态栏中的时钟已被截断。像1 ...或...

我尝试过这两种解决方案,以使状态栏内容变为白色;但这对这种随机时钟行为没有影响。

此:

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

或者这个:

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 :(得分:1)

您正在UILabel上使用扩展名,该扩展名覆盖了intrinsicContentSize。 (或者您可能使用了这种方法)因此状态栏时钟标签将其触发,并导致错误的internalContentSize。尝试使用此覆盖的方法修复textSize计算,或者尽可能避免覆盖它。

我可以猜到您正在使用流行的SO答案中的UILabel + Padding,因此请检查您是否具备以下条件:

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
}

答案 1 :(得分:0)

由于我不知道什么是APColor,因此我更改了下面的行,并且一切正常。

gradientLayer1.colors = [UIColor.red.cgColor, UIColor.orange.cgColor]
  1. 尝试更改同一行,并检查问题是否已解决。很有可能,APColor不会导致此问题。

  2. 检查是否有任何其他物品在您的状态栏中是否可用。例如指示器等。

  3. 如果您在状态栏中添加了其他内容,请告诉我。

输出

enter image description here