IOS 7向けにアプリを更新しています。すべてのビューを調整して、新しい透明なステータスバーを考慮に入れています(アプリは不透明なナビゲーションバーを引き続き使用します)。
ビューコントローラーのいずれかでUISearchDisplayControllerに接続されているUISearchBarで発生している1つの大きな問題を除いて、すべてのビューでステータスバーを調整するのは比較的簡単でした。
以下に示すように、検索バーは正常に表示されるようです。
検索バーhttp://imageshack.us/a/img163/9128/06vx.png
問題は、検索を開始するとすぐにナビゲーションバーが消えるということです(本来あるべきです)が、他のすべてのものも上に移動してステータスバーに重なります。
壊れた検索バーhttp://imageshack.us/a/img11/8237/corh.png
これは、検索バーが終了する検索バーの20ピクセル下で画面が暗くなるので、意図したとおりに機能していないようです。
IOS 7にはこれに対する組み込みソリューションがありますか?ユーザーが検索を開始および終了するたびに、ビューごとにフレームを手動で調整する必要はありません。
ありがとう!
私を正しい道に導いてくれてありがとう。ソリューションは機能しましたが、検索バーのフレームを移動するだけで、他のサブビューは間違った場所に残っていました。変更したのは、ビュー内のすべてのサブビューを移動し、アニメーション化することだけでした。
ありがとう!
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[UIView animateWithDuration:0.25 animations:^{
for (UIView *subview in self.view.subviews)
subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
}];
}
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
[UIView animateWithDuration:0.25 animations:^{
for (UIView *subview in self.view.subviews)
subview.transform = CGAffineTransformIdentity;
}];
}
}
ViewDidLoadに次の行を追加すると、修正されました。
self.edgesForExtendedLayout = UIRectEdgeNone;
半透明のナビゲーションバーを使用していませんか?もしそうなら、これはそれを解決します。
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = YES;
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = NO;
}
-(void)ViewDidLoadに次のコードを配置するだけです。 iOS 7以降のバージョンで動作します
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
更新:
if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
これは私が抱えていた問題を説明しているようです。うまくいけば、それは私の以前の位置で誰かを助けるでしょう。
UIViewController/UITablewViewControllerに追加されたSearchDisplayControllerをサブクラス化します。
実装に次のようなものを追加します。
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
CGRect frame = self.searchResultsTableView.frame;
frame.Origin.y = CGRectGetHeight(self.searchContentsController.navigationController.navigationBar.frame);
frame.size.height = CGRectGetHeight(frame) - CGRectGetMinY(frame);
self.searchResultsTableView.frame = frame;
frame = self.searchBar.frame;
self.searchBar.frame = frame;
[self.searchContentsController.view insertSubview:self.searchBar aboveSubview:self.searchResultsTableView];
}
私は問題を解決するために以下のコードをしました。
- (void) viewDidLayoutSubviews
{
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.Origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
}
}
多分これをviewDidLoadに追加すると役立つと思います:
if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
追加するだけ
self.definesPresentationContext = YES;
ここから詳細を読むことができます: ISearchController and definePresentationContext
およびfrom Apple documentation: ISearchController documentation
注:UISearchDispalyControllerはiOS7では非推奨です。iOS8では代わりにUISearchControllerを使用し、上記の方法ではUISearchControllerを使用します
私の場合、検索バーの下のビューは適切な場所にあり、検索バーのみがステータスバーと重なっています。この場合、このコードの平和はうまく機能します:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = self.searchBar.frame;
frame.Origin.y += statusBarFrame.size.height;
self.searchBar.frame = frame;
}
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = self.searchBar.frame;
frame.Origin.y -= statusBarFrame.size.height;
self.searchBar.frame = frame;
}
}
他の人にも役立つことを願っています
_ [に追加されたSearchDisplayController
をサブクラス化しますUIViewController/UITablewViewController
そしてこれを実装に追加します-
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
if(self.active == visible) return;
[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
if (visible) {
[self.searchBar becomeFirstResponder];
} else {
[self.searchBar resignFirstResponder];
}
}
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = controller.searchBar.frame;
frame.Origin.y += statusBarFrame.size.height;
controller.searchBar.frame = frame;
}
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = controller.searchBar.frame;
frame.Origin.y -= statusBarFrame.size.height;
controller.searchBar.frame = frame;
}
}
上記の回答は、ナビゲーションバーが隠れていない場合にのみ機能します。 ナビゲーションバーを非表示にしている場合、これを試してください:
-(void)viewDidAppear:(BOOL)animated{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[self.tableView setFrame:CGRectMake(self.tableView.frame.Origin.x, self.tableView.frame.Origin.y+statusBarFrame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height)];
}
}
この投稿に基づいて: ISearchBarはiOSのステータスバーと重なります