iPhone X上的错误观看位置

我的应用程序在所有设备上看起来都很好,直到我在新的iPhone X上测试它(参见附带的屏幕截图)。 搜索栏位于导航栏下方,非常糟糕。 我尝试使用新的安全区域插入,edgeForExtendedLayout,但没有成功。 也许有人可以帮助解决这个问题。

在此处输入图像描述

Apple发布的关于iPhone X(以及8和8 Plus)开发的短video解决了这种情况(或者非常接近它的几个)。

在他们为iPhone X调整WWDC应用程序的案例研究中, 他们发现搜索栏未在“video”选项卡中设置 。 那是因为他们present了一个UISearchController ,但在iOS 11(对于所有设备)处理此问题的最佳方法是将搜索控制器附加到导航项。 如果您仍需要部署回iOS 10(或更早版本),则可以通过可用性检查来处理此问题:

 let searchController = UISearchController(searchResultsController: nil) // configure searchController properties if #available(iOS 11.0, *) { self.navigationItem.searchController = searchController searchController.isActive = true // to show it now } else { present(searchController, animated: true, completion: nil) } 

同样,如果您直接将搜索栏设置为表格视图的标题, 您也可以将其附加到导航项目中 :

 if #available(iOS 11.0, *) { self.navigationItem.searchController = searchController searchController.isActive = shouldShowBarNow // made up local variable } else { if shouldShowBarNow { self.tableView.tableHeaderView = searchController.searchBar } else { self.tableView.tableHeaderView = nil } } 

经过一些调查后,我想出了如何解决我的问题。 我必须根据安全区域对齐搜索视图。 请参阅以下解决方案:

  if (@available(iOS 11.0, *)) { [self.searchView setTranslatesAutoresizingMaskIntoConstraints:NO]; UILayoutGuide *guide = self.view.safeAreaLayoutGuide; [NSLayoutConstraint activateConstraints:@[ [self.searchView.topAnchor constraintEqualToAnchor:guide.topAnchor], [self.searchView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor], [self.searchView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor], [NSLayoutConstraint constraintWithItem:self.searchView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:44] ]]; } 

现在所有设备上的一切都很棒。 希望这可以帮助其他类似问题的人。 干杯。