You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.5 KiB
94 lines
3.5 KiB
//
|
|
// Created by Marco Schmickler.
|
|
// Copyright (c) 2023 Marco Schmickler. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewControllerDelegate {
|
|
|
|
var window: UIWindow?
|
|
|
|
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
|
|
guard let _ = scene as? UIWindowScene else { return }
|
|
setupSplitViewController()
|
|
}
|
|
|
|
func sceneDidBecomeActive(_ scene: UIScene) {
|
|
NetworkManager.sharedInstance.alive()
|
|
}
|
|
|
|
func sceneDidEnterBackground(_ scene: UIScene) {
|
|
(UIApplication.shared.delegate as? AppDelegate)?.saveContext()
|
|
}
|
|
|
|
private func setupSplitViewController() {
|
|
guard let storyboardSplit = window?.rootViewController as? UISplitViewController else { return }
|
|
guard let split = modernSplitView(from: storyboardSplit) else { return }
|
|
|
|
configureSplitViewDisplay(split)
|
|
split.delegate = self
|
|
|
|
let detailNav = split.viewController(for: .secondary) as? UINavigationController
|
|
detailNav?.topViewController?.navigationItem.leftBarButtonItem = nil
|
|
|
|
guard let masterNav = split.viewController(for: .primary) as? UINavigationController,
|
|
let controller = masterNav.topViewController as? MasterViewController else { return }
|
|
controller.delegate = NetworkDelegate()
|
|
controller.model.items = LocalManager.sharedInstance.model!.items
|
|
}
|
|
|
|
private func modernSplitView(from split: UISplitViewController) -> UISplitViewController? {
|
|
guard split.style != .doubleColumn else { return split }
|
|
|
|
guard let primary = split.viewControllers.first,
|
|
let secondary = split.viewControllers.last else {
|
|
return nil
|
|
}
|
|
|
|
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) {
|
|
guard UIDevice.current.userInterfaceIdiom == .pad else {
|
|
split.preferredDisplayMode = .automatic
|
|
return
|
|
}
|
|
|
|
split.minimumPrimaryColumnWidth = 220
|
|
split.maximumPrimaryColumnWidth = 280
|
|
split.preferredPrimaryColumnWidth = 240
|
|
|
|
if #available(iOS 26.0, *) {
|
|
split.minimumSecondaryColumnWidth = 320
|
|
split.preferredSecondaryColumnWidthFraction = 0.68
|
|
}
|
|
|
|
split.preferredSplitBehavior = .tile
|
|
split.preferredDisplayMode = .oneBesideSecondary
|
|
split.show(.primary)
|
|
}
|
|
|
|
// MARK: - Split view
|
|
|
|
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
|
|
if let nav = secondaryViewController as? UINavigationController,
|
|
let detail = nav.topViewController as? DetailViewController,
|
|
detail.detailItem == nil {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func splitViewController(_ svc: UISplitViewController, displayModeForExpandingToProposedDisplayMode proposedDisplayMode: UISplitViewController.DisplayMode) -> UISplitViewController.DisplayMode {
|
|
if UIDevice.current.userInterfaceIdiom == .pad {
|
|
return .oneBesideSecondary
|
|
}
|
|
|
|
return proposedDisplayMode
|
|
}
|
|
}
|