今天在做UISearchController的優(yōu)化時(shí)叛氨,遇到了以下問題,在此記錄一下腺毫。
1.設(shè)置cancleButton,輸入框等顏色
// 設(shè)置顯示取消按鈕
searchController.searchBar.showsCancelButton = true
在代理方法中更改按鈕顏色
func updateSearchResults(for searchController: UISearchController) {
// 修改取消按鈕文字顏色
if let searchBarSubView = searchController.searchBar.subviews.first {
for subView in searchBarSubView.subviews {
if subView.isKind(of: UIButton.classForCoder()) {
let cancleButton = subView as! UIButton
cancleButton.setTitleColor(UIColor.white, for: .normal)
}
}
}
}
2.searchBar多出的邊框線
設(shè)置searchBar.barTintColor改變searchBar的背景顏色后,會(huì)發(fā)現(xiàn)searchBar頂部和底部會(huì)有兩條初始顏色的線條。這里有兩種方法解決:
1.設(shè)置searchBarStyle, searchContrl.searchBar.searchBarStyle = .minimal。searchBarStyle共有3種系統(tǒng)樣式诗赌。
default: 默認(rèn)樣式
prominent:search bar的背景是半透明的,輸入框是不透明的
minimal:search bar沒有默認(rèn)的背景秸弛,輸入框是半透明的
具體看官方文檔铭若。
2.設(shè)置backgroundImage,給backgroundImage設(shè)置一個(gè)空的圖片递览,這里需要注意的是叼屠,必須將isTranslucent設(shè)置false,否則绞铃,設(shè)置的barTintColor無法顯示出來
searchController.searchBar.setBackgroundImage(UIImage.init(), for: UIBarPosition.any, barMetrics: UIBarMetrics.default)
searchController.searchBar.isTranslucent = false
3.改變輸入框的高度
默認(rèn)系統(tǒng)不提供改變輸入框的高度的API镜雨,通過實(shí)驗(yàn),嘗試通過遍歷子視圖改變高度的想法失敗儿捧,最后找到通過設(shè)置輸入框的背景圖片可以達(dá)到輸入框顯示可是高度改變的效果荚坞。
這里先生成一張輸入框背景顏色的圖片,寬度大于0菲盾,高度為輸入框理想高度颓影,設(shè)置searchFieldBackgroundImage,OK,搞定亿汞。使用請(qǐng)注意瞭空,此處極少情況下會(huì)出現(xiàn)searchBar消失的現(xiàn)象揪阿,原因未明疗我。設(shè)置后輸入框變成方形,這里在繪制圖片時(shí)南捂,可以先設(shè)置圓角吴裤,已達(dá)到輸入框圓角的效果。
// 調(diào)整輸入框高度, 寬度可以設(shè)置大于0的任意值溺健,高度為輸入框顯示高度
let image = self.searchFieldImage(CGSize.init(width: 100, height: 30))
// image = image?.resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 45, bottom: 0, right: 45), resizingMode: UIImageResizingMode.stretch)
searchContrl.searchBar.setSearchFieldBackgroundImage(image, for: .normal)
生成圖片方法:
func searchFieldImage(_ size: CGSize) -> UIImage? {
UIGraphicsBeginImageContext(size)
UIColor.white.setFill()
UIRectFill(CGRect.init(origin: CGPoint.zero, size: size))
// 圓角效果
// let path = UIBezierPath.init(roundedRect: CGRect.init(origin: CGPoint.zero, size: size), cornerRadius: size.height / 2)
// path.fill()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}