Edited at

UISearchBarのカスタマイズ

iOS13では禁止になっているようです。

UISearchBarのプライベートなプロパティにアクセスするコードがiOS 13では禁止になったようです



下準備


ブラー無効化

extension UISearchBar {

func disableBlur() {
backgroundImage = UIImage()
translucent = true
}
}


textField取得

extension UISearchBar {

var textField: UITextField? {
return valueForKey("_searchField") as? UITextField
}
}


アクセサリ取得

extension UITextField {

//クリアボタン
var rightButton: UIButton? {
return valueForKey("_clearButton") as? UIButton
}
//虫眼鏡
var lupeImageView: UIImageView? {
return leftView as? UIImageView
}
}


ViewのRenderingModeをalwaysTemplateに変更

extension UIButton {

func becomeImageAlwaysTemplate() {
if let image = imageForState(.Highlighted) {
let paintedImage = image.imageWithRenderingMode(.AlwaysTemplate)
setImage(paintedImage, forState: .Normal)
setImage(paintedImage, forState: .Highlighted)
}
}
}

extension UIImageView {
func becomeImageAlwaysTemplate() {
image = image?.imageWithRenderingMode(.AlwaysTemplate)
}
}


カスタマイズ


角丸

searchBar.textField.layer.cornerRadius = searchBar.textField.bounds.height / 2.0

searchBar.textField.layer.masksToBounds = true

毎回masksToBoundsを設定する必要あり


背景色透過

searchBar.disableBlur()

searchBar.backgroundColor = UIColor.clearColor()


placeholderの文字色変更

searchBar.placeholder = placeholder

searchBar.textField?.attributedPlaceholder = NSAttributedString(string: searchBar.placeholder ?? "", attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])


入力部分の背景色変更

searchBar.textField?.backgroundColor = UIColor.redColor()


入力文字色変更

searchBar.textField?.textColor = UIColor.blackColor()


クリアボタンの色変更

searchBar.textField?.rightButton?.becomeImageAlwaysTemplate()

searchBar.textField?.rightButton?.tintColor = UIColor.whiteColor()


虫眼鏡アイコンの色変更

searchBar.textField?.lupeImageView?.becomeImageAlwaysTemplate()

searchBar.textField?.lupeImageView?.tintColor = UIColor.whiteColor()


カーソル・選択範囲色の変更

searchBar.tintColor = UIColor.whiteColor()