我正在尝试UISearchController
,但我做对了。我从自己的UISearchController
中拿出了一个UIViewController
干净的Main.storyboard
,看起来不错-但是,一旦我旋转设备,它就会上下移动几分。
要重新创建它,只需执行以下几个步骤:
AppDelegate.swift
,并从项目设置(项目->常规->目标->主界面)中删除其名称在application didFinishLaunchingWithOptions...{
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
return true
}
中:
ViewController.swift
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
let button = UIButton(frame: CGRect(x: 20, y: 200, width: 100, height: 40))
button.setTitle("Search", for: .normal)
button.backgroundColor = .black
button.addTarget(self, action: #selector(click), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func click(){
self.present(UISearchController(searchResultsController: nil), animated: true, completion: nil)
}
}
:
UISearchBarBackground
当设备处于纵向模式时,以纵向模式呈现搜索效果很好-但是,如果在显示搜索栏时将设备旋转到横向状态,它将被错误定位,位于屏幕顶部上方几个像素。
在横向时显示搜索结果将相反。它在横向上看起来很棒,但是将其旋转为纵向时,整个搜索控制器视图将向下推几个像素。
这与杆的高度大小无关。整个栏都被上推/下推。
我尝试进一步调查。我从横向模式展示了搜索控制器,然后旋转到纵向,然后调试了视图层次结构:
说实话,我不太确定自己在看什么。最顶部的视图是嵌入在_UISearchBarContainerView
中的_UISearchControllerView
中的y: 5
。
正如您在右侧的大小检查器中看到的那样,中视图“容器”具有y: -44
,这没有任何意义。当调试正确的状态时,y为0。真正有趣的是,在这种损坏的情况下,最顶层的视图具有UISearchController
,并且在正确的情况下也具有相同的视图-但您可以清楚地看到其中存在一些空间剩下的东西。似乎有三个不同的y位置。我不明白。
我已经阅读了一些有关如何实现UISearchController
的指南,但实际上,我发现的每个示例都是人们以模态方式呈现包含SearchController的自定义ViewController。这将导致整个自定义ViewController从下面进行动画处理。
由于UIViewController
是UIViewController
的子类,所以我想测试一下直接显示它,而不是将其作为常规Hide status bar
的一部分。这样就可以使searchBar从上方动起来,而键盘从下方动起来,效果很酷。
但是为什么不起作用?
编辑:我刚刚发现,如果在项目设置中启用UISearchController
,则Hide status bar
的横向看上去比上方的“正确状态”更正确。 ,甚至可以正确制作动画以拍摄人像。这太奇怪了,因为状态栏根本没有改变。在风景中从未见过。为什么会这样?似乎太越野了。查看以下三种状态:
第一种状态是从纵向显示搜索控制器然后旋转到横向时(是否启用Hide status bar
都没关系。
第二种状态是在Hide status bar
为假的情况下从横向显示搜索控制器时
第三个状态是当{{1}}为true时从横向显示搜索控制器。
答案 0 :(得分:0)
如documentation中所述:
尽管UISearchController对象是视图控制器,但您应该 永远不要直接从您的界面显示它。如果你想呈现 明确显示搜索结果界面,包装搜索控制器 在UISearchContainerViewController对象中并显示该对象 代替。
尝试将UISearchController
包装在UISearchContainerViewController
中。
答案 1 :(得分:0)
如何使自定义视图包含搜索栏。 将其置于图层顶部。
当旋转发生时,更新它的框架/约束。
答案 2 :(得分:0)
这在iPhone X的设计指南中已涉及。现在,导航栏包含搜索控制器。您可以实例化搜索控制器,并将其设置为navigationItem.searchController。现在,它将在旋转时处理搜索控制器。
var search = UISearchController(searchResultsController: nil)
self.navigationItem.searchController = search
答案 3 :(得分:-3)
您可以执行此指标
class ViewController: UIViewController {
let sc = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
let button = UIButton(frame: CGRect(x: 20, y: 200, width: 100, height: 40))
button.setTitle("Search", for: .normal)
button.backgroundColor = .black
button.addTarget(self, action: #selector(click), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func click(){
self.present(sc, animated: true, completion: nil)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
var mFrame = sc.view.frame
mFrame.origin.y = 5.0
sc.view.frame = mFrame
}