web-dev-qa-db-ja.com

UINavigationBarに追加されたUIsearchbarがキャンセルボタンを表示しない場合のiOS7

UISearchBarをUINavigationBarの上に追加し、UIsearchbar showsCancelButtonをYESに設定します。iOS6では正常に動作しますが、iOS7ではキャンセルボタンが表示されません。以下のコードスニペットを使用しました

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 600, 44)];
searchBar.showsCancelButton = YES;
searchBar.translucent = NO;
[searchBar setTintColor:[UIColor redColor]];
searchBar.backgroundColor = [UIColor yellowColor];
[self.navigationController.navigationBar   addSubview:searchBar];
22
JackYi

何らかの理由で、iOS7はナビゲーションバーに追加されたときにキャンセルボタンを表示しません。これは、navigationItemのtitleViewとして設定しようとした場合にも発生します。

最初に別のUIViewでUISearchBarをラップすることにより、この問題を回避できます。 titleViewとしてそれを行う方法は次のとおりです。

UISearchBar *searchBar = [UISearchBar new];
searchBar.showsCancelButton = YES;
[searchBar sizeToFit];
UIView *barWrapper = [[UIView alloc]initWithFrame:searchBar.bounds];
[barWrapper addSubview:searchBar];
self.navigationItem.titleView = barWrapper;
44
Rodskjegg

同様の問題があり、キャンセルボタンのあるiPhoneの検索バーではうまく表示されましたが、iPadではキャンセルボタンは表示されませんでした。 UIsearchBarを@Rodskjeggスロースタイルの問題のようにUIViewにラップします。 iPadでは、UIsearchBarをnavigationItemのtitleViewとして設定し、UIBarButtonSystemItemCancelとしてsetRighttBarButtonItemにUIBarButtonItemを追加します。

    [self.navigationItem setLeftBarButtonItem:Nil animated:YES];
    self.navigationItem.titleView = self.searchBar;

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    {
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(searchBarCancelButtonClicked:)];

        [self.navigationItem setRightBarButtonItem: cancelButton animated:YES];
    }
    else {
        [self.navigationItem setRightBarButtonItem: nil animated:YES];
    }
6
vcalfa

IOS 7以降、displaysSearchBarInNavigationBarのプロパティYESUISearchDisplayControllerに設定するだけで、NavigationBarでUISearchbarを自動的に取得できます。

4
kohaxun

はい、iOS 7のボタンは画面上にありますが、タイトルは非表示になる可能性があります

enter image description here

そして、シミュレーターでの結果:

enter image description here

4
David

私は同じ問題に遭遇しました、これが私の解決策です、これが役立つことを願っています。

さらなる説明:setShowsCancelButton:animated: searchBarに追加すると、魔法のように機能します。 searchBarをナビゲーションバーに追加する最もクリーンな方法はself.navigationItem.titleView = self.searchBar;を呼び出す適切なタイミングsetShowsCancelButton:animated:searchBarTextDidBeginEditing:およびsearchBarTextDidEndEditing:デリゲートメソッド。したがって、selfをsearchBarのデリゲートとして設定することを忘れないでください。

- (void)viewDidLoad
{
    self.navigationItem.titleView = self.searchBar;
}

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:YES animated:YES]; 
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:NO animated:YES];
}
3
廖維平

私は同じ問題を抱えていました。iPhoneでは検索キャンセルはうまく表示されましたが、iPadでは表示されませんでした。

UISearchBarを別のUIViewでラップする回避策は、外観が異なり、回転時の幅が間違っているため、うまくいきませんでした。

私の解決策は単純なものです-キャンセルなしで検索を使用し、UIBarButtonItemとしてキャンセルを追加します。

1
Tal Haham

検索バーデリゲートを実装し、これを使用します。

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = YES;
}
0
user3607589