UISearchController中的searchBar在tableHeaderView中动画出屏幕

时间:2014-10-06 18:41:38

标签: ios objective-c uitableview uisearchbar uisearchcontroller

我有UISearchController UITableViewController作为searchResultsController,此UISearchBar的{​​{1}}设置为searchController在我的根ViewController中显示的当前tableHeaderView。正如预期的那样,几乎所有东西都运作良好。但是在tableView的动画中(当我点击searchBar和UISearchBar隐藏并且searchBar到达顶部时,就像在UINavigationBar中一样)我有一个奇怪的行为。它不会移动到UISearchDisplayController(y:0)的位置,而是跳出屏幕而不是启动显示取消按钮的动画。我尝试将我的实例化代码移动到UINavigationBar而不是viewDidLoad,事情就是一样的。我认为问题的中心位于init视图的框架中,但我不确定(我尝试设置框架,但没有成功)。我正在做的一切都是纯粹的代码。

以下是代码的相关部分:

searchResultsController

我对- (void) viewDidLoad { [super viewDidLoad]; // search controller setup self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController]; self.searchController.delegate = self; self.searchController.searchResultsUpdater = self; self.searchController.searchBar.delegate = self; [self.searchController.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchController.searchBar; self.searchController.definesPresentationContext = YES; }

的延迟加载
searchResultsController

我已经从apple下载了示例代码,但他们使用storyBoards和xib作为UITableViewCell,SearchController在项目中完美运行。有没有人有同样的问题?我怎样才能解决这个问题?任何解决方案或建议将不胜感激。

感谢您的关注。

8 个答案:

答案 0 :(得分:23)

添加

self.extendedLayoutIncludesOpaqueBars = YES;

on viewDidLoad方法

答案 1 :(得分:20)

您是否尝试将hidesNavigationBarDuringPresentation设置为false? 解决了我的头痛..

self.searchController.hidesNavigationBarDuringPresentation = false;

在我看来,将搜索栏放在导航栏中可以提供更加可靠的用户体验(适用于iphone)

self.navigationItem.titleView = self.searchController.searchBar;

答案 2 :(得分:17)

为了让这个更清楚@ Lorenzo的回答对我有用。

self.definesPresentationContext = YES;

答案 3 :(得分:7)

试试这个:

首先,您需要委派

  

UISearchControllerDelegate

对于Swift

func willPresentSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = true
}

func willDismissSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = false
}

答案 4 :(得分:3)

在Swift中,尝试:

override func viewDidLoad() {
    edgesForExtendedLayout = []
    searchController.hidesNavigationBarDuringPresentation = false

    // ...
}

答案 5 :(得分:1)

SWIFT 3.01

func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}

func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}

答案 6 :(得分:0)

我注意到UISearchController在我的一个视图中完美运行,但在另一个视图中没有。问题出在UITableViewController而不是UIViewController上。如果切换到UITiewController,其中包含UITableView并且正确约束,则没有问题。我用XIB实现了它,它运行得很好。

答案 7 :(得分:0)

在我的情况下,searchBar位于tableHeaderView中,屏幕上没有NavigationBar。但是,当活跃时,SearchBar仍然向上动画重叠状态栏。防止这种情况的解决方案是设置:

searchController.hidesNavigationBarDuringPresentation = false

这很奇怪,因为我说视图控制器没有使用导航栏。