Posted at

【iOS - Swift】UISearchBarの背景部分を透過させる方法

More than 3 years have passed since last update.


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