├── Building-Apps-With-FunctionalTableData ├── Part 2 │ ├── Cartfile │ ├── Cartfile.resolved │ ├── Project-01.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── project.pbxproj │ └── Project-01 │ │ ├── Models │ │ ├── Movie.swift │ │ └── Movies.swift │ │ ├── View Controllers │ │ ├── FunctionalViewController.swift │ │ ├── MoviesViewController.swift │ │ └── MovieViewController.swift │ │ ├── AppDelegate.swift │ │ ├── Cells │ │ ├── ButtonCell.swift │ │ └── LabelCell.swift │ │ ├── Info.plist │ │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ │ └── Assets.xcassets │ │ └── AppIcon.appiconset │ │ └── Contents.json ├── Part 3 │ ├── Cartfile │ ├── Cartfile.resolved │ ├── Project-01 │ │ ├── Assets.xcassets │ │ │ ├── Contents.json │ │ │ ├── heart.imageset │ │ │ │ ├── heart.pdf │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── View Controllers │ │ │ ├── FunctionalViewController.swift │ │ │ ├── MovieViewController.swift │ │ │ └── MoviesViewController.swift │ │ ├── Models │ │ │ ├── Movie.swift │ │ │ └── Movies.swift │ │ ├── Cells │ │ │ ├── ImageCell.swift │ │ │ ├── ButtonCell.swift │ │ │ ├── LabelCell.swift │ │ │ └── CombinedCell.swift │ │ ├── AppDelegate.swift │ │ ├── Info.plist │ │ └── Base.lproj │ │ │ └── LaunchScreen.storyboard │ └── Project-01.xcodeproj │ │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ │ └── project.pbxproj └── README.md ├── Joyful-Animations-Using-Arcs ├── .DS_Store ├── README.md └── Source.swift ├── UIKit-Dynamics-in-the-real-world ├── .DS_Store ├── DynamicBehavior │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── EmojoRaul.imageset │ │ │ ├── EmojoRaul.pdf │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── AppDelegate.swift │ └── ViewController.swift ├── DynamicBehavior.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── project.pbxproj └── README.md ├── Adding-Undo-and-Redo support-to-iOS ├── .DS_Store ├── UndoManager │ ├── UndoManager │ │ ├── Assets.xcassets │ │ │ ├── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── AppDelegate.swift │ │ └── ViewController.swift │ ├── .DS_Store │ └── UndoManager.xcodeproj │ │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── project.pbxproj └── README.md ├── UserInterfaceLevel-the-future-of-floating-apps ├── .DS_Store ├── UserInterfaceLevel Example │ ├── UserInterfaceLevel Example │ │ ├── Resources │ │ │ ├── Assets.xcassets │ │ │ │ ├── Contents.json │ │ │ │ └── AppIcon.appiconset │ │ │ │ │ └── Contents.json │ │ │ └── Base.lproj │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ ├── Source │ │ │ ├── ViewController.swift │ │ │ └── AdaptiveColor.swift │ │ ├── AppDelegate.swift │ │ ├── Info.plist │ │ └── SceneDelegate.swift │ └── UserInterfaceLevel Example.xcodeproj │ │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── project.pbxproj └── README.md ├── README.md ├── LICENSE └── .gitignore /Building-Apps-With-FunctionalTableData/Part 2/Cartfile: -------------------------------------------------------------------------------- 1 | github "ActionKit/ActionKit" 2 | github "Shopify/FunctionalTableData" 3 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Cartfile: -------------------------------------------------------------------------------- 1 | github "ActionKit/ActionKit" 2 | github "Shopify/FunctionalTableData" 3 | -------------------------------------------------------------------------------- /Joyful-Animations-Using-Arcs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/Joyful-Animations-Using-Arcs/.DS_Store -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/UIKit-Dynamics-in-the-real-world/.DS_Store -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ActionKit/ActionKit" "2.3.2" 2 | github "Shopify/FunctionalTableData" "1.0.0" 3 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ActionKit/ActionKit" "2.3.2" 2 | github "Shopify/FunctionalTableData" "1.0.0" 3 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/Adding-Undo-and-Redo support-to-iOS/.DS_Store -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/Adding-Undo-and-Redo support-to-iOS/UndoManager/.DS_Store -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/UserInterfaceLevel-the-future-of-floating-apps/.DS_Store -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Technical articles 2 | A code repository for technical articles written by me 👨🏻‍💻 . You can find them and much more at https://medium.com/@raulriera 3 | 4 | ## Stay in touch 5 | Raul Riera, [@raulriera](http://twitter.com/raulriera) 6 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Assets.xcassets/heart.imageset/heart.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/Building-Apps-With-FunctionalTableData/Part 3/Project-01/Assets.xcassets/heart.imageset/heart.pdf -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/Assets.xcassets/EmojoRaul.imageset/EmojoRaul.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raulriera/technical-articles/HEAD/UIKit-Dynamics-in-the-real-world/DynamicBehavior/Assets.xcassets/EmojoRaul.imageset/EmojoRaul.pdf -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Joyful-Animations-Using-Arcs/README.md: -------------------------------------------------------------------------------- 1 | # Joyful animations using arcs 2 | 3 | Inspired by a tweet, improving the animations of the app I have probably spent too many days on 🤣. 4 | 5 | https://medium.com/@raulriera/smoothanimations-bf063b912430 6 | 7 | ## Stay in touch 8 | Raul Riera, [@raulriera](http://twitter.com/raulriera) 9 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/Assets.xcassets/EmojoRaul.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "EmojoRaul.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/README.md: -------------------------------------------------------------------------------- 1 | # UserInterfaceLevel, the future of floating apps? 2 | 3 | Using the latest addition to `UITraitCollection` to create colors that adapt to the presentation level of your screens. 4 | 5 | https://medium.com/@raulriera/userinterfacelevel-the-future-of-floating-apps-bec2d3328e79 6 | 7 | ## Stay in touch 8 | Raul Riera, [@raulriera](http://twitter.com/raulriera) 9 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/README.md: -------------------------------------------------------------------------------- 1 | # Building apps with FunctionalTableData 2 | FunctionalTableData is a library built by Shopify, which enables users to user a functional approach to rendering content on the screen. Read everything about it on https://medium.com/shopify-mobile/building-apps-with-functionaltabledata-part-1-11cd7f9af000 3 | 4 | ## Stay in touch 5 | Raul Riera, [@raulriera](http://twitter.com/raulriera) 6 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Assets.xcassets/heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "heart.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template", 14 | "preserves-vector-representation" : true 15 | } 16 | } -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/README.md: -------------------------------------------------------------------------------- 1 | # Adding Undo and Redo support to iOS 2 | You have accidentally shaken your phone and noticed that little alert screen that says "Undo [something]". In this story we are going to learn how to implement Undo and Redo actions in iOS apps. 3 | 4 | https://medium.com/@raulriera/uikit-dynamics-in-the-real-world-ef0dfd924260 5 | 6 | ## Stay in touch 7 | Raul Riera, [@raulriera](http://twitter.com/raulriera) 8 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/README.md: -------------------------------------------------------------------------------- 1 | # UIKit Dynamics in the real world 2 | I bet you have found some examples online about how to recreate Tinder's swipe UI that do a lot of math and calculations. With this article we are going to do the same effect way more simpler, the way its meant to be done 😉. 3 | 4 | https://medium.com/@raulriera/uikit-dynamics-in-the-real-world-ef0dfd924260 5 | 6 | ## Stay in touch 7 | Raul Riera, [@raulriera](http://twitter.com/raulriera) 8 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Source/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // UserInterfaceLevel Example 4 | // 5 | // Created by Raul Riera on 2020-06-06. 6 | // Copyright © 2020 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | 15 | view.backgroundColor = AdaptiveColor(base: (light: .white, dark: .black), 16 | elevated: (light: .lightGray, dark: .gray)).value 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/Models/Movie.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Movie.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 24/06/2017. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Movie: Codable, Equatable { 12 | let title: String 13 | let summary: String 14 | let price: Double 15 | let url: URL 16 | 17 | // MARK: Equatable 18 | 19 | static func ==(lhs: Movie, rhs: Movie) -> Bool { 20 | return lhs.title == rhs.title && 21 | lhs.summary == rhs.summary && 22 | lhs.price == rhs.price && 23 | lhs.url == rhs.url 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/View Controllers/FunctionalViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FunctionalViewController.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | class FunctionalViewController: UITableViewController { 13 | let functionalData = FunctionalTableData() 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | navigationController?.navigationBar.prefersLargeTitles = true 18 | functionalData.tableView = tableView 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/View Controllers/FunctionalViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FunctionalViewController.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | class FunctionalViewController: UITableViewController { 13 | let functionalData = FunctionalTableData() 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | navigationController?.navigationBar.prefersLargeTitles = true 18 | functionalData.tableView = tableView 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Models/Movie.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Movie.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 24/06/2017. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Movie: Codable, Equatable { 12 | let title: String 13 | let summary: String 14 | let price: Double 15 | let url: URL 16 | var isFavorite: Bool 17 | 18 | // MARK: Equatable 19 | 20 | static func ==(lhs: Movie, rhs: Movie) -> Bool { 21 | return lhs.title == rhs.title && 22 | lhs.summary == rhs.summary && 23 | lhs.price == rhs.price && 24 | lhs.url == rhs.url && 25 | lhs.isFavorite == rhs.isFavorite 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Cells/ImageCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageCell.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import FunctionalTableData 10 | 11 | typealias ImageCell = HostCell 12 | 13 | struct ImageState: Equatable { 14 | let image: UIImage 15 | let tintColor: UIColor 16 | 17 | public static func updateView(_ view: UIImageView, state: ImageState?) { 18 | guard let state = state else { 19 | view.tintColor = UIColor.blue 20 | view.image = nil 21 | return 22 | } 23 | 24 | view.tintColor = state.tintColor 25 | view.image = state.image 26 | } 27 | 28 | static func ==(lhs: ImageState, rhs: ImageState) -> Bool { 29 | return lhs.image == rhs.image && lhs.tintColor == rhs.tintColor 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Raul Riera 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | window = UIWindow() 19 | let rootViewController = UINavigationController(rootViewController: MoviesViewController()) 20 | window?.rootViewController = rootViewController 21 | window?.makeKeyAndVisible() 22 | 23 | UIWindow.appearance().tintColor = .blue 24 | UIButton.appearance().setTitleColor(.blue, for: []) 25 | // Customize the appearance of the row separators 26 | Separator.appearance().backgroundColor = UITableView().separatorColor 27 | Separator.inset = 16 28 | 29 | return true 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | window = UIWindow() 19 | let rootViewController = UINavigationController(rootViewController: MoviesViewController()) 20 | window?.rootViewController = rootViewController 21 | window?.makeKeyAndVisible() 22 | 23 | UIWindow.appearance().tintColor = .blue 24 | UIButton.appearance().setTitleColor(.blue, for: []) 25 | // Customize the appearance of the row separators 26 | Separator.appearance().backgroundColor = UITableView().separatorColor 27 | Separator.inset = 16 28 | 29 | return true 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /Joyful-Animations-Using-Arcs/Source.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | extension CGRect { 4 | init(startPoint: CGPoint, endPoint: CGPoint) { 5 | self = CGRect(x: min(startPoint.x, endPoint.x), 6 | y: min(startPoint.y, endPoint.y), 7 | width: abs(startPoint.x - endPoint.x), 8 | height: abs(startPoint.y - endPoint.y)) 9 | } 10 | } 11 | 12 | func attachDebugShapes(to canvas: UIView, from emojiView: UIView) { 13 | let rectBetweenPoints = CGRect(startPoint: emojiView.center, endPoint: canvas.center) 14 | let controlPoint = CGPoint(x: rectBetweenPoints.midX, y: rectBetweenPoints.minY) 15 | let path = UIBezierPath() 16 | path.move(to: emojiView.center) 17 | path.addQuadCurve(to: canvas.center, controlPoint: controlPoint) 18 | 19 | let debug1 = UIView(frame: rectBetweenPoints) 20 | debug1.layer.borderColor = UIColor.blue.cgColor 21 | debug1.layer.borderWidth = 1 22 | 23 | canvas.addSubview(debug1) 24 | 25 | let asLayer = CAShapeLayer() 26 | asLayer.strokeColor = UIColor.green.cgColor 27 | asLayer.fillColor = UIColor.clear.cgColor 28 | asLayer.path = path.cgPath 29 | canvas.layer.addSublayer(asLayer) 30 | } 31 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/Cells/ButtonCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonCell.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | import ActionKit 12 | 13 | typealias ButtonCell = HostCell 14 | 15 | struct ButtonState: Equatable { 16 | let title: String 17 | let action: () -> Void 18 | 19 | public static func updateView(_ view: UIButton, state: ButtonState?) { 20 | guard let state = state else { 21 | view.setTitle(nil, for: .normal) 22 | view.removeControlEvent(.touchUpInside) 23 | return 24 | } 25 | 26 | view.titleLabel?.font = UIFont.systemFont(ofSize: 22) 27 | view.contentHorizontalAlignment = .leading 28 | view.setTitle(state.title, for: .normal) 29 | // Callback support for UIControl using the `ActionKit` library. 30 | // Use whatever technique you prefer to achieve the same 31 | view.addControlEvent(.touchUpInside) { 32 | state.action() 33 | } 34 | } 35 | 36 | static func ==(lhs: ButtonState, rhs: ButtonState) -> Bool { 37 | return lhs.title == rhs.title 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Cells/ButtonCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonCell.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | import ActionKit 12 | 13 | typealias ButtonCell = HostCell 14 | 15 | struct ButtonState: Equatable { 16 | let title: String 17 | let action: () -> Void 18 | 19 | public static func updateView(_ view: UIButton, state: ButtonState?) { 20 | guard let state = state else { 21 | view.setTitle(nil, for: .normal) 22 | view.removeControlEvent(.touchUpInside) 23 | return 24 | } 25 | 26 | view.titleLabel?.font = UIFont.systemFont(ofSize: 22) 27 | view.contentHorizontalAlignment = .leading 28 | view.setTitle(state.title, for: .normal) 29 | // Callback support for UIControl using the `ActionKit` library. 30 | // Use whatever technique you prefer to achieve the same 31 | view.addControlEvent(.touchUpInside) { 32 | state.action() 33 | } 34 | } 35 | 36 | static func ==(lhs: ButtonState, rhs: ButtonState) -> Bool { 37 | return lhs.title == rhs.title 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Source/AdaptiveColor.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public struct AdaptiveColor { 4 | /// See [UserInterfaceLevel](https://developer.apple.com/documentation/uikit/uiuserinterfacelevel) for more info. 5 | private(set) var base: (light: UIColor, dark: UIColor) 6 | /// The color used for content visually above your window's main content. If none is specified, the `base` color is used instead. 7 | /// 8 | /// See [UserInterfaceLevel](https://developer.apple.com/documentation/uikit/uiuserinterfacelevel) for more info. 9 | private(set) var elevated: (light: UIColor, dark: UIColor) 10 | 11 | public init(light: UIColor, dark: UIColor) { 12 | base = (light: light, dark: dark) 13 | elevated = base 14 | } 15 | 16 | public init(base: (light: UIColor, dark: UIColor), elevated: (light: UIColor, dark: UIColor)) { 17 | self.base = base 18 | self.elevated = elevated 19 | } 20 | 21 | public var value: UIColor { 22 | if #available(iOSApplicationExtension 13.0, *) { 23 | return UIColor { traitCollection in 24 | let isElevated = traitCollection.userInterfaceLevel == .elevated 25 | if traitCollection.userInterfaceStyle == .dark { 26 | return isElevated ? self.elevated.dark : self.base.dark 27 | } else { 28 | return isElevated ? self.elevated.light : self.base.light 29 | } 30 | } 31 | } else { 32 | return base.light 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // UserInterfaceLevel Example 4 | // 5 | // Created by Raul Riera on 2020-06-06. 6 | // Copyright © 2020 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/Models/Movies.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Movies.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-03. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // Super simple list of movies, you probably want to fetch this from a remote repository 12 | 13 | let toyStory: Movie = Movie(title: "Toy Story", summary: """ 14 | Woody (Tom Hanks), a good-hearted cowboy doll who belongs to a young boy named Andy (John Morris), sees his position as Andy's favorite toy jeopardized when his parents buy him a Buzz Lightyear (Tim Allen) action figure. 15 | """, price: 14.99, url: URL(string: "https://itunes.apple.com/ca/movie/toy-story/id188703840")!) 16 | 17 | let toyStory2: Movie = Movie(title: "Toy Story 2", summary: """ 18 | The toys are back in town and ready to play once again on the big screen in Toy Story 2, the exciting sequel to the landmark 1995 animated blockbuster from Disney/Pixar. This comedy-adventure picks up as Andy heads off to Cowboy Camp leaving his toys to their own devices. 19 | """, price: 24.99, url: URL(string: "https://itunes.apple.com/ca/movie/toy-story-2/id268793231")!) 20 | 21 | let findingNemo: Movie = Movie(title: "Finding Nemo", summary: """ 22 | From the Academy Award®-winning creators of TOY STORY and MONSTERS, INC. (2001, Best Animated Short Film, FOR THE BIRDS), it's FINDING NEMO, a hilarious adventure where you'll meet colorful characters that take you into the breathtaking underwater world of Australia's Great Barrier Reef. 23 | """, price: 9.99, url: URL(string: "https://itunes.apple.com/ca/movie/finding-nemo/id255295077")!) 24 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | .build/ 41 | 42 | # CocoaPods 43 | # 44 | # We recommend against adding the Pods directory to your .gitignore. However 45 | # you should judge for yourself, the pros and cons are mentioned at: 46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 47 | # 48 | # Pods/ 49 | 50 | # Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | Carthage/ 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Models/Movies.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Movies.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-03. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // Super simple list of movies, you probably want to fetch this from a remote repository 12 | 13 | let toyStory: Movie = Movie(title: "Toy Story", summary: """ 14 | Woody (Tom Hanks), a good-hearted cowboy doll who belongs to a young boy named Andy (John Morris), sees his position as Andy's favorite toy jeopardized when his parents buy him a Buzz Lightyear (Tim Allen) action figure. 15 | """, price: 14.99, url: URL(string: "https://itunes.apple.com/ca/movie/toy-story/id188703840")!, isFavorite: false) 16 | 17 | let toyStory2: Movie = Movie(title: "Toy Story 2", summary: """ 18 | The toys are back in town and ready to play once again on the big screen in Toy Story 2, the exciting sequel to the landmark 1995 animated blockbuster from Disney/Pixar. This comedy-adventure picks up as Andy heads off to Cowboy Camp leaving his toys to their own devices. 19 | """, price: 24.99, url: URL(string: "https://itunes.apple.com/ca/movie/toy-story-2/id268793231")!, isFavorite: false) 20 | 21 | let findingNemo: Movie = Movie(title: "Finding Nemo", summary: """ 22 | From the Academy Award®-winning creators of TOY STORY and MONSTERS, INC. (2001, Best Animated Short Film, FOR THE BIRDS), it's FINDING NEMO, a hilarious adventure where you'll meet colorful characters that take you into the breathtaking underwater world of Australia's Great Barrier Reef. 23 | """, price: 9.99, url: URL(string: "https://itunes.apple.com/ca/movie/finding-nemo/id255295077")!, isFavorite: false) 24 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/Cells/LabelCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LabelCell.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | public typealias LabelCell = HostCell 13 | 14 | /// A very simple state for a `UILabel` allowing a quick configuration of its text, font, and color values. 15 | public struct LabelState: Equatable { 16 | public let text: String 17 | public let font: UIFont 18 | public let color: UIColor 19 | 20 | public init(text: String, font: UIFont = UIFont.systemFont(ofSize: 17), color: UIColor = .black) { 21 | self.text = text 22 | self.font = font 23 | self.color = color 24 | } 25 | 26 | /// Update the view with the contents of the state. 27 | /// 28 | /// - Parameters: 29 | /// - view: `UIView` that responds to this state. 30 | /// - state: data to update the view with. If `nil` the view is being reused by the tableview. 31 | public static func updateView(_ view: UILabel, state: LabelState?) { 32 | guard let state = state else { 33 | view.text = nil 34 | view.font = UIFont.systemFont(ofSize: 17) 35 | view.textColor = .black 36 | view.lineBreakMode = .byTruncatingTail 37 | view.numberOfLines = 1 38 | return 39 | } 40 | 41 | view.text = state.text 42 | view.font = state.font 43 | view.textColor = state.color 44 | view.numberOfLines = 0 45 | view.lineBreakMode = .byWordWrapping 46 | } 47 | 48 | public static func ==(lhs: LabelState, rhs: LabelState) -> Bool { 49 | return lhs.text == rhs.text && lhs.font == rhs.font && lhs.color == rhs.color 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Cells/LabelCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LabelCell.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | public typealias LabelCell = HostCell 13 | 14 | /// A very simple state for a `UILabel` allowing a quick configuration of its text, font, and color values. 15 | public struct LabelState: Equatable { 16 | public let text: String 17 | public let font: UIFont 18 | public let color: UIColor 19 | 20 | public init(text: String, font: UIFont = UIFont.systemFont(ofSize: 17), color: UIColor = .black) { 21 | self.text = text 22 | self.font = font 23 | self.color = color 24 | } 25 | 26 | /// Update the view with the contents of the state. 27 | /// 28 | /// - Parameters: 29 | /// - view: `UIView` that responds to this state. 30 | /// - state: data to update the view with. If `nil` the view is being reused by the tableview. 31 | public static func updateView(_ view: UILabel, state: LabelState?) { 32 | guard let state = state else { 33 | view.text = nil 34 | view.font = UIFont.systemFont(ofSize: 17) 35 | view.textColor = .black 36 | view.lineBreakMode = .byTruncatingTail 37 | view.numberOfLines = 1 38 | return 39 | } 40 | 41 | view.text = state.text 42 | view.font = state.font 43 | view.textColor = state.color 44 | view.numberOfLines = 0 45 | view.lineBreakMode = .byWordWrapping 46 | } 47 | 48 | public static func ==(lhs: LabelState, rhs: LabelState) -> Bool { 49 | return lhs.text == rhs.text && lhs.font == rhs.font && lhs.color == rhs.color 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/View Controllers/MoviesViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MoviesViewController.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-03. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FunctionalTableData 11 | 12 | class MoviesViewController: FunctionalViewController { 13 | let movies: [Movie] = [toyStory, toyStory2, findingNemo] 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | title = "Movies" 18 | render() 19 | } 20 | 21 | private func render() { 22 | // In here, FunctionalTableData will diff the current 23 | // state of the tableView with the state being passed. 24 | // And only update the changes 25 | functionalData.renderAndDiff([tableState()]) 26 | } 27 | 28 | private func tableState() -> TableSection { 29 | let cells: [CellConfigType] = movies.map { movie in 30 | let rowAction = UITableViewRowAction(style: .normal, title: "😙", handler: { _, _ in 31 | print("Do something with the movie: \(movie.title)") 32 | }) 33 | 34 | let actions = CellActions(selectionAction: { [weak self] _ in 35 | self?.present(movie: movie) 36 | return .selected 37 | }, rowActions: [rowAction]) 38 | 39 | return LabelCell(key: "key-\(movie)", 40 | style: CellStyle(highlight: true), 41 | actions: actions, 42 | state: LabelState(text: movie.title), 43 | cellUpdater: LabelState.updateView) 44 | } 45 | 46 | return TableSection(key: "section", rows: cells, style: SectionStyle(separators: .default)) 47 | } 48 | 49 | private func present(movie: Movie) { 50 | let viewController = MovieViewController(movie: movie) 51 | navigationController?.pushViewController(viewController, animated: true) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/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 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/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 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/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 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/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 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Resources/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 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01/View Controllers/MovieViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MovieViewController.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | class MovieViewController: FunctionalViewController { 13 | let movie: Movie 14 | 15 | required init(movie: Movie) { 16 | self.movie = movie 17 | super.init(style: .plain) 18 | } 19 | 20 | required init?(coder aDecoder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | override func viewDidLoad() { 25 | super.viewDidLoad() 26 | title = movie.title 27 | render() 28 | } 29 | 30 | private func render() { 31 | // In here, FunctionalTableData will diff the current 32 | // state of the tableView with the state being passed. 33 | // And only update the changes 34 | functionalData.renderAndDiff([tableState()]) 35 | } 36 | 37 | private func tableState() -> TableSection { 38 | let summaryCell = LabelCell(key: "summary", 39 | state: LabelState(text: movie.summary), 40 | cellUpdater: LabelState.updateView) 41 | 42 | let padding = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0) 43 | let cellStyle = CellStyle(bottomSeparator: .inset, layoutMargins: padding) 44 | 45 | let rentInItunes = ButtonCell(key: "rent", 46 | style: cellStyle, 47 | state: ButtonState(title: "\(movie.price) Rent", action: { [weak self] in 48 | print("Looks like you want to rent \(String(describing: self?.movie.title))") 49 | }), 50 | cellUpdater: ButtonState.updateView) 51 | 52 | let shareLink = ButtonCell(key: "share", 53 | style: cellStyle, 54 | state: ButtonState(title: "Share", action: { [weak self] in 55 | print("Looks like you want to share \(String(describing: self?.movie.title))") 56 | }), 57 | cellUpdater: ButtonState.updateView) 58 | 59 | let cells: [CellConfigType] = [ 60 | summaryCell, 61 | rentInItunes, 62 | shareLink 63 | ] 64 | 65 | return TableSection(key: "section", rows: cells) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/View Controllers/MovieViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MovieViewController.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-02. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | class MovieViewController: FunctionalViewController { 13 | let movie: Movie 14 | 15 | required init(movie: Movie) { 16 | self.movie = movie 17 | super.init(style: .plain) 18 | } 19 | 20 | required init?(coder aDecoder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | override func viewDidLoad() { 25 | super.viewDidLoad() 26 | title = movie.title 27 | render() 28 | } 29 | 30 | private func render() { 31 | // In here, FunctionalTableData will diff the current 32 | // state of the tableView with the state being passed. 33 | // And only update the changes 34 | functionalData.renderAndDiff([tableState()]) 35 | } 36 | 37 | private func tableState() -> TableSection { 38 | let summaryCell = LabelCell(key: "summary", 39 | state: LabelState(text: movie.summary), 40 | cellUpdater: LabelState.updateView) 41 | 42 | let padding = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0) 43 | let cellStyle = CellStyle(bottomSeparator: .inset, layoutMargins: padding) 44 | 45 | let rentInItunes = ButtonCell(key: "rent", 46 | style: cellStyle, 47 | state: ButtonState(title: "\(movie.price) Rent", action: { [weak self] in 48 | print("Looks like you want to rent \(String(describing: self?.movie.title))") 49 | }), 50 | cellUpdater: ButtonState.updateView) 51 | 52 | let shareLink = ButtonCell(key: "share", 53 | style: cellStyle, 54 | state: ButtonState(title: "Share", action: { [weak self] in 55 | print("Looks like you want to share \(String(describing: self?.movie.title))") 56 | }), 57 | cellUpdater: ButtonState.updateView) 58 | 59 | let cells: [CellConfigType] = [ 60 | summaryCell, 61 | rentInItunes, 62 | shareLink 63 | ] 64 | 65 | return TableSection(key: "section", rows: cells) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // UndoManager 4 | // 5 | // Created by Raul Riera on 2019-01-27. 6 | // Copyright © 2019 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIMainStoryboardFile 45 | Main 46 | UIRequiredDeviceCapabilities 47 | 48 | armv7 49 | 50 | UISupportedInterfaceOrientations 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationLandscapeLeft 54 | UIInterfaceOrientationLandscapeRight 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationPortraitUpsideDown 60 | UIInterfaceOrientationLandscapeLeft 61 | UIInterfaceOrientationLandscapeRight 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/Cells/CombinedCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CombinedCell.swift 3 | // Project-01 4 | // 5 | // Created by Geoff Foster on 2017-12-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FunctionalTableData 11 | 12 | /** `CombinedCell` while very daunting to look at, is actually very simple once 13 | we go over through all the generics. 14 | 15 | `View1` and `View2` needs to be an instance of `UIView`, which are the two views displayed side 16 | by side in our instances of `CombinedCell`. 17 | 18 | `State1` and `State2` needs to conform to `Equatable`, and are used to update the contents of the previously 19 | defined view pairs. 20 | 21 | Lastly, `Layout` needs to conform to `TableItemLayout` and defines how our cell is layout in our container. 22 | */ 23 | public typealias CombinedCell = HostCell, CombinedState, Layout> 24 | 25 | public struct CombinedState: Equatable { 26 | public let state1: S1 27 | public let state2: S2 28 | public init(state1: S1, state2: S2) { 29 | self.state1 = state1 30 | self.state2 = state2 31 | } 32 | 33 | public static func ==(lhs: CombinedState, rhs: CombinedState) -> Bool { 34 | return lhs.state1 == rhs.state1 && lhs.state2 == rhs.state2 35 | } 36 | } 37 | 38 | public class CombinedView: UIView { 39 | public let view1 = View1() 40 | public let view2 = View2() 41 | public let stackView: UIStackView 42 | 43 | public override init(frame: CGRect) { 44 | stackView = UIStackView(frame: frame) 45 | super.init(frame: frame) 46 | stackView.addArrangedSubview(view1) 47 | stackView.addArrangedSubview(view2) 48 | 49 | stackView.translatesAutoresizingMaskIntoConstraints = false 50 | addSubview(stackView) 51 | 52 | NSLayoutConstraint.activate([ 53 | stackView.leadingAnchor.constraint(equalTo: leadingAnchor), 54 | stackView.trailingAnchor.constraint(equalTo: trailingAnchor), 55 | stackView.topAnchor.constraint(equalTo: topAnchor), 56 | stackView.bottomAnchor.constraint(equalTo: bottomAnchor) 57 | ]) 58 | } 59 | 60 | public required init?(coder aDecoder: NSCoder) { 61 | fatalError("init(coder:) has not been implemented") 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // DynamicBehavior 4 | // 5 | // Created by Raul Riera on 2018-03-31. 6 | // Copyright © 2018 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // UserInterfaceLevel Example 4 | // 5 | // Created by Raul Riera on 2020-06-06. 6 | // Copyright © 2020 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | guard let _ = (scene as? UIWindowScene) else { return } 21 | } 22 | 23 | func sceneDidDisconnect(_ scene: UIScene) { 24 | // Called as the scene is being released by the system. 25 | // This occurs shortly after the scene enters the background, or when its session is discarded. 26 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 27 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 28 | } 29 | 30 | func sceneDidBecomeActive(_ scene: UIScene) { 31 | // Called when the scene has moved from an inactive state to an active state. 32 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 33 | } 34 | 35 | func sceneWillResignActive(_ scene: UIScene) { 36 | // Called when the scene will move from an active state to an inactive state. 37 | // This may occur due to temporary interruptions (ex. an incoming phone call). 38 | } 39 | 40 | func sceneWillEnterForeground(_ scene: UIScene) { 41 | // Called as the scene transitions from the background to the foreground. 42 | // Use this method to undo the changes made on entering the background. 43 | } 44 | 45 | func sceneDidEnterBackground(_ scene: UIScene) { 46 | // Called as the scene transitions from the foreground to the background. 47 | // Use this method to save data, release shared resources, and store enough scene-specific state information 48 | // to restore the scene back to its current state. 49 | } 50 | 51 | 52 | } 53 | 54 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01/View Controllers/MoviesViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MoviesViewController.swift 3 | // Project-01 4 | // 5 | // Created by Raul Riera on 2017-12-03. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import FunctionalTableData 11 | 12 | class MoviesViewController: FunctionalViewController { 13 | var movies: [Movie] = [toyStory, toyStory2, findingNemo] 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | title = "Movies" 18 | render() 19 | } 20 | 21 | private func render() { 22 | // In here, FunctionalTableData will diff the current 23 | // state of the tableView with the state being passed. 24 | // And only update the changes 25 | functionalData.renderAndDiff([tableState()]) 26 | } 27 | 28 | private func tableState() -> TableSection { 29 | let cells: [CellConfigType] = movies.map { movie in 30 | let rowAction = UITableViewRowAction(style: .normal, title: movie.isFavorite ? "Unfave" : "Fave", handler: { [weak self] _, _ in 31 | self?.toggleFavorite(movie: movie) 32 | }) 33 | 34 | let actions = CellActions(selectionAction: { [weak self] _ in 35 | self?.present(movie: movie) 36 | return .selected 37 | }, rowActions: [rowAction]) 38 | 39 | // Create the two states and combined them 40 | let labelState = LabelState(text: movie.title) 41 | let iconState = ImageState(image: UIImage(named: "heart")!, tintColor: movie.isFavorite ? .red : UIColor.gray.withAlphaComponent(0.2)) 42 | let combinedState = CombinedState(state1: labelState, state2: iconState) 43 | 44 | // Yup, that is very long, we can always use our little `typealias` trick to make them shorter. 45 | // Maybe something like `LabelIconCell` if we plan to reuse it. 46 | let combinedCell = CombinedCell( 47 | key: "key-\(movie)", 48 | style: CellStyle(highlight: true), 49 | actions: actions, 50 | state: combinedState, 51 | cellUpdater: { view, state in 52 | view.view2.setContentHuggingPriority(.required, for: .horizontal) 53 | 54 | // Combined cell is just two cells side by side, call their individual 55 | // cellUpdater in order to update their content. 56 | LabelState.updateView(view.view1, state: state?.state1) 57 | ImageState.updateView(view.view2, state: state?.state2) 58 | }) 59 | 60 | return combinedCell 61 | } 62 | 63 | return TableSection(key: "section", rows: cells, style: SectionStyle(separators: .default)) 64 | } 65 | 66 | private func present(movie: Movie) { 67 | let viewController = MovieViewController(movie: movie) 68 | navigationController?.pushViewController(viewController, animated: true) 69 | } 70 | 71 | private func toggleFavorite(movie: Movie) { 72 | guard let index = movies.index(where: { $0 == movie }) else { return } 73 | 74 | var movieCopy = movie 75 | movieCopy.isFavorite = !movieCopy.isFavorite 76 | 77 | movies[index] = movieCopy 78 | 79 | render() 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // UndoManager 4 | // 5 | // Created by Raul Riera on 2019-01-27. 6 | // Copyright © 2019 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | var state: State { 13 | didSet { 14 | label.text = state.debugDescription 15 | 16 | // While the code is running on the main thread, the undo manager doesn’t update its state until after `registerUndo` returns. Using the DispatchQueue block allows the UI update to wait until this undo/redo operation completes. 17 | DispatchQueue.main.async { 18 | self.undoButton?.isEnabled = self.undoManager?.canUndo == true 19 | self.redoButton?.isEnabled = self.undoManager?.canRedo == true 20 | } 21 | } 22 | } 23 | 24 | @IBOutlet weak var label: UILabel! 25 | 26 | private var count: Int = 0 27 | private var undoButton: UIBarButtonItem? 28 | private var redoButton: UIBarButtonItem? 29 | 30 | private let _um = UndoManager() 31 | override var undoManager: UndoManager? { 32 | return _um 33 | } 34 | 35 | // By overwriting undoManager and this property, our view controller 36 | // will prompt you to undo and redo after you shake the device. 37 | // Give it a try :) 38 | override var canBecomeFirstResponder: Bool { 39 | return true 40 | } 41 | 42 | required init?(coder aDecoder: NSCoder) { 43 | self.state = State(person: Person(name: "Initial state")) 44 | super.init(coder: aDecoder) 45 | } 46 | 47 | override func viewDidLoad() { 48 | super.viewDidLoad() 49 | view.backgroundColor = .white 50 | 51 | undoButton = UIBarButtonItem(barButtonSystemItem: .undo, target: self, action: #selector(didTapUndo)) 52 | redoButton = UIBarButtonItem(barButtonSystemItem: .redo, target: self, action: #selector(didTapRedo)) 53 | 54 | undoButton?.isEnabled = false 55 | redoButton?.isEnabled = false 56 | 57 | navigationItem.leftBarButtonItems = [undoButton!, redoButton!] 58 | navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(didTapAdd)) 59 | 60 | title = "Undo manager" 61 | 62 | label.text = state.debugDescription 63 | } 64 | 65 | @objc func didTapAdd(_ button: UIBarButtonItem) { 66 | // You can spam `appendState` and the undo operation will revert all of them 67 | // in a single group. 68 | appendState() 69 | } 70 | 71 | func appendState() { 72 | let newState = State(person: Person(name: "Name \(count)")) 73 | 74 | undoManager?.replace(item: self.state, with: newState, handler: { stateFromStack in 75 | print("Undoing: \(self.state) for \(stateFromStack)") 76 | self.state = stateFromStack 77 | }) 78 | 79 | self.state = newState 80 | count = count + 1 81 | } 82 | 83 | @objc func didTapUndo(_ button: UIBarButtonItem) { 84 | undoManager?.undo() 85 | } 86 | 87 | @objc func didTapRedo(_ button: UIBarButtonItem) { 88 | undoManager?.redo() 89 | } 90 | } 91 | 92 | // Undo Manager 93 | 94 | extension UndoManager { 95 | func replace(item oldItem: T, with newItem: T, title: String? = nil, handler: ((T) -> Void)?) { 96 | guard let oldItem = copy(item: oldItem) else { return } 97 | guard let newItem = copy(item: newItem) else { return } 98 | 99 | registerUndo(withTarget: self) { 100 | handler?(oldItem) 101 | $0.replace(item: newItem, with: oldItem, title: title, handler: handler) 102 | } 103 | 104 | guard let title = title else { return } 105 | setActionName(title) 106 | } 107 | 108 | private func copy(item: T) -> T? { 109 | guard let data = try? JSONEncoder().encode(item) else { 110 | return nil 111 | } 112 | 113 | return try? JSONDecoder().decode(T.self, from: data) 114 | } 115 | } 116 | 117 | // Files for quickly debugging the copy function 118 | 119 | struct State: CustomDebugStringConvertible, Codable, Equatable { 120 | let person: Person 121 | var debugDescription: String { 122 | return "\(person.name)" 123 | } 124 | } 125 | 126 | class Person: Codable, Equatable { 127 | let name: String 128 | 129 | init(name: String) { 130 | self.name = name 131 | } 132 | 133 | static func == (lhs: Person, rhs: Person) -> Bool { 134 | return lhs.name == rhs.name 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // DynamicBehavior 4 | // 5 | // Created by Raul Riera on 2018-03-31. 6 | // Copyright © 2018 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class TossingBehavior: UIDynamicBehavior { 12 | enum Direction { 13 | case top, left, bottom, right 14 | } 15 | 16 | private let snap: UISnapBehavior 17 | private let item: UIDynamicItem 18 | private var bounds: CGRect? 19 | 20 | var isEnabled: Bool = true { 21 | didSet { 22 | if isEnabled { 23 | addChildBehavior(snap) 24 | } else { 25 | removeChildBehavior(snap) 26 | } 27 | } 28 | } 29 | 30 | init(item: UIDynamicItem, snapTo: CGPoint) { 31 | self.item = item 32 | self.snap = UISnapBehavior(item: item, snapTo: snapTo) 33 | 34 | super.init() 35 | 36 | addChildBehavior(snap) 37 | 38 | snap.action = { [weak self] in 39 | guard let bounds = self?.bounds, let item = self?.item else { return } 40 | guard let direction = self?.direction(from: item.center, in: bounds) else { return } 41 | guard let vector = self?.vector(from: direction) else { return } 42 | 43 | self?.isEnabled = false 44 | 45 | let gravity = UIGravityBehavior(items: [item]) 46 | gravity.gravityDirection = vector 47 | gravity.magnitude = 5 48 | gravity.action = { 49 | print("Falling") 50 | } 51 | 52 | self?.addChildBehavior(gravity) 53 | } 54 | } 55 | 56 | // MARK: UIDynamicBehavior 57 | 58 | override func willMove(to dynamicAnimator: UIDynamicAnimator?) { 59 | super.willMove(to: dynamicAnimator) 60 | bounds = dynamicAnimator?.referenceView?.bounds 61 | } 62 | 63 | // MARK: Helpers 64 | 65 | private func direction(from center: CGPoint, in bounds: CGRect) -> Direction? { 66 | if center.x > bounds.width * 0.8 { 67 | return .right 68 | } else if center.x < bounds.width * 0.2 { 69 | return .left 70 | } else if center.y < bounds.height * 0.2 { 71 | return .top 72 | } else if center.y > bounds.height * 0.8 { 73 | return .bottom 74 | } 75 | 76 | return nil 77 | } 78 | 79 | private func vector(from direction: Direction) -> CGVector { 80 | switch direction { 81 | case .top: 82 | return CGVector(dx: 0, dy: -1) 83 | case .left: 84 | return CGVector(dx: -1, dy: 0) 85 | case .bottom: 86 | return CGVector(dx: 0, dy: 1) 87 | case .right: 88 | return CGVector(dx: 1, dy: 0) 89 | } 90 | } 91 | } 92 | 93 | class ViewController: UIViewController { 94 | @IBOutlet private weak var cardView: UIView! 95 | private var animator: UIDynamicAnimator! 96 | private var tossing: TossingBehavior! 97 | 98 | override func viewDidLoad() { 99 | super.viewDidLoad() 100 | 101 | animator = UIDynamicAnimator(referenceView: view) 102 | tossing = TossingBehavior(item: cardView, snapTo: view.center) 103 | animator.addBehavior(tossing) 104 | 105 | let panGesture = UIPanGestureRecognizer(target: self, action: #selector(pannedView)) 106 | cardView.addGestureRecognizer(panGesture) 107 | cardView.isUserInteractionEnabled = true 108 | } 109 | 110 | @objc func pannedView(recognizer: UIPanGestureRecognizer) { 111 | switch recognizer.state { 112 | case .began: 113 | tossing.isEnabled = false 114 | case .changed: 115 | let translation = recognizer.translation(in: view) 116 | cardView.center = CGPoint(x: cardView.center.x + translation.x, 117 | y: cardView.center.y + translation.y) 118 | recognizer.setTranslation(.zero, in: view) 119 | 120 | case .ended, .cancelled, .failed: 121 | tossing.isEnabled = true 122 | case .possible: 123 | break 124 | } 125 | } 126 | } 127 | 128 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example/Resources/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 26 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /Adding-Undo-and-Redo support-to-iOS/UndoManager/UndoManager.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4CC36C1A21FD84C40044DE42 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC36C1921FD84C40044DE42 /* AppDelegate.swift */; }; 11 | 4CC36C1C21FD84C40044DE42 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC36C1B21FD84C40044DE42 /* ViewController.swift */; }; 12 | 4CC36C1F21FD84C40044DE42 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4CC36C1D21FD84C40044DE42 /* Main.storyboard */; }; 13 | 4CC36C2121FD84C60044DE42 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4CC36C2021FD84C60044DE42 /* Assets.xcassets */; }; 14 | 4CC36C2421FD84C60044DE42 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4CC36C2221FD84C60044DE42 /* LaunchScreen.storyboard */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 4CC36C1621FD84C40044DE42 /* UndoManager.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UndoManager.app; sourceTree = BUILT_PRODUCTS_DIR; }; 19 | 4CC36C1921FD84C40044DE42 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 20 | 4CC36C1B21FD84C40044DE42 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 21 | 4CC36C1E21FD84C40044DE42 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 22 | 4CC36C2021FD84C60044DE42 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 23 | 4CC36C2321FD84C60044DE42 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 24 | 4CC36C2521FD84C60044DE42 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 25 | /* End PBXFileReference section */ 26 | 27 | /* Begin PBXFrameworksBuildPhase section */ 28 | 4CC36C1321FD84C40044DE42 /* Frameworks */ = { 29 | isa = PBXFrameworksBuildPhase; 30 | buildActionMask = 2147483647; 31 | files = ( 32 | ); 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXFrameworksBuildPhase section */ 36 | 37 | /* Begin PBXGroup section */ 38 | 4CC36C0D21FD84C40044DE42 = { 39 | isa = PBXGroup; 40 | children = ( 41 | 4CC36C1821FD84C40044DE42 /* UndoManager */, 42 | 4CC36C1721FD84C40044DE42 /* Products */, 43 | ); 44 | sourceTree = ""; 45 | }; 46 | 4CC36C1721FD84C40044DE42 /* Products */ = { 47 | isa = PBXGroup; 48 | children = ( 49 | 4CC36C1621FD84C40044DE42 /* UndoManager.app */, 50 | ); 51 | name = Products; 52 | sourceTree = ""; 53 | }; 54 | 4CC36C1821FD84C40044DE42 /* UndoManager */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | 4CC36C1921FD84C40044DE42 /* AppDelegate.swift */, 58 | 4CC36C1B21FD84C40044DE42 /* ViewController.swift */, 59 | 4CC36C1D21FD84C40044DE42 /* Main.storyboard */, 60 | 4CC36C2021FD84C60044DE42 /* Assets.xcassets */, 61 | 4CC36C2221FD84C60044DE42 /* LaunchScreen.storyboard */, 62 | 4CC36C2521FD84C60044DE42 /* Info.plist */, 63 | ); 64 | path = UndoManager; 65 | sourceTree = ""; 66 | }; 67 | /* End PBXGroup section */ 68 | 69 | /* Begin PBXNativeTarget section */ 70 | 4CC36C1521FD84C40044DE42 /* UndoManager */ = { 71 | isa = PBXNativeTarget; 72 | buildConfigurationList = 4CC36C2821FD84C60044DE42 /* Build configuration list for PBXNativeTarget "UndoManager" */; 73 | buildPhases = ( 74 | 4CC36C1221FD84C40044DE42 /* Sources */, 75 | 4CC36C1321FD84C40044DE42 /* Frameworks */, 76 | 4CC36C1421FD84C40044DE42 /* Resources */, 77 | ); 78 | buildRules = ( 79 | ); 80 | dependencies = ( 81 | ); 82 | name = UndoManager; 83 | productName = UndoManager; 84 | productReference = 4CC36C1621FD84C40044DE42 /* UndoManager.app */; 85 | productType = "com.apple.product-type.application"; 86 | }; 87 | /* End PBXNativeTarget section */ 88 | 89 | /* Begin PBXProject section */ 90 | 4CC36C0E21FD84C40044DE42 /* Project object */ = { 91 | isa = PBXProject; 92 | attributes = { 93 | LastSwiftUpdateCheck = 1010; 94 | LastUpgradeCheck = 1010; 95 | ORGANIZATIONNAME = "Raul Riera"; 96 | TargetAttributes = { 97 | 4CC36C1521FD84C40044DE42 = { 98 | CreatedOnToolsVersion = 10.1; 99 | }; 100 | }; 101 | }; 102 | buildConfigurationList = 4CC36C1121FD84C40044DE42 /* Build configuration list for PBXProject "UndoManager" */; 103 | compatibilityVersion = "Xcode 9.3"; 104 | developmentRegion = en; 105 | hasScannedForEncodings = 0; 106 | knownRegions = ( 107 | en, 108 | Base, 109 | ); 110 | mainGroup = 4CC36C0D21FD84C40044DE42; 111 | productRefGroup = 4CC36C1721FD84C40044DE42 /* Products */; 112 | projectDirPath = ""; 113 | projectRoot = ""; 114 | targets = ( 115 | 4CC36C1521FD84C40044DE42 /* UndoManager */, 116 | ); 117 | }; 118 | /* End PBXProject section */ 119 | 120 | /* Begin PBXResourcesBuildPhase section */ 121 | 4CC36C1421FD84C40044DE42 /* Resources */ = { 122 | isa = PBXResourcesBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | 4CC36C2421FD84C60044DE42 /* LaunchScreen.storyboard in Resources */, 126 | 4CC36C2121FD84C60044DE42 /* Assets.xcassets in Resources */, 127 | 4CC36C1F21FD84C40044DE42 /* Main.storyboard in Resources */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXResourcesBuildPhase section */ 132 | 133 | /* Begin PBXSourcesBuildPhase section */ 134 | 4CC36C1221FD84C40044DE42 /* Sources */ = { 135 | isa = PBXSourcesBuildPhase; 136 | buildActionMask = 2147483647; 137 | files = ( 138 | 4CC36C1C21FD84C40044DE42 /* ViewController.swift in Sources */, 139 | 4CC36C1A21FD84C40044DE42 /* AppDelegate.swift in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin PBXVariantGroup section */ 146 | 4CC36C1D21FD84C40044DE42 /* Main.storyboard */ = { 147 | isa = PBXVariantGroup; 148 | children = ( 149 | 4CC36C1E21FD84C40044DE42 /* Base */, 150 | ); 151 | name = Main.storyboard; 152 | sourceTree = ""; 153 | }; 154 | 4CC36C2221FD84C60044DE42 /* LaunchScreen.storyboard */ = { 155 | isa = PBXVariantGroup; 156 | children = ( 157 | 4CC36C2321FD84C60044DE42 /* Base */, 158 | ); 159 | name = LaunchScreen.storyboard; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXVariantGroup section */ 163 | 164 | /* Begin XCBuildConfiguration section */ 165 | 4CC36C2621FD84C60044DE42 /* Debug */ = { 166 | isa = XCBuildConfiguration; 167 | buildSettings = { 168 | ALWAYS_SEARCH_USER_PATHS = NO; 169 | CLANG_ANALYZER_NONNULL = YES; 170 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 171 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 172 | CLANG_CXX_LIBRARY = "libc++"; 173 | CLANG_ENABLE_MODULES = YES; 174 | CLANG_ENABLE_OBJC_ARC = YES; 175 | CLANG_ENABLE_OBJC_WEAK = YES; 176 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 177 | CLANG_WARN_BOOL_CONVERSION = YES; 178 | CLANG_WARN_COMMA = YES; 179 | CLANG_WARN_CONSTANT_CONVERSION = YES; 180 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 181 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 182 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 183 | CLANG_WARN_EMPTY_BODY = YES; 184 | CLANG_WARN_ENUM_CONVERSION = YES; 185 | CLANG_WARN_INFINITE_RECURSION = YES; 186 | CLANG_WARN_INT_CONVERSION = YES; 187 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 188 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 189 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 190 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 191 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 192 | CLANG_WARN_STRICT_PROTOTYPES = YES; 193 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 194 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 195 | CLANG_WARN_UNREACHABLE_CODE = YES; 196 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 197 | CODE_SIGN_IDENTITY = "iPhone Developer"; 198 | COPY_PHASE_STRIP = NO; 199 | DEBUG_INFORMATION_FORMAT = dwarf; 200 | ENABLE_STRICT_OBJC_MSGSEND = YES; 201 | ENABLE_TESTABILITY = YES; 202 | GCC_C_LANGUAGE_STANDARD = gnu11; 203 | GCC_DYNAMIC_NO_PIC = NO; 204 | GCC_NO_COMMON_BLOCKS = YES; 205 | GCC_OPTIMIZATION_LEVEL = 0; 206 | GCC_PREPROCESSOR_DEFINITIONS = ( 207 | "DEBUG=1", 208 | "$(inherited)", 209 | ); 210 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 211 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 212 | GCC_WARN_UNDECLARED_SELECTOR = YES; 213 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 214 | GCC_WARN_UNUSED_FUNCTION = YES; 215 | GCC_WARN_UNUSED_VARIABLE = YES; 216 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 217 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 218 | MTL_FAST_MATH = YES; 219 | ONLY_ACTIVE_ARCH = YES; 220 | SDKROOT = iphoneos; 221 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 222 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 223 | }; 224 | name = Debug; 225 | }; 226 | 4CC36C2721FD84C60044DE42 /* Release */ = { 227 | isa = XCBuildConfiguration; 228 | buildSettings = { 229 | ALWAYS_SEARCH_USER_PATHS = NO; 230 | CLANG_ANALYZER_NONNULL = YES; 231 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 232 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 233 | CLANG_CXX_LIBRARY = "libc++"; 234 | CLANG_ENABLE_MODULES = YES; 235 | CLANG_ENABLE_OBJC_ARC = YES; 236 | CLANG_ENABLE_OBJC_WEAK = YES; 237 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 238 | CLANG_WARN_BOOL_CONVERSION = YES; 239 | CLANG_WARN_COMMA = YES; 240 | CLANG_WARN_CONSTANT_CONVERSION = YES; 241 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 242 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 243 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 244 | CLANG_WARN_EMPTY_BODY = YES; 245 | CLANG_WARN_ENUM_CONVERSION = YES; 246 | CLANG_WARN_INFINITE_RECURSION = YES; 247 | CLANG_WARN_INT_CONVERSION = YES; 248 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 249 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 250 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 251 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 252 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 253 | CLANG_WARN_STRICT_PROTOTYPES = YES; 254 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 255 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 256 | CLANG_WARN_UNREACHABLE_CODE = YES; 257 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 258 | CODE_SIGN_IDENTITY = "iPhone Developer"; 259 | COPY_PHASE_STRIP = NO; 260 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 261 | ENABLE_NS_ASSERTIONS = NO; 262 | ENABLE_STRICT_OBJC_MSGSEND = YES; 263 | GCC_C_LANGUAGE_STANDARD = gnu11; 264 | GCC_NO_COMMON_BLOCKS = YES; 265 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 266 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 267 | GCC_WARN_UNDECLARED_SELECTOR = YES; 268 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 269 | GCC_WARN_UNUSED_FUNCTION = YES; 270 | GCC_WARN_UNUSED_VARIABLE = YES; 271 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 272 | MTL_ENABLE_DEBUG_INFO = NO; 273 | MTL_FAST_MATH = YES; 274 | SDKROOT = iphoneos; 275 | SWIFT_COMPILATION_MODE = wholemodule; 276 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 277 | VALIDATE_PRODUCT = YES; 278 | }; 279 | name = Release; 280 | }; 281 | 4CC36C2921FD84C60044DE42 /* Debug */ = { 282 | isa = XCBuildConfiguration; 283 | buildSettings = { 284 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 285 | CODE_SIGN_STYLE = Automatic; 286 | INFOPLIST_FILE = UndoManager/Info.plist; 287 | LD_RUNPATH_SEARCH_PATHS = ( 288 | "$(inherited)", 289 | "@executable_path/Frameworks", 290 | ); 291 | PRODUCT_BUNDLE_IDENTIFIER = com.raulriera.UndoManager; 292 | PRODUCT_NAME = "$(TARGET_NAME)"; 293 | SWIFT_VERSION = 4.2; 294 | TARGETED_DEVICE_FAMILY = "1,2"; 295 | }; 296 | name = Debug; 297 | }; 298 | 4CC36C2A21FD84C60044DE42 /* Release */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 302 | CODE_SIGN_STYLE = Automatic; 303 | INFOPLIST_FILE = UndoManager/Info.plist; 304 | LD_RUNPATH_SEARCH_PATHS = ( 305 | "$(inherited)", 306 | "@executable_path/Frameworks", 307 | ); 308 | PRODUCT_BUNDLE_IDENTIFIER = com.raulriera.UndoManager; 309 | PRODUCT_NAME = "$(TARGET_NAME)"; 310 | SWIFT_VERSION = 4.2; 311 | TARGETED_DEVICE_FAMILY = "1,2"; 312 | }; 313 | name = Release; 314 | }; 315 | /* End XCBuildConfiguration section */ 316 | 317 | /* Begin XCConfigurationList section */ 318 | 4CC36C1121FD84C40044DE42 /* Build configuration list for PBXProject "UndoManager" */ = { 319 | isa = XCConfigurationList; 320 | buildConfigurations = ( 321 | 4CC36C2621FD84C60044DE42 /* Debug */, 322 | 4CC36C2721FD84C60044DE42 /* Release */, 323 | ); 324 | defaultConfigurationIsVisible = 0; 325 | defaultConfigurationName = Release; 326 | }; 327 | 4CC36C2821FD84C60044DE42 /* Build configuration list for PBXNativeTarget "UndoManager" */ = { 328 | isa = XCConfigurationList; 329 | buildConfigurations = ( 330 | 4CC36C2921FD84C60044DE42 /* Debug */, 331 | 4CC36C2A21FD84C60044DE42 /* Release */, 332 | ); 333 | defaultConfigurationIsVisible = 0; 334 | defaultConfigurationName = Release; 335 | }; 336 | /* End XCConfigurationList section */ 337 | }; 338 | rootObject = 4CC36C0E21FD84C40044DE42 /* Project object */; 339 | } 340 | -------------------------------------------------------------------------------- /UIKit-Dynamics-in-the-real-world/DynamicBehavior.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4C10C1CD2070020A00BE6AD5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C10C1CC2070020A00BE6AD5 /* AppDelegate.swift */; }; 11 | 4C10C1CF2070020A00BE6AD5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C10C1CE2070020A00BE6AD5 /* ViewController.swift */; }; 12 | 4C10C1D22070020A00BE6AD5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C10C1D02070020A00BE6AD5 /* Main.storyboard */; }; 13 | 4C10C1D42070020B00BE6AD5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C10C1D32070020B00BE6AD5 /* Assets.xcassets */; }; 14 | 4C10C1D72070020B00BE6AD5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C10C1D52070020B00BE6AD5 /* LaunchScreen.storyboard */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 4C10C1C92070020A00BE6AD5 /* DynamicBehavior.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicBehavior.app; sourceTree = BUILT_PRODUCTS_DIR; }; 19 | 4C10C1CC2070020A00BE6AD5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 20 | 4C10C1CE2070020A00BE6AD5 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 21 | 4C10C1D12070020A00BE6AD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 22 | 4C10C1D32070020B00BE6AD5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 23 | 4C10C1D62070020B00BE6AD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 24 | 4C10C1D82070020B00BE6AD5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 25 | /* End PBXFileReference section */ 26 | 27 | /* Begin PBXFrameworksBuildPhase section */ 28 | 4C10C1C62070020A00BE6AD5 /* Frameworks */ = { 29 | isa = PBXFrameworksBuildPhase; 30 | buildActionMask = 2147483647; 31 | files = ( 32 | ); 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXFrameworksBuildPhase section */ 36 | 37 | /* Begin PBXGroup section */ 38 | 4C10C1C02070020A00BE6AD5 = { 39 | isa = PBXGroup; 40 | children = ( 41 | 4C10C1CB2070020A00BE6AD5 /* DynamicBehavior */, 42 | 4C10C1CA2070020A00BE6AD5 /* Products */, 43 | ); 44 | sourceTree = ""; 45 | }; 46 | 4C10C1CA2070020A00BE6AD5 /* Products */ = { 47 | isa = PBXGroup; 48 | children = ( 49 | 4C10C1C92070020A00BE6AD5 /* DynamicBehavior.app */, 50 | ); 51 | name = Products; 52 | sourceTree = ""; 53 | }; 54 | 4C10C1CB2070020A00BE6AD5 /* DynamicBehavior */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | 4C10C1CC2070020A00BE6AD5 /* AppDelegate.swift */, 58 | 4C10C1CE2070020A00BE6AD5 /* ViewController.swift */, 59 | 4C10C1D02070020A00BE6AD5 /* Main.storyboard */, 60 | 4C10C1D32070020B00BE6AD5 /* Assets.xcassets */, 61 | 4C10C1D52070020B00BE6AD5 /* LaunchScreen.storyboard */, 62 | 4C10C1D82070020B00BE6AD5 /* Info.plist */, 63 | ); 64 | path = DynamicBehavior; 65 | sourceTree = ""; 66 | }; 67 | /* End PBXGroup section */ 68 | 69 | /* Begin PBXNativeTarget section */ 70 | 4C10C1C82070020A00BE6AD5 /* DynamicBehavior */ = { 71 | isa = PBXNativeTarget; 72 | buildConfigurationList = 4C10C1DB2070020B00BE6AD5 /* Build configuration list for PBXNativeTarget "DynamicBehavior" */; 73 | buildPhases = ( 74 | 4C10C1C52070020A00BE6AD5 /* Sources */, 75 | 4C10C1C62070020A00BE6AD5 /* Frameworks */, 76 | 4C10C1C72070020A00BE6AD5 /* Resources */, 77 | ); 78 | buildRules = ( 79 | ); 80 | dependencies = ( 81 | ); 82 | name = DynamicBehavior; 83 | productName = DynamicBehavior; 84 | productReference = 4C10C1C92070020A00BE6AD5 /* DynamicBehavior.app */; 85 | productType = "com.apple.product-type.application"; 86 | }; 87 | /* End PBXNativeTarget section */ 88 | 89 | /* Begin PBXProject section */ 90 | 4C10C1C12070020A00BE6AD5 /* Project object */ = { 91 | isa = PBXProject; 92 | attributes = { 93 | LastSwiftUpdateCheck = 0930; 94 | LastUpgradeCheck = 0930; 95 | ORGANIZATIONNAME = "Raul Riera"; 96 | TargetAttributes = { 97 | 4C10C1C82070020A00BE6AD5 = { 98 | CreatedOnToolsVersion = 9.3; 99 | }; 100 | }; 101 | }; 102 | buildConfigurationList = 4C10C1C42070020A00BE6AD5 /* Build configuration list for PBXProject "DynamicBehavior" */; 103 | compatibilityVersion = "Xcode 9.3"; 104 | developmentRegion = en; 105 | hasScannedForEncodings = 0; 106 | knownRegions = ( 107 | en, 108 | Base, 109 | ); 110 | mainGroup = 4C10C1C02070020A00BE6AD5; 111 | productRefGroup = 4C10C1CA2070020A00BE6AD5 /* Products */; 112 | projectDirPath = ""; 113 | projectRoot = ""; 114 | targets = ( 115 | 4C10C1C82070020A00BE6AD5 /* DynamicBehavior */, 116 | ); 117 | }; 118 | /* End PBXProject section */ 119 | 120 | /* Begin PBXResourcesBuildPhase section */ 121 | 4C10C1C72070020A00BE6AD5 /* Resources */ = { 122 | isa = PBXResourcesBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | 4C10C1D72070020B00BE6AD5 /* LaunchScreen.storyboard in Resources */, 126 | 4C10C1D42070020B00BE6AD5 /* Assets.xcassets in Resources */, 127 | 4C10C1D22070020A00BE6AD5 /* Main.storyboard in Resources */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXResourcesBuildPhase section */ 132 | 133 | /* Begin PBXSourcesBuildPhase section */ 134 | 4C10C1C52070020A00BE6AD5 /* Sources */ = { 135 | isa = PBXSourcesBuildPhase; 136 | buildActionMask = 2147483647; 137 | files = ( 138 | 4C10C1CF2070020A00BE6AD5 /* ViewController.swift in Sources */, 139 | 4C10C1CD2070020A00BE6AD5 /* AppDelegate.swift in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin PBXVariantGroup section */ 146 | 4C10C1D02070020A00BE6AD5 /* Main.storyboard */ = { 147 | isa = PBXVariantGroup; 148 | children = ( 149 | 4C10C1D12070020A00BE6AD5 /* Base */, 150 | ); 151 | name = Main.storyboard; 152 | sourceTree = ""; 153 | }; 154 | 4C10C1D52070020B00BE6AD5 /* LaunchScreen.storyboard */ = { 155 | isa = PBXVariantGroup; 156 | children = ( 157 | 4C10C1D62070020B00BE6AD5 /* Base */, 158 | ); 159 | name = LaunchScreen.storyboard; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXVariantGroup section */ 163 | 164 | /* Begin XCBuildConfiguration section */ 165 | 4C10C1D92070020B00BE6AD5 /* Debug */ = { 166 | isa = XCBuildConfiguration; 167 | buildSettings = { 168 | ALWAYS_SEARCH_USER_PATHS = NO; 169 | CLANG_ANALYZER_NONNULL = YES; 170 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 171 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 172 | CLANG_CXX_LIBRARY = "libc++"; 173 | CLANG_ENABLE_MODULES = YES; 174 | CLANG_ENABLE_OBJC_ARC = YES; 175 | CLANG_ENABLE_OBJC_WEAK = YES; 176 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 177 | CLANG_WARN_BOOL_CONVERSION = YES; 178 | CLANG_WARN_COMMA = YES; 179 | CLANG_WARN_CONSTANT_CONVERSION = YES; 180 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 181 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 182 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 183 | CLANG_WARN_EMPTY_BODY = YES; 184 | CLANG_WARN_ENUM_CONVERSION = YES; 185 | CLANG_WARN_INFINITE_RECURSION = YES; 186 | CLANG_WARN_INT_CONVERSION = YES; 187 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 188 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 189 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 190 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 191 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 192 | CLANG_WARN_STRICT_PROTOTYPES = YES; 193 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 194 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 195 | CLANG_WARN_UNREACHABLE_CODE = YES; 196 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 197 | CODE_SIGN_IDENTITY = "iPhone Developer"; 198 | COPY_PHASE_STRIP = NO; 199 | DEBUG_INFORMATION_FORMAT = dwarf; 200 | ENABLE_STRICT_OBJC_MSGSEND = YES; 201 | ENABLE_TESTABILITY = YES; 202 | GCC_C_LANGUAGE_STANDARD = gnu11; 203 | GCC_DYNAMIC_NO_PIC = NO; 204 | GCC_NO_COMMON_BLOCKS = YES; 205 | GCC_OPTIMIZATION_LEVEL = 0; 206 | GCC_PREPROCESSOR_DEFINITIONS = ( 207 | "DEBUG=1", 208 | "$(inherited)", 209 | ); 210 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 211 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 212 | GCC_WARN_UNDECLARED_SELECTOR = YES; 213 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 214 | GCC_WARN_UNUSED_FUNCTION = YES; 215 | GCC_WARN_UNUSED_VARIABLE = YES; 216 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 217 | MTL_ENABLE_DEBUG_INFO = YES; 218 | ONLY_ACTIVE_ARCH = YES; 219 | SDKROOT = iphoneos; 220 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 221 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 222 | }; 223 | name = Debug; 224 | }; 225 | 4C10C1DA2070020B00BE6AD5 /* Release */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ALWAYS_SEARCH_USER_PATHS = NO; 229 | CLANG_ANALYZER_NONNULL = YES; 230 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 231 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 232 | CLANG_CXX_LIBRARY = "libc++"; 233 | CLANG_ENABLE_MODULES = YES; 234 | CLANG_ENABLE_OBJC_ARC = YES; 235 | CLANG_ENABLE_OBJC_WEAK = YES; 236 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 237 | CLANG_WARN_BOOL_CONVERSION = YES; 238 | CLANG_WARN_COMMA = YES; 239 | CLANG_WARN_CONSTANT_CONVERSION = YES; 240 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 241 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 242 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 243 | CLANG_WARN_EMPTY_BODY = YES; 244 | CLANG_WARN_ENUM_CONVERSION = YES; 245 | CLANG_WARN_INFINITE_RECURSION = YES; 246 | CLANG_WARN_INT_CONVERSION = YES; 247 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 248 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 249 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 250 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 251 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 252 | CLANG_WARN_STRICT_PROTOTYPES = YES; 253 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 254 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 255 | CLANG_WARN_UNREACHABLE_CODE = YES; 256 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 257 | CODE_SIGN_IDENTITY = "iPhone Developer"; 258 | COPY_PHASE_STRIP = NO; 259 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 260 | ENABLE_NS_ASSERTIONS = NO; 261 | ENABLE_STRICT_OBJC_MSGSEND = YES; 262 | GCC_C_LANGUAGE_STANDARD = gnu11; 263 | GCC_NO_COMMON_BLOCKS = YES; 264 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 265 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 266 | GCC_WARN_UNDECLARED_SELECTOR = YES; 267 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 268 | GCC_WARN_UNUSED_FUNCTION = YES; 269 | GCC_WARN_UNUSED_VARIABLE = YES; 270 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 271 | MTL_ENABLE_DEBUG_INFO = NO; 272 | SDKROOT = iphoneos; 273 | SWIFT_COMPILATION_MODE = wholemodule; 274 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 275 | VALIDATE_PRODUCT = YES; 276 | }; 277 | name = Release; 278 | }; 279 | 4C10C1DC2070020B00BE6AD5 /* Debug */ = { 280 | isa = XCBuildConfiguration; 281 | buildSettings = { 282 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 283 | CODE_SIGN_STYLE = Automatic; 284 | DEVELOPMENT_TEAM = R64MTWS872; 285 | INFOPLIST_FILE = DynamicBehavior/Info.plist; 286 | LD_RUNPATH_SEARCH_PATHS = ( 287 | "$(inherited)", 288 | "@executable_path/Frameworks", 289 | ); 290 | PRODUCT_BUNDLE_IDENTIFIER = com.raulriera.DynamicBehavior; 291 | PRODUCT_NAME = "$(TARGET_NAME)"; 292 | SWIFT_VERSION = 4.0; 293 | TARGETED_DEVICE_FAMILY = "1,2"; 294 | }; 295 | name = Debug; 296 | }; 297 | 4C10C1DD2070020B00BE6AD5 /* Release */ = { 298 | isa = XCBuildConfiguration; 299 | buildSettings = { 300 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 301 | CODE_SIGN_STYLE = Automatic; 302 | DEVELOPMENT_TEAM = R64MTWS872; 303 | INFOPLIST_FILE = DynamicBehavior/Info.plist; 304 | LD_RUNPATH_SEARCH_PATHS = ( 305 | "$(inherited)", 306 | "@executable_path/Frameworks", 307 | ); 308 | PRODUCT_BUNDLE_IDENTIFIER = com.raulriera.DynamicBehavior; 309 | PRODUCT_NAME = "$(TARGET_NAME)"; 310 | SWIFT_VERSION = 4.0; 311 | TARGETED_DEVICE_FAMILY = "1,2"; 312 | }; 313 | name = Release; 314 | }; 315 | /* End XCBuildConfiguration section */ 316 | 317 | /* Begin XCConfigurationList section */ 318 | 4C10C1C42070020A00BE6AD5 /* Build configuration list for PBXProject "DynamicBehavior" */ = { 319 | isa = XCConfigurationList; 320 | buildConfigurations = ( 321 | 4C10C1D92070020B00BE6AD5 /* Debug */, 322 | 4C10C1DA2070020B00BE6AD5 /* Release */, 323 | ); 324 | defaultConfigurationIsVisible = 0; 325 | defaultConfigurationName = Release; 326 | }; 327 | 4C10C1DB2070020B00BE6AD5 /* Build configuration list for PBXNativeTarget "DynamicBehavior" */ = { 328 | isa = XCConfigurationList; 329 | buildConfigurations = ( 330 | 4C10C1DC2070020B00BE6AD5 /* Debug */, 331 | 4C10C1DD2070020B00BE6AD5 /* Release */, 332 | ); 333 | defaultConfigurationIsVisible = 0; 334 | defaultConfigurationName = Release; 335 | }; 336 | /* End XCConfigurationList section */ 337 | }; 338 | rootObject = 4C10C1C12070020A00BE6AD5 /* Project object */; 339 | } 340 | -------------------------------------------------------------------------------- /UserInterfaceLevel-the-future-of-floating-apps/UserInterfaceLevel Example/UserInterfaceLevel Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4C19D4C4248BF2B300957BE0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C19D4C3248BF2B300957BE0 /* AppDelegate.swift */; }; 11 | 4C19D4C6248BF2B300957BE0 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C19D4C5248BF2B300957BE0 /* SceneDelegate.swift */; }; 12 | 4C19D4C8248BF2B300957BE0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C19D4C7248BF2B300957BE0 /* ViewController.swift */; }; 13 | 4C19D4CB248BF2B300957BE0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C19D4C9248BF2B300957BE0 /* Main.storyboard */; }; 14 | 4C19D4CD248BF2B600957BE0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C19D4CC248BF2B600957BE0 /* Assets.xcassets */; }; 15 | 4C19D4D0248BF2B600957BE0 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C19D4CE248BF2B600957BE0 /* LaunchScreen.storyboard */; }; 16 | 4C19D4D8248BF2D900957BE0 /* AdaptiveColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C19D4D7248BF2D900957BE0 /* AdaptiveColor.swift */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | 4C19D4C0248BF2B300957BE0 /* UserInterfaceLevel Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "UserInterfaceLevel Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | 4C19D4C3248BF2B300957BE0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 22 | 4C19D4C5248BF2B300957BE0 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 23 | 4C19D4C7248BF2B300957BE0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 24 | 4C19D4CA248BF2B300957BE0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 25 | 4C19D4CC248BF2B600957BE0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 26 | 4C19D4CF248BF2B600957BE0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 27 | 4C19D4D1248BF2B600957BE0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 28 | 4C19D4D7248BF2D900957BE0 /* AdaptiveColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveColor.swift; sourceTree = ""; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXFrameworksBuildPhase section */ 32 | 4C19D4BD248BF2B300957BE0 /* Frameworks */ = { 33 | isa = PBXFrameworksBuildPhase; 34 | buildActionMask = 2147483647; 35 | files = ( 36 | ); 37 | runOnlyForDeploymentPostprocessing = 0; 38 | }; 39 | /* End PBXFrameworksBuildPhase section */ 40 | 41 | /* Begin PBXGroup section */ 42 | 4C19D4B7248BF2B300957BE0 = { 43 | isa = PBXGroup; 44 | children = ( 45 | 4C19D4C2248BF2B300957BE0 /* UserInterfaceLevel Example */, 46 | 4C19D4C1248BF2B300957BE0 /* Products */, 47 | ); 48 | sourceTree = ""; 49 | }; 50 | 4C19D4C1248BF2B300957BE0 /* Products */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 4C19D4C0248BF2B300957BE0 /* UserInterfaceLevel Example.app */, 54 | ); 55 | name = Products; 56 | sourceTree = ""; 57 | }; 58 | 4C19D4C2248BF2B300957BE0 /* UserInterfaceLevel Example */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 4C19D4C3248BF2B300957BE0 /* AppDelegate.swift */, 62 | 4C19D4C5248BF2B300957BE0 /* SceneDelegate.swift */, 63 | 4C19D4D1248BF2B600957BE0 /* Info.plist */, 64 | 4C19D4D9248BF2E600957BE0 /* Resources */, 65 | 4C19D4DA248BF2F100957BE0 /* Source */, 66 | ); 67 | path = "UserInterfaceLevel Example"; 68 | sourceTree = ""; 69 | }; 70 | 4C19D4D9248BF2E600957BE0 /* Resources */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | 4C19D4C9248BF2B300957BE0 /* Main.storyboard */, 74 | 4C19D4CC248BF2B600957BE0 /* Assets.xcassets */, 75 | 4C19D4CE248BF2B600957BE0 /* LaunchScreen.storyboard */, 76 | ); 77 | path = Resources; 78 | sourceTree = ""; 79 | }; 80 | 4C19D4DA248BF2F100957BE0 /* Source */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 4C19D4C7248BF2B300957BE0 /* ViewController.swift */, 84 | 4C19D4D7248BF2D900957BE0 /* AdaptiveColor.swift */, 85 | ); 86 | path = Source; 87 | sourceTree = ""; 88 | }; 89 | /* End PBXGroup section */ 90 | 91 | /* Begin PBXNativeTarget section */ 92 | 4C19D4BF248BF2B300957BE0 /* UserInterfaceLevel Example */ = { 93 | isa = PBXNativeTarget; 94 | buildConfigurationList = 4C19D4D4248BF2B600957BE0 /* Build configuration list for PBXNativeTarget "UserInterfaceLevel Example" */; 95 | buildPhases = ( 96 | 4C19D4BC248BF2B300957BE0 /* Sources */, 97 | 4C19D4BD248BF2B300957BE0 /* Frameworks */, 98 | 4C19D4BE248BF2B300957BE0 /* Resources */, 99 | ); 100 | buildRules = ( 101 | ); 102 | dependencies = ( 103 | ); 104 | name = "UserInterfaceLevel Example"; 105 | productName = "UserInterfaceLevel Example"; 106 | productReference = 4C19D4C0248BF2B300957BE0 /* UserInterfaceLevel Example.app */; 107 | productType = "com.apple.product-type.application"; 108 | }; 109 | /* End PBXNativeTarget section */ 110 | 111 | /* Begin PBXProject section */ 112 | 4C19D4B8248BF2B300957BE0 /* Project object */ = { 113 | isa = PBXProject; 114 | attributes = { 115 | LastSwiftUpdateCheck = 1150; 116 | LastUpgradeCheck = 1150; 117 | ORGANIZATIONNAME = "Raul Riera"; 118 | TargetAttributes = { 119 | 4C19D4BF248BF2B300957BE0 = { 120 | CreatedOnToolsVersion = 11.5; 121 | }; 122 | }; 123 | }; 124 | buildConfigurationList = 4C19D4BB248BF2B300957BE0 /* Build configuration list for PBXProject "UserInterfaceLevel Example" */; 125 | compatibilityVersion = "Xcode 9.3"; 126 | developmentRegion = en; 127 | hasScannedForEncodings = 0; 128 | knownRegions = ( 129 | en, 130 | Base, 131 | ); 132 | mainGroup = 4C19D4B7248BF2B300957BE0; 133 | productRefGroup = 4C19D4C1248BF2B300957BE0 /* Products */; 134 | projectDirPath = ""; 135 | projectRoot = ""; 136 | targets = ( 137 | 4C19D4BF248BF2B300957BE0 /* UserInterfaceLevel Example */, 138 | ); 139 | }; 140 | /* End PBXProject section */ 141 | 142 | /* Begin PBXResourcesBuildPhase section */ 143 | 4C19D4BE248BF2B300957BE0 /* Resources */ = { 144 | isa = PBXResourcesBuildPhase; 145 | buildActionMask = 2147483647; 146 | files = ( 147 | 4C19D4D0248BF2B600957BE0 /* LaunchScreen.storyboard in Resources */, 148 | 4C19D4CD248BF2B600957BE0 /* Assets.xcassets in Resources */, 149 | 4C19D4CB248BF2B300957BE0 /* Main.storyboard in Resources */, 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | /* End PBXResourcesBuildPhase section */ 154 | 155 | /* Begin PBXSourcesBuildPhase section */ 156 | 4C19D4BC248BF2B300957BE0 /* Sources */ = { 157 | isa = PBXSourcesBuildPhase; 158 | buildActionMask = 2147483647; 159 | files = ( 160 | 4C19D4C8248BF2B300957BE0 /* ViewController.swift in Sources */, 161 | 4C19D4C4248BF2B300957BE0 /* AppDelegate.swift in Sources */, 162 | 4C19D4C6248BF2B300957BE0 /* SceneDelegate.swift in Sources */, 163 | 4C19D4D8248BF2D900957BE0 /* AdaptiveColor.swift in Sources */, 164 | ); 165 | runOnlyForDeploymentPostprocessing = 0; 166 | }; 167 | /* End PBXSourcesBuildPhase section */ 168 | 169 | /* Begin PBXVariantGroup section */ 170 | 4C19D4C9248BF2B300957BE0 /* Main.storyboard */ = { 171 | isa = PBXVariantGroup; 172 | children = ( 173 | 4C19D4CA248BF2B300957BE0 /* Base */, 174 | ); 175 | name = Main.storyboard; 176 | sourceTree = ""; 177 | }; 178 | 4C19D4CE248BF2B600957BE0 /* LaunchScreen.storyboard */ = { 179 | isa = PBXVariantGroup; 180 | children = ( 181 | 4C19D4CF248BF2B600957BE0 /* Base */, 182 | ); 183 | name = LaunchScreen.storyboard; 184 | sourceTree = ""; 185 | }; 186 | /* End PBXVariantGroup section */ 187 | 188 | /* Begin XCBuildConfiguration section */ 189 | 4C19D4D2248BF2B600957BE0 /* Debug */ = { 190 | isa = XCBuildConfiguration; 191 | buildSettings = { 192 | ALWAYS_SEARCH_USER_PATHS = NO; 193 | CLANG_ANALYZER_NONNULL = YES; 194 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 195 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 196 | CLANG_CXX_LIBRARY = "libc++"; 197 | CLANG_ENABLE_MODULES = YES; 198 | CLANG_ENABLE_OBJC_ARC = YES; 199 | CLANG_ENABLE_OBJC_WEAK = YES; 200 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 201 | CLANG_WARN_BOOL_CONVERSION = YES; 202 | CLANG_WARN_COMMA = YES; 203 | CLANG_WARN_CONSTANT_CONVERSION = YES; 204 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 205 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 206 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 207 | CLANG_WARN_EMPTY_BODY = YES; 208 | CLANG_WARN_ENUM_CONVERSION = YES; 209 | CLANG_WARN_INFINITE_RECURSION = YES; 210 | CLANG_WARN_INT_CONVERSION = YES; 211 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 212 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 213 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 214 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 215 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 216 | CLANG_WARN_STRICT_PROTOTYPES = YES; 217 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 218 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 219 | CLANG_WARN_UNREACHABLE_CODE = YES; 220 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 221 | COPY_PHASE_STRIP = NO; 222 | DEBUG_INFORMATION_FORMAT = dwarf; 223 | ENABLE_STRICT_OBJC_MSGSEND = YES; 224 | ENABLE_TESTABILITY = YES; 225 | GCC_C_LANGUAGE_STANDARD = gnu11; 226 | GCC_DYNAMIC_NO_PIC = NO; 227 | GCC_NO_COMMON_BLOCKS = YES; 228 | GCC_OPTIMIZATION_LEVEL = 0; 229 | GCC_PREPROCESSOR_DEFINITIONS = ( 230 | "DEBUG=1", 231 | "$(inherited)", 232 | ); 233 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 234 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 235 | GCC_WARN_UNDECLARED_SELECTOR = YES; 236 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 237 | GCC_WARN_UNUSED_FUNCTION = YES; 238 | GCC_WARN_UNUSED_VARIABLE = YES; 239 | IPHONEOS_DEPLOYMENT_TARGET = 13.5; 240 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 241 | MTL_FAST_MATH = YES; 242 | ONLY_ACTIVE_ARCH = YES; 243 | SDKROOT = iphoneos; 244 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 245 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 246 | }; 247 | name = Debug; 248 | }; 249 | 4C19D4D3248BF2B600957BE0 /* Release */ = { 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++14"; 256 | CLANG_CXX_LIBRARY = "libc++"; 257 | CLANG_ENABLE_MODULES = YES; 258 | CLANG_ENABLE_OBJC_ARC = YES; 259 | CLANG_ENABLE_OBJC_WEAK = YES; 260 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 261 | CLANG_WARN_BOOL_CONVERSION = YES; 262 | CLANG_WARN_COMMA = YES; 263 | CLANG_WARN_CONSTANT_CONVERSION = YES; 264 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 265 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 266 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 267 | CLANG_WARN_EMPTY_BODY = YES; 268 | CLANG_WARN_ENUM_CONVERSION = YES; 269 | CLANG_WARN_INFINITE_RECURSION = YES; 270 | CLANG_WARN_INT_CONVERSION = YES; 271 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 272 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 273 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 274 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 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-with-dsym"; 283 | ENABLE_NS_ASSERTIONS = NO; 284 | ENABLE_STRICT_OBJC_MSGSEND = YES; 285 | GCC_C_LANGUAGE_STANDARD = gnu11; 286 | GCC_NO_COMMON_BLOCKS = YES; 287 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 288 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 289 | GCC_WARN_UNDECLARED_SELECTOR = YES; 290 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 291 | GCC_WARN_UNUSED_FUNCTION = YES; 292 | GCC_WARN_UNUSED_VARIABLE = YES; 293 | IPHONEOS_DEPLOYMENT_TARGET = 13.5; 294 | MTL_ENABLE_DEBUG_INFO = NO; 295 | MTL_FAST_MATH = YES; 296 | SDKROOT = iphoneos; 297 | SWIFT_COMPILATION_MODE = wholemodule; 298 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 299 | VALIDATE_PRODUCT = YES; 300 | }; 301 | name = Release; 302 | }; 303 | 4C19D4D5248BF2B600957BE0 /* Debug */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 307 | CODE_SIGN_STYLE = Automatic; 308 | INFOPLIST_FILE = "UserInterfaceLevel Example/Info.plist"; 309 | LD_RUNPATH_SEARCH_PATHS = ( 310 | "$(inherited)", 311 | "@executable_path/Frameworks", 312 | ); 313 | PRODUCT_BUNDLE_IDENTIFIER = "com.raulriera.UserInterfaceLevel-Example"; 314 | PRODUCT_NAME = "$(TARGET_NAME)"; 315 | SWIFT_VERSION = 5.0; 316 | TARGETED_DEVICE_FAMILY = "1,2"; 317 | }; 318 | name = Debug; 319 | }; 320 | 4C19D4D6248BF2B600957BE0 /* Release */ = { 321 | isa = XCBuildConfiguration; 322 | buildSettings = { 323 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 324 | CODE_SIGN_STYLE = Automatic; 325 | INFOPLIST_FILE = "UserInterfaceLevel Example/Info.plist"; 326 | LD_RUNPATH_SEARCH_PATHS = ( 327 | "$(inherited)", 328 | "@executable_path/Frameworks", 329 | ); 330 | PRODUCT_BUNDLE_IDENTIFIER = "com.raulriera.UserInterfaceLevel-Example"; 331 | PRODUCT_NAME = "$(TARGET_NAME)"; 332 | SWIFT_VERSION = 5.0; 333 | TARGETED_DEVICE_FAMILY = "1,2"; 334 | }; 335 | name = Release; 336 | }; 337 | /* End XCBuildConfiguration section */ 338 | 339 | /* Begin XCConfigurationList section */ 340 | 4C19D4BB248BF2B300957BE0 /* Build configuration list for PBXProject "UserInterfaceLevel Example" */ = { 341 | isa = XCConfigurationList; 342 | buildConfigurations = ( 343 | 4C19D4D2248BF2B600957BE0 /* Debug */, 344 | 4C19D4D3248BF2B600957BE0 /* Release */, 345 | ); 346 | defaultConfigurationIsVisible = 0; 347 | defaultConfigurationName = Release; 348 | }; 349 | 4C19D4D4248BF2B600957BE0 /* Build configuration list for PBXNativeTarget "UserInterfaceLevel Example" */ = { 350 | isa = XCConfigurationList; 351 | buildConfigurations = ( 352 | 4C19D4D5248BF2B600957BE0 /* Debug */, 353 | 4C19D4D6248BF2B600957BE0 /* Release */, 354 | ); 355 | defaultConfigurationIsVisible = 0; 356 | defaultConfigurationName = Release; 357 | }; 358 | /* End XCConfigurationList section */ 359 | }; 360 | rootObject = 4C19D4B8248BF2B300957BE0 /* Project object */; 361 | } 362 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 2/Project-01.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4C4A21A51FD2FB8700792DF4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21A41FD2FB8700792DF4 /* AppDelegate.swift */; }; 11 | 4C4A21A71FD2FB8700792DF4 /* MovieViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21A61FD2FB8700792DF4 /* MovieViewController.swift */; }; 12 | 4C4A21AC1FD2FB8700792DF4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C4A21AB1FD2FB8700792DF4 /* Assets.xcassets */; }; 13 | 4C4A21AF1FD2FB8700792DF4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C4A21AD1FD2FB8700792DF4 /* LaunchScreen.storyboard */; }; 14 | 4C4A21B81FD2FD5C00792DF4 /* FunctionalTableData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C4A21B71FD2FD5C00792DF4 /* FunctionalTableData.framework */; }; 15 | 4C4A21BA1FD2FD5D00792DF4 /* ActionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C4A21B91FD2FD5D00792DF4 /* ActionKit.framework */; }; 16 | 4C4A21BD1FD3A3AE00792DF4 /* FunctionalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21BC1FD3A3AE00792DF4 /* FunctionalViewController.swift */; }; 17 | 4C4A21BF1FD3AA9600792DF4 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21BE1FD3AA9600792DF4 /* LabelCell.swift */; }; 18 | 4C4A21C31FD48C8C00792DF4 /* Movie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21C21FD48C8C00792DF4 /* Movie.swift */; }; 19 | 4C4A21C61FD48D0E00792DF4 /* ButtonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21C51FD48D0E00792DF4 /* ButtonCell.swift */; }; 20 | 4C67E8F11FD49AA9007AAF0A /* Movies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67E8F01FD49AA9007AAF0A /* Movies.swift */; }; 21 | 4C67E8F31FD49BC8007AAF0A /* MoviesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67E8F21FD49BC8007AAF0A /* MoviesViewController.swift */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 4C4A21A11FD2FB8700792DF4 /* Project-01.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Project-01.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 4C4A21A41FD2FB8700792DF4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 27 | 4C4A21A61FD2FB8700792DF4 /* MovieViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieViewController.swift; sourceTree = ""; }; 28 | 4C4A21AB1FD2FB8700792DF4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 29 | 4C4A21AE1FD2FB8700792DF4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 30 | 4C4A21B01FD2FB8700792DF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 31 | 4C4A21B71FD2FD5C00792DF4 /* FunctionalTableData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FunctionalTableData.framework; path = Carthage/Build/iOS/FunctionalTableData.framework; sourceTree = ""; }; 32 | 4C4A21B91FD2FD5D00792DF4 /* ActionKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ActionKit.framework; path = Carthage/Build/iOS/ActionKit.framework; sourceTree = ""; }; 33 | 4C4A21BC1FD3A3AE00792DF4 /* FunctionalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionalViewController.swift; sourceTree = ""; }; 34 | 4C4A21BE1FD3AA9600792DF4 /* LabelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelCell.swift; sourceTree = ""; }; 35 | 4C4A21C21FD48C8C00792DF4 /* Movie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Movie.swift; sourceTree = ""; }; 36 | 4C4A21C51FD48D0E00792DF4 /* ButtonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonCell.swift; sourceTree = ""; }; 37 | 4C67E8F01FD49AA9007AAF0A /* Movies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Movies.swift; sourceTree = ""; }; 38 | 4C67E8F21FD49BC8007AAF0A /* MoviesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesViewController.swift; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | 4C4A219E1FD2FB8700792DF4 /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | 4C4A21B81FD2FD5C00792DF4 /* FunctionalTableData.framework in Frameworks */, 47 | 4C4A21BA1FD2FD5D00792DF4 /* ActionKit.framework in Frameworks */, 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXFrameworksBuildPhase section */ 52 | 53 | /* Begin PBXGroup section */ 54 | 4C4A21981FD2FB8700792DF4 = { 55 | isa = PBXGroup; 56 | children = ( 57 | 4C4A21A31FD2FB8700792DF4 /* Project-01 */, 58 | 4C4A21A21FD2FB8700792DF4 /* Products */, 59 | 4C4A21B61FD2FD5B00792DF4 /* Frameworks */, 60 | ); 61 | sourceTree = ""; 62 | }; 63 | 4C4A21A21FD2FB8700792DF4 /* Products */ = { 64 | isa = PBXGroup; 65 | children = ( 66 | 4C4A21A11FD2FB8700792DF4 /* Project-01.app */, 67 | ); 68 | name = Products; 69 | sourceTree = ""; 70 | }; 71 | 4C4A21A31FD2FB8700792DF4 /* Project-01 */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | 4C4A21A41FD2FB8700792DF4 /* AppDelegate.swift */, 75 | 4C4A21C41FD48CF300792DF4 /* Models */, 76 | 4C4A21C11FD3AAAC00792DF4 /* View Controllers */, 77 | 4C4A21C01FD3AA9B00792DF4 /* Cells */, 78 | 4C4A21AB1FD2FB8700792DF4 /* Assets.xcassets */, 79 | 4C4A21AD1FD2FB8700792DF4 /* LaunchScreen.storyboard */, 80 | 4C4A21B01FD2FB8700792DF4 /* Info.plist */, 81 | ); 82 | path = "Project-01"; 83 | sourceTree = ""; 84 | }; 85 | 4C4A21B61FD2FD5B00792DF4 /* Frameworks */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 4C4A21B91FD2FD5D00792DF4 /* ActionKit.framework */, 89 | 4C4A21B71FD2FD5C00792DF4 /* FunctionalTableData.framework */, 90 | ); 91 | name = Frameworks; 92 | sourceTree = ""; 93 | }; 94 | 4C4A21C01FD3AA9B00792DF4 /* Cells */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 4C4A21BE1FD3AA9600792DF4 /* LabelCell.swift */, 98 | 4C4A21C51FD48D0E00792DF4 /* ButtonCell.swift */, 99 | ); 100 | path = Cells; 101 | sourceTree = ""; 102 | }; 103 | 4C4A21C11FD3AAAC00792DF4 /* View Controllers */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 4C4A21A61FD2FB8700792DF4 /* MovieViewController.swift */, 107 | 4C67E8F21FD49BC8007AAF0A /* MoviesViewController.swift */, 108 | 4C4A21BC1FD3A3AE00792DF4 /* FunctionalViewController.swift */, 109 | ); 110 | path = "View Controllers"; 111 | sourceTree = ""; 112 | }; 113 | 4C4A21C41FD48CF300792DF4 /* Models */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 4C4A21C21FD48C8C00792DF4 /* Movie.swift */, 117 | 4C67E8F01FD49AA9007AAF0A /* Movies.swift */, 118 | ); 119 | path = Models; 120 | sourceTree = ""; 121 | }; 122 | /* End PBXGroup section */ 123 | 124 | /* Begin PBXNativeTarget section */ 125 | 4C4A21A01FD2FB8700792DF4 /* Project-01 */ = { 126 | isa = PBXNativeTarget; 127 | buildConfigurationList = 4C4A21B31FD2FB8700792DF4 /* Build configuration list for PBXNativeTarget "Project-01" */; 128 | buildPhases = ( 129 | 4C4A219D1FD2FB8700792DF4 /* Sources */, 130 | 4C4A219E1FD2FB8700792DF4 /* Frameworks */, 131 | 4C4A219F1FD2FB8700792DF4 /* Resources */, 132 | 4C4A21BB1FD2FD7000792DF4 /* Carthage Script */, 133 | ); 134 | buildRules = ( 135 | ); 136 | dependencies = ( 137 | ); 138 | name = "Project-01"; 139 | productName = "Project-01"; 140 | productReference = 4C4A21A11FD2FB8700792DF4 /* Project-01.app */; 141 | productType = "com.apple.product-type.application"; 142 | }; 143 | /* End PBXNativeTarget section */ 144 | 145 | /* Begin PBXProject section */ 146 | 4C4A21991FD2FB8700792DF4 /* Project object */ = { 147 | isa = PBXProject; 148 | attributes = { 149 | LastSwiftUpdateCheck = 0910; 150 | LastUpgradeCheck = 0910; 151 | ORGANIZATIONNAME = "Raul Riera"; 152 | TargetAttributes = { 153 | 4C4A21A01FD2FB8700792DF4 = { 154 | CreatedOnToolsVersion = 9.1; 155 | ProvisioningStyle = Automatic; 156 | }; 157 | }; 158 | }; 159 | buildConfigurationList = 4C4A219C1FD2FB8700792DF4 /* Build configuration list for PBXProject "Project-01" */; 160 | compatibilityVersion = "Xcode 8.0"; 161 | developmentRegion = en; 162 | hasScannedForEncodings = 0; 163 | knownRegions = ( 164 | en, 165 | Base, 166 | ); 167 | mainGroup = 4C4A21981FD2FB8700792DF4; 168 | productRefGroup = 4C4A21A21FD2FB8700792DF4 /* Products */; 169 | projectDirPath = ""; 170 | projectRoot = ""; 171 | targets = ( 172 | 4C4A21A01FD2FB8700792DF4 /* Project-01 */, 173 | ); 174 | }; 175 | /* End PBXProject section */ 176 | 177 | /* Begin PBXResourcesBuildPhase section */ 178 | 4C4A219F1FD2FB8700792DF4 /* Resources */ = { 179 | isa = PBXResourcesBuildPhase; 180 | buildActionMask = 2147483647; 181 | files = ( 182 | 4C4A21AF1FD2FB8700792DF4 /* LaunchScreen.storyboard in Resources */, 183 | 4C4A21AC1FD2FB8700792DF4 /* Assets.xcassets in Resources */, 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | /* End PBXResourcesBuildPhase section */ 188 | 189 | /* Begin PBXShellScriptBuildPhase section */ 190 | 4C4A21BB1FD2FD7000792DF4 /* Carthage Script */ = { 191 | isa = PBXShellScriptBuildPhase; 192 | buildActionMask = 2147483647; 193 | files = ( 194 | ); 195 | inputPaths = ( 196 | "$(SRCROOT)/Carthage/Build/iOS/FunctionalTableData.framework", 197 | "$(SRCROOT)/Carthage/Build/iOS/ActionKit.framework", 198 | ); 199 | name = "Carthage Script"; 200 | outputPaths = ( 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | shellPath = /bin/sh; 204 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 205 | }; 206 | /* End PBXShellScriptBuildPhase section */ 207 | 208 | /* Begin PBXSourcesBuildPhase section */ 209 | 4C4A219D1FD2FB8700792DF4 /* Sources */ = { 210 | isa = PBXSourcesBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | 4C67E8F11FD49AA9007AAF0A /* Movies.swift in Sources */, 214 | 4C4A21A71FD2FB8700792DF4 /* MovieViewController.swift in Sources */, 215 | 4C4A21A51FD2FB8700792DF4 /* AppDelegate.swift in Sources */, 216 | 4C4A21BF1FD3AA9600792DF4 /* LabelCell.swift in Sources */, 217 | 4C4A21BD1FD3A3AE00792DF4 /* FunctionalViewController.swift in Sources */, 218 | 4C4A21C31FD48C8C00792DF4 /* Movie.swift in Sources */, 219 | 4C4A21C61FD48D0E00792DF4 /* ButtonCell.swift in Sources */, 220 | 4C67E8F31FD49BC8007AAF0A /* MoviesViewController.swift in Sources */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | /* End PBXSourcesBuildPhase section */ 225 | 226 | /* Begin PBXVariantGroup section */ 227 | 4C4A21AD1FD2FB8700792DF4 /* LaunchScreen.storyboard */ = { 228 | isa = PBXVariantGroup; 229 | children = ( 230 | 4C4A21AE1FD2FB8700792DF4 /* Base */, 231 | ); 232 | name = LaunchScreen.storyboard; 233 | sourceTree = ""; 234 | }; 235 | /* End PBXVariantGroup section */ 236 | 237 | /* Begin XCBuildConfiguration section */ 238 | 4C4A21B11FD2FB8700792DF4 /* Debug */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_ANALYZER_NONNULL = YES; 243 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 244 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 245 | CLANG_CXX_LIBRARY = "libc++"; 246 | CLANG_ENABLE_MODULES = YES; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 249 | CLANG_WARN_BOOL_CONVERSION = YES; 250 | CLANG_WARN_COMMA = YES; 251 | CLANG_WARN_CONSTANT_CONVERSION = YES; 252 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 253 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 254 | CLANG_WARN_EMPTY_BODY = YES; 255 | CLANG_WARN_ENUM_CONVERSION = YES; 256 | CLANG_WARN_INFINITE_RECURSION = YES; 257 | CLANG_WARN_INT_CONVERSION = YES; 258 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 259 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 260 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 261 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 262 | CLANG_WARN_STRICT_PROTOTYPES = YES; 263 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 264 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 265 | CLANG_WARN_UNREACHABLE_CODE = YES; 266 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 267 | CODE_SIGN_IDENTITY = "iPhone Developer"; 268 | COPY_PHASE_STRIP = NO; 269 | DEBUG_INFORMATION_FORMAT = dwarf; 270 | ENABLE_STRICT_OBJC_MSGSEND = YES; 271 | ENABLE_TESTABILITY = YES; 272 | GCC_C_LANGUAGE_STANDARD = gnu11; 273 | GCC_DYNAMIC_NO_PIC = NO; 274 | GCC_NO_COMMON_BLOCKS = YES; 275 | GCC_OPTIMIZATION_LEVEL = 0; 276 | GCC_PREPROCESSOR_DEFINITIONS = ( 277 | "DEBUG=1", 278 | "$(inherited)", 279 | ); 280 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 281 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 282 | GCC_WARN_UNDECLARED_SELECTOR = YES; 283 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 284 | GCC_WARN_UNUSED_FUNCTION = YES; 285 | GCC_WARN_UNUSED_VARIABLE = YES; 286 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 287 | MTL_ENABLE_DEBUG_INFO = YES; 288 | ONLY_ACTIVE_ARCH = YES; 289 | SDKROOT = iphoneos; 290 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 291 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 292 | }; 293 | name = Debug; 294 | }; 295 | 4C4A21B21FD2FB8700792DF4 /* Release */ = { 296 | isa = XCBuildConfiguration; 297 | buildSettings = { 298 | ALWAYS_SEARCH_USER_PATHS = NO; 299 | CLANG_ANALYZER_NONNULL = YES; 300 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 301 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 302 | CLANG_CXX_LIBRARY = "libc++"; 303 | CLANG_ENABLE_MODULES = YES; 304 | CLANG_ENABLE_OBJC_ARC = YES; 305 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 306 | CLANG_WARN_BOOL_CONVERSION = YES; 307 | CLANG_WARN_COMMA = YES; 308 | CLANG_WARN_CONSTANT_CONVERSION = YES; 309 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 310 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 311 | CLANG_WARN_EMPTY_BODY = YES; 312 | CLANG_WARN_ENUM_CONVERSION = YES; 313 | CLANG_WARN_INFINITE_RECURSION = YES; 314 | CLANG_WARN_INT_CONVERSION = YES; 315 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 316 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 317 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 318 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 319 | CLANG_WARN_STRICT_PROTOTYPES = YES; 320 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 321 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 322 | CLANG_WARN_UNREACHABLE_CODE = YES; 323 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 324 | CODE_SIGN_IDENTITY = "iPhone Developer"; 325 | COPY_PHASE_STRIP = NO; 326 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 327 | ENABLE_NS_ASSERTIONS = NO; 328 | ENABLE_STRICT_OBJC_MSGSEND = YES; 329 | GCC_C_LANGUAGE_STANDARD = gnu11; 330 | GCC_NO_COMMON_BLOCKS = YES; 331 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 332 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 333 | GCC_WARN_UNDECLARED_SELECTOR = YES; 334 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 335 | GCC_WARN_UNUSED_FUNCTION = YES; 336 | GCC_WARN_UNUSED_VARIABLE = YES; 337 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 338 | MTL_ENABLE_DEBUG_INFO = NO; 339 | SDKROOT = iphoneos; 340 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 341 | VALIDATE_PRODUCT = YES; 342 | }; 343 | name = Release; 344 | }; 345 | 4C4A21B41FD2FB8700792DF4 /* Debug */ = { 346 | isa = XCBuildConfiguration; 347 | buildSettings = { 348 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 349 | CODE_SIGN_STYLE = Automatic; 350 | DEVELOPMENT_TEAM = R64MTWS872; 351 | FRAMEWORK_SEARCH_PATHS = ( 352 | "$(inherited)", 353 | "$(PROJECT_DIR)/Carthage/Build/iOS", 354 | ); 355 | INFOPLIST_FILE = "Project-01/Info.plist"; 356 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 357 | PRODUCT_BUNDLE_IDENTIFIER = "com.raulriera.Project-01"; 358 | PRODUCT_NAME = "$(TARGET_NAME)"; 359 | SWIFT_VERSION = 4.0; 360 | TARGETED_DEVICE_FAMILY = "1,2"; 361 | }; 362 | name = Debug; 363 | }; 364 | 4C4A21B51FD2FB8700792DF4 /* Release */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 368 | CODE_SIGN_STYLE = Automatic; 369 | DEVELOPMENT_TEAM = R64MTWS872; 370 | FRAMEWORK_SEARCH_PATHS = ( 371 | "$(inherited)", 372 | "$(PROJECT_DIR)/Carthage/Build/iOS", 373 | ); 374 | INFOPLIST_FILE = "Project-01/Info.plist"; 375 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 376 | PRODUCT_BUNDLE_IDENTIFIER = "com.raulriera.Project-01"; 377 | PRODUCT_NAME = "$(TARGET_NAME)"; 378 | SWIFT_VERSION = 4.0; 379 | TARGETED_DEVICE_FAMILY = "1,2"; 380 | }; 381 | name = Release; 382 | }; 383 | /* End XCBuildConfiguration section */ 384 | 385 | /* Begin XCConfigurationList section */ 386 | 4C4A219C1FD2FB8700792DF4 /* Build configuration list for PBXProject "Project-01" */ = { 387 | isa = XCConfigurationList; 388 | buildConfigurations = ( 389 | 4C4A21B11FD2FB8700792DF4 /* Debug */, 390 | 4C4A21B21FD2FB8700792DF4 /* Release */, 391 | ); 392 | defaultConfigurationIsVisible = 0; 393 | defaultConfigurationName = Release; 394 | }; 395 | 4C4A21B31FD2FB8700792DF4 /* Build configuration list for PBXNativeTarget "Project-01" */ = { 396 | isa = XCConfigurationList; 397 | buildConfigurations = ( 398 | 4C4A21B41FD2FB8700792DF4 /* Debug */, 399 | 4C4A21B51FD2FB8700792DF4 /* Release */, 400 | ); 401 | defaultConfigurationIsVisible = 0; 402 | defaultConfigurationName = Release; 403 | }; 404 | /* End XCConfigurationList section */ 405 | }; 406 | rootObject = 4C4A21991FD2FB8700792DF4 /* Project object */; 407 | } 408 | -------------------------------------------------------------------------------- /Building-Apps-With-FunctionalTableData/Part 3/Project-01.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4C4A21A51FD2FB8700792DF4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21A41FD2FB8700792DF4 /* AppDelegate.swift */; }; 11 | 4C4A21A71FD2FB8700792DF4 /* MovieViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21A61FD2FB8700792DF4 /* MovieViewController.swift */; }; 12 | 4C4A21AC1FD2FB8700792DF4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C4A21AB1FD2FB8700792DF4 /* Assets.xcassets */; }; 13 | 4C4A21AF1FD2FB8700792DF4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C4A21AD1FD2FB8700792DF4 /* LaunchScreen.storyboard */; }; 14 | 4C4A21B81FD2FD5C00792DF4 /* FunctionalTableData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C4A21B71FD2FD5C00792DF4 /* FunctionalTableData.framework */; }; 15 | 4C4A21BA1FD2FD5D00792DF4 /* ActionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C4A21B91FD2FD5D00792DF4 /* ActionKit.framework */; }; 16 | 4C4A21BD1FD3A3AE00792DF4 /* FunctionalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21BC1FD3A3AE00792DF4 /* FunctionalViewController.swift */; }; 17 | 4C4A21BF1FD3AA9600792DF4 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21BE1FD3AA9600792DF4 /* LabelCell.swift */; }; 18 | 4C4A21C31FD48C8C00792DF4 /* Movie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21C21FD48C8C00792DF4 /* Movie.swift */; }; 19 | 4C4A21C61FD48D0E00792DF4 /* ButtonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A21C51FD48D0E00792DF4 /* ButtonCell.swift */; }; 20 | 4C67E8F11FD49AA9007AAF0A /* Movies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67E8F01FD49AA9007AAF0A /* Movies.swift */; }; 21 | 4C67E8F31FD49BC8007AAF0A /* MoviesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67E8F21FD49BC8007AAF0A /* MoviesViewController.swift */; }; 22 | 4C8D4D621FDAD62800C0A494 /* CombinedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D4D611FDAD62800C0A494 /* CombinedCell.swift */; }; 23 | 4C8D4D641FDAEBA400C0A494 /* ImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D4D631FDAEBA400C0A494 /* ImageCell.swift */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | 4C4A21A11FD2FB8700792DF4 /* Project-01.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Project-01.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 4C4A21A41FD2FB8700792DF4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 29 | 4C4A21A61FD2FB8700792DF4 /* MovieViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieViewController.swift; sourceTree = ""; }; 30 | 4C4A21AB1FD2FB8700792DF4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 31 | 4C4A21AE1FD2FB8700792DF4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 32 | 4C4A21B01FD2FB8700792DF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 4C4A21B71FD2FD5C00792DF4 /* FunctionalTableData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FunctionalTableData.framework; path = Carthage/Build/iOS/FunctionalTableData.framework; sourceTree = ""; }; 34 | 4C4A21B91FD2FD5D00792DF4 /* ActionKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ActionKit.framework; path = Carthage/Build/iOS/ActionKit.framework; sourceTree = ""; }; 35 | 4C4A21BC1FD3A3AE00792DF4 /* FunctionalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionalViewController.swift; sourceTree = ""; }; 36 | 4C4A21BE1FD3AA9600792DF4 /* LabelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelCell.swift; sourceTree = ""; }; 37 | 4C4A21C21FD48C8C00792DF4 /* Movie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Movie.swift; sourceTree = ""; }; 38 | 4C4A21C51FD48D0E00792DF4 /* ButtonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonCell.swift; sourceTree = ""; }; 39 | 4C67E8F01FD49AA9007AAF0A /* Movies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Movies.swift; sourceTree = ""; }; 40 | 4C67E8F21FD49BC8007AAF0A /* MoviesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesViewController.swift; sourceTree = ""; }; 41 | 4C8D4D611FDAD62800C0A494 /* CombinedCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinedCell.swift; sourceTree = ""; }; 42 | 4C8D4D631FDAEBA400C0A494 /* ImageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageCell.swift; sourceTree = ""; }; 43 | /* End PBXFileReference section */ 44 | 45 | /* Begin PBXFrameworksBuildPhase section */ 46 | 4C4A219E1FD2FB8700792DF4 /* Frameworks */ = { 47 | isa = PBXFrameworksBuildPhase; 48 | buildActionMask = 2147483647; 49 | files = ( 50 | 4C4A21B81FD2FD5C00792DF4 /* FunctionalTableData.framework in Frameworks */, 51 | 4C4A21BA1FD2FD5D00792DF4 /* ActionKit.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 4C4A21981FD2FB8700792DF4 = { 59 | isa = PBXGroup; 60 | children = ( 61 | 4C4A21A31FD2FB8700792DF4 /* Project-01 */, 62 | 4C4A21A21FD2FB8700792DF4 /* Products */, 63 | 4C4A21B61FD2FD5B00792DF4 /* Frameworks */, 64 | ); 65 | sourceTree = ""; 66 | }; 67 | 4C4A21A21FD2FB8700792DF4 /* Products */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 4C4A21A11FD2FB8700792DF4 /* Project-01.app */, 71 | ); 72 | name = Products; 73 | sourceTree = ""; 74 | }; 75 | 4C4A21A31FD2FB8700792DF4 /* Project-01 */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 4C4A21A41FD2FB8700792DF4 /* AppDelegate.swift */, 79 | 4C4A21C41FD48CF300792DF4 /* Models */, 80 | 4C4A21C11FD3AAAC00792DF4 /* View Controllers */, 81 | 4C4A21C01FD3AA9B00792DF4 /* Cells */, 82 | 4C4A21AB1FD2FB8700792DF4 /* Assets.xcassets */, 83 | 4C4A21AD1FD2FB8700792DF4 /* LaunchScreen.storyboard */, 84 | 4C4A21B01FD2FB8700792DF4 /* Info.plist */, 85 | ); 86 | path = "Project-01"; 87 | sourceTree = ""; 88 | }; 89 | 4C4A21B61FD2FD5B00792DF4 /* Frameworks */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 4C4A21B91FD2FD5D00792DF4 /* ActionKit.framework */, 93 | 4C4A21B71FD2FD5C00792DF4 /* FunctionalTableData.framework */, 94 | ); 95 | name = Frameworks; 96 | sourceTree = ""; 97 | }; 98 | 4C4A21C01FD3AA9B00792DF4 /* Cells */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 4C4A21C51FD48D0E00792DF4 /* ButtonCell.swift */, 102 | 4C8D4D611FDAD62800C0A494 /* CombinedCell.swift */, 103 | 4C8D4D631FDAEBA400C0A494 /* ImageCell.swift */, 104 | 4C4A21BE1FD3AA9600792DF4 /* LabelCell.swift */, 105 | ); 106 | path = Cells; 107 | sourceTree = ""; 108 | }; 109 | 4C4A21C11FD3AAAC00792DF4 /* View Controllers */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 4C4A21A61FD2FB8700792DF4 /* MovieViewController.swift */, 113 | 4C67E8F21FD49BC8007AAF0A /* MoviesViewController.swift */, 114 | 4C4A21BC1FD3A3AE00792DF4 /* FunctionalViewController.swift */, 115 | ); 116 | path = "View Controllers"; 117 | sourceTree = ""; 118 | }; 119 | 4C4A21C41FD48CF300792DF4 /* Models */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 4C4A21C21FD48C8C00792DF4 /* Movie.swift */, 123 | 4C67E8F01FD49AA9007AAF0A /* Movies.swift */, 124 | ); 125 | path = Models; 126 | sourceTree = ""; 127 | }; 128 | /* End PBXGroup section */ 129 | 130 | /* Begin PBXNativeTarget section */ 131 | 4C4A21A01FD2FB8700792DF4 /* Project-01 */ = { 132 | isa = PBXNativeTarget; 133 | buildConfigurationList = 4C4A21B31FD2FB8700792DF4 /* Build configuration list for PBXNativeTarget "Project-01" */; 134 | buildPhases = ( 135 | 4C4A219D1FD2FB8700792DF4 /* Sources */, 136 | 4C4A219E1FD2FB8700792DF4 /* Frameworks */, 137 | 4C4A219F1FD2FB8700792DF4 /* Resources */, 138 | 4C4A21BB1FD2FD7000792DF4 /* Carthage Script */, 139 | ); 140 | buildRules = ( 141 | ); 142 | dependencies = ( 143 | ); 144 | name = "Project-01"; 145 | productName = "Project-01"; 146 | productReference = 4C4A21A11FD2FB8700792DF4 /* Project-01.app */; 147 | productType = "com.apple.product-type.application"; 148 | }; 149 | /* End PBXNativeTarget section */ 150 | 151 | /* Begin PBXProject section */ 152 | 4C4A21991FD2FB8700792DF4 /* Project object */ = { 153 | isa = PBXProject; 154 | attributes = { 155 | LastSwiftUpdateCheck = 0910; 156 | LastUpgradeCheck = 0910; 157 | ORGANIZATIONNAME = "Raul Riera"; 158 | TargetAttributes = { 159 | 4C4A21A01FD2FB8700792DF4 = { 160 | CreatedOnToolsVersion = 9.1; 161 | ProvisioningStyle = Automatic; 162 | }; 163 | }; 164 | }; 165 | buildConfigurationList = 4C4A219C1FD2FB8700792DF4 /* Build configuration list for PBXProject "Project-01" */; 166 | compatibilityVersion = "Xcode 8.0"; 167 | developmentRegion = en; 168 | hasScannedForEncodings = 0; 169 | knownRegions = ( 170 | en, 171 | Base, 172 | ); 173 | mainGroup = 4C4A21981FD2FB8700792DF4; 174 | productRefGroup = 4C4A21A21FD2FB8700792DF4 /* Products */; 175 | projectDirPath = ""; 176 | projectRoot = ""; 177 | targets = ( 178 | 4C4A21A01FD2FB8700792DF4 /* Project-01 */, 179 | ); 180 | }; 181 | /* End PBXProject section */ 182 | 183 | /* Begin PBXResourcesBuildPhase section */ 184 | 4C4A219F1FD2FB8700792DF4 /* Resources */ = { 185 | isa = PBXResourcesBuildPhase; 186 | buildActionMask = 2147483647; 187 | files = ( 188 | 4C4A21AF1FD2FB8700792DF4 /* LaunchScreen.storyboard in Resources */, 189 | 4C4A21AC1FD2FB8700792DF4 /* Assets.xcassets in Resources */, 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | /* End PBXResourcesBuildPhase section */ 194 | 195 | /* Begin PBXShellScriptBuildPhase section */ 196 | 4C4A21BB1FD2FD7000792DF4 /* Carthage Script */ = { 197 | isa = PBXShellScriptBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | ); 201 | inputPaths = ( 202 | "$(SRCROOT)/Carthage/Build/iOS/FunctionalTableData.framework", 203 | "$(SRCROOT)/Carthage/Build/iOS/ActionKit.framework", 204 | ); 205 | name = "Carthage Script"; 206 | outputPaths = ( 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | shellPath = /bin/sh; 210 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 211 | }; 212 | /* End PBXShellScriptBuildPhase section */ 213 | 214 | /* Begin PBXSourcesBuildPhase section */ 215 | 4C4A219D1FD2FB8700792DF4 /* Sources */ = { 216 | isa = PBXSourcesBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | 4C67E8F11FD49AA9007AAF0A /* Movies.swift in Sources */, 220 | 4C8D4D621FDAD62800C0A494 /* CombinedCell.swift in Sources */, 221 | 4C4A21A71FD2FB8700792DF4 /* MovieViewController.swift in Sources */, 222 | 4C4A21A51FD2FB8700792DF4 /* AppDelegate.swift in Sources */, 223 | 4C4A21BF1FD3AA9600792DF4 /* LabelCell.swift in Sources */, 224 | 4C4A21BD1FD3A3AE00792DF4 /* FunctionalViewController.swift in Sources */, 225 | 4C4A21C31FD48C8C00792DF4 /* Movie.swift in Sources */, 226 | 4C4A21C61FD48D0E00792DF4 /* ButtonCell.swift in Sources */, 227 | 4C67E8F31FD49BC8007AAF0A /* MoviesViewController.swift in Sources */, 228 | 4C8D4D641FDAEBA400C0A494 /* ImageCell.swift in Sources */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXSourcesBuildPhase section */ 233 | 234 | /* Begin PBXVariantGroup section */ 235 | 4C4A21AD1FD2FB8700792DF4 /* LaunchScreen.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 4C4A21AE1FD2FB8700792DF4 /* Base */, 239 | ); 240 | name = LaunchScreen.storyboard; 241 | sourceTree = ""; 242 | }; 243 | /* End PBXVariantGroup section */ 244 | 245 | /* Begin XCBuildConfiguration section */ 246 | 4C4A21B11FD2FB8700792DF4 /* Debug */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | ALWAYS_SEARCH_USER_PATHS = NO; 250 | CLANG_ANALYZER_NONNULL = YES; 251 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 252 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 253 | CLANG_CXX_LIBRARY = "libc++"; 254 | CLANG_ENABLE_MODULES = YES; 255 | CLANG_ENABLE_OBJC_ARC = YES; 256 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 257 | CLANG_WARN_BOOL_CONVERSION = YES; 258 | CLANG_WARN_COMMA = YES; 259 | CLANG_WARN_CONSTANT_CONVERSION = YES; 260 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 261 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 262 | CLANG_WARN_EMPTY_BODY = YES; 263 | CLANG_WARN_ENUM_CONVERSION = YES; 264 | CLANG_WARN_INFINITE_RECURSION = YES; 265 | CLANG_WARN_INT_CONVERSION = YES; 266 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 267 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 268 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 269 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 270 | CLANG_WARN_STRICT_PROTOTYPES = YES; 271 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 272 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 273 | CLANG_WARN_UNREACHABLE_CODE = YES; 274 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 275 | CODE_SIGN_IDENTITY = "iPhone Developer"; 276 | COPY_PHASE_STRIP = NO; 277 | DEBUG_INFORMATION_FORMAT = dwarf; 278 | ENABLE_STRICT_OBJC_MSGSEND = YES; 279 | ENABLE_TESTABILITY = YES; 280 | GCC_C_LANGUAGE_STANDARD = gnu11; 281 | GCC_DYNAMIC_NO_PIC = NO; 282 | GCC_NO_COMMON_BLOCKS = YES; 283 | GCC_OPTIMIZATION_LEVEL = 0; 284 | GCC_PREPROCESSOR_DEFINITIONS = ( 285 | "DEBUG=1", 286 | "$(inherited)", 287 | ); 288 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 289 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 290 | GCC_WARN_UNDECLARED_SELECTOR = YES; 291 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 292 | GCC_WARN_UNUSED_FUNCTION = YES; 293 | GCC_WARN_UNUSED_VARIABLE = YES; 294 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 295 | MTL_ENABLE_DEBUG_INFO = YES; 296 | ONLY_ACTIVE_ARCH = YES; 297 | SDKROOT = iphoneos; 298 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 299 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 300 | }; 301 | name = Debug; 302 | }; 303 | 4C4A21B21FD2FB8700792DF4 /* Release */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | ALWAYS_SEARCH_USER_PATHS = NO; 307 | CLANG_ANALYZER_NONNULL = YES; 308 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 309 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 310 | CLANG_CXX_LIBRARY = "libc++"; 311 | CLANG_ENABLE_MODULES = YES; 312 | CLANG_ENABLE_OBJC_ARC = YES; 313 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 314 | CLANG_WARN_BOOL_CONVERSION = YES; 315 | CLANG_WARN_COMMA = YES; 316 | CLANG_WARN_CONSTANT_CONVERSION = YES; 317 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 318 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 319 | CLANG_WARN_EMPTY_BODY = YES; 320 | CLANG_WARN_ENUM_CONVERSION = YES; 321 | CLANG_WARN_INFINITE_RECURSION = YES; 322 | CLANG_WARN_INT_CONVERSION = YES; 323 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 326 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 327 | CLANG_WARN_STRICT_PROTOTYPES = YES; 328 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 329 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 330 | CLANG_WARN_UNREACHABLE_CODE = YES; 331 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 332 | CODE_SIGN_IDENTITY = "iPhone Developer"; 333 | COPY_PHASE_STRIP = NO; 334 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 335 | ENABLE_NS_ASSERTIONS = NO; 336 | ENABLE_STRICT_OBJC_MSGSEND = YES; 337 | GCC_C_LANGUAGE_STANDARD = gnu11; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 340 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 341 | GCC_WARN_UNDECLARED_SELECTOR = YES; 342 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 343 | GCC_WARN_UNUSED_FUNCTION = YES; 344 | GCC_WARN_UNUSED_VARIABLE = YES; 345 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 346 | MTL_ENABLE_DEBUG_INFO = NO; 347 | SDKROOT = iphoneos; 348 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 349 | VALIDATE_PRODUCT = YES; 350 | }; 351 | name = Release; 352 | }; 353 | 4C4A21B41FD2FB8700792DF4 /* Debug */ = { 354 | isa = XCBuildConfiguration; 355 | buildSettings = { 356 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 357 | CODE_SIGN_STYLE = Automatic; 358 | DEVELOPMENT_TEAM = R64MTWS872; 359 | FRAMEWORK_SEARCH_PATHS = ( 360 | "$(inherited)", 361 | "$(PROJECT_DIR)/Carthage/Build/iOS", 362 | ); 363 | INFOPLIST_FILE = "Project-01/Info.plist"; 364 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 365 | PRODUCT_BUNDLE_IDENTIFIER = "com.raulriera.Project-01"; 366 | PRODUCT_NAME = "$(TARGET_NAME)"; 367 | SWIFT_VERSION = 4.0; 368 | TARGETED_DEVICE_FAMILY = "1,2"; 369 | }; 370 | name = Debug; 371 | }; 372 | 4C4A21B51FD2FB8700792DF4 /* Release */ = { 373 | isa = XCBuildConfiguration; 374 | buildSettings = { 375 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 376 | CODE_SIGN_STYLE = Automatic; 377 | DEVELOPMENT_TEAM = R64MTWS872; 378 | FRAMEWORK_SEARCH_PATHS = ( 379 | "$(inherited)", 380 | "$(PROJECT_DIR)/Carthage/Build/iOS", 381 | ); 382 | INFOPLIST_FILE = "Project-01/Info.plist"; 383 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 384 | PRODUCT_BUNDLE_IDENTIFIER = "com.raulriera.Project-01"; 385 | PRODUCT_NAME = "$(TARGET_NAME)"; 386 | SWIFT_VERSION = 4.0; 387 | TARGETED_DEVICE_FAMILY = "1,2"; 388 | }; 389 | name = Release; 390 | }; 391 | /* End XCBuildConfiguration section */ 392 | 393 | /* Begin XCConfigurationList section */ 394 | 4C4A219C1FD2FB8700792DF4 /* Build configuration list for PBXProject "Project-01" */ = { 395 | isa = XCConfigurationList; 396 | buildConfigurations = ( 397 | 4C4A21B11FD2FB8700792DF4 /* Debug */, 398 | 4C4A21B21FD2FB8700792DF4 /* Release */, 399 | ); 400 | defaultConfigurationIsVisible = 0; 401 | defaultConfigurationName = Release; 402 | }; 403 | 4C4A21B31FD2FB8700792DF4 /* Build configuration list for PBXNativeTarget "Project-01" */ = { 404 | isa = XCConfigurationList; 405 | buildConfigurations = ( 406 | 4C4A21B41FD2FB8700792DF4 /* Debug */, 407 | 4C4A21B51FD2FB8700792DF4 /* Release */, 408 | ); 409 | defaultConfigurationIsVisible = 0; 410 | defaultConfigurationName = Release; 411 | }; 412 | /* End XCConfigurationList section */ 413 | }; 414 | rootObject = 4C4A21991FD2FB8700792DF4 /* Project object */; 415 | } 416 | --------------------------------------------------------------------------------