在 iOS 11 上,导航项中的搜索栏在导航弹出时折叠并卡在状态栏下

Posted

技术标签:

【中文标题】在 iOS 11 上,导航项中的搜索栏在导航弹出时折叠并卡在状态栏下【英文标题】:Search Bar in a Navigation Item collapses and gets stuck under status bar upon navigation pop, on iOS 11 【发布时间】:2017-09-15 12:23:58 【问题描述】:

我正在使用 UINavigationItem 的新 ios 11 searchContoller 属性。我正在运行 iOS 11.0 GM 版本。

当我在搜索控制器处于活动状态时执行 push segue 时,它​​工作正常。当我随后弹回时,搜索栏在状态栏中折叠并被挤压。然后我无法取消搜索或编辑搜索文本。

查看以下图片序列:

最后的图像显示了在 pop segue 期间表格的出现,以从呈现的视图控制器返回到带有搜索栏的表格。奇怪的是,这并不总是会发生。它发生在 90% 的时间,但有时它表现得很好。我还没有弄清楚我在做什么不同的事情来让它发挥作用。一旦搜索栏被压扁,我必须强制关闭应用程序才能恢复到合理的状态。

设置搜索控制器的代码非常标准。 viewDidLoad()的相关位如下:

searchController = UISearchController(searchResultsController: nil)
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.returnKeyType = .done
searchController.searchBar.placeholder = "Your Library"
searchController.searchBar.searchBarStyle = .minimal

// We will manage the clearing of selections ourselves.
clearsSelectionOnViewWillAppear = false

// Some search bar styles are slightly different on iOS 11
if #available(iOS 11.0, *) 
    navigationItem.searchController = searchController
    navigationController!.navigationBar.prefersLargeTitles = true

else 
    searchController.searchBar.backgroundColor = tableView.backgroundColor!
    searchController.hidesNavigationBarDuringPresentation = false
    tableView.tableHeaderView = searchController.searchBar
    tableView.setContentOffset(CGPoint(x: 0, y: searchController.searchBar.frame.height), animated: false)

我还在 Apple 的消息应用程序(见下面的屏幕截图)以及“设置”、“便笺”和“邮件”中注意到了这个问题,所以这可能是 iOS 11 的错误。

这似乎只在设置 -> 常规 -> 辅助功能 -> 较大文本中使用小于默认文本大小时发生,并且似乎只发生在物理设备上(尚未在模拟器中重现)。在viewDidAppear 中,searchController.searchBar.frame.height 等于0(但在viewDidDisappear 中不等于viewWillAppear)。到目前为止,我唯一的解决方法是:

override func viewDidAppear(_ animated: Bool) 
    if #available(iOS 11.0, *), searchController.searchBar.frame.height == 0 
        navigationItem.searchController?.isActive = false
    

    super.viewDidAppear(animated)

有没有更好的方法来解决这个问题?

【问题讨论】:

我有类似的问题.. 我现在向 Apple 提出了错误报告... 把雷达发给我,我会宣传它 我提交的错误报告的 URL 是 bugreport.apple.com/web/?problemID=34459254 我不知道其他用户是否可以访问。是这个意思吗? 刚刚收到一封电子邮件,通知我错误报告已关闭,因为它与 33893656 重复 【参考方案1】:

这个 bug 可以在 iOS 11.1 中重现:

- (void)viewDidLoad 
    [super viewDidLoad];

    self.navigationItem.hidesSearchBarWhenScrolling = NO;


- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    if (@available(iOS 11.0, *)) 
        self.navigationItem.hidesSearchBarWhenScrolling = YES;
    

避免在 VC 生命周期事件上改变 navigationItem,为我解决了问题

【讨论】:

以上是关于在 iOS 11 上,导航项中的搜索栏在导航弹出时折叠并卡在状态栏下的主要内容,如果未能解决你的问题,请参考以下文章

在动画推送和弹出时,导航项中带有搜索栏的连续视图控制器会导致视图模糊[重复]

iOS:使导航栏在 UITableViewController 中始终可见

移动开发中导航栏和搜索栏在设计中应该注意哪些问题?

从 iOS 11 搜索控制器导航时不需要的 UITableView 重新加载动画

iOS 7 导航栏在翻转水平 Segue 上跳转

iOS 7导航栏在viewDidAppear上跳跃/拉伸