UISearchBarおよびUINavigationItem
-
06-07-2019 - |
質問
ナビゲーションバーの左端から右端に自分自身を配置するUISearchBarを取得できないようです。 -(void)viewDidLoadメソッドには、次のコードがあります:
UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];
ビルドして実行すると、一見しただけで問題ありません。ただし、もっとよく見ると、左側にマージン/スペースがあることがわかります。これは大事なことではありませんが、検索バーをタップして検索を開始すると、キャンセルボタンが表示されます。検索バーは少し右側に配置されているため、アニメーションはぎくしゃくしており、キャンセルボタンは次のように最後から落ちます。 リンクテキスト
UINavigationItemは3つのセルを持つテーブルのように見えます。最初と最後に削除できないパディングがあります。また、すべてをまとめて「マージ」する方法はないようです。次に検索バーを配置します。 AppStoreの検索ではナビゲーションバーに検索バーがあり、端まで表示されるため、この外観が可能です。スライドバーのキャンセルボタンアニメーションが適切に機能するように、検索バーを端まで移動する方法を知っている人はいますか?
解決 3
私は答えを見つけたと思います-検証するためのテストは行っていませんが。上記で提供した問題では、次の構造になっています。
Tab Bar Controller->ナビゲーションコントローラー->ビューコントローラ
問題の検索バーはView Controllerにあり、View ControllerはNavigation Controllerにあり、Navigation ControllerはTabバーにあります。
私は何気なくスタンフォードCS 193P(2009年春)のコースを見ていましたが、講義13の終わりに答えが提示されたかもしれません。 Alan Cannistraroは、Presenceアプリの構造は次の構造を持つ必要があると述べました。
この構造http://img143.imageshack.us/img143/6/viewcontrollerstructure .jpg
(Tab Bar Controllerに隣接する)下部のView Controllerは、検索バーを制御するView Controllerでした。彼は、それがこの方法で行われなければ、「問題にぶつかるだろう」と警告しました。おそらく私が直面した問題?そう信じています。
他のヒント
実際には、本当に簡単な解決策があります。しなければならないことは、バックアイテムの幅がゼロのビューを作成することだけです。
UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];
これは、initではなくloadViewメソッドで必ず行ってください。なぜそれが違いを生むのかわかりませんが、そうなります。
どうやらそれはタイミングについてです。 loadViewでの作業は停止しましたが、viewWillAppearでの作業は機能します(もちろん、1回だけ実行されるようにチェックして)。いくつかの初期化が既に完了した後にtitleViewを設定することだと思います。
次のコードは、このUIViewControllerだけのためにnavigationBarを非表示にします:
- (void)viewWillAppear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
UISearchBarをUINavigationBarの場所に表示するには、ルートビューコントローラに、ナビゲーションバーが通常ある場所に検索バーを置くだけです!
たぶん、リンゴはこれらのことをするためにUISearchDisplayControllerを使用しています。