如何在iOS 11中更改UISearchController搜索栏颜色

如何在iOS 11中更改UISearchController搜索栏颜色,ios,swift3,uinavigationcontroller,uisearchbar,uisearchcontroller,Ios,Swift3,Uinavigationcontroller,Uisearchbar,Uisearchcontroller,我想自定义搜索栏的背景颜色和文本颜色,我已经尝试了以下代码来进行自定义,但没有成功 extension UISearchBar { private func getViewElement<T>(type: T.Type) -> T? { let svs = subviews.flatMap { $0.subviews } guard let element = (svs.filter { $0 is T }).first as? T e

我想自定义搜索栏的背景颜色和文本颜色,我已经尝试了以下代码来进行自定义,但没有成功

extension UISearchBar {

    private func getViewElement<T>(type: T.Type) -> T? {
        let svs = subviews.flatMap { $0.subviews }
        guard let element = (svs.filter { $0 is T }).first as? T else { return nil }
        return element
    }

    func getSearchBarTextField() -> UITextField? {
        return getViewElement(type: UITextField.self)
    }

    func getSearchBarButton() -> UIButton? {
        return getViewElement(type: UIButton.self)
    }

    func setTextColor(color: UIColor) {
        if let textField = getSearchBarTextField() {
            textField.textColor = color
        }
    }

    func setTextFieldColor(color: UIColor) {
        if let textField = getViewElement(type: UITextField.self) {
            switch searchBarStyle {
            case .minimal:
                textField.layer.backgroundColor = color.cgColor
                textField.layer.cornerRadius = 18.0
                if let backgroundview = textField.subviews.first {
                    backgroundview.layer.cornerRadius = 18.0;
                    backgroundview.clipsToBounds = true;
                }
            case .prominent, .default:
                textField.backgroundColor = color
            }
        }
    }

    func setPlaceholderTextColor(color: UIColor) {
        if let textField = getSearchBarTextField() {
            textField.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes: [NSAttributedStringKey.foregroundColor: color])
        }
    }

    func setTextFieldClearButtonColor(color: UIColor) {
        if let textField = getSearchBarTextField() {
            let button = textField.value(forKey: "_clearButton") as! UIButton
            if let image = button.imageView?.image {
                button.setImage(image.transform(withNewColor: color), for: .normal)
            }else{
                //button.setImage(#imageLiteral(resourceName: "icon-hotel"), for: .normal)
            }
        }
        if let btn = getSearchBarButton() {
            let button = btn.value(forKey: "_clearButton") as! UIButton
            if let image = button.imageView?.image {
                button.setImage(image.transform(withNewColor: color), for: .normal)
            }else{
                //button.setImage(#imageLiteral(resourceName: "icon-hotel"), for: .normal)
            }
        }

    }

    func setSearchImageColor(color: UIColor) {
        if let imageView = getSearchBarTextField()?.leftView as? UIImageView {
            imageView.image = imageView.image?.transform(withNewColor: color)
        }
    }
}

extension UIImage {

    func transform(withNewColor color: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)

        let context = UIGraphicsGetCurrentContext()!
        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.setBlendMode(.normal)

        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        context.clip(to: rect, mask: cgImage!)

        color.setFill()
        context.fill(rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }
}

我已将代码放入主队列及其工作

DispatchQueue.main.async {
            self.searchBarController.searchBar.placeholder = "Search"
            self.searchBarController.searchBar.setTextColor(color: .white)
            self.searchBarController.searchBar.setPlaceholderTextColor(color: .white)
            self.searchBarController.searchBar.setSearchImageColor(color: .white)
            self.searchBarController.searchBar.setTextFieldColor(color: UIColor.clear) //light green
            self.searchBarController.searchBar.delegate = self
        }

奇怪:)

在AppDelegate中,在didFinishLaunchingWithOptions函数中添加以下代码行:

UISearchBar.appearance().tintColor = .green  // Add your color
UISearchBar.appearance().backgroundColor = .white  // Add your color

你试过设置searchBarController.searchBar.barTintColor吗?是的,我试过了。
UISearchBar.appearance().tintColor = .green  // Add your color
UISearchBar.appearance().backgroundColor = .white  // Add your color