12

iOS 6 アプリと同じように、UISearchBar に TextField を配置して同じ外観を実現しようとしています。いくつかの方法でコーディングしようとしましたが、まだ成功していません。問題は、iOS 7 以降、TextField のフレームを変更できないことです。その結果、TextField が NavigationBar のすべてのスペースを取り、右側の UIBarButtonItem (メニュー ボタン) をオーバーライドします。以下の写真を参照してください。

スクリーンショット

iOS 6 コード: これは iOS 6 でのコーディング方法で、TextFields フレームを好きなように設定できました。

UITextField *sbTextField = (UITextField *)[searchBar.subviews lastObject];
[sbTextField removeFromSuperview];

CGRect rect = searchBar.frame;
rect.size.height = 32;
rect.size.width = 210;
sbTextField.frame = rect;

[sbTextField setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin];


UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc]  initWithCustomView:sbTextField];

[[self navigationItem] setLeftBarButtonItem:searchBarNavigationItem];

iOS 7 での上記のコードの結果: ![iOS 7 look]

iOS 7 コード: iOS 7 の違いは、UITextField を UISearchBar/UINavigationBar に追加するために subViews を使用する必要があることです。これを行うことで、私はまだそのフレームを変更できませんでした. 現在、このコードの下の図に示されている右側の menuButton に重なっています...

UITextField* sbTextField;
CGRect rect = subView.frame;
rect.size.height = 32;
rect.size.width = 115;

for (UIView *subView in self.searchBar.subviews){
    for (UIView *ndLeveSubView in subView.subviews){

        if ([ndLeveSubView isKindOfClass:[UITextField class]])
        {

            sbTextField = (UITextField *)ndLeveSubView;
            sbTextField.backgroundColor =[UIColor whiteColor];
            UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc] initWithCustomView:sbTextField];
            sbTextField.frame = rect;
            self.navigationItem.leftBarButtonItem = searchBarNavigationItem;
            self.navigationItem.rightBarButtonItem =  menuButton;
            [sbTextField removeFromSuperview];

             break;
        }

    }

 }
 [self.searchBar reloadInputViews];

ここに画像の説明を入力 SO ... サブビューのフレーム (TextField) を何らかの方法で変更することは可能ですか? :(

編集

答えはちょっと不自由です。TextField の右側にあるボタンを使用して ios7 でコードを機能させるには、TextField を navigationBar の titleView として設定する必要があります。これは ios 6 では当てはまりませんでした。しかし、他の問題が発生する可能性があり、iOS7 の searchBars 内で TextField を使用することはお勧めしません。代わりに searchDispalyController を使用してください。以下の私の答えを見てください

 self.navigationItem.titleView = sbTextField;
4

7 に答える 7

13

iOS 7 ではを入れないでくださいUITextFieldUINavigationBarこのウィジェットはすでに Apple によって提供されています。

UISearchDisplayControlleriOS 7 では、 をとともに使用するだけで、次のようUISearchBarに設定できます。

searchDisplayController.displaySearchBarInNavigationBar = YES

検索バーは に表示され、元の iOS 6 ソリューションのすべてのハックや手動のフレーム サイズ調整を行わなくてもUINavigationBar、他の とうまく連携します。UIBarButtonItem

注意すべき点 - iOS 7 よりも古い OS をまだサポートしているプロジェクトにこれを追加する場合は、呼び出しにチェックを入れるか、古い OS で実行するとアプリがクラッシュすることを確認する必要があります。

if([searchDisplayController respondsToSelector:@selector(displaysSearchBarInNavigationBar)])
{
    searchDisplayController.displaysSearchBarInNavigationBar = YES;
}

iOS 7 移行ガイドのこのセクションを参照してください: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Bars.html

iOS 7 では、UISearchDisplayController には、iPhone のカレンダーにあるような検索バーをナビゲーション バーに配置するために使用できる、displaysSearchBarInNavigationBar プロパティが含まれています。

もう 1 つ注意してください - 面倒なフレーム操作をすべて行う必要がないように、今後 AutoLayout への移行を検討する必要があります。Apple はそれを推奨しており、おそらく正当な理由があります (より大きな画面を備えた将来のデバイス...?)

于 2013-10-04T15:37:15.383 に答える
2

ターゲット フレームで UIView *textFieldContainer を作成し、テキスト フィールドをその UIView に追加してから、その textFieldContainer をナビゲーション アイテムとして追加します。つまり、テキストフィールドがコンテナー内にあり、そのコンテナーで遊ぶだけで、アプローチは同じままです。

于 2013-10-02T10:53:52.563 に答える