Swift 3:Popover ViewController中的UISearchBar显示的宽度超出预期(在iPad上)

Swift 3:Popover ViewController中的UISearchBar显示的宽度超出预期(在iPad上),swift,uitableview,ipad,swift3,uisearchbar,Swift,Uitableview,Ipad,Swift3,Uisearchbar,我有一个从Popover segue打开的视图控制器-在iPhone上显示它作为一个完整的页面视图控制器打开(基本上是模态的)。在iPad上,它以popover的形式打开 在iPad上打开视图时,seachbar会呈现比Popor视图更宽的视图。这在任何iPhone屏幕尺寸上都不会发生——只有iPad(作为Popover) 如果我将UISearchBar调到焦点位置(点击文本字段),问题将自行解决,直到再次打开视图: UISearchBar以编程方式添加到所需尺寸的UIView中 下面是

我有一个从Popover segue打开的视图控制器-在iPhone上显示它作为一个完整的页面视图控制器打开(基本上是模态的)。在iPad上,它以popover的形式打开

在iPad上打开视图时,seachbar会呈现比Popor视图更宽的视图。这在任何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.layoutifneed()。这两者都没有任何效果

我可以通过在viewDidLoad中激活UISearchBar来解决这个问题,但我正在寻找一个不那么麻烦的解决方案


谢谢

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

我相信这最终是由于ViewController被设置为“推断大小”和“固定大小”所致。在不同尺寸的iPad屏幕上(9.7英寸vs 12.9英寸)

为了解决这个问题,我将搜索栏的框架宽度设置为它下面的tableview。我不知道为什么searchbarview的大小会改变宽度,因为它被限制在前缘和后缘(superview)

虽然这是可行的,但如果使用分割视图(用于popover有显示空间的宽度),则存在相同的问题

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

---编辑---

在ViewController的layout下取消选中“从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中缺少一个设置

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