├── 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 | --------------------------------------------------------------------------------