├── CatalystCustomToolbar
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ ├── icon20.png
│ │ ├── icon-1024.png
│ │ ├── icon-120.png
│ │ ├── icon-152.png
│ │ ├── icon-167.png
│ │ ├── icon-180.png
│ │ ├── icon-29.png
│ │ ├── icon-40.png
│ │ ├── icon-58.png
│ │ ├── icon-60.png
│ │ ├── icon-76.png
│ │ ├── icon-80.png
│ │ ├── icon-87.png
│ │ └── Contents.json
├── Source
│ ├── Application
│ │ ├── CCTAppDelegate.swift
│ │ ├── CCTSceneDelegate+NSToolbar.swift
│ │ └── CCTSceneDelegate.swift
│ └── Main
│ │ ├── CCTMainViewController.swift
│ │ └── CCTCustomToolbarViewController.swift
├── Info.plist
└── Base.lproj
│ └── LaunchScreen.storyboard
├── CatalystCustomToolbar.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcuserdata
│ │ └── steven.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcshareddata
│ │ └── swiftpm
│ │ └── Package.resolved
├── xcuserdata
│ └── steven.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
├── xcshareddata
│ └── xcschemes
│ │ └── CatalystCustomToolbar.xcscheme
└── project.pbxproj
└── README.md
/CatalystCustomToolbar/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon20.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-1024.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-120.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-152.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-167.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-180.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-29.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-40.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-58.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-60.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-76.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-80.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/icon-87.png
--------------------------------------------------------------------------------
/CatalystCustomToolbar.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar.xcodeproj/project.xcworkspace/xcuserdata/steven.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steventroughtonsmith/CatalystCustomToolbar/HEAD/CatalystCustomToolbar.xcodeproj/project.xcworkspace/xcuserdata/steven.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CatalystCustomToolbar
2 |
3 | This example showcases how to use an undocumented window UITitleBar.titleVisibility value to enable custom UIKit (or SwiftUI) toolbars in Mac Catalyst that support both input events and draggability.
4 |
5 | ### Screenshots
6 |
7 | 
8 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "appleuniversalcore",
5 | "kind" : "remoteSourceControl",
6 | "location" : "https://github.com/steventroughtonsmith/AppleUniversalCore.git",
7 | "state" : {
8 | "branch" : "main",
9 | "revision" : "e1232caf11c9c6f9299ed3168f7f941d7d70422f"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Source/Application/CCTAppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CCTAppDelegate.swift
3 | // CatalystCustomToolbar
4 | //
5 | // Created by Steven Troughton-Smith on 06/02/2023.
6 | //
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class CCTAppDelegate: UIResponder, UIApplicationDelegate {
13 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
14 | return true
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar.xcodeproj/xcuserdata/steven.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | CatalystCustomToolbar.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | B0A3CB3F2991482300749665
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Source/Application/CCTSceneDelegate+NSToolbar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CCTSceneDelegate+NSToolbar.swift
3 | // CatalystCustomToolbar
4 | //
5 | // Created by Steven Troughton-Smith on 06/02/2023.
6 | //
7 | //
8 |
9 | import UIKit
10 |
11 | #if targetEnvironment(macCatalyst)
12 | import AppKit
13 |
14 | extension CCTSceneDelegate: NSToolbarDelegate {
15 |
16 | func toolbarItems() -> [NSToolbarItem.Identifier] {
17 | return []
18 | }
19 |
20 | func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
21 | return toolbarItems()
22 | }
23 |
24 | func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
25 | return toolbarItems()
26 | }
27 |
28 | func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
29 | return NSToolbarItem(itemIdentifier: itemIdentifier)
30 | }
31 | }
32 | #endif
33 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Source/Main/CCTMainViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CCTMainViewController.swift
3 | // CatalystCustomToolbar
4 | //
5 | // Created by Steven Troughton-Smith on 06/02/2023.
6 | //
7 | //
8 |
9 | import UIKit
10 | import AppleUniversalCore
11 |
12 | final class CCTMainViewController: UIViewController {
13 |
14 | let toolbarController = CCTCustomToolbarViewController()
15 | let toolbarHeight = UIFloat(70)
16 |
17 | init() {
18 | super.init(nibName: nil, bundle: nil)
19 | title = "CatalystCustomToolbar"
20 |
21 | view.backgroundColor = .systemBackground
22 | view.addSubview(toolbarController.view)
23 | }
24 |
25 | required init?(coder aDecoder: NSCoder) {
26 | fatalError("init(coder:) has not been implemented")
27 | }
28 |
29 | // MARK: -
30 |
31 | override func viewDidLayoutSubviews() {
32 |
33 | let additionalSafeDelta = UIDevice.current.userInterfaceIdiom == .mac ? 0 : view.safeAreaInsets.top
34 | let division = view.bounds.divided(atDistance: toolbarHeight + additionalSafeDelta, from: .minYEdge)
35 | toolbarController.view.frame = division.slice
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ITSAppUsesNonExemptEncryption
6 |
7 | LSRequiresIPhoneOS
8 |
9 | UIApplicationSceneManifest
10 |
11 | UIApplicationSupportsMultipleScenes
12 |
13 | UISceneConfigurations
14 |
15 | UIWindowSceneSessionRoleApplication
16 |
17 |
18 | UISceneConfigurationName
19 | Default Configuration
20 | UISceneDelegateClassName
21 | $(PRODUCT_MODULE_NAME).CCTSceneDelegate
22 |
23 |
24 |
25 |
26 | UIApplicationSupportsIndirectInputEvents
27 |
28 | UILaunchStoryboardName
29 | LaunchScreen
30 | UIRequiredDeviceCapabilities
31 |
32 | armv7
33 |
34 | UISupportedInterfaceOrientations
35 |
36 | UIInterfaceOrientationPortrait
37 | UIInterfaceOrientationLandscapeLeft
38 | UIInterfaceOrientationLandscapeRight
39 |
40 | UISupportedInterfaceOrientations~ipad
41 |
42 | UIInterfaceOrientationPortrait
43 | UIInterfaceOrientationPortraitUpsideDown
44 | UIInterfaceOrientationLandscapeLeft
45 | UIInterfaceOrientationLandscapeRight
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Source/Application/CCTSceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CCTSceneDelegate.swift
3 | // CatalystCustomToolbar
4 | //
5 | // Created by Steven Troughton-Smith on 06/02/2023.
6 | //
7 | //
8 |
9 | import UIKit
10 |
11 | class CCTSceneDelegate: UIResponder, UIWindowSceneDelegate {
12 | var window: UIWindow?
13 |
14 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
15 | guard let windowScene = scene as? UIWindowScene else {
16 | fatalError("Expected scene of type UIWindowScene but got an unexpected type")
17 | }
18 | window = UIWindow(windowScene: windowScene)
19 |
20 | if let window = window {
21 | window.rootViewController = CCTMainViewController()
22 |
23 | #if targetEnvironment(macCatalyst)
24 |
25 | /*
26 | We still set up an empty NSToolbar here to gain the centered window controls and draggability
27 | */
28 |
29 | let toolbar = NSToolbar(identifier: NSToolbar.Identifier("CCTSceneDelegate.Toolbar"))
30 | toolbar.delegate = self
31 | toolbar.displayMode = .iconOnly
32 | toolbar.allowsUserCustomization = false
33 |
34 | windowScene.titlebar?.toolbar = toolbar
35 | windowScene.titlebar?.toolbarStyle = .unified
36 | windowScene.titlebar?.autoHidesToolbarInFullScreen = true
37 |
38 | /*
39 | This is a private enum value and may break in the future, but is essential for custom toolbars.
40 | Please file a radar if you need this in your app to let Apple know they should document it (FB9109207).
41 | */
42 | windowScene.titlebar?.titleVisibility = .init(rawValue: 10) ?? .hidden // UITitlebarTitleVisibilityTransparent
43 |
44 | #endif
45 |
46 | window.makeKeyAndVisible()
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "size": "20x20",
5 | "idiom": "iphone",
6 | "filename": "icon-40.png",
7 | "scale": "2x"
8 | },
9 | {
10 | "size": "20x20",
11 | "idiom": "iphone",
12 | "filename": "icon-60.png",
13 | "scale": "3x"
14 | },
15 | {
16 | "size": "29x29",
17 | "idiom": "iphone",
18 | "filename": "icon-58.png",
19 | "scale": "2x"
20 | },
21 | {
22 | "size": "29x29",
23 | "idiom": "iphone",
24 | "filename": "icon-87.png",
25 | "scale": "3x"
26 | },
27 | {
28 | "size": "40x40",
29 | "idiom": "iphone",
30 | "filename": "icon-80.png",
31 | "scale": "2x"
32 | },
33 | {
34 | "size": "40x40",
35 | "idiom": "iphone",
36 | "filename": "icon-120.png",
37 | "scale": "3x"
38 | },
39 | {
40 | "size": "60x60",
41 | "idiom": "iphone",
42 | "filename": "icon-120.png",
43 | "scale": "2x"
44 | },
45 | {
46 | "size": "60x60",
47 | "idiom": "iphone",
48 | "filename": "icon-180.png",
49 | "scale": "3x"
50 | },
51 | {
52 | "size": "20x20",
53 | "idiom": "ipad",
54 | "filename": "icon20.png",
55 | "scale": "1x"
56 | },
57 | {
58 | "size": "20x20",
59 | "idiom": "ipad",
60 | "filename": "icon-40.png",
61 | "scale": "2x"
62 | },
63 | {
64 | "size": "29x29",
65 | "idiom": "ipad",
66 | "filename": "icon-29.png",
67 | "scale": "1x"
68 | },
69 | {
70 | "size": "29x29",
71 | "idiom": "ipad",
72 | "filename": "icon-58.png",
73 | "scale": "2x"
74 | },
75 | {
76 | "size": "40x40",
77 | "idiom": "ipad",
78 | "filename": "icon-40.png",
79 | "scale": "1x"
80 | },
81 | {
82 | "size": "40x40",
83 | "idiom": "ipad",
84 | "filename": "icon-80.png",
85 | "scale": "2x"
86 | },
87 | {
88 | "size": "76x76",
89 | "idiom": "ipad",
90 | "filename": "icon-76.png",
91 | "scale": "1x"
92 | },
93 | {
94 | "size": "76x76",
95 | "idiom": "ipad",
96 | "filename": "icon-152.png",
97 | "scale": "2x"
98 | },
99 | {
100 | "size": "83.5x83.5",
101 | "idiom": "ipad",
102 | "filename": "icon-167.png",
103 | "scale": "2x"
104 | },
105 | {
106 | "size": "1024x1024",
107 | "idiom": "ios-marketing",
108 | "filename": "icon-1024.png",
109 | "scale": "1x"
110 | }
111 | ],
112 | "info": {
113 | "version": 1,
114 | "author": "xcode"
115 | }
116 | }
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Source/Main/CCTCustomToolbarViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CCTCustomToolbarViewController.swift
3 | // CatalystCustomToolbar
4 | //
5 | // Created by Steven Troughton-Smith on 06/02/2023.
6 | //
7 |
8 | import UIKit
9 | import AppleUniversalCore
10 |
11 | class CCTCustomToolbarViewController: UIViewController {
12 | let stackView = UIStackView()
13 | let padding = UIFloat(13)
14 | let windowControlsPadding = UIDevice.current.userInterfaceIdiom == .mac ? UIFloat(100) : .zero
15 |
16 | // MARK: - Dummy toolbar for demo purposes — you can ignore this
17 |
18 | init() {
19 | super.init(nibName: nil, bundle: nil)
20 |
21 | view.backgroundColor = .secondarySystemFill
22 |
23 | func _dummyButton(title:String) -> UIButton {
24 | let button = UIButton(type: .custom)
25 | button.setTitle(title, for: .normal)
26 | button.preferredBehavioralStyle = .pad
27 | button.configuration = .borderedProminent()
28 |
29 | return button
30 | }
31 |
32 | stackView.addArrangedSubview(_dummyButton(title: "Play"))
33 | stackView.addArrangedSubview(_dummyButton(title: "Pause"))
34 |
35 | let titleView = UILabel()
36 | titleView.text = "Testificate"
37 | titleView.textAlignment = .center
38 | stackView.addArrangedSubview(titleView)
39 |
40 | stackView.addArrangedSubview({
41 | let slider = UISlider()
42 | slider.value = 0.7
43 | return slider
44 | }())
45 | stackView.addArrangedSubview(_dummyButton(title: "AirPlay"))
46 |
47 |
48 | stackView.insetsLayoutMarginsFromSafeArea = false
49 | stackView.isLayoutMarginsRelativeArrangement = true
50 | stackView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: padding, leading: windowControlsPadding+padding, bottom: padding, trailing: padding)
51 | stackView.spacing = padding
52 | stackView.distribution = .fillEqually
53 |
54 | view.addSubview(stackView)
55 | }
56 |
57 | required init?(coder: NSCoder) {
58 | fatalError("init(coder:) has not been implemented")
59 | }
60 |
61 | // MARK: - Layout — Including macOS Fullscreen check
62 |
63 | override func viewDidLayoutSubviews() {
64 | stackView.frame = UIDevice.current.userInterfaceIdiom == .mac ? view.bounds : view.bounds.inset(by: view.safeAreaInsets)
65 |
66 | if UIDevice.current.userInterfaceIdiom == .mac {
67 |
68 | var isFullscreen = false
69 | if #available(iOS 16.0, *) {
70 | if view.window?.windowScene?.isFullScreen == true {
71 | isFullscreen = true
72 | }
73 | }
74 |
75 | /*
76 | We're in macOS fullscreen mode — window controls are hidden.
77 | NOTE: You should also be thinking about RTL layouts here if not relying on leading/trailing constraints
78 | */
79 | if isFullscreen || view.window?.safeAreaInsets.top == 0 {
80 | stackView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: padding, leading: padding, bottom: padding, trailing: padding)
81 | }
82 | else {
83 | stackView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: padding, leading: windowControlsPadding+padding, bottom: padding, trailing: padding)
84 | }
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar.xcodeproj/xcshareddata/xcschemes/CatalystCustomToolbar.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
57 |
58 |
59 |
60 |
66 |
68 |
74 |
75 |
76 |
77 |
79 |
80 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/CatalystCustomToolbar.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | B0A3CB442991482300749665 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B0A3CB432991482300749665 /* Assets.xcassets */; };
11 | B0A3CB482991482300749665 /* CCTAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A3CB472991482300749665 /* CCTAppDelegate.swift */; };
12 | B0A3CB4A2991482300749665 /* CCTSceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A3CB492991482300749665 /* CCTSceneDelegate.swift */; };
13 | B0A3CB4C2991482300749665 /* CCTSceneDelegate+NSToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A3CB4B2991482300749665 /* CCTSceneDelegate+NSToolbar.swift */; };
14 | B0A3CB4F2991482300749665 /* CCTMainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A3CB4E2991482300749665 /* CCTMainViewController.swift */; };
15 | B0A3CB522991482300749665 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B0A3CB502991482300749665 /* LaunchScreen.storyboard */; };
16 | B0A3CB5A2991489000749665 /* CCTCustomToolbarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A3CB592991489000749665 /* CCTCustomToolbarViewController.swift */; };
17 | B0A3CB5D299148D400749665 /* AppleUniversalCore in Frameworks */ = {isa = PBXBuildFile; productRef = B0A3CB5C299148D400749665 /* AppleUniversalCore */; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXFileReference section */
21 | B0A3CB402991482300749665 /* CatalystCustomToolbar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CatalystCustomToolbar.app; sourceTree = BUILT_PRODUCTS_DIR; };
22 | B0A3CB432991482300749665 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
23 | B0A3CB472991482300749665 /* CCTAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCTAppDelegate.swift; sourceTree = ""; };
24 | B0A3CB492991482300749665 /* CCTSceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCTSceneDelegate.swift; sourceTree = ""; };
25 | B0A3CB4B2991482300749665 /* CCTSceneDelegate+NSToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CCTSceneDelegate+NSToolbar.swift"; sourceTree = ""; };
26 | B0A3CB4E2991482300749665 /* CCTMainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCTMainViewController.swift; sourceTree = ""; };
27 | B0A3CB512991482300749665 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
28 | B0A3CB532991482300749665 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
29 | B0A3CB592991489000749665 /* CCTCustomToolbarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCTCustomToolbarViewController.swift; sourceTree = ""; };
30 | B0A3CB5E2991542300749665 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
31 | /* End PBXFileReference section */
32 |
33 | /* Begin PBXFrameworksBuildPhase section */
34 | B0A3CB3D2991482300749665 /* Frameworks */ = {
35 | isa = PBXFrameworksBuildPhase;
36 | buildActionMask = 2147483647;
37 | files = (
38 | B0A3CB5D299148D400749665 /* AppleUniversalCore in Frameworks */,
39 | );
40 | runOnlyForDeploymentPostprocessing = 0;
41 | };
42 | /* End PBXFrameworksBuildPhase section */
43 |
44 | /* Begin PBXGroup section */
45 | B0A3CB372991482300749665 = {
46 | isa = PBXGroup;
47 | children = (
48 | B0A3CB5E2991542300749665 /* README.md */,
49 | B0A3CB422991482300749665 /* CatalystCustomToolbar */,
50 | B0A3CB412991482300749665 /* Products */,
51 | );
52 | sourceTree = "";
53 | };
54 | B0A3CB412991482300749665 /* Products */ = {
55 | isa = PBXGroup;
56 | children = (
57 | B0A3CB402991482300749665 /* CatalystCustomToolbar.app */,
58 | );
59 | name = Products;
60 | sourceTree = "";
61 | };
62 | B0A3CB422991482300749665 /* CatalystCustomToolbar */ = {
63 | isa = PBXGroup;
64 | children = (
65 | B0A3CB432991482300749665 /* Assets.xcassets */,
66 | B0A3CB502991482300749665 /* LaunchScreen.storyboard */,
67 | B0A3CB532991482300749665 /* Info.plist */,
68 | B0A3CB452991482300749665 /* Source */,
69 | );
70 | path = CatalystCustomToolbar;
71 | sourceTree = "";
72 | };
73 | B0A3CB452991482300749665 /* Source */ = {
74 | isa = PBXGroup;
75 | children = (
76 | B0A3CB462991482300749665 /* Application */,
77 | B0A3CB4D2991482300749665 /* Main */,
78 | );
79 | path = Source;
80 | sourceTree = "";
81 | };
82 | B0A3CB462991482300749665 /* Application */ = {
83 | isa = PBXGroup;
84 | children = (
85 | B0A3CB472991482300749665 /* CCTAppDelegate.swift */,
86 | B0A3CB492991482300749665 /* CCTSceneDelegate.swift */,
87 | B0A3CB4B2991482300749665 /* CCTSceneDelegate+NSToolbar.swift */,
88 | );
89 | path = Application;
90 | sourceTree = "";
91 | };
92 | B0A3CB4D2991482300749665 /* Main */ = {
93 | isa = PBXGroup;
94 | children = (
95 | B0A3CB4E2991482300749665 /* CCTMainViewController.swift */,
96 | B0A3CB592991489000749665 /* CCTCustomToolbarViewController.swift */,
97 | );
98 | path = Main;
99 | sourceTree = "";
100 | };
101 | /* End PBXGroup section */
102 |
103 | /* Begin PBXNativeTarget section */
104 | B0A3CB3F2991482300749665 /* CatalystCustomToolbar */ = {
105 | isa = PBXNativeTarget;
106 | buildConfigurationList = B0A3CB562991482300749665 /* Build configuration list for PBXNativeTarget "CatalystCustomToolbar" */;
107 | buildPhases = (
108 | B0A3CB3C2991482300749665 /* Sources */,
109 | B0A3CB3D2991482300749665 /* Frameworks */,
110 | B0A3CB3E2991482300749665 /* Resources */,
111 | );
112 | buildRules = (
113 | );
114 | dependencies = (
115 | );
116 | name = CatalystCustomToolbar;
117 | packageProductDependencies = (
118 | B0A3CB5C299148D400749665 /* AppleUniversalCore */,
119 | );
120 | productName = CatalystCustomToolbar;
121 | productReference = B0A3CB402991482300749665 /* CatalystCustomToolbar.app */;
122 | productType = "com.apple.product-type.application";
123 | };
124 | /* End PBXNativeTarget section */
125 |
126 | /* Begin PBXProject section */
127 | B0A3CB382991482300749665 /* Project object */ = {
128 | isa = PBXProject;
129 | attributes = {
130 | BuildIndependentTargetsInParallel = 1;
131 | CLASSPREFIX = CCT;
132 | LastSwiftUpdateCheck = 1420;
133 | LastUpgradeCheck = 1420;
134 | TargetAttributes = {
135 | B0A3CB3F2991482300749665 = {
136 | CreatedOnToolsVersion = 14.2;
137 | };
138 | };
139 | };
140 | buildConfigurationList = B0A3CB3B2991482300749665 /* Build configuration list for PBXProject "CatalystCustomToolbar" */;
141 | compatibilityVersion = "Xcode 14.0";
142 | developmentRegion = en;
143 | hasScannedForEncodings = 0;
144 | knownRegions = (
145 | en,
146 | Base,
147 | );
148 | mainGroup = B0A3CB372991482300749665;
149 | packageReferences = (
150 | B0A3CB5B299148D400749665 /* XCRemoteSwiftPackageReference "AppleUniversalCore" */,
151 | );
152 | productRefGroup = B0A3CB412991482300749665 /* Products */;
153 | projectDirPath = "";
154 | projectRoot = "";
155 | targets = (
156 | B0A3CB3F2991482300749665 /* CatalystCustomToolbar */,
157 | );
158 | };
159 | /* End PBXProject section */
160 |
161 | /* Begin PBXResourcesBuildPhase section */
162 | B0A3CB3E2991482300749665 /* Resources */ = {
163 | isa = PBXResourcesBuildPhase;
164 | buildActionMask = 2147483647;
165 | files = (
166 | B0A3CB442991482300749665 /* Assets.xcassets in Resources */,
167 | B0A3CB522991482300749665 /* LaunchScreen.storyboard in Resources */,
168 | );
169 | runOnlyForDeploymentPostprocessing = 0;
170 | };
171 | /* End PBXResourcesBuildPhase section */
172 |
173 | /* Begin PBXSourcesBuildPhase section */
174 | B0A3CB3C2991482300749665 /* Sources */ = {
175 | isa = PBXSourcesBuildPhase;
176 | buildActionMask = 2147483647;
177 | files = (
178 | B0A3CB4F2991482300749665 /* CCTMainViewController.swift in Sources */,
179 | B0A3CB4A2991482300749665 /* CCTSceneDelegate.swift in Sources */,
180 | B0A3CB5A2991489000749665 /* CCTCustomToolbarViewController.swift in Sources */,
181 | B0A3CB4C2991482300749665 /* CCTSceneDelegate+NSToolbar.swift in Sources */,
182 | B0A3CB482991482300749665 /* CCTAppDelegate.swift in Sources */,
183 | );
184 | runOnlyForDeploymentPostprocessing = 0;
185 | };
186 | /* End PBXSourcesBuildPhase section */
187 |
188 | /* Begin PBXVariantGroup section */
189 | B0A3CB502991482300749665 /* LaunchScreen.storyboard */ = {
190 | isa = PBXVariantGroup;
191 | children = (
192 | B0A3CB512991482300749665 /* Base */,
193 | );
194 | name = LaunchScreen.storyboard;
195 | sourceTree = "";
196 | };
197 | /* End PBXVariantGroup section */
198 |
199 | /* Begin XCBuildConfiguration section */
200 | B0A3CB542991482300749665 /* Debug */ = {
201 | isa = XCBuildConfiguration;
202 | buildSettings = {
203 | ALWAYS_SEARCH_USER_PATHS = NO;
204 | CLANG_ANALYZER_NONNULL = YES;
205 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
206 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
207 | CLANG_ENABLE_MODULES = YES;
208 | CLANG_ENABLE_OBJC_ARC = YES;
209 | CLANG_ENABLE_OBJC_WEAK = YES;
210 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
211 | CLANG_WARN_BOOL_CONVERSION = YES;
212 | CLANG_WARN_COMMA = YES;
213 | CLANG_WARN_CONSTANT_CONVERSION = YES;
214 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
215 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
216 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
217 | CLANG_WARN_EMPTY_BODY = YES;
218 | CLANG_WARN_ENUM_CONVERSION = YES;
219 | CLANG_WARN_INFINITE_RECURSION = YES;
220 | CLANG_WARN_INT_CONVERSION = YES;
221 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
222 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
223 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
224 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
225 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
226 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
227 | CLANG_WARN_STRICT_PROTOTYPES = YES;
228 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
229 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
230 | CLANG_WARN_UNREACHABLE_CODE = YES;
231 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
232 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
233 | COPY_PHASE_STRIP = NO;
234 | DEBUG_INFORMATION_FORMAT = dwarf;
235 | ENABLE_STRICT_OBJC_MSGSEND = YES;
236 | ENABLE_TESTABILITY = YES;
237 | GCC_C_LANGUAGE_STANDARD = gnu11;
238 | GCC_DYNAMIC_NO_PIC = NO;
239 | GCC_NO_COMMON_BLOCKS = YES;
240 | GCC_OPTIMIZATION_LEVEL = 0;
241 | GCC_PREPROCESSOR_DEFINITIONS = (
242 | "DEBUG=1",
243 | "$(inherited)",
244 | );
245 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
246 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
247 | GCC_WARN_UNDECLARED_SELECTOR = YES;
248 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
249 | GCC_WARN_UNUSED_FUNCTION = YES;
250 | GCC_WARN_UNUSED_VARIABLE = YES;
251 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
252 | MTL_FAST_MATH = YES;
253 | ONLY_ACTIVE_ARCH = YES;
254 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
255 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
256 | SWIFT_VERSION = 5.0;
257 | };
258 | name = Debug;
259 | };
260 | B0A3CB552991482300749665 /* Release */ = {
261 | isa = XCBuildConfiguration;
262 | buildSettings = {
263 | ALWAYS_SEARCH_USER_PATHS = NO;
264 | CLANG_ANALYZER_NONNULL = YES;
265 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
266 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
267 | CLANG_ENABLE_MODULES = YES;
268 | CLANG_ENABLE_OBJC_ARC = YES;
269 | CLANG_ENABLE_OBJC_WEAK = YES;
270 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
271 | CLANG_WARN_BOOL_CONVERSION = YES;
272 | CLANG_WARN_COMMA = YES;
273 | CLANG_WARN_CONSTANT_CONVERSION = YES;
274 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
275 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
276 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
277 | CLANG_WARN_EMPTY_BODY = YES;
278 | CLANG_WARN_ENUM_CONVERSION = YES;
279 | CLANG_WARN_INFINITE_RECURSION = YES;
280 | CLANG_WARN_INT_CONVERSION = YES;
281 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
282 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
283 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
284 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
285 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
286 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
287 | CLANG_WARN_STRICT_PROTOTYPES = YES;
288 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
289 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
290 | CLANG_WARN_UNREACHABLE_CODE = YES;
291 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
292 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
293 | COPY_PHASE_STRIP = NO;
294 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
295 | ENABLE_NS_ASSERTIONS = NO;
296 | ENABLE_STRICT_OBJC_MSGSEND = YES;
297 | GCC_C_LANGUAGE_STANDARD = gnu11;
298 | GCC_NO_COMMON_BLOCKS = YES;
299 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
300 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
301 | GCC_WARN_UNDECLARED_SELECTOR = YES;
302 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
303 | GCC_WARN_UNUSED_FUNCTION = YES;
304 | GCC_WARN_UNUSED_VARIABLE = YES;
305 | MTL_ENABLE_DEBUG_INFO = NO;
306 | MTL_FAST_MATH = YES;
307 | SWIFT_COMPILATION_MODE = wholemodule;
308 | SWIFT_OPTIMIZATION_LEVEL = "-O";
309 | SWIFT_VERSION = 5.0;
310 | };
311 | name = Release;
312 | };
313 | B0A3CB572991482300749665 /* Debug */ = {
314 | isa = XCBuildConfiguration;
315 | buildSettings = {
316 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
317 | CLANG_STATIC_ANALYZER_MODE = deep;
318 | CODE_SIGN_IDENTITY = "iPhone Developer";
319 | CODE_SIGN_STYLE = Automatic;
320 | CURRENT_PROJECT_VERSION = 1;
321 | DEVELOPMENT_TEAM = 2ZDN69KUUV;
322 | GCC_TREAT_WARNINGS_AS_ERRORS = deep;
323 | GCC_WARN_PEDANTIC = deep;
324 | GENERATE_INFOPLIST_FILE = YES;
325 | INFOPLIST_FILE = "$(PRODUCT_NAME)/Info.plist";
326 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
327 | "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 15.0;
328 | LD_RUNPATH_SEARCH_PATHS = (
329 | "$(inherited)",
330 | "@executable_path/Frameworks",
331 | );
332 | MARKETING_VERSION = 1.0;
333 | PRODUCT_BUNDLE_IDENTIFIER = com.highcaffeinecontent.CatalystCustomToolbar;
334 | PRODUCT_NAME = CatalystCustomToolbar;
335 | RUN_CLANG_STATIC_ANALYZER = YES;
336 | SDKROOT = iphoneos;
337 | SUPPORTS_MACCATALYST = YES;
338 | SWIFT_EMIT_LOC_STRINGS = YES;
339 | SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
340 | SWIFT_VERSION = 5.0;
341 | TARGETED_DEVICE_FAMILY = "1,2,6";
342 | };
343 | name = Debug;
344 | };
345 | B0A3CB582991482300749665 /* Release */ = {
346 | isa = XCBuildConfiguration;
347 | buildSettings = {
348 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
349 | CLANG_STATIC_ANALYZER_MODE = deep;
350 | CODE_SIGN_IDENTITY = "iPhone Developer";
351 | CODE_SIGN_STYLE = Automatic;
352 | CURRENT_PROJECT_VERSION = 1;
353 | DEVELOPMENT_TEAM = 2ZDN69KUUV;
354 | GCC_TREAT_WARNINGS_AS_ERRORS = deep;
355 | GCC_WARN_PEDANTIC = deep;
356 | GENERATE_INFOPLIST_FILE = YES;
357 | INFOPLIST_FILE = "$(PRODUCT_NAME)/Info.plist";
358 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
359 | "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 15.0;
360 | LD_RUNPATH_SEARCH_PATHS = (
361 | "$(inherited)",
362 | "@executable_path/Frameworks",
363 | );
364 | MARKETING_VERSION = 1.0;
365 | PRODUCT_BUNDLE_IDENTIFIER = com.highcaffeinecontent.CatalystCustomToolbar;
366 | PRODUCT_NAME = CatalystCustomToolbar;
367 | RUN_CLANG_STATIC_ANALYZER = YES;
368 | SDKROOT = iphoneos;
369 | SUPPORTS_MACCATALYST = YES;
370 | SWIFT_EMIT_LOC_STRINGS = YES;
371 | SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
372 | SWIFT_VERSION = 5.0;
373 | TARGETED_DEVICE_FAMILY = "1,2,6";
374 | VALIDATE_PRODUCT = YES;
375 | };
376 | name = Release;
377 | };
378 | /* End XCBuildConfiguration section */
379 |
380 | /* Begin XCConfigurationList section */
381 | B0A3CB3B2991482300749665 /* Build configuration list for PBXProject "CatalystCustomToolbar" */ = {
382 | isa = XCConfigurationList;
383 | buildConfigurations = (
384 | B0A3CB542991482300749665 /* Debug */,
385 | B0A3CB552991482300749665 /* Release */,
386 | );
387 | defaultConfigurationIsVisible = 0;
388 | defaultConfigurationName = Release;
389 | };
390 | B0A3CB562991482300749665 /* Build configuration list for PBXNativeTarget "CatalystCustomToolbar" */ = {
391 | isa = XCConfigurationList;
392 | buildConfigurations = (
393 | B0A3CB572991482300749665 /* Debug */,
394 | B0A3CB582991482300749665 /* Release */,
395 | );
396 | defaultConfigurationIsVisible = 0;
397 | defaultConfigurationName = Release;
398 | };
399 | /* End XCConfigurationList section */
400 |
401 | /* Begin XCRemoteSwiftPackageReference section */
402 | B0A3CB5B299148D400749665 /* XCRemoteSwiftPackageReference "AppleUniversalCore" */ = {
403 | isa = XCRemoteSwiftPackageReference;
404 | repositoryURL = "https://github.com/steventroughtonsmith/AppleUniversalCore.git";
405 | requirement = {
406 | branch = main;
407 | kind = branch;
408 | };
409 | };
410 | /* End XCRemoteSwiftPackageReference section */
411 |
412 | /* Begin XCSwiftPackageProductDependency section */
413 | B0A3CB5C299148D400749665 /* AppleUniversalCore */ = {
414 | isa = XCSwiftPackageProductDependency;
415 | package = B0A3CB5B299148D400749665 /* XCRemoteSwiftPackageReference "AppleUniversalCore" */;
416 | productName = AppleUniversalCore;
417 | };
418 | /* End XCSwiftPackageProductDependency section */
419 | };
420 | rootObject = B0A3CB382991482300749665 /* Project object */;
421 | }
422 |
--------------------------------------------------------------------------------