【发布时间】:2019-10-22 22:38:50
【问题描述】:
我正在尝试使用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)
}
}
在设备处于纵向模式时显示搜索在纵向上看起来很棒 - 但如果您在显示搜索栏时将设备旋转到横向,它将被错误地定位,在屏幕顶部上方几个像素处。
在横向显示搜索将产生相反的结果。它在横向看起来很棒,但是当它旋转到纵向时,整个搜索控制器视图将被向下推几个像素。
这不是栏杆高度大小的问题。整个条被向上/向下推。
我尝试进一步调查。我将搜索控制器从横向模式呈现并旋转为纵向,然后调试视图层次结构:
说实话,我不太确定我在看什么。最顶层的视图是嵌入在_UISearchBarContainerView 中的UISearchBarBackground,而_UISearchControllerView 则位于_UISearchControllerView 中。
正如您在右侧的尺寸检查器中看到的,中间视图“容器”具有y: 5,这没有任何意义。调试正确状态时,y 为 0。真正有趣的是,在这种损坏情况下,最顶层的视图有 y: -44,正确时也有相同的 - 但你可以清楚地看到上面还有一些空间它。似乎存在三个不同的 y 位置。没看懂。
我已经阅读了一些关于如何实现UISearchController 的指南,但实际上我发现的每个示例都是人们以模态方式呈现包含 SearchController 的自定义 ViewController。这将导致整个自定义 ViewController 从下方动画化。
由于UISearchController 是UIViewController 的子类,我想测试一下直接呈现它,而不是作为常规UIViewController 的一部分。这给出了很酷的效果,即 searchBar 从上方动画,键盘从下方动画。
但是为什么这不起作用呢?
编辑:我刚刚发现如果我在项目设置中启用Hide status bar,UISearchController 在横向上看起来比上面的“正确状态”更正确,甚至动画正确的肖像。这很奇怪,因为状态栏根本没有改变。它在风景中从未可见。为什么会这样?好像太坑了看看这三种状态:
第一种状态是从纵向显示搜索控制器然后旋转到横向(不管Hide status bar是否启用。
第二种状态是当Hide status bar 为假时从横向显示搜索控制器
第三种状态是当Hide status bar 为真时从横向显示搜索控制器。
【问题讨论】:
标签: ios swift uiviewcontroller uikit uisearchcontroller