3

標準的な方法でUISearchDisplayControllerを設定したUITableViewControllerを持っています(検索バーはtableView内にあります)。私は検索バーを隠すようにしたいと思っています。本当に隠されていて、ただスクロールしていないだけです。as in this solution。次に、ユーザーがボタンを押したときに検索UIを表示し、ユーザーが検索で見つかった項目の1つを選択した後に、再度非表示にします(本当に非表示にします)。ここでUITableViewの検索バーを非表示にする

は、そのためのほとんどの作業コードです:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    self.searchDisplayController.searchBar.prompt = @"Add an item"; 
    self.searchDisplayController.searchBar.placeholder = @"Type the item name"; 

    // i do this to trigger the formatting logic below 
    [self.searchDisplayController setActive:YES animated:NO]; 
    [self.searchDisplayController setActive:NO animated:NO]; 
    // rest of my view will appear 
} 

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { 

    NSTimeInterval duration = (self.isViewLoaded && self.view.window)? 0.3 : 0.0; 
    __block CGFloat searchBarHeight = controller.searchBar.frame.size.height; 

    [UIView animateWithDuration:duration animations:^{ 
     self.tableView.contentOffset = CGPointMake(0, searchBarHeight); 
     self.tableView.contentInset = UIEdgeInsetsMake(-searchBarHeight, 0, 0, 0); // trouble here, I think 
    } completion:^(BOOL finished) { 
     controller.searchBar.hidden = YES; 
    }]; 
} 

- (IBAction)pressedAddButton:(id)sender { 

    self.searchDisplayController.searchBar.hidden = NO; 
    [self.searchDisplayController setActive:YES animated:YES]; 
} 

を示すために、私は適切にコンテンツのインセットを設定していると思うが、それが突然動作します。コードで示すように、テーブルはコンテンツがあまりにも遠くに移動することを許します。つまり、非常に背の高い2つの行だけで、私は下にスクロールすることができます。 contentInset行をコメントアウトすると、テーブルはコンテンツをあまりにも遠くに引っ張り、行0の上に大きな空白を残します。おそらく、検索バーが隠れている場所です。

誰でも助けることができます。

+0

検索バーを隠した後、テーブルは2行、各70ピクセルの高さ、テーブルの高さ= 367、内容offset.y = 0、内容inset.top = -75、およびinset.bottom = 0期待される。私がここにこだわっているのは、「ボトムバウンス」の原因です。スクロールビューでは、コンテンツのサイズが140px、ビューが367で、スクロールできないようにしてください。なぜ、最初の行をスクロールできますか? – danh

答えて

11

この問題がある可能性があります誰にも(誰もいないように見える) -

前方唯一の方法私はUITableViewControllerを放棄してUIViewControllerを支持し、テーブルビューと検索バーであるuiviewを見つけることができました。

私は上記のようなレイアウトを管理:

- (void)setSearchHidden:(BOOL)hidden animated:(BOOL)animated { 

    UISearchBar *searchBar = self.searchDisplayController.searchBar; 
    CGFloat searchBarHeight = searchBar.frame.size.height; 

    CGFloat offset = (hidden)? -searchBarHeight : searchBarHeight; 
    NSTimeInterval duration = (animated)? 0.3 : 0.0; 

    [UIView animateWithDuration:duration animations:^{ 
     searchBar.frame = CGRectOffset(searchBar.frame, 0.0, offset); 
     self.tableView.frame = UIEdgeInsetsInsetRect(self.tableView.frame, UIEdgeInsetsMake(offset, 0, 0, 0)); 
    } completion:^(BOOL finished) {if (!hidden) [searchBar becomeFirstResponder];}]; 
} 

add関数の開始と終了に呼び出されるメソッドを除き。

(年に約2回、私はUITableViewControllerが価値があるよりも面倒です、そして、ほぼ同じ頻度で、私はそれを忘れました)。

+0

これは素晴らしいことでした!私はsearchbar.alpha = 0を追加しました。アニメーションに... – Hackmodford

+1

+1 "私はそれを忘れた":D – bennythemink

0

"アルファ" のアプローチで行く:

[controller.searchBar setAlpha:0.0]; 

または

[controller.searchBar setAlpha:1.0]; 
+0

考えてくれてありがとうが、違いはない。 – danh

0

、あなたのテーブルに十分なエントリを持っている場合は、次の操作を行うことができます

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

この作品だけ完全に画面を満たすのに十分なエントリが存在する場合。もちろん、エントリが1つまたは2つしかない場合は、検索バーを非表示にすることはできません。

関連する問題