web-dev-qa-db-ja.com

iOS 7 UISearchDisplayController検索バーが検索中にステータスバーと重なる

IOS 7向けにアプリを更新しています。すべてのビューを調整して、新しい透明なステータスバーを考慮に入れています(アプリは不透明なナビゲーションバーを引き続き使用します)。

ビューコントローラーのいずれかでUISearchDisplayControllerに接続されているUISearchBarで発生している1つの大きな問題を除いて、すべてのビューでステータスバーを調整するのは比較的簡単でした。

以下に示すように、検索バーは正常に表示されるようです。

検索バーhttp://imageshack.us/a/img163/9128/06vx.png

問題は、検索を開始するとすぐにナビゲーションバーが消えるということです(本来あるべきです)が、他のすべてのものも上に移動してステータスバーに重なります。

壊れた検索バーhttp://imageshack.us/a/img11/8237/corh.png

これは、検索バーが終了する検索バーの20ピクセル下で画面が暗くなるので、意図したとおりに機能していないようです。

IOS 7にはこれに対する組み込みソリューションがありますか?ユーザーが検索を開始および終了するたびに、ビューごとにフレームを手動で調整する必要はありません。

ありがとう!

66
desmondhume

私を正しい道に導いてくれてありがとう。ソリューションは機能しましたが、検索バーのフレームを移動するだけで、他のサブビューは間違った場所に残っていました。変更したのは、ビュー内のすべてのサブビューを移動し、アニメーション化することだけでした。

ありがとう!

-(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;
        }];
    }
}
21
desmondhume

ViewDidLoadに次の行を追加すると、修正されました。

self.edgesForExtendedLayout = UIRectEdgeNone;
88
Deddiekoel

半透明のナビゲーションバーを使用していませんか?もしそうなら、これはそれを解決します。

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}
13
tachiba

-(void)ViewDidLoadに次のコードを配置するだけです。 iOS 7以降のバージョンで動作します

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

更新:

if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
7
Salim

これは私が抱えていた問題を説明しているようです。うまくいけば、それは私の以前の位置で誰かを助けるでしょう。

  1. UIViewController/UITablewViewControllerに追加されたSearchDisplayControllerをサブクラス化します。

  2. 実装に次のようなものを追加します。

     - (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];
    
    }
    
6
Morkrom

私は問題を解決するために以下のコードをしました。

    - (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;
        }
}
6
Sabareesh

多分これをviewDidLoadに追加すると役立つと思います:

if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
    self.edgesForExtendedLayout = UIRectEdgeNone;

}
5
iphoner

追加するだけ

self.definesPresentationContext = YES;

ここから詳細を読むことができます: ISearchController and definePresentationContext

およびfrom Apple documentation: ISearchController documentation

注:UISearchDispalyControllerはiOS7では非推奨です。iOS8では代わりにUISearchControllerを使用し、上記の方法ではUISearchControllerを使用します

3

私の場合、検索バーの下のビューは適切な場所にあり、検索バーのみがステータスバーと重なっています。この場合、このコードの平和はうまく機能します:

- (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;
    }
}

他の人にも役立つことを願っています

2
Aurelien Porte

_ [に追加された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];
    }
}
0
G.T.
-(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;
    }
}
0
hodade

上記の回答は、ナビゲーションバーが隠れていない場合にのみ機能します。 ナビゲーションバーを非表示にしている場合、これを試してください:

-(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のステータスバーと重なります

0