UISearchBarController iOS 11问题 - SearchBar和范围按钮重叠

时间:2017-09-22 11:55:34

标签: ios swift uisearchcontroller

推荐herehere。第一个链接没有答案。在第二个链接中,虽然答案未被接受,但苹果开发者论坛的链接给出了错误。

在iOS 11之前:

enter image description here

iOS 11:

enter image description here

注意:相同设备的代码相同。
此外,这意味着,所有使用此功能的应用都必须重新发布?

7 个答案:

答案 0 :(得分:7)

添加这些行为我修复了它:

CompletableFuture

答案 1 :(得分:2)

我可以使用以下代码在iOS11中正确显示初始外观(根据greg'答案):

[self.searchController.searchBar sizeToFit];

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    // Fallback on earlier versions
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

但是,如果应用程序是背景,然后在搜索栏处于活动状态时恢复,则外观最终会重叠,如上面的Nitish的第二个屏幕截图所示。

我能够通过以下解决方法解决这个问题:

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    self.searchController.searchBar.showsScopeBar = NO;
    [self.searchController.searchBar sizeToFit];
    self.searchController.searchBar.showsScopeBar = YES;
    [self.searchController.searchBar sizeToFit];
}];

(我仍在研究如何在搜索栏处于活动状态时更改界面方向后解决布局问题 - 这仍然会重叠。)

答案 2 :(得分:1)

在Ray Wenderlich提交的雷达中,@ benck从WWDC发布了这个answer,如果我没记错的话,还没有发布。

答案 3 :(得分:1)

根据您的评论,UISearchController的{​​{1}}已被分配到UISearchBar的{​​{1}}。在iOS 11中,您应该将UITableView分配给视图tableHeaderView的{​​{1}}属性。您不再需要在任何地方分配UISearchController。请参阅此新属性的Apple's documentation

答案 4 :(得分:1)

我在我的应用程序上遇到了同样的问题,我的解决方案是在iOS 11中,使用apple为searchBar建议的新方法在navigationItem中,否则,使用旧方法。我在viewDidLoad()中的代码如下:

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    searchViewHeight.constant = 0
} else {
    searchView.addSubview(searchController.searchBar)
}

我有两个IBOutlets:searchView和searchViewHeight:

@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11

在iOS 11之前,我的viewController的层次结构如下:

My searchView before iOS 11

我有一个searchView,其高度为44,包含我的searchController的searchBar视图。它在导航栏下。

在iOS 11中,我为searchView的高度约束添加了一个新的IBOutlet,并将其常量设置为0,隐藏了此容器视图。并将searchController添加为导航项的一部分。

参见apple的文档: https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

在iOS 11下还有一件事,默认情况下,searchBar的textField背景颜色比导航栏颜色稍暗。为了保持一致性,您可以将其更改为白色,以下代码适用于iOS11及其之前的版本:

if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField {
    if let backgroundView = textField.subviews.first {

        // Search bar textField background color
        backgroundView.backgroundColor = UIColor.white

        // Search bar textField rounded corner
        backgroundView.layer.cornerRadius = 10
        backgroundView.clipsToBounds = true
    }
}

答案 5 :(得分:0)

我认为解决方案是在导航栏中添加搜索栏:

c

您可以找到UISearchBarController的示例 - SearchBar和范围按钮重叠here

答案 6 :(得分:0)

我在iOS 11中遇到了同样的问题。

与此处的一些评论相反,如果我查看您的屏幕截图,您不想将其设置为navigationItem,因为您没有UINavigationController设置。

您是否也想在searchBar的标头中添加tableView,因为出于某种原因,它无法应对scopeBar

所以我采取了哪些措施来修复它:

要获得范围超过UISearchBar的{​​{1}},请在界面制作工具中使用tableView a UIViewController

在视图控制器中放置UITableViewControllerUISearchBar并正确连接(委托,dataSource等)。

不要忘记将您的swift文件更改为UITableView而不是UIViewController,并相应地进行更改。 (添加一个tableView属性并通过UITableViewController连接它,更改tableView的委托等)

然后在界面构建器中,使用autoLayout指南,以便IBOutlet位于searchBar

之上

enter image description here

在界面构建器中激活范围栏时,它看起来很奇怪,但不要惊慌,这样会好的。我猜Apple在改变行为以使用tableView时,搞砸了渲染界面构建器......无论如何......

然后一切正常,看起来像这样(在我的情况下,我在弹出窗口中显示vc,但这并不重要)

enter image description here