ios11: 导航栏中的 UISearchBar

ios11: UISearchBar in Navigation Bar

借助这个 ,我在导航栏中实现了渐变。但是,渐变不包括搜索栏。

但这就是我想要的:

知道问题出在哪里吗?非常感谢您提供的任何帮助。我将在下面分享我的代码。

extension UINavigationBar {

    func setGradientBackground(colors: [UIColor]) {

        var updatedFrame = bounds
        updatedFrame.size.height += 20
        let gradientLayer = CAGradientLayer(frame: updatedFrame, colors: colors)

        setBackgroundImage(gradientLayer.createGradientImage(), for: UIBarMetrics.default)
    }
}


extension CAGradientLayer {

    convenience init(frame: CGRect, colors: [UIColor]) {
        self.init()
        self.frame = frame
        self.colors = []
        for color in colors {
            self.colors?.append(color.cgColor)
        }
        startPoint = CGPoint(x: 0, y: 0)
        endPoint = CGPoint(x: 0, y: 1)
    }

    func createGradientImage() -> UIImage? {

        var image: UIImage? = nil
        UIGraphicsBeginImageContext(bounds.size)
        if let context = UIGraphicsGetCurrentContext() {
            render(in: context)
            image = UIGraphicsGetImageFromCurrentImageContext()
        }
        UIGraphicsEndImageContext()
        return image
    }

}

我的ViewController:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationBarGradient(colors: [UIColor.init(hex: "0089FC" ), 
UIColor.init(hex: "56ACF5" )])

    if #available(iOS 11.0, *) {
        navigationItem.searchController = searchController

    }
}
  private func navigationBarGradient(colors: [UIColor]) {
        navigationController?.navigationBar.setGradientBackground(colors: colors)
    }

我相信搜索栏和导航栏是两个独立的元素,因此您的渐变只影响一个。您可以将它们都设置为清除,然后使用您正在寻找的渐变将另一个视图或标签元素放在后面(添加约束)。

对于要使用以下代码同时设置 barTintColor 和 backgroundImage 的 searchBar。

override func viewDidLoad() {
    self.searchBar.barTintColor = UIColor.clear
    self.searchBar.backgroundImage = UIImage()
    self.navBar.backgroundColor = UIColor.clear
}

请查看来自 Apple 的 Sample Code,了解如何执行此操作以及导航栏上的其他修改。

话虽这么说,如果您不需要任何其他导航栏功能,例如左右按钮,那么在这个特定视图中隐藏导航栏并拥有自定义视图会简单得多在原地。

在我能想到的方法中,material资源的使用是最简单的一种,如果让上层控件透明可能效果不是很好