2017-03-09 27 views
0

UISearchControllerは私のUITableViewのすぐ上にあり、私のテーブルには多くの記録があります。ユーザーがテーブルの一番下に行くと、検索バーを表示するためにトップに戻る必要があります。UITableViewでUISearchControllerを表示するスクロールダウン

- (void) showSearchBar { 
    _searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 

    self.searchController.searchResultsUpdater = self; 
    self.searchController.searchBar.placeholder = nil; 
    [self.searchController.searchBar sizeToFit]; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
    //self.sharedNavigationItem.titleView = _searchController.searchBar; 

    self.searchController.delegate = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES 
    self.searchController.searchBar.delegate = self; // so we can monitor text changes + others 
     self.definesPresentationContext = YES; 
    _searchController.hidesNavigationBarDuringPresentation = NO; 

} 

は私がテーブルに(上がる)スクロールダウンして、私は(下がる)までスクロールしたときに、それをバック隠したときに検索バーを表示する方法を思っていた:私は検索バーを作成する方法を確認することができ、以下のテーブルの中でさえ、私はテーブルの一番下にいます。

答えて

0

検索バーはUIに任意に配置できます。テーブルビューの兄弟ビューを作成します。たとえば、テーブルの上に配置します。そのビューに44pxに初期設定された高さの制約を与え、ビューと制約の両方にコンセントを提供する...今

@property(weak,nonatomic) IBOutlet UIView *searchBarContainerView; 
@property(weak,nonatomic) IBOutlet NSLayoutConstraint *searchBarHeightConstraint; 

、に、セットアップコードの変更:

// ... 
self.searchBarHeightConstraint.constant = self.searchController.searchBar.bounds.size.height; 
[self.searchBarContainerView addSubview:self.searchController.searchBar]; 
// ... 
0

あなたは上部のヘッダー滞在を作る場合は、検索フィールドには、目に見える

にUITableViewStylePlain滞在する必要があります:プレーンテーブルビュー。セクションヘッダーまたはフッターは、インラインセパレータとして表示され、テーブルビューがスクロールされると浮動します。

UITableViewStyleGrouped:セクションに異なる行グループが存在するテーブルビュー。セクションのヘッダーとフッターは浮動しません。

+0

:&削除SearchControllerを追加するには

BOOL showSearch; -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if ([scrollView.panGestureRecognizer translationInView:scrollView].y > 0) { // down showSearch = true; } else { // up showSearch = false; } } -(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ if (showSearch) { [self addSearch]; } else { [self removeSearch]; } [_tableView reloadData]; } 

:スクロールの方向を識別するために

。だから私はOPは、スタイルをプレーンに設定し、セクション0ヘッダーに検索バーを置くことができると思いますか?これは知っておくと良いことですが、このアプローチは他のテーブルの振る舞いを制約します(例えば、OPがセクションヘッダーに何か他のものを必要としたり、他のヘッダーを浮かべたくないなど)。 – danh

+0

彼は定義できますそれは選択されたテーブルだけに適用されますが、これはすべてに適用する必要はありません –

0

私はあなたを助けようとし私がしたことで、それがあなたを助けることを願っています。 これは、テーブルビューのヘッダビューに自分のラベルを追加したものです。検索コントローラで置き換えようとしましたが、

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
     CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, 40); 
     UIView *view = [[UIView alloc] initWithFrame:frame]; 
     view.backgroundColor = [UIColor clearColor]; 
     view.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     _searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
     self.searchController.searchResultsUpdater = self; 
     self.searchController.searchBar.placeholder = nil; 
     [self.searchController.searchBar sizeToFit]; 
     [view addSubview:_searchController]; 
     view.tag = 123; 
     return view; 
} 

ドラッグの終了時にエフェクトを非表示にするには、以下の方法を使用します。

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
      targetContentOffset:(inout CGPoint *)targetContentOffset{ 
    if (velocity.y > 0){ 
    NSLog(@"up"); 
    [self.view viewWithTag:123].hidden = true; 
} 
if (velocity.y < 0){ 
    NSLog(@"down"); 
    [self.view viewWithTag:123].hidden = false; 
} 

と方法下記のテーブルビューの使用をスクロールの即時変更のために:私はいくつかの新しい答えを考え、いくつか検索した後

-(void)scrollViewDidScroll:(UIScrollView *)scrollView //working delegate 
{ 
    if ([scrollView.panGestureRecognizer translationInView:scrollView].y > 0) { 
     NSLog(@"down"); 
     [self.view viewWithTag:123].hidden = false; 
    } else { 
     NSLog(@"up"); 
     [self.view viewWithTag:123].hidden = true; 
    } 
} 
0

、それはあなたを助け願っています!これは良い情報です

-(void)addSearch {  
    if (!_searchController){ 

    _searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 

    _searchController.searchResultsUpdater = self; 
    [_searchController.searchBar sizeToFit]; 
    _tableView.tableHeaderView = _searchController.searchBar; 

    _searchController.delegate = self; 
    _searchController.dimsBackgroundDuringPresentation = NO; 

    self.definesPresentationContext = YES; 
    _searchController.active = NO; 

    _searchController.searchResultsUpdater = self; 
    _searchController.dimsBackgroundDuringPresentation = NO; 
    self.definesPresentationContext = YES; 
    _tableView.tableHeaderView = _searchController.searchBar; 

    _searchController.searchBar.delegate = self; 
    } 
} 

-(void)removeSearch { 
    _searchController.active = NO; 
    [_searchController removeFromParentViewController]; 
    _searchController = nil; 
    _tableView.tableHeaderView = nil; 
} 
関連する問題