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()