Sti*_*Sti 6 uiviewcontroller uikit ios swift uisearchcontroller
我正在试验UISearchController,但我做对了。我展示了UISearchController我自己的清洁UIViewController,它看起来很棒 - 但是一旦我旋转设备,它就会向上或向下移动几个点。
要重新创建它,只需执行以下几个步骤:
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)
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |