弹出框控制器不考虑设备大小 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)
我正在开发一个使用几个 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)