使用 UIAppearance 使 UINavigationBar 具有渐变背景

Posted

技术标签:

【中文标题】使用 UIAppearance 使 UINavigationBar 具有渐变背景【英文标题】:Make UINavigationBar have a gradient background using UIAppearance 【发布时间】:2017-09-27 15:51:46 【问题描述】:

在this 问题之后,我可以为UINavigationBar 制作背景渐变,但是当我尝试通过UIAppearance 设置它时,应用程序在didFinishLaunching 中崩溃,因为没有当前@987654325 @。我怎样才能解决这个问题,并且在应用程序委托中仍然拥有我所有的 UIAppearance 代码?

didFinishLaunching 中的return true 之前调用的代码:

private func setNavBarAppearance() 
    let titleAttributes: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.white]
    UINavigationBar.appearance().titleTextAttributes = titleAttributes
    UINavigationBar.appearance().barTintColor = .white
    UINavigationBar.appearance().tintColor = .white
    UINavigationBar.appearance().makeTransparent()

    // Set gradient
    let colors = [UIColor.lavender.cgColor, UIColor.mint.cgColor]
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = UINavigationBar.appearance().bounds
    gradientLayer.colors = colors
    gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
    gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.5)

    let image = UIImage(layer: gradientLayer)
    UINavigationBar.appearance().setBackgroundImage(image, for: .default)

【问题讨论】:

UINavigationBar 子类化可能是更好的解决方案。 【参考方案1】:

调用UIGraphicsBeginImageContext 时,您必须提供非零CGRect。在我的情况下,我将框架设置为UINavigationBar.appearance().bounds,这是应用程序委托中的零矩形。为了解决这个问题,我只需将渐变 frame 设置为 CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 1)

【讨论】:

这太棒了,我来自 Xamarin.ios,这是最好的方法。

以上是关于使用 UIAppearance 使 UINavigationBar 具有渐变背景的主要内容,如果未能解决你的问题,请参考以下文章

swift 使UIView子类的属性支持UIAppearance

使用 UIAppearance 渲染图像

UIAppearance 的“当不包含在”中

使用 UIAppearance 移动 UINavigationBar

使用 UIAppearance 更改所有 UITableViewCells 的文本颜色

如何使用 UIAppearance 设置 ViewController 的 backgroundColor