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 中缺少一个设置。