

iOSのGoogleMapアプリのようにメニューのViewが開いてもそのViewController内で、常に最前面にUISearchbarを表示するにはどうすればよいですか？

以下がイメージです。  
![メニューを開く前](https://i.stack.imgur.com/nO3Y3.png)
![メニューを開いた後](https://i.stack.imgur.com/DeVlQ.png)


CC BY-SA 3.0
2015-02-27T06:55:46.033
7206
2015-03-07T10:22:34.550
2015-02-27T09:19:10.193
8060
8060
question
ios
常にUISearchbarを表示


# はじめに

`UIViewController`内で通常、ベースとなるViewはプロパティの`view`になります。  
この`view`に何かのViewを`addSubview:`すると、そのViewが最前面になります。

つまり、一番最後に`addSubview:`したViewが最前面になる訳ですが、普通は画面の初期表示の後にもユーザーイベント等をトリガーとして`addSubview:`する事があります。

ここで、Viewを最前面にするメソッドとして、`bringSubviewToFront:`があります。  
このメソッドを使うとそのViewに貼られているSubViewを最前面にする事ができます。

# 回答

質問のひとつの解決手段として、 **viewプロパティにaddSubview:されるタイミングでbringSubviewToFront:を呼ぶ**
を提案します。

まず、対象の`UIViewController`のサブクラスのプロパティ`view`を下記のようなUIViewサブクラスで置き換えます。(xibやstoryboard上又はloadView等で)

[code]

    @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
    
[/code]

次に、最前面に置きたいView(ここではUISearchbar)を生成時に、上記クラスのプロパティ`frontView`にセットしておく。(下記参照)

[code]

    [(MyView*)self.view setFrontView:searchbar];
    
[/code]

そうすると、設定したViewControllerの`view`に`addSubview:`される度に`didAddSubview:`が呼ばれ、`frontView`にセットしたViewが最前面になる処理が呼ばれます。


CC BY-SA 3.0
2015-03-07T10:22:34.550
7583
2015-03-07T10:22:34.550
2020-06-17T08:14:45.997
-1
7364
7206
answer