Swift 3:弹出窗口 ViewController 中的 UISearchBar 显示得比预期的要宽(在 iPad 上)
Swift 3: UISearchBar in Popover ViewController shows up wider than expected (on iPad)
我有一个从 Popover segue 打开的视图控制器 - 在 iPhone 上显示它作为完整页面视图控制器打开(基本上是模态的)。在 iPad 上,它作为弹出窗口打开。
在 iPad 上打开视图时,搜索栏呈现的宽度比弹出窗口的视图宽。这不会发生在任何 iPhone 屏幕尺寸上 - 仅 iPad(作为 Popover)。
如果我将 UISearchBar 置于焦点(点击文本字段),问题会自行解决,直到再次打开视图:
UISearchBar 以编程方式添加到所需尺寸的 UIView。
这是初始化 SearchController 的代码
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.definesPresentationContext = false;
searchBarView.addSubview(controller.searchBar)
return controller
})()
我尝试删除 .sizeToFit() 并改为根据 CGSize
调整大小
controller.searchBar.sizeThatFits(CGSize(width: 375, height: 44)
但是这没有用。我也试过调用 view.setNeedsLayout() 和 view.LayoutIfNeeded()。这些都没有任何效果。
我可以通过在 viewDidLoad 中激活 UISearchBar 来解决这个问题,但我正在寻找一个不那么笨拙的解决方案。
谢谢!
好吧,这是调试 UI 问题的有趣课程。
我相信这最终是由于 ViewController 被设置为推断大小和固定大小。在不同的 iPad 屏幕尺寸(9.7" 与 12.9")上。
为了解决这个问题,我将搜索栏的框架宽度设置为其下方的表格视图。我不确定为什么 searchbarview 的大小会改变宽度,因为它受限于前缘和后缘(超级视图)。
if UIDevice.current.userInterfaceIdiom == .pad {
self.resultSearchController.searchBar.frame = CGRect(x: 0, y: 0, width: Int(tableView.frame.width), height: 44)
}
虽然这可行,但如果使用拆分视图(对于弹出窗口有空间显示的宽度),也会出现同样的问题。
欢迎提出进一步的建议,但这是一个好的开始。
---编辑---
取消选中 ViewController 布局下的 "Resize View from NIB" 以及将大小设置为自由格式并声明恒定宽度解决了 VC 在 iPad 上调整大小的问题。从那里我只是在 viewDidLoad 中设置搜索栏的框架,如下所示:
if UIDevice.current.userInterfaceIdiom == .pad {
self.resultSearchController.searchBar.frame = CGRect(x: 0, y: 0, width: 375, height: 44)
}
似乎适用于所有设备,无论是否使用拆分视图。可能有更好的方法可以在不检测 iPad 的情况下执行此操作。我想我在 Interface Builder 中缺少一个设置。
我有一个从 Popover segue 打开的视图控制器 - 在 iPhone 上显示它作为完整页面视图控制器打开(基本上是模态的)。在 iPad 上,它作为弹出窗口打开。
在 iPad 上打开视图时,搜索栏呈现的宽度比弹出窗口的视图宽。这不会发生在任何 iPhone 屏幕尺寸上 - 仅 iPad(作为 Popover)。
如果我将 UISearchBar 置于焦点(点击文本字段),问题会自行解决,直到再次打开视图:
UISearchBar 以编程方式添加到所需尺寸的 UIView。
这是初始化 SearchController 的代码
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.definesPresentationContext = false;
searchBarView.addSubview(controller.searchBar)
return controller
})()
我尝试删除 .sizeToFit() 并改为根据 CGSize
调整大小controller.searchBar.sizeThatFits(CGSize(width: 375, height: 44)
但是这没有用。我也试过调用 view.setNeedsLayout() 和 view.LayoutIfNeeded()。这些都没有任何效果。
我可以通过在 viewDidLoad 中激活 UISearchBar 来解决这个问题,但我正在寻找一个不那么笨拙的解决方案。
谢谢!
好吧,这是调试 UI 问题的有趣课程。
我相信这最终是由于 ViewController 被设置为推断大小和固定大小。在不同的 iPad 屏幕尺寸(9.7" 与 12.9")上。
为了解决这个问题,我将搜索栏的框架宽度设置为其下方的表格视图。我不确定为什么 searchbarview 的大小会改变宽度,因为它受限于前缘和后缘(超级视图)。
if UIDevice.current.userInterfaceIdiom == .pad {
self.resultSearchController.searchBar.frame = CGRect(x: 0, y: 0, width: Int(tableView.frame.width), height: 44)
}
虽然这可行,但如果使用拆分视图(对于弹出窗口有空间显示的宽度),也会出现同样的问题。
欢迎提出进一步的建议,但这是一个好的开始。
---编辑---
取消选中 ViewController 布局下的 "Resize View from NIB" 以及将大小设置为自由格式并声明恒定宽度解决了 VC 在 iPad 上调整大小的问题。从那里我只是在 viewDidLoad 中设置搜索栏的框架,如下所示:
if UIDevice.current.userInterfaceIdiom == .pad {
self.resultSearchController.searchBar.frame = CGRect(x: 0, y: 0, width: 375, height: 44)
}
似乎适用于所有设备,无论是否使用拆分视图。可能有更好的方法可以在不检测 iPad 的情况下执行此操作。我想我在 Interface Builder 中缺少一个设置。