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];
何らかの理由で、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;
同様の問題があり、キャンセルボタンのある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];
}
IOS 7以降、displaysSearchBarInNavigationBar
のプロパティYES
をUISearchDisplayController
に設定するだけで、NavigationBarでUISearchbar
を自動的に取得できます。
はい、iOS 7のボタンは画面上にありますが、タイトルは非表示になる可能性があります
そして、シミュレーターでの結果:
私は同じ問題に遭遇しました、これが私の解決策です、これが役立つことを願っています。
さらなる説明: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];
}
私は同じ問題を抱えていました。iPhoneでは検索キャンセルはうまく表示されましたが、iPadでは表示されませんでした。
UISearchBarを別のUIViewでラップする回避策は、外観が異なり、回転時の幅が間違っているため、うまくいきませんでした。
私の解決策は単純なものです-キャンセルなしで検索を使用し、UIBarButtonItemとしてキャンセルを追加します。
検索バーデリゲートを実装し、これを使用します。
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
searchBar.showsCancelButton = YES;
}