iOS 11的UISearchBar不接受tintColor。

3
我尝试在我的应用中实现 iOS 11 中的新搜索栏,但由于某些原因,我无法使搜索栏的颜色与导航栏一起更改。在切换到新样式之前,我在我的 AppDelagate 中使用 UISearchBar.appearance().barTintColor = .DRGreen 改变了颜色,但现在即使进行了这个更改,它仍然保持默认的白色。 错误搜索栏颜色的屏幕截图(抱歉,截图是一个链接,我还没有足够的声望来嵌入图片。)
我的代码:
import UIKit

class DirectoryTC: UITableViewController, UISearchResultsUpdating {

var teachers = [

    Redacted information


]
var filteredTeachers = [Teacher]()

var selectedTeacher = Teacher(name: "", email: "", roomNumber: "", website: "")

var searchController: UISearchController!
var resultsController = UITableViewController()

var searchText = ""

override func viewDidLoad()
{

    super.viewDidLoad()

    self.resultsController.tableView.dataSource = self
    self.resultsController.tableView.delegate = self

    if #available(iOS 11, *)
    {
        searchController = UISearchController(searchResultsController: resultsController)
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.text = searchText

        self.navigationItem.searchController = searchController
        self.navigationItem.searchController?.searchBar.tintColor = UIColor.DRGreen
        searchController.isActive = true
    }else
    {
        self.searchController = UISearchController(searchResultsController: self.resultsController)
        self.tableView.tableHeaderView = self.searchController.searchBar
        self.searchController.searchResultsUpdater = self
        self.searchController.searchBar.layer.borderWidth = 1
        self.searchController.searchBar.layer.borderColor = UIColor.DRGreen.cgColor

        present(searchController, animated: true, completion: nil)
    }



    definesPresentationContext = true

    //Make Search Background Green
    //tableView.backgroundView = UIView()
    //tableView.backgroundView?.backgroundColor = .DRGreen

    //Remove Navigation Bar Border
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()


    //Add in the DR LOGO on top Bar
    addNavBarImage()

}

func updateSearchResults(for searchController: UISearchController) {

    self.filteredTeachers = self.teachers.filter{ (teacher:Teacher) -> Bool in

        if teacher.name.lowercased().contains(searchText.lowercased())
        {
            return true
        }else
        {
            return false
        }
    }

    self.resultsController.tableView.reloadData()

}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{

    if tableView == self.tableView
    {
        return self.teachers.count
    }else
    {
        return self.filteredTeachers.count
    }

}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = UITableViewCell()

    let teacher : Teacher

    if tableView == self.tableView
    {
        teacher = teachers[indexPath.row]
    }else
    {
        teacher = filteredTeachers[indexPath.row]
    }

    cell.textLabel?.text = teacher.name

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    let teacher : Teacher

    if tableView == self.tableView
    {
        teacher = teachers[indexPath.row]
        selectedTeacher = teacher
    }else
    {
        teacher = filteredTeachers[indexPath.row]
        selectedTeacher = teacher
    }


    self.performSegue(withIdentifier: "teacherDetail", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as? DirectoryDetailVC

    vc?.name = selectedTeacher.name
    vc?.email = selectedTeacher.email
    vc?.roomNumber = selectedTeacher.roomNumber
    vc?.website = selectedTeacher.website
}

func addNavBarImage() {

    let navBarController = navigationController!

    let image = #imageLiteral(resourceName: "DRNavigationBarLogo")
    let imageView = UIImageView(image: image)

    let bannerWidth = navBarController.navigationBar.frame.size.width
    let bannerHeight = navBarController.navigationBar.frame.size.height

    let  bannerX = bannerWidth / 2 - image.size.width / 2
    let bannerY = bannerHeight / 2 - image.size.height / 2

    imageView.frame = CGRect(x: bannerX, y: bannerY, width: bannerWidth, height: bannerHeight)
    imageView.contentMode = .scaleAspectFit

    navigationItem.titleView = imageView

}

}

我也遇到了这个问题... ios11现在让我很头疼。 - hhanesand
@hhanesand,你有找到这方面的任何信息吗?我还是卡住了。 - JoshHolme
不,我所做的任何事情都没有改变任何东西,手动设置颜色会在某些时候被重置。我正在发布带有颜色错误的版本,除非花费太多时间,否则我无法做更多的事情。 - hhanesand
1个回答

0

你可以使用以下方法更改UISearchBar的背景颜色:

func setBackground(searchBar: UISearchBar) {
    for subView in searchBar.subviews {
        for view in subView.subviews {
            if view.isKind(of: NSClassFromString("UISearchBarBackground")!) {
                guard let imageView = view as? UIImageView else {
                    print("cast exception ui image view")
                    continue
                }
                imageView.image = nil
                imageView.backgroundColor = UIColor.DRGreen
                return
            }
        }
    }
}

在初始化UISearchControl之后调用此方法。例如:
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    setBackground(searchBar: self.searchController.searchBar)
}

我尝试将它添加到我的代码中,但运行时出现以下错误:“Thread 1:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)”,在调用“setBackground(searchBar:self.searchController.searchBar)”的位置。 - JoshHolme
可能在初始化UISearchController之前就调用了它。你必须在之后调用它。例如,在viewDidLayoutSubviews()中调用是一个不错的选择。 - missionMan
viewDidLayoutSubviews()在哪里? - JoshHolme
仍然无法工作。我将setBackground函数和viewDidLayoutSubviews函数放在viewDidLoad函数之后,并在viewDidLoad函数底部调用viewDidLayoutSubviews函数,但我仍然在调用viewDidLayoutSubViews函数中的setBackground时遇到EXC_BAD_INSTRUCTION错误。 - JoshHolme
啊,好的,我已经解决了这个问题,现在运行没有任何错误,但是它仍然显示为默认的白色搜索栏。 - JoshHolme
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接