Popover控制器不遵守设备尺寸类别

时间:2019-02-27 16:52:44

标签: ios uitableview autolayout popover size-classes

我正在开发一个使用几个UITableView作为弹出窗口的应用程序。我在自定义单元格上设置了标签,并且正在使用大小类来在iPad上查看时放大字体大小。字体的大小在弹出框上不起作用。无论我使用哪种设备,它都遵循默认字体大小。如果我使用相同的单元格并将其显示在不是弹出框的UITableView中,则字体会根据显示它的设备进行调整

这是我的自定义单元格。这很简单,只需一个标签即可。

enter image description here

这就是我设置字体的方式。

enter image description here

如您所见,我将wRhR的字体设置为比默认字体大得多。

在iPad上运行时,这是显示表格时单元格中的字体大小。

enter image description here

这是弹出窗口中单元格中的字体大小。

enter image description here

如果我将默认字体大小调整得更大,它将反映在弹出窗口中。这是将默认字体大小设置为30时的样子。

enter image description here

在弹出框上使用时,如何获得UITableViewCell标签来遵守wRhR size类的字体集?

添加此内容后,我发现一个不一致之处。在此方法使用的弹出窗口上,弹出窗口顶部和表格之间有大量空间。看起来像这样:

enter image description here

使用没有自定义单元格的表视图显示弹出框看起来像这样。

enter image description here

我认为顶部的空白区域是导航栏。如果可能的话,我希望它看起来像第二张图片。

另一个编辑:我想通了。将其添加到弹出式代码中即可对其进行修复:

navController.setNavigationBarHidden(true, animated: false)

1 个答案:

答案 0 :(得分:1)

一种选择是使用自定义UINavigationController

class PopoverNavController: UINavigationController {

    var customTraitCollection: UITraitCollection?

    convenience init(rootViewController: UIViewController, traitCollection: UITraitCollection? = nil) {
        self.init(rootViewController: rootViewController)
        customTraitCollection = traitCollection
    }

    override var traitCollection: UITraitCollection {
        if let customTraitCollection = customTraitCollection {
            return customTraitCollection
        }
        return super.traitCollection
    }
}

您可以像这样使用它:

let storyboard = UIStoryboard(name: "Main", bundle: .main)
guard let popoverController = storyboard.instantiateViewController(withIdentifier: "PopoverController") as? PopoverController else {
    return
}
// Here we set the override trait collection
let navController = PopoverNavController(rootViewController: popoverController, traitCollection: traitCollection)
navController.modalPresentationStyle = .popover
let popover = navController.popoverPresentationController
popoverController.preferredContentSize = preferredContentSize
popover?.sourceView = sourceView
popover?.sourceRect = sourceRect
popover?.permittedArrowDirections = .up
present(navController, animated: true)

这样,popover控制器将获得与其父代相同的特征集。如果此特征集合不符合您的需求,您还可以指定一个自定义特征集合,如下所示:

let customTraitCollection = UITraitCollection(horizontalSizeClass: .regular)
let navController = PopoverNavController(rootViewController: popoverController, traitCollection: customTraitCollection)