web-dev-qa-db-ja.com

iOS7のUISearchBar内のUITextField

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

Screenshots

iOS 6コード:これがiOS6でのコーディング方法です、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での上記のコードの結果:![iOS7の外観]

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];

enter image description here SO ... subViewのフレーム(TextField)を何らかの方法で変更することは可能ですか? :(

[〜#〜]編集[〜#〜]

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

 self.navigationItem.titleView = sbTextField;
12

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

IOS 7では、UISearchDisplayControllerUISearchBarを使用して、次のように設定できます。

searchDisplayController.displaySearchBarInNavigationBar = YES

検索バーはUINavigationBarに表示され、元のiOS6ソリューションのすべてのハックや手動のフレームサイズ設定なしで他のUIBarButtonItemsとうまく連携します。

注意すべき点が1つあります。これを、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にdisplaysSearchBarInNavigationBarプロパティが含まれています。このプロパティを使用して、iPhoneのカレンダーと同様にナビゲーションバーに検索バーを配置できます。

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

13
DiscDev

iOS 7では、テキストフィールドにアクセスするには、レベルをさらに繰り返す必要があります。このようにコードを変更します

for (UIView *subView in self.searchBar.subviews){
    for (UIView *ndLeveSubView in subView.subviews){
    if ([ndLeveSubView isKindOfClass:[UITextField class]])
        {
            searchBarTextField = (UITextField *)ndLeveSubView;
            break;
        }
    }
   }

ただし、UISearchBarの背景をクリアし、テキストフィールドに検索バーアイコンを設定する最良の方法は次のとおりです。

[searchBar setBackgroundImage:[[UIImage alloc] init] ];//if you want to remove background of uisearchbar
UIImage *image = [UIImage imageNamed: @"search_icon.png"];
[searchBar setImage:image forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
13
Adnan Aftab

これを試してみてください。よくわかりませんが、iOS 7の検索バーにはサブビューがあり、そのサブビュー内には2つのサブビューがあります。そのうちの1つはUITextFieldです。

UIView *searchbarview = [searchBar.subviews objectAtIndex:0];
UITextField *sbTextField = (UITextField *)[searchbarview.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];
2
Bhumit Mehta

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

2
Syed Absar

iOS6およびiOS7互換ソリューション:

- (void)setTextFieldAsDelegate:(UIView *)inputView {
    for (UIView *view in inputView.subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            searchBarTextField = (UITextField *)view;
            searchBarTextField.delegate = self;
            break;
        } else {
            [self setTextFieldAsDelegate:view];
        }
    }
}
2
Javier Querol

迅速なソリューション

for subView in searchBar.subviews{
        for deeperView in subView.subviews{
            if let searchField:UITextField = deeperView as? UITextField{
                searchField.layer.borderWidth = 1.0
                searchField.layer.borderColor = UIColor(red: 134/255, green: 14/255, blue: 75/255, alpha: 1).CGColor
                searchField.layer.cornerRadius = 5.0
            }
        }
    }
0
Tialtous