UISearchBarの背景部分を透過させるコード
UISearchBarのサブビューまで潜ってUISearchBarBackground(UIImageViewのサブクラス)とUISearchBarTextField(UITextFieldのサブクラス)を直接いじってやるやり方。
for subview in searchBar.subviews {
for secondSubView in subview.subviews {
// 背景部分
if let imgview = secondSubView as? UIImageView {
imgview.image = nil
}
// テキストフィールド部分
if let txtview = secondSubView as? UITextField {
txtview.backgroundColor = UIColor.whiteColor()
}
}
}
どのタイミングでこのコードを走らせるか
まず、アプリ起動時からUISearchBarの背景部分を透過したい場合に、viewDidLoad()
やviewWillAppear()
内に記述するというのは__避けるべき__だと思う。
これはUISearchBarに対してAutoLayoutを使用している場合に、viewDidLoad()
およびviewWillAppear()
の時点ではレイアウト制約が反映されていないため、その影響か、UISearchBarのサブビューであるUISearchBarBackgroundとUISearchBarTextFieldに対して再設定を行っても、ちゃんと効いてくれない。
制約が実際に反映されるのは、viewDidLayoutSubviews()
の時点なので、例えばこのタイミングで透過処理を行えばよい。
override fun viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// 透過処理(先のコードと一緒)
for subview in searchBar.subviews {
for secondSubView in subview.subviews {
if let imgview = secondSubView as? UIImageView {
imgview.image = nil
}
if let txtview = secondSubView as? UITextField {
txtview.backgroundColor = UIColor.whiteColor()
}
}
}
}