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