旋转后呈现的 ViewController 中的子视图位置错误

Sti*_*Sti 6 uiviewcontroller uikit ios swift uisearchcontroller

我正在试验UISearchController,但我做对了。我展示UISearchController我自己的清洁UIViewController,它看起来很棒 - 但是一旦我旋转设备,它就会向上或向下移动几个点。

要重新创建它,只需执行以下几个步骤:

  1. 创建一个新的单一视图项目
  2. 删除Main.storyboard从项目文件,并从项目设置中删除它的名字(项目- >常规- >目标- >主界面)

AppDelegate.swift

application didFinishLaunchingWithOptions...{
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = ViewController()
    window?.makeKeyAndVisible()
    return true
}
Run Code Online (Sandbox Code Playgroud)

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样。这就是我所看到的: 这个

当设备处于纵向模式时显示搜索在纵向上看起来很棒 - 但是如果您在显示搜索栏时将设备旋转到横向,它将被错误地定位,位于屏幕顶部上方几个像素。

在横向时呈现搜索将产生相反的结果。它在横向看起来很棒,但是当将它旋转到纵向时,整个搜索控制器视图将被向下推几个像素。

这不是杆上的高度大小的问题。整个酒吧被向上/向下推。

我尝试进一步调查。我从横向模式呈现搜索控制器并旋转到纵向,然后调试视图层次结构:

调试

老实说,我不太确定我在看什么。最顶层的视图是UISearchBarBackground嵌入在 a 中的 a _UISearchBarContainerView,它位于 a 中_UISearchControllerView

正如您在右侧的尺寸检查器中看到的那样,中间视图“容器”有y: 5,这是没有意义的。当调试正确的状态时,y 是 0。真正有趣的是最上面的视图y: -44在这种损坏的情况下,它在正确的时候也是一样的——但是你可以清楚地看到它上面有一些剩余的空间。似乎有三个不同的 y 位置。我不明白。

我已经阅读了一些关于如何实现 a 的指南UISearchController,但实际上我发现的每个示例都是人们模态地呈现一个包含 SearchController 的自定义 ViewController。这将导致整个自定义 ViewController 从下方向上动画。

由于UISearchController是 的子类UIViewController,我想测试直接呈现它,而不是作为常规UIViewController. 这给出了搜索栏从上方动画和键盘从下方动画的酷炫效果。

但为什么这不起作用?

编辑:我刚刚发现,如果我Hide status bar在项目设置中启用,UISearchController横向看起来比上面的“正确状态”更正确,甚至可以正确地动画成肖像。这太奇怪了,因为状态栏根本没有改变。它在风景中从未可见。为什么会发生这种情况?好像太坑了 看看这三个状态: 风景

第一个状态是从纵向显示搜索控制器然后旋转到横向(是否Hide status bar启用无关紧要)。

第二种状态是当从横向显示搜索控制器时,如果Hide status bar为假

第三种状态是当从横向显示搜索控制器时,如果Hide status bar为真。

Jam*_*mil -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
}
Run Code Online (Sandbox Code Playgroud)