gpt4 book ai didi

ios - 在 iOS 13 中覆盖 traitCollection

转载 作者:行者123 更新时间:2023-12-01 15:36:34 29 4
gpt4 key购买 nike

在我的初始 View Controller 中,我有一个 UITabbarController作为 subview Controller 。

我想要UITabbarController显示其UITabbar traitCollection 的 Horizo​​ntalSizeClass 为 Compact,因此在标签栏中,图像和标题显示为垂直对齐而不是并排。

iOS13 现在不支持覆盖 UITabbarController 的 traitCollection getter,
Xcode 给出以下警告。

        override var traitCollection: UITraitCollection{
let current = super.traitCollection
let compact = UITraitCollection(horizontalSizeClass: .compact)
return UITraitCollection(traitsFrom: [current, compact])
}

Class MyTabbarController overrides the -traitCollection getter, which is not supported. If you're trying to override traits, you must use the appropriate API.



在研究了合适的 API 之后,我发现

open func setOverrideTraitCollection(_ collection: UITraitCollection?, forChild childViewController: UIViewController)

在实现这个之后,我能够覆盖 myTabbarController 的特征集合,但只有在 View 改变方向之后。仅当我将 viewWillTransition 覆盖为方法时,此 API 才有效。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
let currentTC = traitCollection
let compactTC = UITraitCollection(horizontalSizeClass: .compact)
let custom = UITraitCollection(traitsFrom: [currentTC, compactTC])
print("ovverride trait collections before transition")
setOverrideTraitCollection(custom, forChild: tabController)
}

我只能在设备旋转时覆盖特征。如果我尝试在任何其他 View Controller 生命周期方法中覆盖特征集合,此 API 将不起作用。最初加载 View 时如何覆盖 traitCollection?
我尝试在 viewDidLoad() 中使用相同的代码我的初始 View Controller 的方法,但它没有效果。

最佳答案

我不确定 OP 是否可以正常工作,但我最近遇到了同样的问题。就我而言,我需要将 iPhone 和 iPad 的设备方向视为相同,特别是在纵向方向中将 Horizo​​ntalSizeClass 设置为 .compact。

因为 setOverrideTraitCollection() 仅适用于 subview Controller ,所以我必须将我的“主” View Controller 嵌入另一个 View Controller (我称之为“根” View Controller ),并在 Root View Controller 中处理特征覆盖。正如 OP 所暗示的,这需要在应用程序启动和方向发生变化时发生。就我而言,我可以在 prepareForSegue 中编写启动代码。不知道为什么将代码放入 viewDidLoad() 对 OP 不起作用——可能是因为他没有为 subview Controller 的 View 调用 setNeedsLayout()。

这是我的 Root View Controller 代码:

class RootViewController: UIViewController {

var masterViewController: MasterViewController?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MasterViewSegue" {
masterViewController = segue.destination as? MasterViewController
updateMasterViewTraits(for: CGSize(width: view.bounds.width, height: view.bounds.height))
}
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
updateMasterViewTraits(for: size)
}

func updateMasterViewTraits(for size: CGSize) {
var orientationTraits: UITraitCollection
if size.width < size.height {
orientationTraits = UITraitCollection(traitsFrom:[UITraitCollection(horizontalSizeClass: .compact), UITraitCollection(verticalSizeClass: .regular)])
} else {
orientationTraits = UITraitCollection(traitsFrom:[UITraitCollection(horizontalSizeClass: .regular), UITraitCollection(verticalSizeClass: .compact)])
}
let traits = UITraitCollection(traitsFrom: [traitCollection, orientationTraits])
setOverrideTraitCollection(traits, forChild: masterViewController!)
masterViewController!.view.setNeedsLayout()
}

}

关于ios - 在 iOS 13 中覆盖 traitCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59509915/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com