├── UIViewControllerAnimatedTransitioning-Demo
├── Resources
│ └── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ └── Contents.json
│ │ └── apple-park-visitor-centre.imageset
│ │ ├── Contents.json
│ │ └── apple-park-visitor-center.jpg
├── View Controllers
│ ├── NavigationController
│ │ ├── NavigationController.swift
│ │ └── NavigationControllerDelegate.swift
│ ├── MainViewController
│ │ ├── MainViewController.swift
│ │ └── TableViewCell.swift
│ └── DetailViewController
│ │ └── DetailViewController.swift
├── Base
│ └── Store
│ │ └── Store.swift
├── Info.plist
├── Supporting Files
│ ├── AppDelegate.swift
│ └── SceneDelegate.swift
└── Storyboards
│ └── Base.lproj
│ └── LaunchScreen.storyboard
└── UIViewControllerAnimatedTransitioning-Demo.xcodeproj
├── project.xcworkspace
├── contents.xcworkspacedata
├── xcuserdata
│ ├── sebvidal.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
│ └── seb.vidal.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
└── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── xcuserdata
├── seb.vidal.xcuserdatad
│ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ │ └── xcschememanagement.plist
└── sebvidal.xcuserdatad
│ └── xcschemes
│ └── xcschememanagement.plist
└── project.pbxproj
/UIViewControllerAnimatedTransitioning-Demo/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Resources/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 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/xcuserdata/seb.vidal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Resources/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 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Resources/Assets.xcassets/apple-park-visitor-centre.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "apple-park-visitor-center.jpg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.xcworkspace/xcuserdata/sebvidal.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sebjvidal/UIViewControllerAnimatedTransitioning-Demo/HEAD/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.xcworkspace/xcuserdata/sebvidal.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Resources/Assets.xcassets/apple-park-visitor-centre.imageset/apple-park-visitor-center.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sebjvidal/UIViewControllerAnimatedTransitioning-Demo/HEAD/UIViewControllerAnimatedTransitioning-Demo/Resources/Assets.xcassets/apple-park-visitor-centre.imageset/apple-park-visitor-center.jpg
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.xcworkspace/xcuserdata/seb.vidal.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sebjvidal/UIViewControllerAnimatedTransitioning-Demo/HEAD/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.xcworkspace/xcuserdata/seb.vidal.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/View Controllers/NavigationController/NavigationController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NavigationController.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class NavigationController: UINavigationController, UIGestureRecognizerDelegate {
11 | override func viewDidLoad() {
12 | super.viewDidLoad()
13 | interactivePopGestureRecognizer?.delegate = self
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/xcuserdata/seb.vidal.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | UIViewControllerAnimatedTransitioning-Demo.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/xcuserdata/sebvidal.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | UIViewControllerAnimatedTransitioning-Demo.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Base/Store/Store.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Store.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Store {
11 | let name: String
12 | let description: String
13 | let image: String
14 |
15 | static let mock = Store(
16 | name: "Apple Park Visitor Centre",
17 | description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
18 | image: "apple-park-visitor-centre"
19 | )
20 | }
21 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/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 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Supporting Files/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
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 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Storyboards/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 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/View Controllers/MainViewController/MainViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainViewController.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class MainViewController: UITableViewController {
11 | private let stores: [Store] = Array(1...10).map { _ in
12 | return Store.mock
13 | }
14 |
15 | init() {
16 | super.init(style: .plain)
17 | setupTableView()
18 | }
19 |
20 | required init?(coder: NSCoder) {
21 | fatalError("init(coder:) has not been implemented")
22 | }
23 |
24 | private func setupTableView() {
25 | tableView.separatorStyle = .none
26 | tableView.rowHeight = UITableView.automaticDimension
27 | tableView.register(TableViewCell.self, forCellReuseIdentifier: "cell")
28 | }
29 |
30 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
31 | return 10
32 | }
33 |
34 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
35 | guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? TableViewCell else {
36 | fatalError("Failed to dequeueReusableCell(withIdentifier:)")
37 | }
38 |
39 | let store = stores[indexPath.row]
40 | cell.configure(with: store)
41 |
42 | return cell
43 | }
44 |
45 | private var navigationControllerDelegate: NavigationControllerDelegate?
46 |
47 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
48 | let frameInTableView = tableView.rectForRow(at: indexPath)
49 | let frameInSuperview = tableView.convert(frameInTableView, to: tableView.superview)
50 | let startingPoint = CGPoint(x: frameInSuperview.minX, y: frameInSuperview.minY)
51 | navigationControllerDelegate = NavigationControllerDelegate(startingPoint: startingPoint)
52 |
53 | let store = stores[indexPath.row]
54 | let detailViewController = DetailViewController(store: store)
55 | navigationController?.delegate = navigationControllerDelegate
56 | navigationController?.pushViewController(detailViewController, animated: true)
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/Supporting Files/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
11 |
12 | var window: UIWindow?
13 |
14 |
15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
16 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
17 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
18 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
19 | guard let windowScene = (scene as? UIWindowScene) else { return }
20 | let window = UIWindow(windowScene: windowScene)
21 | window.rootViewController = NavigationController(rootViewController: MainViewController())
22 | window.makeKeyAndVisible()
23 | self.window = window
24 | }
25 |
26 | func sceneDidDisconnect(_ scene: UIScene) {
27 | // Called as the scene is being released by the system.
28 | // This occurs shortly after the scene enters the background, or when its session is discarded.
29 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
30 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
31 | }
32 |
33 | func sceneDidBecomeActive(_ scene: UIScene) {
34 | // Called when the scene has moved from an inactive state to an active state.
35 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
36 | }
37 |
38 | func sceneWillResignActive(_ scene: UIScene) {
39 | // Called when the scene will move from an active state to an inactive state.
40 | // This may occur due to temporary interruptions (ex. an incoming phone call).
41 | }
42 |
43 | func sceneWillEnterForeground(_ scene: UIScene) {
44 | // Called as the scene transitions from the background to the foreground.
45 | // Use this method to undo the changes made on entering the background.
46 | }
47 |
48 | func sceneDidEnterBackground(_ scene: UIScene) {
49 | // Called as the scene transitions from the foreground to the background.
50 | // Use this method to save data, release shared resources, and store enough scene-specific state information
51 | // to restore the scene back to its current state.
52 | }
53 |
54 |
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/View Controllers/DetailViewController/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 | private var imageView: UIImageView!
12 | private var titleLabel: UILabel!
13 | private var descriptionLabel: UILabel!
14 |
15 | let store: Store
16 |
17 | init(store: Store) {
18 | self.store = store
19 | super.init(nibName: nil, bundle: nil)
20 | setupView()
21 | setupImageView()
22 | setupTitleLabel()
23 | setupDescriptionLabel()
24 | }
25 |
26 | required init?(coder: NSCoder) {
27 | fatalError("init(coder:) has not been implemented")
28 | }
29 |
30 | private func setupView() {
31 | view.backgroundColor = .systemBackground
32 | }
33 |
34 | private func setupImageView() {
35 | imageView = UIImageView()
36 | imageView.image = UIImage(named: store.image)
37 | imageView.translatesAutoresizingMaskIntoConstraints = false
38 |
39 | view.addSubview(imageView)
40 |
41 | NSLayoutConstraint.activate([
42 | imageView.topAnchor.constraint(equalTo: view.topAnchor),
43 | imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
44 | imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
45 | imageView.heightAnchor.constraint(equalTo: imageView.widthAnchor, multiplier: 0.75)
46 | ])
47 | }
48 |
49 | private func setupTitleLabel() {
50 | titleLabel = UILabel()
51 | titleLabel.text = store.name
52 | titleLabel.font = .preferredFont(forTextStyle: .headline)
53 | titleLabel.translatesAutoresizingMaskIntoConstraints = false
54 |
55 | view.addSubview(titleLabel)
56 |
57 | NSLayoutConstraint.activate([
58 | titleLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 8),
59 | titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 12)
60 | ])
61 | }
62 |
63 | private func setupDescriptionLabel() {
64 | descriptionLabel = UILabel()
65 | descriptionLabel.numberOfLines = 0
66 | descriptionLabel.text = store.description
67 | descriptionLabel.translatesAutoresizingMaskIntoConstraints = false
68 |
69 | view.addSubview(descriptionLabel)
70 |
71 | NSLayoutConstraint.activate([
72 | descriptionLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor),
73 | descriptionLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 12),
74 | descriptionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -12)
75 | ])
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/View Controllers/NavigationController/NavigationControllerDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CustomNavigationControllerDelegate.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class NavigationControllerDelegate: NSObject, UINavigationControllerDelegate, UIViewControllerAnimatedTransitioning {
11 | private var operation: UINavigationController.Operation = .push
12 | private let duration: TimeInterval = 0.6
13 |
14 | private let startingPoint: CGPoint
15 |
16 | init(startingPoint: CGPoint) {
17 | self.startingPoint = startingPoint
18 | }
19 |
20 | func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
21 | self.operation = operation
22 |
23 | switch operation {
24 | case .push:
25 | return self
26 | default:
27 | return nil
28 | }
29 | }
30 |
31 | func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
32 | return duration
33 | }
34 |
35 | func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
36 | guard let sourceViewController = transitionContext.viewController(forKey: .from) else {
37 | transitionContext.completeTransition(false)
38 | return
39 | }
40 |
41 | guard let destinationViewController = transitionContext.viewController(forKey: .to) else {
42 | transitionContext.completeTransition(false)
43 | return
44 | }
45 |
46 | animateTransition(from: sourceViewController, to: destinationViewController, with: transitionContext)
47 | }
48 |
49 | private func animateTransition(from sourceViewController: UIViewController, to destinationViewController: UIViewController, with transitionContext: UIViewControllerContextTransitioning) {
50 | switch operation {
51 | case .push:
52 | guard let _ = sourceViewController as? MainViewController else {
53 | return
54 | }
55 |
56 | guard let destinationViewController = destinationViewController as? DetailViewController else {
57 | return
58 | }
59 |
60 | let containerView = transitionContext.containerView
61 | let destinationView = destinationViewController.view!
62 | destinationView.clipsToBounds = true
63 | destinationView.layer.cornerRadius = 15
64 | destinationView.layer.cornerCurve = .continuous
65 |
66 | let x = 16.0
67 | let y = startingPoint.y + 8
68 | let width = UIScreen.main.bounds.width - 32
69 | let height = width * 0.75
70 | destinationView.frame = CGRect(x: x, y: y, width: width, height: height)
71 | destinationView.layoutIfNeeded()
72 |
73 | containerView.addSubview(destinationView)
74 |
75 | let animator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.7) {
76 | let newWidth = UIScreen.main.bounds.width
77 | let newHeight = UIScreen.main.bounds.height
78 | destinationView.frame = CGRect(x: 0, y: 0, width: newWidth, height: newHeight)
79 | destinationView.layer.cornerRadius = 0
80 | }
81 |
82 | animator.addCompletion { position in
83 | transitionContext.completeTransition(position == .end)
84 | }
85 |
86 | animator.startAnimation()
87 | default:
88 | return
89 | }
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo/View Controllers/MainViewController/TableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CustomTableViewCell.swift
3 | // UIViewControllerAnimatedTransitioning-Demo
4 | //
5 | // Created by Seb Vidal on 27/01/2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class TableViewCell: UITableViewCell {
11 | private var stackView: UIStackView!
12 | var heroImageView: UIImageView!
13 | private var detailView: UIView!
14 | private var titleLabel: UILabel!
15 | private var descriptionLabel: UILabel!
16 |
17 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
18 | super.init(style: style, reuseIdentifier: reuseIdentifier)
19 | setupCell()
20 | setupStackView()
21 | setupHeroImageView()
22 | setupDetailView()
23 | setupTitleLabel()
24 | setupDescriptionLabel()
25 | }
26 |
27 | required init?(coder: NSCoder) {
28 | fatalError("init(coder:) has not been implemented")
29 | }
30 |
31 | private func setupCell() {
32 | selectionStyle = .none
33 | }
34 |
35 | private func setupStackView() {
36 | stackView = UIStackView()
37 | stackView.spacing = 0
38 | stackView.axis = .vertical
39 | stackView.clipsToBounds = true
40 | stackView.layer.cornerRadius = 15
41 | stackView.layer.cornerCurve = .continuous
42 | stackView.translatesAutoresizingMaskIntoConstraints = false
43 |
44 | addSubview(stackView)
45 |
46 | NSLayoutConstraint.activate([
47 | stackView.topAnchor.constraint(equalTo: topAnchor, constant: 8),
48 | stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
49 | stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16),
50 | stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8)
51 | ])
52 | }
53 |
54 | private func setupHeroImageView() {
55 | heroImageView = UIImageView()
56 | heroImageView.translatesAutoresizingMaskIntoConstraints = false
57 |
58 | stackView.addArrangedSubview(heroImageView)
59 |
60 | NSLayoutConstraint.activate([
61 | heroImageView.heightAnchor.constraint(equalTo: heroImageView.widthAnchor, multiplier: 0.75)
62 | ])
63 | }
64 |
65 | private func setupDetailView() {
66 | detailView = UIView()
67 | detailView.backgroundColor = .secondarySystemBackground
68 | detailView.translatesAutoresizingMaskIntoConstraints = false
69 |
70 | stackView.addArrangedSubview(detailView)
71 |
72 | NSLayoutConstraint.activate([
73 | detailView.heightAnchor.constraint(greaterThanOrEqualToConstant: 80)
74 | ])
75 | }
76 |
77 | private func setupTitleLabel() {
78 | titleLabel = UILabel()
79 | titleLabel.font = .preferredFont(forTextStyle: .headline)
80 | titleLabel.translatesAutoresizingMaskIntoConstraints = false
81 |
82 | detailView.addSubview(titleLabel)
83 |
84 | NSLayoutConstraint.activate([
85 | titleLabel.topAnchor.constraint(equalTo: detailView.topAnchor, constant: 8),
86 | titleLabel.leadingAnchor.constraint(equalTo: detailView.leadingAnchor, constant: 12)
87 | ])
88 | }
89 |
90 | private func setupDescriptionLabel() {
91 | descriptionLabel = UILabel()
92 | descriptionLabel.numberOfLines = 0
93 | descriptionLabel.translatesAutoresizingMaskIntoConstraints = false
94 |
95 | detailView.addSubview(descriptionLabel)
96 |
97 | NSLayoutConstraint.activate([
98 | descriptionLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor),
99 | descriptionLabel.leadingAnchor.constraint(equalTo: detailView.leadingAnchor, constant: 12),
100 | descriptionLabel.trailingAnchor.constraint(equalTo: detailView.trailingAnchor, constant: -12),
101 | descriptionLabel.bottomAnchor.constraint(equalTo: detailView.bottomAnchor, constant: -8)
102 | ])
103 | }
104 |
105 | func configure(with store: Store) {
106 | titleLabel.text = store.name
107 | descriptionLabel.text = store.description
108 | heroImageView.image = UIImage(named: store.image)
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/UIViewControllerAnimatedTransitioning-Demo.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 93D6901C2983CB1800CCDA7D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D6901B2983CB1800CCDA7D /* AppDelegate.swift */; };
11 | 93D6901E2983CB1800CCDA7D /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D6901D2983CB1800CCDA7D /* SceneDelegate.swift */; };
12 | 93D690252983CB1900CCDA7D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93D690242983CB1900CCDA7D /* Assets.xcassets */; };
13 | 93D690282983CB1900CCDA7D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 93D690262983CB1900CCDA7D /* LaunchScreen.storyboard */; };
14 | 93D690302983CB5100CCDA7D /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D6902F2983CB5100CCDA7D /* MainViewController.swift */; };
15 | 93D690322983CB7A00CCDA7D /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D690312983CB7A00CCDA7D /* DetailViewController.swift */; };
16 | 93D690342983DAD600CCDA7D /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D690332983DAD600CCDA7D /* TableViewCell.swift */; };
17 | 93D690362983DBF300CCDA7D /* NavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D690352983DBF300CCDA7D /* NavigationControllerDelegate.swift */; };
18 | 93D690382984312300CCDA7D /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D690372984312300CCDA7D /* NavigationController.swift */; };
19 | C23DBB6E298439AA00729420 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = C23DBB6D298439AA00729420 /* Store.swift */; };
20 | /* End PBXBuildFile section */
21 |
22 | /* Begin PBXFileReference section */
23 | 93D690182983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "UIViewControllerAnimatedTransitioning-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
24 | 93D6901B2983CB1800CCDA7D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
25 | 93D6901D2983CB1800CCDA7D /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
26 | 93D690242983CB1900CCDA7D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
27 | 93D690272983CB1900CCDA7D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
28 | 93D690292983CB1900CCDA7D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
29 | 93D6902F2983CB5100CCDA7D /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; };
30 | 93D690312983CB7A00CCDA7D /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; };
31 | 93D690332983DAD600CCDA7D /* TableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; };
32 | 93D690352983DBF300CCDA7D /* NavigationControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerDelegate.swift; sourceTree = ""; };
33 | 93D690372984312300CCDA7D /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; };
34 | C23DBB6D298439AA00729420 /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; };
35 | /* End PBXFileReference section */
36 |
37 | /* Begin PBXFrameworksBuildPhase section */
38 | 93D690152983CB1800CCDA7D /* Frameworks */ = {
39 | isa = PBXFrameworksBuildPhase;
40 | buildActionMask = 2147483647;
41 | files = (
42 | );
43 | runOnlyForDeploymentPostprocessing = 0;
44 | };
45 | /* End PBXFrameworksBuildPhase section */
46 |
47 | /* Begin PBXGroup section */
48 | 93D6900F2983CB1800CCDA7D = {
49 | isa = PBXGroup;
50 | children = (
51 | 93D6901A2983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo */,
52 | 93D690192983CB1800CCDA7D /* Products */,
53 | );
54 | sourceTree = "";
55 | };
56 | 93D690192983CB1800CCDA7D /* Products */ = {
57 | isa = PBXGroup;
58 | children = (
59 | 93D690182983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo.app */,
60 | );
61 | name = Products;
62 | sourceTree = "";
63 | };
64 | 93D6901A2983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo */ = {
65 | isa = PBXGroup;
66 | children = (
67 | C23DBB6F298439B000729420 /* Base */,
68 | 93D6903C2984316500CCDA7D /* View Controllers */,
69 | 93D6903A2984314400CCDA7D /* Resources */,
70 | 93D6903B2984315300CCDA7D /* Storyboards */,
71 | 93D690392984313600CCDA7D /* Supporting Files */,
72 | 93D690292983CB1900CCDA7D /* Info.plist */,
73 | );
74 | path = "UIViewControllerAnimatedTransitioning-Demo";
75 | sourceTree = "";
76 | };
77 | 93D690392984313600CCDA7D /* Supporting Files */ = {
78 | isa = PBXGroup;
79 | children = (
80 | 93D6901B2983CB1800CCDA7D /* AppDelegate.swift */,
81 | 93D6901D2983CB1800CCDA7D /* SceneDelegate.swift */,
82 | );
83 | path = "Supporting Files";
84 | sourceTree = "";
85 | };
86 | 93D6903A2984314400CCDA7D /* Resources */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 93D690242983CB1900CCDA7D /* Assets.xcassets */,
90 | );
91 | path = Resources;
92 | sourceTree = "";
93 | };
94 | 93D6903B2984315300CCDA7D /* Storyboards */ = {
95 | isa = PBXGroup;
96 | children = (
97 | 93D690262983CB1900CCDA7D /* LaunchScreen.storyboard */,
98 | );
99 | path = Storyboards;
100 | sourceTree = "";
101 | };
102 | 93D6903C2984316500CCDA7D /* View Controllers */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 93D6903F298431B700CCDA7D /* NavigationController */,
106 | 93D6903D2984317600CCDA7D /* MainViewController */,
107 | 93D6903E2984317C00CCDA7D /* DetailViewController */,
108 | );
109 | path = "View Controllers";
110 | sourceTree = "";
111 | };
112 | 93D6903D2984317600CCDA7D /* MainViewController */ = {
113 | isa = PBXGroup;
114 | children = (
115 | 93D6902F2983CB5100CCDA7D /* MainViewController.swift */,
116 | 93D690332983DAD600CCDA7D /* TableViewCell.swift */,
117 | );
118 | path = MainViewController;
119 | sourceTree = "";
120 | };
121 | 93D6903E2984317C00CCDA7D /* DetailViewController */ = {
122 | isa = PBXGroup;
123 | children = (
124 | 93D690312983CB7A00CCDA7D /* DetailViewController.swift */,
125 | );
126 | path = DetailViewController;
127 | sourceTree = "";
128 | };
129 | 93D6903F298431B700CCDA7D /* NavigationController */ = {
130 | isa = PBXGroup;
131 | children = (
132 | 93D690372984312300CCDA7D /* NavigationController.swift */,
133 | 93D690352983DBF300CCDA7D /* NavigationControllerDelegate.swift */,
134 | );
135 | path = NavigationController;
136 | sourceTree = "";
137 | };
138 | C23DBB6F298439B000729420 /* Base */ = {
139 | isa = PBXGroup;
140 | children = (
141 | C23DBB70298439B300729420 /* Store */,
142 | );
143 | path = Base;
144 | sourceTree = "";
145 | };
146 | C23DBB70298439B300729420 /* Store */ = {
147 | isa = PBXGroup;
148 | children = (
149 | C23DBB6D298439AA00729420 /* Store.swift */,
150 | );
151 | path = Store;
152 | sourceTree = "";
153 | };
154 | /* End PBXGroup section */
155 |
156 | /* Begin PBXNativeTarget section */
157 | 93D690172983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo */ = {
158 | isa = PBXNativeTarget;
159 | buildConfigurationList = 93D6902C2983CB1900CCDA7D /* Build configuration list for PBXNativeTarget "UIViewControllerAnimatedTransitioning-Demo" */;
160 | buildPhases = (
161 | 93D690142983CB1800CCDA7D /* Sources */,
162 | 93D690152983CB1800CCDA7D /* Frameworks */,
163 | 93D690162983CB1800CCDA7D /* Resources */,
164 | );
165 | buildRules = (
166 | );
167 | dependencies = (
168 | );
169 | name = "UIViewControllerAnimatedTransitioning-Demo";
170 | productName = "UIViewControllerAnimatedTransitioning-Demo";
171 | productReference = 93D690182983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo.app */;
172 | productType = "com.apple.product-type.application";
173 | };
174 | /* End PBXNativeTarget section */
175 |
176 | /* Begin PBXProject section */
177 | 93D690102983CB1800CCDA7D /* Project object */ = {
178 | isa = PBXProject;
179 | attributes = {
180 | BuildIndependentTargetsInParallel = 1;
181 | LastSwiftUpdateCheck = 1420;
182 | LastUpgradeCheck = 1420;
183 | TargetAttributes = {
184 | 93D690172983CB1800CCDA7D = {
185 | CreatedOnToolsVersion = 14.2;
186 | };
187 | };
188 | };
189 | buildConfigurationList = 93D690132983CB1800CCDA7D /* Build configuration list for PBXProject "UIViewControllerAnimatedTransitioning-Demo" */;
190 | compatibilityVersion = "Xcode 14.0";
191 | developmentRegion = en;
192 | hasScannedForEncodings = 0;
193 | knownRegions = (
194 | en,
195 | Base,
196 | );
197 | mainGroup = 93D6900F2983CB1800CCDA7D;
198 | productRefGroup = 93D690192983CB1800CCDA7D /* Products */;
199 | projectDirPath = "";
200 | projectRoot = "";
201 | targets = (
202 | 93D690172983CB1800CCDA7D /* UIViewControllerAnimatedTransitioning-Demo */,
203 | );
204 | };
205 | /* End PBXProject section */
206 |
207 | /* Begin PBXResourcesBuildPhase section */
208 | 93D690162983CB1800CCDA7D /* Resources */ = {
209 | isa = PBXResourcesBuildPhase;
210 | buildActionMask = 2147483647;
211 | files = (
212 | 93D690282983CB1900CCDA7D /* LaunchScreen.storyboard in Resources */,
213 | 93D690252983CB1900CCDA7D /* Assets.xcassets in Resources */,
214 | );
215 | runOnlyForDeploymentPostprocessing = 0;
216 | };
217 | /* End PBXResourcesBuildPhase section */
218 |
219 | /* Begin PBXSourcesBuildPhase section */
220 | 93D690142983CB1800CCDA7D /* Sources */ = {
221 | isa = PBXSourcesBuildPhase;
222 | buildActionMask = 2147483647;
223 | files = (
224 | 93D690302983CB5100CCDA7D /* MainViewController.swift in Sources */,
225 | 93D690342983DAD600CCDA7D /* TableViewCell.swift in Sources */,
226 | 93D6901C2983CB1800CCDA7D /* AppDelegate.swift in Sources */,
227 | C23DBB6E298439AA00729420 /* Store.swift in Sources */,
228 | 93D690362983DBF300CCDA7D /* NavigationControllerDelegate.swift in Sources */,
229 | 93D6901E2983CB1800CCDA7D /* SceneDelegate.swift in Sources */,
230 | 93D690382984312300CCDA7D /* NavigationController.swift in Sources */,
231 | 93D690322983CB7A00CCDA7D /* DetailViewController.swift in Sources */,
232 | );
233 | runOnlyForDeploymentPostprocessing = 0;
234 | };
235 | /* End PBXSourcesBuildPhase section */
236 |
237 | /* Begin PBXVariantGroup section */
238 | 93D690262983CB1900CCDA7D /* LaunchScreen.storyboard */ = {
239 | isa = PBXVariantGroup;
240 | children = (
241 | 93D690272983CB1900CCDA7D /* Base */,
242 | );
243 | name = LaunchScreen.storyboard;
244 | sourceTree = "";
245 | };
246 | /* End PBXVariantGroup section */
247 |
248 | /* Begin XCBuildConfiguration section */
249 | 93D6902A2983CB1900CCDA7D /* Debug */ = {
250 | isa = XCBuildConfiguration;
251 | buildSettings = {
252 | ALWAYS_SEARCH_USER_PATHS = NO;
253 | CLANG_ANALYZER_NONNULL = YES;
254 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
255 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
256 | CLANG_ENABLE_MODULES = YES;
257 | CLANG_ENABLE_OBJC_ARC = YES;
258 | CLANG_ENABLE_OBJC_WEAK = YES;
259 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
260 | CLANG_WARN_BOOL_CONVERSION = YES;
261 | CLANG_WARN_COMMA = YES;
262 | CLANG_WARN_CONSTANT_CONVERSION = YES;
263 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
264 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
265 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
266 | CLANG_WARN_EMPTY_BODY = YES;
267 | CLANG_WARN_ENUM_CONVERSION = YES;
268 | CLANG_WARN_INFINITE_RECURSION = YES;
269 | CLANG_WARN_INT_CONVERSION = YES;
270 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
271 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
272 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
273 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
274 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
275 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
276 | CLANG_WARN_STRICT_PROTOTYPES = YES;
277 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
278 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
279 | CLANG_WARN_UNREACHABLE_CODE = YES;
280 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
281 | COPY_PHASE_STRIP = NO;
282 | DEBUG_INFORMATION_FORMAT = dwarf;
283 | ENABLE_STRICT_OBJC_MSGSEND = YES;
284 | ENABLE_TESTABILITY = YES;
285 | GCC_C_LANGUAGE_STANDARD = gnu11;
286 | GCC_DYNAMIC_NO_PIC = NO;
287 | GCC_NO_COMMON_BLOCKS = YES;
288 | GCC_OPTIMIZATION_LEVEL = 0;
289 | GCC_PREPROCESSOR_DEFINITIONS = (
290 | "DEBUG=1",
291 | "$(inherited)",
292 | );
293 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
294 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
295 | GCC_WARN_UNDECLARED_SELECTOR = YES;
296 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
297 | GCC_WARN_UNUSED_FUNCTION = YES;
298 | GCC_WARN_UNUSED_VARIABLE = YES;
299 | IPHONEOS_DEPLOYMENT_TARGET = 16.2;
300 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
301 | MTL_FAST_MATH = YES;
302 | ONLY_ACTIVE_ARCH = YES;
303 | SDKROOT = iphoneos;
304 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
305 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
306 | };
307 | name = Debug;
308 | };
309 | 93D6902B2983CB1900CCDA7D /* Release */ = {
310 | isa = XCBuildConfiguration;
311 | buildSettings = {
312 | ALWAYS_SEARCH_USER_PATHS = NO;
313 | CLANG_ANALYZER_NONNULL = YES;
314 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
316 | CLANG_ENABLE_MODULES = YES;
317 | CLANG_ENABLE_OBJC_ARC = YES;
318 | CLANG_ENABLE_OBJC_WEAK = YES;
319 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
320 | CLANG_WARN_BOOL_CONVERSION = YES;
321 | CLANG_WARN_COMMA = YES;
322 | CLANG_WARN_CONSTANT_CONVERSION = YES;
323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
325 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
326 | CLANG_WARN_EMPTY_BODY = YES;
327 | CLANG_WARN_ENUM_CONVERSION = YES;
328 | CLANG_WARN_INFINITE_RECURSION = YES;
329 | CLANG_WARN_INT_CONVERSION = YES;
330 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
331 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
332 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
333 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
334 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
335 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
336 | CLANG_WARN_STRICT_PROTOTYPES = YES;
337 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
338 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
339 | CLANG_WARN_UNREACHABLE_CODE = YES;
340 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
341 | COPY_PHASE_STRIP = NO;
342 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
343 | ENABLE_NS_ASSERTIONS = NO;
344 | ENABLE_STRICT_OBJC_MSGSEND = YES;
345 | GCC_C_LANGUAGE_STANDARD = gnu11;
346 | GCC_NO_COMMON_BLOCKS = YES;
347 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
348 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
349 | GCC_WARN_UNDECLARED_SELECTOR = YES;
350 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
351 | GCC_WARN_UNUSED_FUNCTION = YES;
352 | GCC_WARN_UNUSED_VARIABLE = YES;
353 | IPHONEOS_DEPLOYMENT_TARGET = 16.2;
354 | MTL_ENABLE_DEBUG_INFO = NO;
355 | MTL_FAST_MATH = YES;
356 | SDKROOT = iphoneos;
357 | SWIFT_COMPILATION_MODE = wholemodule;
358 | SWIFT_OPTIMIZATION_LEVEL = "-O";
359 | VALIDATE_PRODUCT = YES;
360 | };
361 | name = Release;
362 | };
363 | 93D6902D2983CB1900CCDA7D /* Debug */ = {
364 | isa = XCBuildConfiguration;
365 | buildSettings = {
366 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
367 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
368 | CODE_SIGN_STYLE = Automatic;
369 | CURRENT_PROJECT_VERSION = 1;
370 | DEVELOPMENT_TEAM = DY2GQFY855;
371 | GENERATE_INFOPLIST_FILE = YES;
372 | INFOPLIST_FILE = "UIViewControllerAnimatedTransitioning-Demo/Info.plist";
373 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
374 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
375 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
376 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
377 | LD_RUNPATH_SEARCH_PATHS = (
378 | "$(inherited)",
379 | "@executable_path/Frameworks",
380 | );
381 | MARKETING_VERSION = 1.0;
382 | PRODUCT_BUNDLE_IDENTIFIER = "com.sebvidal.UIViewControllerAnimatedTransitioning-Demo";
383 | PRODUCT_NAME = "$(TARGET_NAME)";
384 | SWIFT_EMIT_LOC_STRINGS = YES;
385 | SWIFT_VERSION = 5.0;
386 | TARGETED_DEVICE_FAMILY = "1,2";
387 | };
388 | name = Debug;
389 | };
390 | 93D6902E2983CB1900CCDA7D /* Release */ = {
391 | isa = XCBuildConfiguration;
392 | buildSettings = {
393 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
394 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
395 | CODE_SIGN_STYLE = Automatic;
396 | CURRENT_PROJECT_VERSION = 1;
397 | DEVELOPMENT_TEAM = DY2GQFY855;
398 | GENERATE_INFOPLIST_FILE = YES;
399 | INFOPLIST_FILE = "UIViewControllerAnimatedTransitioning-Demo/Info.plist";
400 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
401 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
402 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
403 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
404 | LD_RUNPATH_SEARCH_PATHS = (
405 | "$(inherited)",
406 | "@executable_path/Frameworks",
407 | );
408 | MARKETING_VERSION = 1.0;
409 | PRODUCT_BUNDLE_IDENTIFIER = "com.sebvidal.UIViewControllerAnimatedTransitioning-Demo";
410 | PRODUCT_NAME = "$(TARGET_NAME)";
411 | SWIFT_EMIT_LOC_STRINGS = YES;
412 | SWIFT_VERSION = 5.0;
413 | TARGETED_DEVICE_FAMILY = "1,2";
414 | };
415 | name = Release;
416 | };
417 | /* End XCBuildConfiguration section */
418 |
419 | /* Begin XCConfigurationList section */
420 | 93D690132983CB1800CCDA7D /* Build configuration list for PBXProject "UIViewControllerAnimatedTransitioning-Demo" */ = {
421 | isa = XCConfigurationList;
422 | buildConfigurations = (
423 | 93D6902A2983CB1900CCDA7D /* Debug */,
424 | 93D6902B2983CB1900CCDA7D /* Release */,
425 | );
426 | defaultConfigurationIsVisible = 0;
427 | defaultConfigurationName = Release;
428 | };
429 | 93D6902C2983CB1900CCDA7D /* Build configuration list for PBXNativeTarget "UIViewControllerAnimatedTransitioning-Demo" */ = {
430 | isa = XCConfigurationList;
431 | buildConfigurations = (
432 | 93D6902D2983CB1900CCDA7D /* Debug */,
433 | 93D6902E2983CB1900CCDA7D /* Release */,
434 | );
435 | defaultConfigurationIsVisible = 0;
436 | defaultConfigurationName = Release;
437 | };
438 | /* End XCConfigurationList section */
439 | };
440 | rootObject = 93D690102983CB1800CCDA7D /* Project object */;
441 | }
442 |
--------------------------------------------------------------------------------