gpt4 book ai didi

ios - 呈现的 ViewController 中的 subview 在旋转后位置错误

转载 作者:搜寻专家 更新时间:2023-10-31 21:49:35 25 4
gpt4 key购买 nike

我正在试验 UISearchController,但我做不好。我从我自己的 UIViewController展示一个干净的 UISearchController,它看起来很棒 - 但是一旦我旋转设备,它就会移动一些点向上或向下。

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

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

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

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

在横向显示搜索结果会产生相反的结果。它在横向上看起来很棒,但是当将其旋转为纵向时,整个搜索 Controller View 将被向下推几个像素。

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

我尝试进一步调查。我从横向模式显示搜索 Controller 并旋转到纵向模式,然后调试 View 层次结构:

debug

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

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

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

由于 UISearchControllerUIViewController 的子类,我想测试直接呈现它,而不是作为常规 UIViewController 的一部分。这提供了很酷的效果,即 searchBar 从上方进行动画处理,键盘从下方进行动画处理。

但是为什么这行不通呢?

编辑:我刚刚发现,如果我在项目设置中启用Hide status barUISearchController 在横向上看起来更正确比上面的“正确状态”,甚至正确地动画到肖像。 super 奇怪,因为状态栏根本没有变化。它在风景中是不可见的。为什么会这样?看起来很麻烦。看看这三种状态: landscape

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

第二种状态是当 Hide status bar 为 false 时从横向显示搜索 Controller

第三种状态是当 Hide status bar 为 true 时从横向显示搜索 Controller 。

最佳答案

documentation 中所述:

Although a UISearchController object is a view controller, you should never present it directly from your interface. If you want to present the search results interface explicitly, wrap your search controller in a UISearchContainerViewController object and present that object instead.

尝试将您的 UISearchController 包装在 UISearchContainerViewController 中。

关于ios - 呈现的 ViewController 中的 subview 在旋转后位置错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com