From 5f41b0da1bed118fcc88d58c23ec5decc930c6fd Mon Sep 17 00:00:00 2001 From: marcoschmickler Date: Sun, 14 Jun 2026 00:26:27 +0200 Subject: [PATCH] modernize scene --- kplayer/SceneDelegate.swift | 67 ++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/kplayer/SceneDelegate.swift b/kplayer/SceneDelegate.swift index b138aa6..881cef5 100644 --- a/kplayer/SceneDelegate.swift +++ b/kplayer/SceneDelegate.swift @@ -23,18 +23,65 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewControllerDe } private func setupSplitViewController() { - guard let split = window?.rootViewController as? UISplitViewController else { return } + guard let storyboardSplit = window?.rootViewController as? UISplitViewController else { return } + let split = installModernSplitViewIfNeeded(storyboardSplit) - let detailNav = split.viewControllers[split.viewControllers.count - 1] as! UINavigationController - detailNav.topViewController!.navigationItem.leftBarButtonItem = split.displayModeButtonItem + configureSplitViewDisplay(split) split.delegate = self - let masterNav = split.viewControllers[0] as! UINavigationController - let controller = masterNav.topViewController as! MasterViewController + let detailNav = detailNavigationController(in: split) + detailNav?.topViewController?.navigationItem.leftBarButtonItem = nil + + guard let masterNav = masterNavigationController(in: split), + let controller = masterNav.topViewController as? MasterViewController else { return } controller.delegate = NetworkDelegate() controller.model.items = LocalManager.sharedInstance.model!.items } + private func installModernSplitViewIfNeeded(_ split: UISplitViewController) -> UISplitViewController { + guard split.style == .unspecified, + let primary = split.viewControllers.first, + let secondary = split.viewControllers.last else { + return split + } + + let modernSplit = UISplitViewController(style: .doubleColumn) + modernSplit.setViewController(primary, for: .primary) + modernSplit.setViewController(secondary, for: .secondary) + window?.rootViewController = modernSplit + return modernSplit + } + + private func configureSplitViewDisplay(_ split: UISplitViewController) { + split.minimumPrimaryColumnWidth = 280 + split.maximumPrimaryColumnWidth = 380 + split.preferredPrimaryColumnWidthFraction = 0.30 + + guard UIDevice.current.userInterfaceIdiom == .pad else { + split.preferredDisplayMode = .automatic + return + } + + split.preferredSplitBehavior = .tile + split.preferredDisplayMode = .oneBesideSecondary + } + + private func masterNavigationController(in split: UISplitViewController) -> UINavigationController? { + if split.style == .doubleColumn { + return split.viewController(for: .primary) as? UINavigationController + } + + return split.viewControllers.first as? UINavigationController + } + + private func detailNavigationController(in split: UISplitViewController) -> UINavigationController? { + if split.style == .doubleColumn { + return split.viewController(for: .secondary) as? UINavigationController + } + + return split.viewControllers.last as? UINavigationController + } + // MARK: - Split view func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { @@ -45,4 +92,14 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewControllerDe } return false } + + func splitViewController(_ svc: UISplitViewController, displayModeForExpandingToProposedDisplayMode proposedDisplayMode: UISplitViewController.DisplayMode) -> UISplitViewController.DisplayMode { + configureSplitViewDisplay(svc) + + if UIDevice.current.userInterfaceIdiom == .pad { + return .oneBesideSecondary + } + + return proposedDisplayMode + } }