旋转后,显示的ViewController中的子视图位置错误

时间:2019-06-07 12:07:16

标签: ios swift uiviewcontroller uikit uisearchcontroller

我正在尝试UISearchController,但我做对了。我从自己的UISearchController中拿出了一个UIViewController干净的Main.storyboard,看起来不错-但是,一旦我旋转设备,它就会上下移动几分。

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

  1. 创建一个新的Single View项目
  2. 从项目文件中删除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

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

当设备处于纵向模式时,以纵向模式呈现搜索效果很好-但是,如果在显示搜索栏时将设备旋转到横向状态,它将被错误定位,位于屏幕顶部上方几个像素。

在横向时显示搜索结果将相反。它在横向上看起来很棒,但是将其旋转为纵向时,整个搜索控制器视图将向下推几个像素。

这与杆的高度大小无关。整个栏都被上推/下推。

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

debug

说实话,我不太确定自己在看什么。最顶部的视图是嵌入在_UISearchBarContainerView中的_UISearchControllerView中的y: 5

正如您在右侧的大小检查器中看到的那样,中视图“容器”具有y: -44,这没有任何意义。当调试正确的状态时,y为0。真正有趣的是,在这种损坏的情况下,最顶层的视图具有UISearchController,并且在正确的情况下也具有相同的视图-但您可以清楚地看到其中存在一些空间剩下的东西。似乎有三个不同的y位置。我不明白。

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

由于UIViewControllerUIViewController的子类,所以我想测试一下直接显示它,而不是将其作为常规Hide status bar的一部分。这样就可以使searchBar从上方动起来,而键盘从下方动起来,效果很酷。

但是为什么不起作用?

编辑:我刚刚发现,如果在项目设置中启用UISearchController,则Hide status bar的横向看上去比上方的“正确状态”更正确。 ,甚至可以正确制作动画以拍摄人像。这太奇怪了,因为状态栏根本没有改变。在风景中从未见过。为什么会这样?似乎太越野了。查看以下三种状态: landscape

第一种状态是从纵向显示搜索控制器然后旋转到横向时(是否启用Hide status bar都没关系。

第二种状态是在Hide status bar为假的情况下从横向显示搜索控制器时

第三个状态是当{{1}}为true时从横向显示搜索控制器。

4 个答案:

答案 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
}