搜索栏控制器 iOS 11 问题 - 搜索栏和范围按钮重叠

Posted

技术标签:

【中文标题】搜索栏控制器 iOS 11 问题 - 搜索栏和范围按钮重叠【英文标题】:UISearchBarController iOS 11 issue - SearchBar and scope buttons overlap 【发布时间】:2017-09-22 11:55:34 【问题描述】:

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

ios 11 之前:

iOS 11:

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

【问题讨论】:

看到一次***.com/questions/31424540/… @Anbu.Karthik 此链接由 Nitish 附加 尝试使用 self.definesPresentationContext = true 在您的 viewDIdload 中写入这一行 @TofaaniKaanudo :已经在那里 您的搜索栏在您的导航栏中吗?或者该视图控制器中没有导航栏? 【参考方案1】:

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

override func viewDidLayoutSubviews() 
    self.searchController.searchBar.sizeToFit()

【讨论】:

也为我修复了。我刚刚将 SearchController 添加到 tableView 没有条件检查 iOS 11。它必须链接到 iOS 11 SDK,但当链接到 iOS 10 SDK 时,此方法不起作用。 对于 iOS 11,这里排名最高的答案是:***.com/questions/45782669/… 是方式。【参考方案2】:

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

[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];
];

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

根据您的 cmets,您的 UISearchControllerUISearchBar 已分配给您的 UITableViewtableHeaderView。在 iOS 11 中,您应该将 UISearchController 分配给视图的 navigationItemsearchController 属性。您不再需要在任何地方分配UISearchBar。在这个新属性上查看Apple's documentation。

【讨论】:

【参考方案5】:

我在我的应用程序中遇到了同样的问题,我的解决方案是在 iOS 11 中,使用苹果建议的 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 的层次结构如下:

我有一个高度为 44 的 searchView 来包含我的 searchController 的 searchBar 视图。它位于导航栏下方。

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

查看苹果的文档: 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
    

【讨论】:

【参考方案6】:

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

navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles
navigationItem.title = "Contacts"
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0)

let searchController = UISearchController(searchResultsController: nil) // Search Controller
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = searchController

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

【讨论】:

【参考方案7】:

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

与这里的一些 cmets 不同,如果我查看您的屏幕截图,您不想将其设置为 navigationItem,因为您没有 UINavigationController 设置。

您也不想在tableView 的标题中添加searchBar,因为由于某种原因它无法处理scopeBar

那么我做了什么来解决它:

要获得UISearchBar 的范围超过tableView,请在界面构建器中使用UIViewController不是UITableViewController

在视图控制器中放置一个UISearchBar 和一个UITableView 并正确连接它们(委托、数据源等)。

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

然后在界面生成器中,使用自动布局指南,使searchBar 位于tableView 之上

在界面生成器中,当您激活范围栏时,它看起来很奇怪,但不要惊慌,它会没事的。我猜苹果在改变行为以使用UINavigationController时搞砸了渲染n界面构建器......无论如何......

然后一切正常,看起来像这样(在我的情况下,我将 vc 显示在弹出窗口中,但这没关系)

【讨论】:

以上是关于搜索栏控制器 iOS 11 问题 - 搜索栏和范围按钮重叠的主要内容,如果未能解决你的问题,请参考以下文章

嵌套视图中的搜索栏和搜索栏控制器 (iOS)

IOS7:uisearchdisplaycontroller 总是显示范围栏

iOS 7 导航栏中的搜索栏

独立的搜索栏和表格视图控制器

视图控制器中的搜索栏和搜索显示控制器,其中包含 UITableView

使用搜索栏和大标题导航栏拉刷新问题