Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UISearchBarController iOS 11问题-搜索栏和范围按钮重叠_Ios_Swift_Uisearchcontroller - Fatal编程技术网

UISearchBarController iOS 11问题-搜索栏和范围按钮重叠

UISearchBarController iOS 11问题-搜索栏和范围按钮重叠,ios,swift,uisearchcontroller,Ios,Swift,Uisearchcontroller,转介及。第一个环节没有答案。在第二个链接中,虽然答案不被接受,但苹果开发者论坛的链接给出了错误 在iOS 11之前: 监督厅11: 注意:相同的设备相同的代码。 此外,这意味着,所有使用此功能的应用程序都必须重新发布?在Ray Wenderlich提交的雷达中,@benck从WWDC发布了此信息,如果我没有弄错的话,它还没有发布。根据您的评论,您的UISearchController的UISearchBar已分配给您的UITableView的tableHeaderView。在iOS 11中,

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

在iOS 11之前:

监督厅11:

注意:相同的设备相同的代码。

此外,这意味着,所有使用此功能的应用程序都必须重新发布?

在Ray Wenderlich提交的雷达中,@benck从WWDC发布了此信息,如果我没有弄错的话,它还没有发布。

根据您的评论,您的
UISearchController
UISearchBar
已分配给您的
UITableView
tableHeaderView
。在iOS 11中,您应该将
UISearchController
分配给视图的
navigationItem
searchController
属性。您不再需要将
ui搜索栏分配到任何位置。请参阅此新属性。

我在我的应用程序中遇到了相同的问题,我的解决方案是在iOS 11中,使用苹果建议的新方式搜索栏(位于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)
}
我有两个IBoutlet:searchView和searchViewHeight:

@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11
在iOS 11之前,我的viewController的层次结构如下所示:

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

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

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

见苹果的文件:

还有一件事是在iOS 11下,默认情况下搜索栏的文本字段背景颜色比导航栏颜色略暗。为了保持一致性,您可以将其更改为白色,以下代码适用于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
    }
}

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

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

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

但是,如果应用程序是后台的,然后在搜索栏处于活动状态时恢复,则外观会重叠,如上面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];
}];

(在搜索栏处于活动状态时,我仍在研究如何解决界面方向发生变化后的布局问题-这仍然会导致重叠。)

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

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的一个示例—搜索栏和范围按钮重叠。

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

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

您也不想在
表视图的标题中添加
搜索栏
,因为出于某种原因,它无法处理
范围栏

那么我做了什么来修复它:

若要获取作用域位于
表视图上的
UISearchBar
,请在interface builder中使用
UIViewController
,而不是
UITableViewController

ui搜索栏
ui表格视图
放置在视图控制器内,并将其正确连接(代理、数据源等)

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

然后在interface builder中,使用自动布局指南,使
搜索栏
位于
表格视图

在interface builder中,当您激活范围栏时,它看起来会非常奇怪,但不要惊慌,它会很好。我猜当苹果公司改变了界面生成器的行为以使用
UINavigationController
时,他们把界面生成器的渲染搞砸了。。。无论如何

然后一切都按它应该的方式运行,看起来是这样的(在我的例子中,我在popover中向vc展示了它,但这并不重要)


请看一次@Anbu.Karthik此链接由NitishTry以self.definesPresentationContext=true附加在您的viewDIdload@TofaaniKaanudo:导航栏中已经有搜索栏了吗?或者在viewcontroller中没有导航栏?对我来说也是固定的。我只是将SearchController添加到tableView中,而没有有条件地检查iOS 11。它必须链接到iOS 11 SDK,但是,当链接到iOS 10 SDK时,此方法不起作用。对于iOS 11,这里排名第一的答案是:是方法。