質問: iOSのGoogleMapアプリのようにメニューのViewが開いてもそのViewController内で、常に最前面にUISearchbarを表示するにはどうすればよいですか? 以下がイメージです。 !メニューを開く前 !メニューを開いた後
回答: はじめに ==== `UIViewController`内で通常、ベースとなるViewはプロパティの`view`になります。 この`view`に何かのViewを`addSubview:`すると、そのViewが最前面になります。 つまり、一番最後に`addSubview:`したViewが最前面になる訳ですが、普通は画面の初期表示の後にもユーザーイベント等をトリガーとして`addSubview:`する事があります。 ここで、Viewを最前面にするメソッドとして、`bringSubviewToFront:`があります。 このメソッドを使うとそのViewに貼られているSubViewを最前面にする事ができます。 回答 == 質問のひとつの解決手段として、**viewプロパティにaddSubview:されるタイミングでbringSubviewToFront:を呼ぶ** を提案します。 まず、対象の`UIViewController`のサブクラスのプロパティ`view`を下記のようなUIViewサブクラスで置き換えます。(xibやstoryboard上又はloadView等で) ``` @interface MyView : UIView // 最前面に置きたいView @property(nonatomic,weak)UIView* frontView; @end @implementation MyView // addSubview:される時に呼ばれる - (void)didAddSubview:(UIView *)subview { // 最前面にする if (self.frontView) { [self bringSubviewToFront:self.frontView]; } } @end ``` 次に、最前面に置きたいView(ここではUISearchbar)を生成時に、上記クラスのプロパティ`frontView`にセットしておく。(下記参照) ``` [(MyView*)self.view setFrontView:searchbar]; ``` そうすると、設定したViewControllerの`view`に`addSubview:`される度に`didAddSubview:`が呼ばれ、`frontView`にセットしたViewが最前面になる処理が呼ばれます。