【iOS】【小ネタ】UISearchBarのsubviewsをのぞいてみたら

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おばんです、杜王町出身としては「七夕は8月ですからァ!」という確固たる意志を持っている田中です。

UISearchBarの虫眼鏡の色を変えたいなぁと思って少し調べてたりしていました。
subviewsをprintしてみると見慣れないクラス名を見かけたので、七夕も会社の創設記念日も関係なく今回はその話です。

Viewの階層を見てみた

Capture View Hierarchyしてみた。

スクリーンショット 2016-07-04 13.18.57

階層で見てみると

  • UISearchBarBackground
  • UISearchBarTextField
  • _SearchBarSearchFieldBackgroundView

など見慣れないクラス名がある。

それぞれアイコンを見ればわかるように

  • UISearchBarBackground: UIImageViewのサブクラス
  • UISearchBarTextField: UITextFieldのサブクラス
  • _SearchBarSearchFieldBackgroundView: UIImageViewのサブクラス

となっているようです。

冒頭で述べたようにview要素を操作したいとすればsubviewsで潜っていって、それぞれキャストして操作することができるということのようですね。

虫眼鏡の色を変える

ちなみに上で書いたように虫眼鏡の色を変えるには、UISearchBarTextFieldのleftViewプロパティに該当Viewがsetされているようですのでそれにアクセスします。
ソースコードはこんな感じです。

let searchTextField = searchBar.subviews[0].subviews[1] as! UITextField
let grassImageView = searchTextField.leftView as! UIImageView
let magnifyingGlassImage = grassImageView.image!.imageWithRenderingMode(.AlwaysTemplate)
grassImageView.image = magnifyingGlassImage
grassImageView.tintColor = UIColor.cyanColor()

スクリーンショット 2016-07-04 15.04.01

注意点

subViewsで潜っていく方法で固定的にコードを書いているとOSの変更時に階層構造が変わったりしたときに想定通りの動作にならないので注意しましょう。

まとめ

UISearchBarに限らず、ほかのView要素も同じようになってるものがあると思われます。知らなんだ...。