【问题标题】:Popover controller does not respect device size class弹出框控制器不尊重设备大小类
【发布时间】:2019-07-21 11:28:03
【问题描述】:

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

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

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

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

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

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

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

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

添加后,我注意到一个不一致之处。在这个方法中使用的popover上,popover的顶部和桌子之间有很大的空间。它看起来像这样:

在没有自定义单元格的情况下显示带有 tableview 的弹出框如下所示。

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

另一个编辑:我想通了。将此添加到弹出框的代码中可以修复它:

navController.setNavigationBarHidden(true, animated: false)

【问题讨论】:

    标签: ios uitableview autolayout popover size-classes


    【解决方案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 控制器将获得与其父级相同的 trait 集合。如果此 trait 集合不适合您的需求,您还可以指定自定义 trait 集合,如下所示:

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

    【讨论】:

    • 谢谢。这是一个完美的答案。在看到这个之前,我的解决方案是创建几个字体常量并根据 userInterfaceIdiom 更改字体。但是,即使这样,我也无法使用自定义单元格。现在一切正常。感谢您花时间输入解决方案。
    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多