将UISearchBar锁定到像Game Center这样的UITableView的顶部

TiM*_*TiM 27 uitableview uiscrollview uisearchbar ios game-center

在游戏中心的UITableViews中有这个很酷的功能,以及它们顶部的搜索栏.与将搜索栏放在表标题视图中的应用程序(因此它计为标准表格单元格)不同,它似乎是用螺栓固定到它上面的父导航栏.因此,当滚动表格时,搜索栏确实会移动,但如果您在表格的边界上滚动,搜索栏将永远不会停止触摸导航栏.

有谁知道这可能是怎么做的?我想知道Apple是否可能将搜索栏和表放在父滚动视图中,但我想知道它是否可能比这更简单.

fri*_*erg 28

鲍勃的答案是相反的:它应该是MIN(0,scrollView.contentOffset.y).

此外,为了正确支持调整大小(旋转时会发生),应重用其他帧值.

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{
    UISearchBar *searchBar = searchDisplayController.searchBar;
    CGRect rect = searchBar.frame;
    rect.origin.y = MIN(0, scrollView.contentOffset.y);
    searchBar.frame = rect;
}
Run Code Online (Sandbox Code Playgroud)

  • 当`UISearchBar`是`tableHeaderView`时,`-scrollViewDidScroll:`中的它的框架的直接操作适用于iOS 5.x但不适用于iOS 6.为了使它工作,我必须将搜索栏包装成一个简单的` UIView`并将其添加为表头. (14认同)

Bob*_*ork 7

您可以将searchBar放在表头中,并为tableView实现 - (void)scrollViewDidScroll:(UIScrollView*)scrollView委托方法.做这样的事情应该有效:

-(void) scrollViewDidScroll:(UIScrollView *)scrollView {
    searchBar.frame = CGRectMake(0,MAX(0,scrollView.contentOffset.y),320,44);
} 
Run Code Online (Sandbox Code Playgroud)

如果您使用了searchDisplayController,则可以使用self.searchDisplayController.searchbar访问搜索栏.


Muh*_*sim 5

在Swift 2.1和iOS 9.2.1中

    let searchController = UISearchController(searchResultsController: nil)

        override func viewDidLoad() {
        /* Search controller parameters */
            searchController.searchResultsUpdater = self  // This protocol allows your class to be informed as text changes within the UISearchBar.
            searchController.dimsBackgroundDuringPresentation = false  // In this instance,using current view to show the results, so do not want to dim current view.
            definesPresentationContext = true   // ensure that the search bar does not remain on the screen if the user navigates to another view controller while the UISearchController is active.

            let tableHeaderView: UIView = UIView.init(frame: searchController.searchBar.frame)
            tableHeaderView.addSubview(searchController.searchBar)
            self.tableView.tableHeaderView = tableHeaderView

        }
        override func scrollViewDidScroll(scrollView: UIScrollView) {
           let searchBar:UISearchBar = searchController.searchBar
           var searchBarFrame:CGRect = searchBar.frame
           if searchController.active {
              searchBarFrame.origin.y = 10
           }
           else {
             searchBarFrame.origin.y = max(0, scrollView.contentOffset.y + scrollView.contentInset.top)

           }
           searchController.searchBar.frame = searchBarFrame
       }
Run Code Online (Sandbox Code Playgroud)