Swift 3:Popover ViewController中的UISearchBar显示比预期更宽(在iPad上)

时间:2017-02-09 04:21:58

标签: swift uitableview ipad swift3 uisearchbar

我有一个从Popover segue打开的视图控制器 - 在iPhone显示器上打开它作为整页视图控制器(基本上是模态)。在iPad上,它作为一个弹出窗口打开。

在iPad上打开视图时,seachbar呈现比弹出窗口更宽的视图。任何iPhone屏幕尺寸都不会出现这种情况 - 只有iPad(作为Popover)。

iPad Popover View

如果我将UISearchBar置于焦点(点击文本字段),问题将自行解决,直到再次打开视图:

iPad SearchBar in Focus

iPad SearchBar after Focus

UISearchBar以编程方式添加到所需尺寸的UIView中。

SearchBarView

以下是初始化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来解决这个问题,但我正在寻找一个不那么笨拙的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是调试UI问题的一个有趣课程。

我认为这最终是由ViewController设置为大小推断和大小修复引起的。在不同的iPad屏幕尺寸上(9.7“对比12.9”)。

要解决此问题,我将搜索栏的框架宽度设置为其下方的tableview。我不确定为什么搜索栏视图大小会改变宽度,因为它受限于前导和后缘(superview)。

        if UIDevice.current.userInterfaceIdiom == .pad {
        self.resultSearchController.searchBar.frame = CGRect(x: 0, y: 0, width: Int(tableView.frame.width), height: 44)
    }

虽然这有效但如果使用分割视图(对于弹出窗口有空间显示的宽度),它也有同样的问题。

欢迎提供进一步的建议,但这是一个良好的开端。

--- ---编辑

取消选中ViewController布局下的“从NIB调整视图大小”以及将大小设置为Freeform并声明恒定宽度解决了在iPad上调整VC大小的问题。从那里我只需在viewDidLoad中设置搜索栏的框架,如下所示:

    if UIDevice.current.userInterfaceIdiom == .pad {
        self.resultSearchController.searchBar.frame = CGRect(x: 0, y: 0, width: 375, height: 44)
    }

无论是否分割视图,似乎都适用于所有设备。如果不检测iPad,可能有更好的方法。我想我在Interface Builder中缺少一个设置。