弹出框控制器不考虑设备大小 class

Popover controller does not respect device size class

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

这是我的自定义单元格。很简单,就一个标签。

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

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

当我在 iPad 上 运行 时,这是我显示 table.

时单元格中字体的大小

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

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

如何让 UITableViewCell 标签在弹出框上使用时遵循为 wRhR 大小 class 设置的字体?

添加此内容后,我注意到一处不一致之处。在该方法使用的popover上,popover顶部和table之间有大量的space。它看起来像这样:

显示带有 table 视图但没有自定义单元格的弹出框看起来像这样。

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

另一个编辑:我明白了。将此添加到弹出窗口的代码中可以修复它:

navController.setNavigationBarHidden(true, animated: false)

一种选择是使用自定义 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)