├── Apple-Music-Search-Chips-Demo
├── Supporting Files
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Info.plist
│ └── Base.lproj
│ │ └── LaunchScreen.storyboard
├── View Controllers
│ ├── TaggedSearchController.swift
│ └── ViewController.swift
├── Extensions
│ ├── UISearchBar+ScopeBar.swift
│ ├── UISearchBar+ScopeBarContainerView.swift
│ └── UISegmentedControl+SetTitles.swift
├── Base
│ ├── SceneDelegate.swift
│ └── AppDelegate.swift
└── Views
│ ├── TaggedSearchBar.swift
│ └── TagsView.swift
└── Apple-Music-Search-Chips-Demo.xcodeproj
├── project.xcworkspace
├── contents.xcworkspacedata
└── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── xcuserdata
└── sebvidal.xcuserdatad
│ ├── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ └── xcschememanagement.plist
└── project.pbxproj
/Apple-Music-Search-Chips-Demo/Supporting Files/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo.xcodeproj/xcuserdata/sebvidal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Supporting Files/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/View Controllers/TaggedSearchController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TaggedSearchController.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 07/09/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | class TaggedSearchController: UISearchController {
11 | private lazy var _searchBar = TaggedSearchBar()
12 |
13 | override var searchBar: TaggedSearchBar {
14 | return _searchBar
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Extensions/UISearchBar+ScopeBar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISearchBar+ScopeBar.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 07/09/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UISearchBar {
11 | var scopeBar: UIView? {
12 | let selector = NSSelectorFromString("_scopeBar")
13 | guard responds(to: selector) else { return nil }
14 | return value(forKey: "_scopeBar") as? UIView
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo.xcodeproj/xcuserdata/sebvidal.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Apple-Music-Search-Chips-Demo.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Extensions/UISearchBar+ScopeBarContainerView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISearchBar+ScopeBarContainerView.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 07/09/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UISearchBar {
11 | var scopeBarContainerView: UIView? {
12 | let selector = NSSelectorFromString("_scopeBarContainerView")
13 | guard responds(to: selector) else { return nil }
14 | return value(forKey: "_scopeBarContainerView") as? UIView
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Extensions/UISegmentedControl+SetTitles.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISegmentedControl+SetTitles.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 07/09/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UISegmentedControl {
11 | func setTitles(_ titles: [String]?) {
12 | if let titles {
13 | for title in titles.reversed() {
14 | insertSegment(withTitle: title, at: 0, animated: false)
15 | }
16 | selectedSegmentIndex = 0
17 | } else {
18 | removeAllSegments()
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Supporting Files/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationSupportsMultipleScenes
8 |
9 | UISceneConfigurations
10 |
11 | UIWindowSceneSessionRoleApplication
12 |
13 |
14 | UISceneConfigurationName
15 | Default Configuration
16 | UISceneDelegateClassName
17 | $(PRODUCT_MODULE_NAME).SceneDelegate
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Base/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 02/08/2024.
6 | //
7 |
8 | import UIKit
9 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
10 |
11 | var window: UIWindow?
12 |
13 |
14 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
15 | guard let windowScene = scene as? UIWindowScene else { return }
16 |
17 | let rootViewController = ViewController()
18 |
19 | let navigationController = UINavigationController(rootViewController: rootViewController)
20 |
21 | let window = UIWindow(windowScene: windowScene)
22 | window.rootViewController = navigationController
23 | window.tintColor = .systemPink
24 | window.makeKeyAndVisible()
25 | window.backgroundColor = .systemBackground
26 |
27 | self.window = window
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Base/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 02/08/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | @main
11 | class AppDelegate: UIResponder, UIApplicationDelegate {
12 |
13 |
14 |
15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
16 | // Override point for customization after application launch.
17 | return true
18 | }
19 |
20 | // MARK: UISceneSession Lifecycle
21 |
22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
23 | // Called when a new scene session is being created.
24 | // Use this method to select a configuration to create the new scene with.
25 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
26 | }
27 |
28 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
29 | // Called when the user discards a scene session.
30 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
31 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
32 | }
33 |
34 |
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/View Controllers/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // Apple-Music-Search-Tags-Demo
4 | //
5 | // Created by Seb Vidal on 02/08/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | class ViewController: UITableViewController, UISearchBarDelegate {
11 | private var searchController: TaggedSearchController!
12 | private var isCancelling: Bool = false
13 |
14 | override func viewDidLoad() {
15 | super.viewDidLoad()
16 |
17 | searchController = TaggedSearchController()
18 | searchController.scopeBarActivation = .onSearchActivation
19 | searchController.searchBar.scopeButtonTitles = ["Apple Music", "Library"]
20 | searchController.searchBar.tagTitles = ["Top Results", "Artists", "Albums", "Songs", "Playlists", "Stations", "Profiles"]
21 | searchController.searchBar.delegate = self
22 |
23 | navigationItem.searchController = searchController
24 | navigationItem.title = "Search"
25 | }
26 |
27 | func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
28 | isCancelling = false
29 |
30 | UIView.animate(withDuration: 0.25) {
31 | self.searchController.searchBar.showsTags = false
32 | }
33 | }
34 |
35 | func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
36 | guard isCancelling == false else { return }
37 |
38 | UIView.animate(withDuration: 0.25) {
39 | self.searchController.searchBar.showsTags = true
40 | }
41 | }
42 |
43 | func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
44 | isCancelling = true
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Supporting Files/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 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Views/TaggedSearchBar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TaggedSearchBar.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 07/09/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | class TaggedSearchBar: UISearchBar {
11 | private var segmentedControl: UISegmentedControl!
12 | private var tagsView: TagsView!
13 |
14 | override var scopeButtonTitles: [String]? {
15 | didSet {
16 | segmentedControl.setTitles(scopeButtonTitles)
17 | }
18 | }
19 |
20 | var showsTags: Bool = false {
21 | didSet {
22 | layoutSegmentedControl()
23 | layoutTagsView()
24 | }
25 | }
26 |
27 | var tagTitles: [String] {
28 | get {
29 | return tagsView.titles
30 | } set {
31 | tagsView.titles = newValue
32 | }
33 | }
34 |
35 | override init(frame: CGRect) {
36 | super.init(frame: frame)
37 | setupSegmentedControl()
38 | setupTagsView()
39 | }
40 |
41 | required init?(coder: NSCoder) {
42 | fatalError("init(coder:) has not been implemented")
43 | }
44 |
45 | private func setupSegmentedControl() {
46 | segmentedControl = UISegmentedControl()
47 | segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged), for: .valueChanged)
48 | }
49 |
50 | @objc private func segmentedControlValueChanged(_ sender: UISegmentedControl) {
51 | delegate?.searchBar?(self, selectedScopeButtonIndexDidChange: sender.selectedSegmentIndex)
52 | }
53 |
54 | private func setupTagsView() {
55 | tagsView = TagsView()
56 | tagsView.alpha = 0
57 | }
58 |
59 | private func layoutSegmentedControl() {
60 | if let scopeBar {
61 | segmentedControl.frame.size = scopeBar.frame.size
62 | segmentedControl.frame.origin.x = scopeBar.frame.origin.x
63 | segmentedControl.frame.origin.y = showsTags ? -scopeBar.frame.height : scopeBar.frame.origin.y
64 |
65 | segmentedControl.alpha = showsTags ? 0 : 1
66 | }
67 | }
68 |
69 | private func layoutTagsView() {
70 | if let scopeBarContainerView {
71 | tagsView.frame.size = scopeBarContainerView.frame.size
72 | tagsView.frame.origin.x = 0
73 | tagsView.frame.origin.y = showsTags ? 0 : scopeBarContainerView.frame.height
74 |
75 | tagsView.alpha = showsTags ? 1 : 0
76 |
77 | let contentInset = searchTextField.frame.origin.x
78 | let safeAreaInset = safeAreaInsets.left
79 | tagsView.contentInset.left = contentInset - safeAreaInset
80 | tagsView.contentInset.right = contentInset - safeAreaInset
81 | tagsView.contentOffset.x = -contentInset
82 | }
83 | }
84 |
85 | override func didMoveToSuperview() {
86 | super.didMoveToSuperview()
87 | scopeBar?.isHidden = true
88 | scopeBarContainerView?.addSubview(segmentedControl)
89 | scopeBarContainerView?.addSubview(tagsView)
90 | }
91 |
92 | override func layoutSubviews() {
93 | super.layoutSubviews()
94 | layoutSegmentedControl()
95 | layoutTagsView()
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo/Views/TagsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TagsView.swift
3 | // Apple-Music-Search-Chips-Demo
4 | //
5 | // Created by Seb Vidal on 07/09/2024.
6 | //
7 |
8 | import UIKit
9 |
10 | class TagsView: UIScrollView {
11 | private var bottomStackView: UIStackView!
12 | private var topStackView: UIStackView!
13 | private var backgroundView: UIView!
14 | private var tagMaskView: UIView!
15 |
16 | var titles: [String] = [] {
17 | didSet { updateButtons(for: titles) }
18 | }
19 |
20 | var selectedTagIndex: Int = 0 {
21 | didSet { updateSelection(for: selectedTagIndex) }
22 | }
23 |
24 | override init(frame: CGRect) {
25 | super.init(frame: frame)
26 | setupScrollView()
27 | setupBottomStackView()
28 | setupTopStackView()
29 | setupBackgroundView()
30 | setupTagMaskView()
31 | }
32 |
33 | required init?(coder: NSCoder) {
34 | fatalError("init(coder:) has not been implemented")
35 | }
36 |
37 | private func setupScrollView() {
38 | alwaysBounceHorizontal = true
39 | showsHorizontalScrollIndicator = false
40 | }
41 |
42 | private func setupBottomStackView() {
43 | bottomStackView = UIStackView()
44 | bottomStackView.axis = .horizontal
45 | bottomStackView.distribution = .fillProportionally
46 | bottomStackView.isLayoutMarginsRelativeArrangement = true
47 | bottomStackView.translatesAutoresizingMaskIntoConstraints = false
48 |
49 | addSubview(bottomStackView)
50 |
51 | NSLayoutConstraint.activate([
52 | bottomStackView.topAnchor.constraint(equalTo: topAnchor),
53 | bottomStackView.leadingAnchor.constraint(equalTo: leadingAnchor),
54 | bottomStackView.trailingAnchor.constraint(equalTo: trailingAnchor),
55 | bottomStackView.bottomAnchor.constraint(equalTo: bottomAnchor)
56 | ])
57 | }
58 |
59 | private func setupTopStackView() {
60 | topStackView = UIStackView()
61 | topStackView.axis = .horizontal
62 | topStackView.isUserInteractionEnabled = false
63 | topStackView.distribution = .fillProportionally
64 | topStackView.isLayoutMarginsRelativeArrangement = true
65 | topStackView.translatesAutoresizingMaskIntoConstraints = false
66 |
67 | addSubview(topStackView)
68 |
69 | NSLayoutConstraint.activate([
70 | topStackView.topAnchor.constraint(equalTo: topAnchor),
71 | topStackView.leadingAnchor.constraint(equalTo: leadingAnchor),
72 | topStackView.trailingAnchor.constraint(equalTo: trailingAnchor),
73 | topStackView.bottomAnchor.constraint(equalTo: bottomAnchor)
74 | ])
75 | }
76 |
77 | private func setupBackgroundView() {
78 | backgroundView = UIView()
79 | backgroundView.clipsToBounds = true
80 | backgroundView.backgroundColor = .tintColor
81 | backgroundView.layer.cornerCurve = .continuous
82 |
83 | insertSubview(backgroundView, aboveSubview: bottomStackView)
84 | }
85 |
86 | private func setupTagMaskView() {
87 | tagMaskView = UIView()
88 | tagMaskView.clipsToBounds = true
89 | tagMaskView.backgroundColor = .black
90 | tagMaskView.layer.cornerCurve = .continuous
91 |
92 | topStackView.mask = tagMaskView
93 | }
94 |
95 | private func updateButtons(for titles: [String]) {
96 | bottomStackView.arrangedSubviews.forEach { subview in
97 | subview.removeFromSuperview()
98 | }
99 |
100 | topStackView.arrangedSubviews.forEach { subview in
101 | subview.removeFromSuperview()
102 | }
103 |
104 | for title in titles {
105 | let bottomButton = button(with: title, foregroundColor: .label)
106 | bottomStackView.addArrangedSubview(bottomButton)
107 |
108 | let topButton = button(with: title, foregroundColor: .white)
109 | topStackView.addArrangedSubview(topButton)
110 | }
111 | }
112 |
113 | private func button(with title: String, foregroundColor: UIColor) -> UIButton {
114 | let titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { container in
115 | var container = container
116 | container.font = UIFont.systemFont(ofSize: 13, weight: .semibold)
117 |
118 | return container
119 | }
120 |
121 | let button = UIButton(type: .system)
122 | button.configuration = .plain()
123 | button.configuration?.title = title
124 | button.configuration?.cornerStyle = .capsule
125 | button.configuration?.baseForegroundColor = foregroundColor
126 | button.configuration?.titleTextAttributesTransformer = titleTextAttributesTransformer
127 | button.configuration?.contentInsets = NSDirectionalEdgeInsets(top: 8.33, leading: 12, bottom: 8, trailing: 12.66)
128 | button.addTarget(self, action: #selector(tagButtonTapped), for: .touchUpInside)
129 |
130 | return button
131 | }
132 |
133 | @objc private func tagButtonTapped(_ sender: UIButton) {
134 | UIView.animate(springDuration: 0.25, bounce: 0.25) {
135 | selectedTagIndex = bottomStackView.arrangedSubviews.firstIndex(of: sender)!
136 | }
137 | }
138 |
139 | private func updateSelection(for selectedTagIndex: Int) {
140 | if bottomStackView.arrangedSubviews.indices.contains(selectedTagIndex) {
141 | let button = bottomStackView.arrangedSubviews[selectedTagIndex]
142 |
143 | tagMaskView.layer.cornerRadius = button.frame.height / 2
144 | tagMaskView.frame = button.frame
145 |
146 | backgroundView.layer.cornerRadius = button.frame.height / 2
147 | backgroundView.frame = button.frame
148 | }
149 | }
150 |
151 | override func layoutSubviews() {
152 | super.layoutSubviews()
153 |
154 | UIView.performWithoutAnimation { [unowned self] in
155 | updateSelection(for: selectedTagIndex)
156 | }
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/Apple-Music-Search-Chips-Demo.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | C2AF32522C5D099800B5A315 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2AF32512C5D099800B5A315 /* AppDelegate.swift */; };
11 | C2AF32542C5D099800B5A315 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2AF32532C5D099800B5A315 /* SceneDelegate.swift */; };
12 | C2AF32562C5D099800B5A315 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2AF32552C5D099800B5A315 /* ViewController.swift */; };
13 | C2AF325B2C5D099900B5A315 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C2AF325A2C5D099900B5A315 /* Assets.xcassets */; };
14 | C2AF325E2C5D099900B5A315 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C2AF325C2C5D099900B5A315 /* LaunchScreen.storyboard */; };
15 | C2B1EB222C8C4DF200871BB7 /* UISearchBar+ScopeBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B1EB212C8C4DF200871BB7 /* UISearchBar+ScopeBar.swift */; };
16 | C2B1EB242C8C4E0300871BB7 /* UISearchBar+ScopeBarContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B1EB232C8C4E0300871BB7 /* UISearchBar+ScopeBarContainerView.swift */; };
17 | C2B1EB272C8C4E1A00871BB7 /* TagsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B1EB262C8C4E1A00871BB7 /* TagsView.swift */; };
18 | C2B1EB2A2C8C4E3700871BB7 /* UISegmentedControl+SetTitles.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B1EB292C8C4E3700871BB7 /* UISegmentedControl+SetTitles.swift */; };
19 | C2B1EB2C2C8C4E6A00871BB7 /* TaggedSearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B1EB2B2C8C4E6A00871BB7 /* TaggedSearchController.swift */; };
20 | C2B1EB2E2C8C4EA500871BB7 /* TaggedSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2B1EB2D2C8C4EA500871BB7 /* TaggedSearchBar.swift */; };
21 | /* End PBXBuildFile section */
22 |
23 | /* Begin PBXFileReference section */
24 | C2AF324E2C5D099800B5A315 /* Apple-Music-Search-Chips-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Apple-Music-Search-Chips-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
25 | C2AF32512C5D099800B5A315 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
26 | C2AF32532C5D099800B5A315 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
27 | C2AF32552C5D099800B5A315 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
28 | C2AF325A2C5D099900B5A315 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
29 | C2AF325D2C5D099900B5A315 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
30 | C2AF325F2C5D099900B5A315 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
31 | C2B1EB212C8C4DF200871BB7 /* UISearchBar+ScopeBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchBar+ScopeBar.swift"; sourceTree = ""; };
32 | C2B1EB232C8C4E0300871BB7 /* UISearchBar+ScopeBarContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchBar+ScopeBarContainerView.swift"; sourceTree = ""; };
33 | C2B1EB262C8C4E1A00871BB7 /* TagsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsView.swift; sourceTree = ""; };
34 | C2B1EB292C8C4E3700871BB7 /* UISegmentedControl+SetTitles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISegmentedControl+SetTitles.swift"; sourceTree = ""; };
35 | C2B1EB2B2C8C4E6A00871BB7 /* TaggedSearchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaggedSearchController.swift; sourceTree = ""; };
36 | C2B1EB2D2C8C4EA500871BB7 /* TaggedSearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaggedSearchBar.swift; sourceTree = ""; };
37 | /* End PBXFileReference section */
38 |
39 | /* Begin PBXFrameworksBuildPhase section */
40 | C2AF324B2C5D099800B5A315 /* Frameworks */ = {
41 | isa = PBXFrameworksBuildPhase;
42 | buildActionMask = 2147483647;
43 | files = (
44 | );
45 | runOnlyForDeploymentPostprocessing = 0;
46 | };
47 | /* End PBXFrameworksBuildPhase section */
48 |
49 | /* Begin PBXGroup section */
50 | C2AF32452C5D099800B5A315 = {
51 | isa = PBXGroup;
52 | children = (
53 | C2AF32502C5D099800B5A315 /* Apple-Music-Search-Chips-Demo */,
54 | C2AF324F2C5D099800B5A315 /* Products */,
55 | );
56 | sourceTree = "";
57 | };
58 | C2AF324F2C5D099800B5A315 /* Products */ = {
59 | isa = PBXGroup;
60 | children = (
61 | C2AF324E2C5D099800B5A315 /* Apple-Music-Search-Chips-Demo.app */,
62 | );
63 | name = Products;
64 | sourceTree = "";
65 | };
66 | C2AF32502C5D099800B5A315 /* Apple-Music-Search-Chips-Demo */ = {
67 | isa = PBXGroup;
68 | children = (
69 | C2B1EB1F2C8C4DB500871BB7 /* Base */,
70 | C2B1EB282C8C4E1D00871BB7 /* Views */,
71 | C2B1EB202C8C4DBA00871BB7 /* View Controllers */,
72 | C2B1EB1E2C8C4DAB00871BB7 /* Supporting Files */,
73 | C2B1EB252C8C4E0600871BB7 /* Extensions */,
74 | );
75 | path = "Apple-Music-Search-Chips-Demo";
76 | sourceTree = "";
77 | };
78 | C2B1EB1E2C8C4DAB00871BB7 /* Supporting Files */ = {
79 | isa = PBXGroup;
80 | children = (
81 | C2AF325A2C5D099900B5A315 /* Assets.xcassets */,
82 | C2AF325C2C5D099900B5A315 /* LaunchScreen.storyboard */,
83 | C2AF325F2C5D099900B5A315 /* Info.plist */,
84 | );
85 | path = "Supporting Files";
86 | sourceTree = "";
87 | };
88 | C2B1EB1F2C8C4DB500871BB7 /* Base */ = {
89 | isa = PBXGroup;
90 | children = (
91 | C2AF32512C5D099800B5A315 /* AppDelegate.swift */,
92 | C2AF32532C5D099800B5A315 /* SceneDelegate.swift */,
93 | );
94 | path = Base;
95 | sourceTree = "";
96 | };
97 | C2B1EB202C8C4DBA00871BB7 /* View Controllers */ = {
98 | isa = PBXGroup;
99 | children = (
100 | C2AF32552C5D099800B5A315 /* ViewController.swift */,
101 | C2B1EB2B2C8C4E6A00871BB7 /* TaggedSearchController.swift */,
102 | );
103 | path = "View Controllers";
104 | sourceTree = "";
105 | };
106 | C2B1EB252C8C4E0600871BB7 /* Extensions */ = {
107 | isa = PBXGroup;
108 | children = (
109 | C2B1EB212C8C4DF200871BB7 /* UISearchBar+ScopeBar.swift */,
110 | C2B1EB232C8C4E0300871BB7 /* UISearchBar+ScopeBarContainerView.swift */,
111 | C2B1EB292C8C4E3700871BB7 /* UISegmentedControl+SetTitles.swift */,
112 | );
113 | path = Extensions;
114 | sourceTree = "";
115 | };
116 | C2B1EB282C8C4E1D00871BB7 /* Views */ = {
117 | isa = PBXGroup;
118 | children = (
119 | C2B1EB262C8C4E1A00871BB7 /* TagsView.swift */,
120 | C2B1EB2D2C8C4EA500871BB7 /* TaggedSearchBar.swift */,
121 | );
122 | path = Views;
123 | sourceTree = "";
124 | };
125 | /* End PBXGroup section */
126 |
127 | /* Begin PBXNativeTarget section */
128 | C2AF324D2C5D099800B5A315 /* Apple-Music-Search-Chips-Demo */ = {
129 | isa = PBXNativeTarget;
130 | buildConfigurationList = C2AF32622C5D099900B5A315 /* Build configuration list for PBXNativeTarget "Apple-Music-Search-Chips-Demo" */;
131 | buildPhases = (
132 | C2AF324A2C5D099800B5A315 /* Sources */,
133 | C2AF324B2C5D099800B5A315 /* Frameworks */,
134 | C2AF324C2C5D099800B5A315 /* Resources */,
135 | );
136 | buildRules = (
137 | );
138 | dependencies = (
139 | );
140 | name = "Apple-Music-Search-Chips-Demo";
141 | productName = "Apple-Music-Search-Chips-Demo";
142 | productReference = C2AF324E2C5D099800B5A315 /* Apple-Music-Search-Chips-Demo.app */;
143 | productType = "com.apple.product-type.application";
144 | };
145 | /* End PBXNativeTarget section */
146 |
147 | /* Begin PBXProject section */
148 | C2AF32462C5D099800B5A315 /* Project object */ = {
149 | isa = PBXProject;
150 | attributes = {
151 | BuildIndependentTargetsInParallel = 1;
152 | LastSwiftUpdateCheck = 1500;
153 | LastUpgradeCheck = 1500;
154 | TargetAttributes = {
155 | C2AF324D2C5D099800B5A315 = {
156 | CreatedOnToolsVersion = 15.0;
157 | };
158 | };
159 | };
160 | buildConfigurationList = C2AF32492C5D099800B5A315 /* Build configuration list for PBXProject "Apple-Music-Search-Chips-Demo" */;
161 | compatibilityVersion = "Xcode 14.0";
162 | developmentRegion = en;
163 | hasScannedForEncodings = 0;
164 | knownRegions = (
165 | en,
166 | Base,
167 | );
168 | mainGroup = C2AF32452C5D099800B5A315;
169 | productRefGroup = C2AF324F2C5D099800B5A315 /* Products */;
170 | projectDirPath = "";
171 | projectRoot = "";
172 | targets = (
173 | C2AF324D2C5D099800B5A315 /* Apple-Music-Search-Chips-Demo */,
174 | );
175 | };
176 | /* End PBXProject section */
177 |
178 | /* Begin PBXResourcesBuildPhase section */
179 | C2AF324C2C5D099800B5A315 /* Resources */ = {
180 | isa = PBXResourcesBuildPhase;
181 | buildActionMask = 2147483647;
182 | files = (
183 | C2AF325E2C5D099900B5A315 /* LaunchScreen.storyboard in Resources */,
184 | C2AF325B2C5D099900B5A315 /* Assets.xcassets in Resources */,
185 | );
186 | runOnlyForDeploymentPostprocessing = 0;
187 | };
188 | /* End PBXResourcesBuildPhase section */
189 |
190 | /* Begin PBXSourcesBuildPhase section */
191 | C2AF324A2C5D099800B5A315 /* Sources */ = {
192 | isa = PBXSourcesBuildPhase;
193 | buildActionMask = 2147483647;
194 | files = (
195 | C2B1EB242C8C4E0300871BB7 /* UISearchBar+ScopeBarContainerView.swift in Sources */,
196 | C2B1EB2A2C8C4E3700871BB7 /* UISegmentedControl+SetTitles.swift in Sources */,
197 | C2B1EB222C8C4DF200871BB7 /* UISearchBar+ScopeBar.swift in Sources */,
198 | C2B1EB2E2C8C4EA500871BB7 /* TaggedSearchBar.swift in Sources */,
199 | C2AF32562C5D099800B5A315 /* ViewController.swift in Sources */,
200 | C2AF32522C5D099800B5A315 /* AppDelegate.swift in Sources */,
201 | C2B1EB2C2C8C4E6A00871BB7 /* TaggedSearchController.swift in Sources */,
202 | C2AF32542C5D099800B5A315 /* SceneDelegate.swift in Sources */,
203 | C2B1EB272C8C4E1A00871BB7 /* TagsView.swift in Sources */,
204 | );
205 | runOnlyForDeploymentPostprocessing = 0;
206 | };
207 | /* End PBXSourcesBuildPhase section */
208 |
209 | /* Begin PBXVariantGroup section */
210 | C2AF325C2C5D099900B5A315 /* LaunchScreen.storyboard */ = {
211 | isa = PBXVariantGroup;
212 | children = (
213 | C2AF325D2C5D099900B5A315 /* Base */,
214 | );
215 | name = LaunchScreen.storyboard;
216 | sourceTree = "";
217 | };
218 | /* End PBXVariantGroup section */
219 |
220 | /* Begin XCBuildConfiguration section */
221 | C2AF32602C5D099900B5A315 /* Debug */ = {
222 | isa = XCBuildConfiguration;
223 | buildSettings = {
224 | ALWAYS_SEARCH_USER_PATHS = NO;
225 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
226 | CLANG_ANALYZER_NONNULL = YES;
227 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
228 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
229 | CLANG_ENABLE_MODULES = YES;
230 | CLANG_ENABLE_OBJC_ARC = YES;
231 | CLANG_ENABLE_OBJC_WEAK = YES;
232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
233 | CLANG_WARN_BOOL_CONVERSION = YES;
234 | CLANG_WARN_COMMA = YES;
235 | CLANG_WARN_CONSTANT_CONVERSION = YES;
236 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
239 | CLANG_WARN_EMPTY_BODY = YES;
240 | CLANG_WARN_ENUM_CONVERSION = YES;
241 | CLANG_WARN_INFINITE_RECURSION = YES;
242 | CLANG_WARN_INT_CONVERSION = YES;
243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
244 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
245 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
246 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
247 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
248 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
249 | CLANG_WARN_STRICT_PROTOTYPES = YES;
250 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
251 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
252 | CLANG_WARN_UNREACHABLE_CODE = YES;
253 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
254 | COPY_PHASE_STRIP = NO;
255 | DEBUG_INFORMATION_FORMAT = dwarf;
256 | ENABLE_STRICT_OBJC_MSGSEND = YES;
257 | ENABLE_TESTABILITY = YES;
258 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
259 | GCC_C_LANGUAGE_STANDARD = gnu17;
260 | GCC_DYNAMIC_NO_PIC = NO;
261 | GCC_NO_COMMON_BLOCKS = YES;
262 | GCC_OPTIMIZATION_LEVEL = 0;
263 | GCC_PREPROCESSOR_DEFINITIONS = (
264 | "DEBUG=1",
265 | "$(inherited)",
266 | );
267 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
268 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
269 | GCC_WARN_UNDECLARED_SELECTOR = YES;
270 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
271 | GCC_WARN_UNUSED_FUNCTION = YES;
272 | GCC_WARN_UNUSED_VARIABLE = YES;
273 | IPHONEOS_DEPLOYMENT_TARGET = 17.0;
274 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
275 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
276 | MTL_FAST_MATH = YES;
277 | ONLY_ACTIVE_ARCH = YES;
278 | SDKROOT = iphoneos;
279 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
280 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
281 | };
282 | name = Debug;
283 | };
284 | C2AF32612C5D099900B5A315 /* Release */ = {
285 | isa = XCBuildConfiguration;
286 | buildSettings = {
287 | ALWAYS_SEARCH_USER_PATHS = NO;
288 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
289 | CLANG_ANALYZER_NONNULL = YES;
290 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
291 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
292 | CLANG_ENABLE_MODULES = YES;
293 | CLANG_ENABLE_OBJC_ARC = YES;
294 | CLANG_ENABLE_OBJC_WEAK = YES;
295 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
296 | CLANG_WARN_BOOL_CONVERSION = YES;
297 | CLANG_WARN_COMMA = YES;
298 | CLANG_WARN_CONSTANT_CONVERSION = YES;
299 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
300 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
301 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
302 | CLANG_WARN_EMPTY_BODY = YES;
303 | CLANG_WARN_ENUM_CONVERSION = YES;
304 | CLANG_WARN_INFINITE_RECURSION = YES;
305 | CLANG_WARN_INT_CONVERSION = YES;
306 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
307 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
308 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
309 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
310 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
311 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
312 | CLANG_WARN_STRICT_PROTOTYPES = YES;
313 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
314 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
315 | CLANG_WARN_UNREACHABLE_CODE = YES;
316 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
317 | COPY_PHASE_STRIP = NO;
318 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
319 | ENABLE_NS_ASSERTIONS = NO;
320 | ENABLE_STRICT_OBJC_MSGSEND = YES;
321 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
322 | GCC_C_LANGUAGE_STANDARD = gnu17;
323 | GCC_NO_COMMON_BLOCKS = YES;
324 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
325 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
326 | GCC_WARN_UNDECLARED_SELECTOR = YES;
327 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
328 | GCC_WARN_UNUSED_FUNCTION = YES;
329 | GCC_WARN_UNUSED_VARIABLE = YES;
330 | IPHONEOS_DEPLOYMENT_TARGET = 17.0;
331 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
332 | MTL_ENABLE_DEBUG_INFO = NO;
333 | MTL_FAST_MATH = YES;
334 | SDKROOT = iphoneos;
335 | SWIFT_COMPILATION_MODE = wholemodule;
336 | VALIDATE_PRODUCT = YES;
337 | };
338 | name = Release;
339 | };
340 | C2AF32632C5D099900B5A315 /* Debug */ = {
341 | isa = XCBuildConfiguration;
342 | buildSettings = {
343 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
344 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
345 | CODE_SIGN_STYLE = Automatic;
346 | CURRENT_PROJECT_VERSION = 1;
347 | DEVELOPMENT_TEAM = DY2GQFY855;
348 | GENERATE_INFOPLIST_FILE = YES;
349 | INFOPLIST_FILE = "Apple-Music-Search-Chips-Demo/Supporting Files/Info.plist";
350 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
351 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
352 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
353 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
354 | LD_RUNPATH_SEARCH_PATHS = (
355 | "$(inherited)",
356 | "@executable_path/Frameworks",
357 | );
358 | MARKETING_VERSION = 1.0;
359 | PRODUCT_BUNDLE_IDENTIFIER = "com.sebvidal.Apple-Music-Search-Chips-Demo";
360 | PRODUCT_NAME = "$(TARGET_NAME)";
361 | SWIFT_EMIT_LOC_STRINGS = YES;
362 | SWIFT_VERSION = 5.0;
363 | TARGETED_DEVICE_FAMILY = "1,2";
364 | };
365 | name = Debug;
366 | };
367 | C2AF32642C5D099900B5A315 /* Release */ = {
368 | isa = XCBuildConfiguration;
369 | buildSettings = {
370 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
371 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
372 | CODE_SIGN_STYLE = Automatic;
373 | CURRENT_PROJECT_VERSION = 1;
374 | DEVELOPMENT_TEAM = DY2GQFY855;
375 | GENERATE_INFOPLIST_FILE = YES;
376 | INFOPLIST_FILE = "Apple-Music-Search-Chips-Demo/Supporting Files/Info.plist";
377 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
378 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
379 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
380 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
381 | LD_RUNPATH_SEARCH_PATHS = (
382 | "$(inherited)",
383 | "@executable_path/Frameworks",
384 | );
385 | MARKETING_VERSION = 1.0;
386 | PRODUCT_BUNDLE_IDENTIFIER = "com.sebvidal.Apple-Music-Search-Chips-Demo";
387 | PRODUCT_NAME = "$(TARGET_NAME)";
388 | SWIFT_EMIT_LOC_STRINGS = YES;
389 | SWIFT_VERSION = 5.0;
390 | TARGETED_DEVICE_FAMILY = "1,2";
391 | };
392 | name = Release;
393 | };
394 | /* End XCBuildConfiguration section */
395 |
396 | /* Begin XCConfigurationList section */
397 | C2AF32492C5D099800B5A315 /* Build configuration list for PBXProject "Apple-Music-Search-Chips-Demo" */ = {
398 | isa = XCConfigurationList;
399 | buildConfigurations = (
400 | C2AF32602C5D099900B5A315 /* Debug */,
401 | C2AF32612C5D099900B5A315 /* Release */,
402 | );
403 | defaultConfigurationIsVisible = 0;
404 | defaultConfigurationName = Release;
405 | };
406 | C2AF32622C5D099900B5A315 /* Build configuration list for PBXNativeTarget "Apple-Music-Search-Chips-Demo" */ = {
407 | isa = XCConfigurationList;
408 | buildConfigurations = (
409 | C2AF32632C5D099900B5A315 /* Debug */,
410 | C2AF32642C5D099900B5A315 /* Release */,
411 | );
412 | defaultConfigurationIsVisible = 0;
413 | defaultConfigurationName = Release;
414 | };
415 | /* End XCConfigurationList section */
416 | };
417 | rootObject = C2AF32462C5D099800B5A315 /* Project object */;
418 | }
419 |
--------------------------------------------------------------------------------