旋转后UITableView标头中UISearchBar的布局搞砸了

时间:2015-06-18 11:29:45

标签: uitableview autolayout uinavigationbar uisearchbar

我有一个UITableView,其中一个搜索栏以编程方式插入到表格中headerView

override func viewDidLoad() {

    super.viewDidLoad()
    resultSearchController = UISearchController(searchResultsController: nil)
    resultSearchController.searchResultsUpdater = self
    resultSearchController.dimsBackgroundDuringPresentation = false
    resultSearchController.searchBar.delegate = self
    resultSearchController.searchBar.placeholder = "Search Contacts"
    resultSearchController.searchBar.scopeButtonTitles = ["All", "Title1", "Title2", "Title3"]

    tableView.tableHeaderView = resultSearchController.searchBar
    resultSearchController.searchBar.sizeToFit()

    definesPresentationContext = true

    tableView.tableFooterView = UIView(frame: CGRectZero)

}`

该表被设置为基于标准UINavigationController的向下钻取 - 选择一行推入详细视图控制器。

一切都在纵向或横向上完美运行,但如果在显示时旋转了细节视图,则会发生故障。确切的顺序是:

  • 以纵向打开表格,使用搜索栏过滤结果,然后选择其中一个结果以推入详细信息视图
  • 在详细视图中,旋转为横向
  • 在仍然在详细视图中时,旋转回肖像

当表格视图重新出现时,搜索栏的所有单个元素都已被"折叠"在彼此之上,整个事物覆盖状态栏:

collapsed search bar

我已经尝试了各种方法在viewDidAppear中明确设置搜索栏的框架,以及从标题视图中删除并替换它 - 但问题仍然存在。

我还注意到来自https://developer.apple.com/library/prerelease/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html的Apple示例代码存在类似问题:

apple code

有没有人为此做出解决方法?

已编辑添加:

在进一步挖掘时,看起来问题是旋转后导航栏消失了 - 在此之前:

nav bar exists

之后:

enter image description here

那么,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在注意到非活动searchBar似乎没有出现此问题后,我已成功保存搜索栏状态,当视图消失并在视图重新出现之前恢复它。

示例代码可以正常进行以下更改。保存状态:

- (void)viewDidDisappear:(BOOL)animated
{
    if (self.searchController.active && self.searchController.searchBar.text.length > 0) {
        self.savedSearch = self.searchController.searchBar.text;
        [self disableSearch];
    } else if (self.searchController.active) {
        // empty search field - this won't get restored
        [self disableSearch];
    }
    [super viewDidDisappear:animated];
}

- (void)disableSearch
{
    if (self.searchController.isActive) {
        self.searchController.searchBar.text = @"";
        self.searchController.active = NO;
    }
}

恢复:

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

    if (self.savedSearch) {
        NSLog(@"RESTORED SEARCH");
        self.searchController.searchBar.text = self.savedSearch;
        self.searchController.searchBar.showsCancelButton = YES;
        self.searchController.active = YES;
        self.savedSearch = nil;
    }
}

无论是否设置了self.searchController.hidesNavigationBarDuringPresentation,这似乎都可以正常工作(尽管如果true返回到视图时会有一些动画)。