gpt4 book ai didi

swift - iOS 14 UISplitViewController(侧边栏)与三栏侧边栏切换图标行为

转载 作者:行者123 更新时间:2023-12-03 13:41:23 25 4
gpt4 key购买 nike

我正在实现 iOS 14 (iPadOS 14) 侧边栏(带有 TripleColumn 的 UISplitViewController)并且有奇怪的“侧边栏切换图标”行为。
在 iOS 13 中,我使用带有一些 Split View和表格 View 的标签栏,所以我需要三列而不是双列来工作。
例如,使用“航类”选项卡中的侧边栏需要三列:
iOS 14 sidebar example with Triple Column
并且有些选项卡只有一列(在 iOS 13 中,它是表格 View 而不是 Split View)。我将补充 View 设置为 nil,并通过调用 iOS 14 中实现的“隐藏”方法来隐藏 View 。(代码见下文):
iOS 14 sidebar example with triple column but hide the supplementary column
自动显示左上角的“侧边栏切换图标”。单击切换图标后,侧边栏正确隐藏,但在我的辅助 View 上创建了一个“后退按钮”(嵌入在 UINavigationController 中的 UITableViewController):
iOS 14 sidebar example after toggle icon clicked
按下(单击)后退按钮没有响应。用户仍然可以从屏幕的左边缘滑动以使侧边栏重新出现,但“后退按钮”令人困惑。我的预期行为是,在侧边栏中选择切换图标后,在辅助 View 中显示“侧边栏切换图标”而不是“后退按钮”。在辅助 View 中按下“侧边栏切换图标”后,侧边栏会重新出现。
与 iOS 14 (iPadOS 14) 中的照片应用程序一样,显示的是切换按钮而不是返回按钮。单击切换图标将使侧边栏再次显示。 (但它是一个双列 Split View)
iPadOS 14 Photos app with sidebar hidden
我的代码:
SceneDelegate.swift:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
if #available(iOS 14.0, *) {
let main = UIStoryboard(name: "Main", bundle: nil)

let splitViewController = UISplitViewController(style: .tripleColumn)

splitViewController.preferredDisplayMode = .twoBesideSecondary
splitViewController.preferredSplitBehavior = .tile
splitViewController.setViewController(SideBarViewController(), for: .primary)

// fall back for compact screen
splitViewController.setViewController(main.instantiateInitialViewController(), for: .compact)
window.rootViewController = splitViewController

self.window = window
window.makeKeyAndVisible()
}
}
}
侧边栏 View Controller :
// if the first tab (dashboard) was selected
private func selectDashboardTab() {
if #available(iOS 14.0, *) {

let dashboardVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DashboardTab") as? UINavigationController

splitViewController?.preferredPrimaryColumnWidth = 250.0
splitViewController?.preferredDisplayMode = .twoBesideSecondary
splitViewController?.preferredSplitBehavior = .tile

splitViewController?.setViewController(dashboardVC, for: .secondary)
splitViewController?.setViewController(nil, for: .supplementary)
splitViewController?.hide(.supplementary)
}
}

最佳答案

我能够重现该问题......但无法使用可用的 API 规避它。 Apple 固执地决定,当处于 3 列布局时,侧边栏图标将始终位于辅助 Controller 中。
话虽如此,我已经编写了一个hack来修复它。我设法创建了一个 UISplitViewController 子类,它“伪造”了一个可编辑的 style属性,从而允许我们设置列数(hack 只是创建了一个全新的 Controller 并使其成为新的 rootViewController)。
该 hack 允许我们在 2 列和 3 列布局之间随意切换,并且似乎解决了侧边栏图标问题。
链接到下面的 Xcode 项目。但这里是它的要点:

class AdaptableSplitViewController: UISplitViewController {
override var style: Style {
get {
super.style
}
set {
guard newValue != style else { return }

let primaryController = viewController(for: .primary)
let supplementaryController = viewController(for: .supplementary)
let secondaryController = viewController(for: .secondary)
let newSplitController = AdaptableSplitViewController(style: newValue)

newSplitController.setViewController(primaryController , for: .primary)
newSplitController.setViewController(secondaryController, for: .secondary)
if newValue == .tripleColumn {
newSplitController.setViewController(supplementaryController, for: .supplementary)
}

UIApplication.shared.windows[0].rootViewController = newSplitController
}
}
}
让我知道这是否有帮助。
Link to the zipped Xcode sample project

关于swift - iOS 14 UISplitViewController(侧边栏)与三栏侧边栏切换图标行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63982469/

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