旋转后 UITableView 标头中 UISearchBar 的布局混乱

Posted

技术标签:

【中文标题】旋转后 UITableView 标头中 UISearchBar 的布局混乱【英文标题】:Layout of UISearchBar in UITableView header messed up after rotation 【发布时间】:2015-06-18 11:29:45 【问题描述】:

我有一个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 的向下钻取 - 选择行会推送到详细视图控制器中。

一切都在纵向或横向上完美运行,但如果在显示时旋转了详细视图,则会在弹出详细视图后崩溃。确切的顺序是:

纵向打开表格,使用搜索栏过滤结果,然后选择其中一个结果推送到详细视图中 在详细视图中,旋转为横向 仍在细节视图中时,旋转回纵向

当表格视图重新出现时,搜索栏的所有单个元素都已经“折叠”在彼此的顶部,整个东西都覆盖在状态栏上:

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

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

有人想出解决方法吗?

编辑添加:

进一步挖掘,问题似乎是导航栏在旋转后消失了 - 这是之前的:

之后:

那么,有什么想法吗?

【问题讨论】:

您找到解决方法了吗? 我现在在 iOS 14 中遇到了类似的问题 ***.com/questions/68571676/… 是 【参考方案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 返回视图时会有一些动画)。

【讨论】:

以上是关于旋转后 UITableView 标头中 UISearchBar 的布局混乱的主要内容,如果未能解决你的问题,请参考以下文章

从横向旋转到纵向 (iPad) 后 UITableView 的奇怪行为

旋转后 UINavigationController 中的 UITableView 在导航栏下

UITableView 标头不可见

UITableView 部分在设备旋转后失去交互

swift 旋转后修复UIStackView内的UITableView高度

如何避免在方向更改后调整 UITableView(旋转)单元格的大小?