From ae8b043b1d72f5bbf1219698ed40793c5168c7f4 Mon Sep 17 00:00:00 2001 From: Gayuru Date: Wed, 18 Sep 2019 00:54:36 +1000 Subject: [PATCH] Rating, CocoaPods implemented & HomeView updated with dynamic data --- Travo-App/Podfile | 17 + Travo-App/Podfile.lock | 20 + .../Cosmos/Cosmos/CosmosAccessibility.swift | 101 ++ .../Cosmos/Cosmos/CosmosDefaultSettings.swift | 105 ++ .../Cosmos/Cosmos/CosmosLayerHelper.swift | 31 + .../Pods/Cosmos/Cosmos/CosmosLayers.swift | 137 +++ .../Cosmos/Cosmos/CosmosLocalizedRating.swift | 110 ++ .../Pods/Cosmos/Cosmos/CosmosRating.swift | 98 ++ .../Pods/Cosmos/Cosmos/CosmosSettings.swift | 104 ++ Travo-App/Pods/Cosmos/Cosmos/CosmosSize.swift | 29 + Travo-App/Pods/Cosmos/Cosmos/CosmosText.swift | 25 + .../Pods/Cosmos/Cosmos/CosmosTouch.swift | 80 ++ Travo-App/Pods/Cosmos/Cosmos/CosmosView.swift | 440 +++++++ .../Cosmos/Helpers/CosmosTouchTarget.swift | 24 + .../Cosmos/Cosmos/Helpers/RightToLeft.swift | 17 + .../Pods/Cosmos/Cosmos/StarFillMode.swift | 17 + Travo-App/Pods/Cosmos/Cosmos/StarLayer.swift | 159 +++ Travo-App/Pods/Cosmos/LICENSE | 21 + Travo-App/Pods/Cosmos/README.md | 228 ++++ Travo-App/Pods/Manifest.lock | 20 + Travo-App/Pods/Pods.xcodeproj/project.pbxproj | 1046 +++++++++++++++++ .../Cosmos/Cosmos-Info.plist | 26 + .../Cosmos/Cosmos-dummy.m | 5 + .../Cosmos/Cosmos-prefix.pch | 12 + .../Cosmos/Cosmos-umbrella.h | 16 + .../Cosmos/Cosmos.modulemap | 6 + .../Cosmos/Cosmos.xcconfig | 9 + .../Pods-Travo-App/Pods-Travo-App-Info.plist | 26 + .../Pods-Travo-App-acknowledgements.markdown | 53 + .../Pods-Travo-App-acknowledgements.plist | 91 ++ .../Pods-Travo-App/Pods-Travo-App-dummy.m | 5 + ...pp-frameworks-Debug-input-files.xcfilelist | 3 + ...p-frameworks-Debug-output-files.xcfilelist | 2 + ...-frameworks-Release-input-files.xcfilelist | 3 + ...frameworks-Release-output-files.xcfilelist | 2 + .../Pods-Travo-App-frameworks.sh | 173 +++ .../Pods-Travo-App/Pods-Travo-App-umbrella.h | 16 + .../Pods-Travo-App.debug.xcconfig | 11 + .../Pods-Travo-App/Pods-Travo-App.modulemap | 6 + .../Pods-Travo-App.release.xcconfig | 11 + .../Pods-Travo-AppUITests-Info.plist | 26 + ...Travo-AppUITests-acknowledgements.markdown | 3 + ...ds-Travo-AppUITests-acknowledgements.plist | 29 + .../Pods-Travo-AppUITests-dummy.m | 5 + .../Pods-Travo-AppUITests-umbrella.h | 16 + .../Pods-Travo-AppUITests.debug.xcconfig | 8 + .../Pods-Travo-AppUITests.modulemap | 6 + .../Pods-Travo-AppUITests.release.xcconfig | 8 + .../TinyConstraints-Info.plist | 26 + .../TinyConstraints/TinyConstraints-dummy.m | 5 + .../TinyConstraints-prefix.pch | 12 + .../TinyConstraints-umbrella.h | 16 + .../TinyConstraints/TinyConstraints.modulemap | 6 + .../TinyConstraints/TinyConstraints.xcconfig | 9 + Travo-App/Pods/TinyConstraints/LICENSE | 22 + Travo-App/Pods/TinyConstraints/README.md | 188 +++ .../TinyConstraints/Classes/Abstraction.swift | 48 + .../Classes/Constrainable.swift | 60 + .../TinyConstraints/Classes/Constraints.swift | 84 ++ .../TinyConstraints/Classes/Stack.swift | 81 ++ .../Classes/TinyConstraints+superview.swift | 247 ++++ .../Classes/TinyConstraints.swift | 351 ++++++ .../Classes/TinyEdgeInsets.swift | 64 + Travo-App/Travo-App.xcodeproj/project.pbxproj | 104 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Travo-App/Travo-App/Model/Places.swift | 6 +- .../Travo-App/View/Favourites.storyboard | 98 +- Travo-App/Travo-App/View/Home.storyboard | 95 +- Travo-App/Travo-App/View/Place.storyboard | 106 +- .../Favourites/FavouritesViewController.swift | 5 +- .../ViewModel/HomeViewController.swift | 32 +- .../ViewModel/PlaceViewController.swift | 12 +- .../Travo-App/ViewModel/PlacesViewModel.swift | 4 +- .../RecommendedCollectionViewCell.swift | 3 +- 75 files changed, 4891 insertions(+), 217 deletions(-) create mode 100644 Travo-App/Podfile create mode 100644 Travo-App/Podfile.lock create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosAccessibility.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosDefaultSettings.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosLayerHelper.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosLayers.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosLocalizedRating.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosRating.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosSettings.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosSize.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosText.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosTouch.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/CosmosView.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/Helpers/CosmosTouchTarget.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/Helpers/RightToLeft.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/StarFillMode.swift create mode 100644 Travo-App/Pods/Cosmos/Cosmos/StarLayer.swift create mode 100644 Travo-App/Pods/Cosmos/LICENSE create mode 100644 Travo-App/Pods/Cosmos/README.md create mode 100644 Travo-App/Pods/Manifest.lock create mode 100644 Travo-App/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Travo-App/Pods/Target Support Files/Cosmos/Cosmos-Info.plist create mode 100644 Travo-App/Pods/Target Support Files/Cosmos/Cosmos-dummy.m create mode 100644 Travo-App/Pods/Target Support Files/Cosmos/Cosmos-prefix.pch create mode 100644 Travo-App/Pods/Target Support Files/Cosmos/Cosmos-umbrella.h create mode 100644 Travo-App/Pods/Target Support Files/Cosmos/Cosmos.modulemap create mode 100644 Travo-App/Pods/Target Support Files/Cosmos/Cosmos.xcconfig create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-Info.plist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.markdown create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.plist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-dummy.m create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-input-files.xcfilelist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-output-files.xcfilelist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-input-files.xcfilelist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-output-files.xcfilelist create mode 100755 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-umbrella.h create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.debug.xcconfig create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.modulemap create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.release.xcconfig create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-Info.plist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.markdown create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.plist create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-dummy.m create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-umbrella.h create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.debug.xcconfig create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.modulemap create mode 100644 Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.release.xcconfig create mode 100644 Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-Info.plist create mode 100644 Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-dummy.m create mode 100644 Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-prefix.pch create mode 100644 Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-umbrella.h create mode 100644 Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.modulemap create mode 100644 Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.xcconfig create mode 100644 Travo-App/Pods/TinyConstraints/LICENSE create mode 100644 Travo-App/Pods/TinyConstraints/README.md create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Abstraction.swift create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constrainable.swift create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constraints.swift create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Stack.swift create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints+superview.swift create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints.swift create mode 100644 Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyEdgeInsets.swift create mode 100644 Travo-App/Travo-App.xcworkspace/contents.xcworkspacedata create mode 100644 Travo-App/Travo-App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Travo-App/Podfile b/Travo-App/Podfile new file mode 100644 index 0000000..94e3bf6 --- /dev/null +++ b/Travo-App/Podfile @@ -0,0 +1,17 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'Travo-App' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for Travo-App + pod 'Cosmos' + pod 'TinyConstraints' + + target 'Travo-AppUITests' do + inherit! :search_paths + # Pods for testing + end + +end diff --git a/Travo-App/Podfile.lock b/Travo-App/Podfile.lock new file mode 100644 index 0000000..523a2f3 --- /dev/null +++ b/Travo-App/Podfile.lock @@ -0,0 +1,20 @@ +PODS: + - Cosmos (19.0.3) + - TinyConstraints (4.0.1) + +DEPENDENCIES: + - Cosmos + - TinyConstraints + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Cosmos + - TinyConstraints + +SPEC CHECKSUMS: + Cosmos: a6fb17284281fa12cf4c85c2efecd440a215ec44 + TinyConstraints: 8dd91295e56797648c7bc335dd20e1d91ec4c192 + +PODFILE CHECKSUM: 513ed71287c25b43ec049ad0bb47c21ecce1335c + +COCOAPODS: 1.7.5 diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosAccessibility.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosAccessibility.swift new file mode 100644 index 0000000..3247205 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosAccessibility.swift @@ -0,0 +1,101 @@ +import UIKit + +/** + +Functions for making cosmos view accessible. + +*/ +struct CosmosAccessibility { + /** + + Makes the view accesible by settings its label and using rating as value. + + */ + + static func update(_ view: UIView, rating: Double, text: String?, settings: CosmosSettings) { + view.isAccessibilityElement = true + + view.accessibilityTraits = settings.updateOnTouch ? + UIAccessibilityTraits.adjustable :UIAccessibilityTraits.none + + var accessibilityLabel = CosmosLocalizedRating.ratingTranslation + + if let text = text, text != "" { + accessibilityLabel += " \(text)" + } + + view.accessibilityLabel = accessibilityLabel + + view.accessibilityValue = accessibilityValue(view, rating: rating, settings: settings) + } + + /** + + Returns the rating that is used as accessibility value. + The accessibility value depends on the star fill mode. + + For example, if rating is 4.6 and fill mode is .half the value will be 4.5. And if the fill mode + if .full the value will be 5. + + */ + static func accessibilityValue(_ view: UIView, rating: Double, settings: CosmosSettings) -> String { + let accessibilityRating = CosmosRating.displayedRatingFromPreciseRating(rating, + fillMode: settings.fillMode, totalStars: settings.totalStars) + + // Omit decimals if the value is an integer + let isInteger = (accessibilityRating * 10).truncatingRemainder(dividingBy: 10) == 0 + + if isInteger { + return "\(Int(accessibilityRating))" + } else { + // Only show a single decimal place + let roundedToFirstDecimalPlace = Double( round(10 * accessibilityRating) / 10 ) + return "\(roundedToFirstDecimalPlace)" + } + } + + /** + + Returns the amount of increment for the rating. When .half and .precise fill modes are used the + rating is incremented by 0.5. + + */ + static func accessibilityIncrement(_ rating: Double, settings: CosmosSettings) -> Double { + var increment: Double = 0 + + switch settings.fillMode { + case .full: + increment = ceil(rating) - rating + if increment == 0 { increment = 1 } + + case .half, .precise: + increment = (ceil(rating * 2) - rating * 2) / 2 + if increment == 0 { increment = 0.5 } + } + + if rating >= Double(settings.totalStars) { increment = 0 } + + let roundedToFirstDecimalPlace = Double( round(10 * increment) / 10 ) + return roundedToFirstDecimalPlace + } + + static func accessibilityDecrement(_ rating: Double, settings: CosmosSettings) -> Double { + var increment: Double = 0 + + switch settings.fillMode { + case .full: + increment = rating - floor(rating) + if increment == 0 { increment = 1 } + + case .half, .precise: + increment = (rating * 2 - floor(rating * 2)) / 2 + if increment == 0 { increment = 0.5 } + } + + if rating <= settings.minTouchRating { increment = 0 } + + let roundedToFirstDecimalPlace = Double( round(10 * increment) / 10 ) + return roundedToFirstDecimalPlace + } +} + diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosDefaultSettings.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosDefaultSettings.swift new file mode 100644 index 0000000..5437215 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosDefaultSettings.swift @@ -0,0 +1,105 @@ +import UIKit + +/** + +Defaults setting values. + +*/ +struct CosmosDefaultSettings { + init() {} + + static let defaultColor = UIColor(red: 1, green: 149/255, blue: 0, alpha: 1) + + + // MARK: - Star settings + // ----------------------------- + + /// Border color of an empty star. + static let emptyBorderColor = defaultColor + + /// Width of the border for the empty star. + static let emptyBorderWidth: Double = 1 / Double(UIScreen.main.scale) + + /// Border color of a filled star. + static let filledBorderColor = defaultColor + + /// Width of the border for a filled star. + static let filledBorderWidth: Double = 1 / Double(UIScreen.main.scale) + + /// Background color of an empty star. + static let emptyColor = UIColor.clear + + /// Background color of a filled star. + static let filledColor = defaultColor + + /** + + Defines how the star is filled when the rating value is not an integer value. It can either show full stars, half stars or stars partially filled according to the rating value. + + */ + static let fillMode = StarFillMode.full + + /// Rating value that is shown in the storyboard by default. + static let rating: Double = 2.718281828 + + /// Distance between stars. + static let starMargin: Double = 5 + + /** + + Array of points for drawing the star with size of 100 by 100 pixels. Supply your points if you need to draw a different shape. + + */ + static let starPoints: [CGPoint] = [ + CGPoint(x: 49.5, y: 0.0), + CGPoint(x: 60.5, y: 35.0), + CGPoint(x: 99.0, y: 35.0), + CGPoint(x: 67.5, y: 58.0), + CGPoint(x: 78.5, y: 92.0), + CGPoint(x: 49.5, y: 71.0), + CGPoint(x: 20.5, y: 92.0), + CGPoint(x: 31.5, y: 58.0), + CGPoint(x: 0.0, y: 35.0), + CGPoint(x: 38.5, y: 35.0) + ] + + /// Size of a single star. + static var starSize: Double = 20 + + /// The total number of stars to be shown. + static let totalStars = 5 + + + // MARK: - Text settings + // ----------------------------- + + + /// Color of the text. + static let textColor = UIColor(red: 127/255, green: 127/255, blue: 127/255, alpha: 1) + + /// Font for the text. + static let textFont = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.footnote) + + /// Distance between the text and the stars. + static let textMargin: Double = 5 + + /// Calculates the size of the default text font. It is used for making the text size configurable from the storyboard. + static var textSize: Double { + get { + return Double(textFont.pointSize) + } + } + + + // MARK: - Touch settings + // ----------------------------- + + /// The lowest rating that user can set by touching the stars. + static let minTouchRating: Double = 1 + + /// Set to `false` if you don't want to pass touches to superview (can be useful in a table view). + static let passTouchesToSuperview = true + + /// When `true` the star fill level is updated when user touches the cosmos view. When `false` the Cosmos view only shows the rating and does not act as the input control. + static let updateOnTouch = true +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosLayerHelper.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosLayerHelper.swift new file mode 100644 index 0000000..578cc11 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosLayerHelper.swift @@ -0,0 +1,31 @@ +import UIKit + +/// Helper class for creating CALayer objects. +class CosmosLayerHelper { + /** + + Creates a text layer for the given text string and font. + + - parameter text: The text shown in the layer. + - parameter font: The text font. It is also used to calculate the layer bounds. + - parameter color: Text color. + + - returns: New text layer. + + */ + class func createTextLayer(_ text: String, font: UIFont, color: UIColor) -> CATextLayer { + let size = NSString(string: text).size(withAttributes: [NSAttributedString.Key.font: font]) + + let layer = CATextLayer() + layer.bounds = CGRect(origin: CGPoint(), size: size) + layer.anchorPoint = CGPoint() + + layer.string = text + layer.font = CGFont(font.fontName as CFString) + layer.fontSize = font.pointSize + layer.foregroundColor = color.cgColor + layer.contentsScale = UIScreen.main.scale + + return layer + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosLayers.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosLayers.swift new file mode 100644 index 0000000..dff1d73 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosLayers.swift @@ -0,0 +1,137 @@ +import UIKit + + +/** + +Colection of helper functions for creating star layers. + +*/ +class CosmosLayers { + /** + + Creates the layers for the stars. + + - parameter rating: The decimal number representing the rating. Usually a number between 1 and 5 + - parameter settings: Star view settings. + - returns: Array of star layers. + + */ + class func createStarLayers(_ rating: Double, settings: CosmosSettings, isRightToLeft: Bool) -> [CALayer] { + + var ratingRemander = CosmosRating.numberOfFilledStars(rating, + totalNumberOfStars: settings.totalStars) + + var starLayers = [CALayer]() + + for _ in (0.. CALayer { + + if starFillLevel >= 1 { + return createStarLayer(true, settings: settings) + } + + if starFillLevel == 0 { + return createStarLayer(false, settings: settings) + } + + return createPartialStar(starFillLevel, settings: settings, isRightToLeft: isRightToLeft) + } + + /** + + Creates a partially filled star layer with two sub-layers: + + 1. The layer for the filled star on top. The fill level parameter determines the width of this layer. + 2. The layer for the empty star below. + + - parameter starFillLevel: Decimal number between 0 and 1 describing the star fill level. + - parameter settings: Star view settings. + + - returns: Layer that contains the partially filled star. + + */ + class func createPartialStar(_ starFillLevel: Double, settings: CosmosSettings, isRightToLeft: Bool) -> CALayer { + let filledStar = createStarLayer(true, settings: settings) + let emptyStar = createStarLayer(false, settings: settings) + + + let parentLayer = CALayer() + parentLayer.contentsScale = UIScreen.main.scale + parentLayer.bounds = CGRect(origin: CGPoint(), size: filledStar.bounds.size) + parentLayer.anchorPoint = CGPoint() + parentLayer.addSublayer(emptyStar) + parentLayer.addSublayer(filledStar) + + if isRightToLeft { + // Flip the star horizontally for a right-to-left language + let rotation = CATransform3DMakeRotation(CGFloat(Double.pi), 0, 1, 0) + filledStar.transform = CATransform3DTranslate(rotation, -filledStar.bounds.size.width, 0, 0) + } + + // Make filled layer width smaller according to the fill level + filledStar.bounds.size.width *= CGFloat(starFillLevel) + + return parentLayer + } + + private class func createStarLayer(_ isFilled: Bool, settings: CosmosSettings) -> CALayer { + if let image = isFilled ? settings.filledImage : settings.emptyImage { + // Create a layer that shows a star from an image + return StarLayer.create(image: image, size: settings.starSize) + } + + // Create a layer that draws a star from an array of points + + let fillColor = isFilled ? settings.filledColor : settings.emptyColor + let strokeColor = isFilled ? settings.filledBorderColor : settings.emptyBorderColor + + return StarLayer.create(settings.starPoints, + size: settings.starSize, + lineWidth: isFilled ? settings.filledBorderWidth : settings.emptyBorderWidth, + fillColor: fillColor, + strokeColor: strokeColor) + } + + /** + + Positions the star layers one after another with a margin in between. + + - parameter layers: The star layers array. + - parameter starMargin: Margin between stars. + + */ + class func positionStarLayers(_ layers: [CALayer], starMargin: Double) { + var positionX:CGFloat = 0 + + for layer in layers { + layer.position.x = positionX + positionX += layer.bounds.width + CGFloat(starMargin) + } + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosLocalizedRating.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosLocalizedRating.swift new file mode 100644 index 0000000..be50d1b --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosLocalizedRating.swift @@ -0,0 +1,110 @@ +import Foundation + +/** + +Returns the word "Rating" in user's language. It is used for voice-over in accessibility mode. + +*/ +struct CosmosLocalizedRating { + static var defaultText = "Rating" + + static var localizedRatings = [ + "ar": "تصنيف", + "bg": "Рейтинг", + "cy": "Sgôr", + "da": "Rating", + "de": "Bewertung", + "el": "Βαθμολογία", + "en": defaultText, + "es": "Valorar", + "et": "Reiting", + "fi": "Luokitus", + "fr": "De note", + "he": "דירוג", + "hi": "रेटिंग", + "hr": "Ocjena", + "hu": "Értékelés", + "id": "Peringkat", + "it": "Voto", + "ko": "등급", + "lt": "Reitingas", + "lv": "Vērtējums", + "nl": "Rating", + "no": "Vurdering", + "pl": "Ocena", + "pt": "Classificação", + "ro": "Evaluare", + "ru": "Рейтинг", + "sk": "Hodnotenie", + "sl": "Ocena", + "sr": "Рејтинг", + "sw": "Rating", + "th": "การจัดอันดับ", + "tr": "Oy verin", + "cs": "Hodnocení", + "uk": "Рейтинг", + "vi": "Đánh giá", + "zh": "评分" + ] + + static var ratingTranslation: String { + let languages = preferredLanguages(Locale.preferredLanguages) + return ratingInPreferredLanguage(languages) + } + + /** + + Returns the word "Rating" in user's language. + + - parameter language: ISO 639-1 language code. Example: 'en'. + + */ + static func translation(_ language: String) -> String? { + return localizedRatings[language] + } + + /** + + Returns translation using the preferred language. + + - parameter preferredLanguages: Array of preferred language codes (ISO 639-1). The first element is most preferred. + + - parameter localizedText: Dictionary with translations for the languages. The keys are ISO 639-1 language codes and values are the text. + + - parameter fallbackTranslation: The translation text used if no translation found for the preferred languages. + + - returns: Translation for the preferred language. + + */ + static func translationInPreferredLanguage(_ preferredLanguages: [String], + localizedText: [String: String], + fallbackTranslation: String) -> String { + + for language in preferredLanguages { + if let translatedText = translation(language) { + return translatedText + } + } + + return fallbackTranslation + } + + static func ratingInPreferredLanguage(_ preferredLanguages: [String]) -> String { + return translationInPreferredLanguage(preferredLanguages, + localizedText: localizedRatings, + fallbackTranslation: defaultText) + } + + static func preferredLanguages(_ preferredLocales: [String]) -> [String] { + return preferredLocales.map { element in + + let dashSeparated = element.components(separatedBy: "-") + if dashSeparated.count > 1 { return dashSeparated[0] } + + let underscoreSeparated = element.components(separatedBy: "_") + if underscoreSeparated.count > 1 { return underscoreSeparated[0] } + + return element + } + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosRating.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosRating.swift new file mode 100644 index 0000000..bcdcbfb --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosRating.swift @@ -0,0 +1,98 @@ +import UIKit + +/** + +Helper functions for calculating rating. + +*/ +struct CosmosRating { + + /** + + Returns a decimal number between 0 and 1 describing the star fill level. + + - parameter ratingRemainder: This value is passed from the loop that creates star layers. The value starts with the rating value and decremented by 1 when each star is created. For example, suppose we want to display rating of 3.5. When the first star is created the ratingRemainder parameter will be 3.5. For the second star it will be 2.5. Third: 1.5. Fourth: 0.5. Fifth: -0.5. + + - parameter fillMode: Describe how stars should be filled: full, half or precise. + + - returns: Decimal value between 0 and 1 describing the star fill level. 1 is a fully filled star. 0 is an empty star. 0.5 is a half-star. + + */ + static func starFillLevel(ratingRemainder: Double, fillMode: StarFillMode) -> Double { + + var result = ratingRemainder + + if result > 1 { result = 1 } + if result < 0 { result = 0 } + + return roundFillLevel(result, fillMode: fillMode) + } + + /** + + Rounds a single star's fill level according to the fill mode. "Full" mode returns 0 or 1 by using the standard decimal rounding. "Half" mode returns 0, 0.5 or 1 by rounding the decimal to closest of 3 values. "Precise" mode will return the fill level unchanged. + + - parameter starFillLevel: Decimal number between 0 and 1 describing the star fill level. + + - parameter fillMode: Fill mode that is used to round the fill level value. + + - returns: The rounded fill level. + + */ + static func roundFillLevel(_ starFillLevel: Double, fillMode: StarFillMode) -> Double { + switch fillMode { + case .full: + return Double(round(starFillLevel)) + case .half: + return Double(round(starFillLevel * 2) / 2) + case .precise : + return starFillLevel + } + } + + + /** + + Helper function for calculating the rating that is displayed to the user + taking into account the star fill mode. For example, if the fill mode is .half and precise rating is 4.6, the displayed rating will be 4.5. And if the fill mode is .full the displayed rating will be 5. + + - parameter preciseRating: Precise rating value, like 4.8237 + + - parameter fillMode: Describe how stars should be filled: full, half or precise. + + - parameter totalStars: Total number of stars. + + - returns: Returns rating that is displayed to the user taking into account the star fill mode. + + */ + static func displayedRatingFromPreciseRating(_ preciseRating: Double, + fillMode: StarFillMode, totalStars: Int) -> Double { + + let starFloorNumber = floor(preciseRating) + let singleStarRemainder = preciseRating - starFloorNumber + + var displayedRating = starFloorNumber + starFillLevel( + ratingRemainder: singleStarRemainder, fillMode: fillMode) + + displayedRating = min(Double(totalStars), displayedRating) // Can't go bigger than number of stars + displayedRating = max(0, displayedRating) // Can't be less than zero + + return displayedRating + } + + /** + + Returns the number of filled stars for given rating. + + - parameter rating: The rating to be displayed. + - parameter totalNumberOfStars: Total number of stars. + - returns: Number of filled stars. If rating is biggen than the total number of stars (usually 5) it returns the maximum number of stars. + + */ + static func numberOfFilledStars(_ rating: Double, totalNumberOfStars: Int) -> Double { + if rating > Double(totalNumberOfStars) { return Double(totalNumberOfStars) } + if rating < 0 { return 0 } + + return rating + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosSettings.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosSettings.swift new file mode 100644 index 0000000..02e59f0 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosSettings.swift @@ -0,0 +1,104 @@ +import UIKit + +/** + +Settings that define the appearance of the star rating views. + +*/ +public struct CosmosSettings { + + /// Returns default set of settings for CosmosView + public static var `default`: CosmosSettings { + return CosmosSettings() + } + + public init() {} + + // MARK: - Star settings + // ----------------------------- + + /// Border color of an empty star. + public var emptyBorderColor = CosmosDefaultSettings.emptyBorderColor + + /// Width of the border for empty star. + public var emptyBorderWidth: Double = CosmosDefaultSettings.emptyBorderWidth + + /// Border color of a filled star. + public var filledBorderColor = CosmosDefaultSettings.filledBorderColor + + /// Width of the border for a filled star. + public var filledBorderWidth: Double = CosmosDefaultSettings.filledBorderWidth + + /// Background color of an empty star. + public var emptyColor = CosmosDefaultSettings.emptyColor + + /// Background color of a filled star. + public var filledColor = CosmosDefaultSettings.filledColor + + /** + + Defines how the star is filled when the rating value is not a whole integer. It can either show full stars, half stars or stars partially filled according to the rating value. + + */ + public var fillMode = CosmosDefaultSettings.fillMode + + /// Distance between stars. + public var starMargin: Double = CosmosDefaultSettings.starMargin + + /** + + Array of points for drawing the star with size of 100 by 100 pixels. Supply your points if you need to draw a different shape. + + */ + public var starPoints: [CGPoint] = CosmosDefaultSettings.starPoints + + /// Size of a single star. + public var starSize: Double = CosmosDefaultSettings.starSize + + /// The maximum number of stars to be shown. + public var totalStars = CosmosDefaultSettings.totalStars + + // MARK: - Star image settings + // ----------------------------- + + /** + + Image used for the filled portion of the star. By default the star is drawn from the array of points unless an image is supplied. + + */ + public var filledImage: UIImage? = nil + + /** + + Image used for the empty portion of the star. By default the star is drawn from the array of points unless an image is supplied. + + */ + public var emptyImage: UIImage? = nil + + // MARK: - Text settings + // ----------------------------- + + /// Color of the text. + public var textColor = CosmosDefaultSettings.textColor + + /// Font for the text. + public var textFont = CosmosDefaultSettings.textFont + + /// Distance between the text and the stars. + public var textMargin: Double = CosmosDefaultSettings.textMargin + + + // MARK: - Touch settings + // ----------------------------- + + /// The lowest rating that user can set by touching the stars. + public var minTouchRating: Double = CosmosDefaultSettings.minTouchRating + + /// Set to `false` if you don't want to pass touches to superview (can be useful in a table view). + public var passTouchesToSuperview = CosmosDefaultSettings.passTouchesToSuperview + + /// When `true` the star fill level is updated when user touches the cosmos view. When `false` the Cosmos view only shows the rating and does not act as the input control. + public var updateOnTouch = CosmosDefaultSettings.updateOnTouch +} + + diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosSize.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosSize.swift new file mode 100644 index 0000000..f6807b7 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosSize.swift @@ -0,0 +1,29 @@ +import UIKit + +/** + +Helper class for calculating size for the cosmos view. + +*/ +class CosmosSize { + /** + + Calculates the size of the cosmos view. It goes through all the star and text layers and makes size the view size is large enough to show all of them. + + */ + class func calculateSizeToFitLayers(_ layers: [CALayer]) -> CGSize { + var size = CGSize() + + for layer in layers { + if layer.frame.maxX > size.width { + size.width = layer.frame.maxX + } + + if layer.frame.maxY > size.height { + size.height = layer.frame.maxY + } + } + + return size + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosText.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosText.swift new file mode 100644 index 0000000..278e6df --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosText.swift @@ -0,0 +1,25 @@ + + +import UIKit + +/** + +Positions the text layer to the right of the stars. + +*/ +class CosmosText { + /** + + Positions the text layer to the right from the stars. Text is aligned to the center of the star superview vertically. + + - parameter layer: The text layer to be positioned. + - parameter starsSize: The size of the star superview. + - parameter textMargin: The distance between the stars and the text. + + */ + class func position(_ layer: CALayer, starsSize: CGSize, textMargin: Double) { + layer.position.x = starsSize.width + CGFloat(textMargin) + let yOffset = (starsSize.height - layer.bounds.height) / 2 + layer.position.y = yOffset + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosTouch.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosTouch.swift new file mode 100644 index 0000000..9b9bf71 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosTouch.swift @@ -0,0 +1,80 @@ +import UIKit + +/** + +Functions for working with touch input. + +*/ +struct CosmosTouch { + /** + + Calculates the rating based on the touch location. + + - parameter position: The horizontal location of the touch relative to the width of the stars. + + - returns: The rating representing the touch location. + + */ + static func touchRating(_ position: CGFloat, settings: CosmosSettings) -> Double { + var rating = preciseRating( + position: Double(position), + numberOfStars: settings.totalStars, + starSize: settings.starSize, + starMargin: settings.starMargin) + + if settings.fillMode == .half { + rating += 0.20 + } + + if settings.fillMode == .full { + rating += 0.45 + } + + rating = CosmosRating.displayedRatingFromPreciseRating(rating, + fillMode: settings.fillMode, totalStars: settings.totalStars) + + rating = max(settings.minTouchRating, rating) // Can't be less than min rating + + return rating + } + + + /** + + Returns the precise rating based on the touch position. + + - parameter position: The horizontal location of the touch relative to the width of the stars. + - parameter numberOfStars: Total number of stars, filled and full. + - parameter starSize: The width of a star. + - parameter starSize: Margin between stars. + - returns: The precise rating. + + */ + static func preciseRating(position: Double, numberOfStars: Int, + starSize: Double, starMargin: Double) -> Double { + + if position < 0 { return 0 } + var positionRemainder = position; + + // Calculate the number of times the star with a margin fits the position + // This will be the whole part of the rating + var rating: Double = Double(Int(position / (starSize + starMargin))) + + // If rating is grater than total number of stars - return maximum rating + if Int(rating) > numberOfStars { return Double(numberOfStars) } + + // Calculate what portion of the last star does the position correspond to + // This will be the added partial part of the rating + + positionRemainder -= rating * (starSize + starMargin) + + if positionRemainder > starSize + { + rating += 1 + } else { + rating += positionRemainder / starSize + } + + return rating + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/CosmosView.swift b/Travo-App/Pods/Cosmos/Cosmos/CosmosView.swift new file mode 100644 index 0000000..99ade6a --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/CosmosView.swift @@ -0,0 +1,440 @@ +import UIKit + +/** + +A star rating view that can be used to show customer rating for the products. On can select stars by tapping on them when updateOnTouch settings is true. An optional text can be supplied that is shown on the right side. + +Example: + + cosmosView.rating = 4 + cosmosView.text = "(123)" + +Shows: ★★★★☆ (123) + +*/ +@IBDesignable open class CosmosView: UIView { + + /** + + The currently shown number of stars, usually between 1 and 5. If the value is decimal the stars will be shown according to the Fill Mode setting. + + */ + @IBInspectable open var rating: Double = CosmosDefaultSettings.rating { + didSet { + if oldValue != rating { + update() + } + } + } + + /// Currently shown text. Set it to nil to display just the stars without text. + @IBInspectable open var text: String? { + didSet { + if oldValue != text { + update() + } + } + } + + /// Star rating settings. + open var settings: CosmosSettings = .default { + didSet { + update() + } + } + + /// Stores calculated size of the view. It is used as intrinsic content size. + private var viewSize = CGSize() + + /// Draws the stars when the view comes out of storyboard with default settings + open override func awakeFromNib() { + super.awakeFromNib() + + update() + } + + /** + + Initializes and returns a newly allocated cosmos view object. + + */ + public convenience init(settings: CosmosSettings = .default) { + self.init(frame: .zero, settings: settings) + } + + /** + + Initializes and returns a newly allocated cosmos view object with the specified frame rectangle. + + - parameter frame: The frame rectangle for the view. + + */ + override public convenience init(frame: CGRect) { + self.init(frame: frame, settings: .default) + } + + public init(frame: CGRect, settings: CosmosSettings) { + super.init(frame: frame) + self.settings = settings + update() + improvePerformance() + } + + /// Initializes and returns a newly allocated cosmos view object. + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + improvePerformance() + } + + /// Change view settings for faster drawing + private func improvePerformance() { + /// Cache the view into a bitmap instead of redrawing the stars each time + layer.shouldRasterize = true + layer.rasterizationScale = UIScreen.main.scale + + isOpaque = true + } + + /** + + Updates the stars and optional text based on current values of `rating` and `text` properties. + + */ + open func update() { + + // Create star layers + // ------------ + + var layers = CosmosLayers.createStarLayers( + rating, + settings: settings, + isRightToLeft: RightToLeft.isRightToLeft(self) + ) + + // Create text layer + // ------------ + + if let text = text { + let textLayer = createTextLayer(text, layers: layers) + layers = addTextLayer(textLayer: textLayer, layers: layers) + } + + layer.sublayers = layers + + + // Update size + // ------------ + + updateSize(layers) + + // Update accesibility + // ------------ + + updateAccessibility() + } + + /** + + Creates the text layer for the given text string. + + - parameter text: Text string for the text layer. + - parameter layers: Arrays of layers containing the stars. + + - returns: The newly created text layer. + + */ + private func createTextLayer(_ text: String, layers: [CALayer]) -> CALayer { + let textLayer = CosmosLayerHelper.createTextLayer(text, + font: settings.textFont, color: settings.textColor) + + let starsSize = CosmosSize.calculateSizeToFitLayers(layers) + + if RightToLeft.isRightToLeft(self) { + CosmosText.position(textLayer, starsSize: CGSize(width: 0, height: starsSize.height), textMargin: 0) + } else { + CosmosText.position(textLayer, starsSize: starsSize, textMargin: settings.textMargin) + } + + layer.addSublayer(textLayer) + + return textLayer + } + + /** + + Adds text layer to the array of layers + + - parameter textLayer: A text layer. + - parameter layers: An array where the text layer will be added. + - returns: An array of layer with the text layer. + + */ + private func addTextLayer(textLayer: CALayer, layers: [CALayer]) -> [CALayer] { + var allLayers = layers + // Position stars after the text for right-to-left languages + if RightToLeft.isRightToLeft(self) { + for starLayer in layers { + starLayer.position.x += textLayer.bounds.width + CGFloat(settings.textMargin); + } + + allLayers.insert(textLayer, at: 0) + } else { + allLayers.append(textLayer) + } + + return allLayers + } + + /** + + Updates the size to fit all the layers containing stars and text. + + - parameter layers: Array of layers containing stars and the text. + + */ + private func updateSize(_ layers: [CALayer]) { + viewSize = CosmosSize.calculateSizeToFitLayers(layers) + invalidateIntrinsicContentSize() + + // Stretch the view to include all stars and the text. + // Needed when used without Auto Layout to receive touches for all stars. + frame.size = intrinsicContentSize + } + + /// Returns the content size to fit all the star and text layers. + override open var intrinsicContentSize:CGSize { + return viewSize + } + + /** + + Prepares the Cosmos view for reuse in a table view cell. + If the cosmos view is used in a table view cell, call this method after the + cell is dequeued. Alternatively, override UITableViewCell's prepareForReuse method and call + this method from there. + + */ + open func prepareForReuse() { + previousRatingForDidTouchCallback = -123.192 + } + + // MARK: - Accessibility + + private func updateAccessibility() { + CosmosAccessibility.update(self, rating: rating, text: text, settings: settings) + } + + /// Called by the system in accessibility voice-over mode when the value is incremented by the user. + open override func accessibilityIncrement() { + super.accessibilityIncrement() + + rating += CosmosAccessibility.accessibilityIncrement(rating, settings: settings) + didTouchCosmos?(rating) + didFinishTouchingCosmos?(rating) + } + + /// Called by the system in accessibility voice-over mode when the value is decremented by the user. + open override func accessibilityDecrement() { + super.accessibilityDecrement() + + rating -= CosmosAccessibility.accessibilityDecrement(rating, settings: settings) + didTouchCosmos?(rating) + didFinishTouchingCosmos?(rating) + } + + // MARK: - Touch recognition + + /// Closure will be called when user touches the cosmos view. The touch rating argument is passed to the closure. + open var didTouchCosmos: ((Double)->())? + + /// Closure will be called when the user lifts finger from the cosmos view. The touch rating argument is passed to the closure. + open var didFinishTouchingCosmos: ((Double)->())? + + /// Overriding the function to detect the first touch gesture. + open override func touchesBegan(_ touches: Set, with event: UIEvent?) { + if settings.passTouchesToSuperview { super.touchesBegan(touches, with: event) } + guard let location = touchLocationFromBeginningOfRating(touches) else { return } + onDidTouch(location) + } + + /// Overriding the function to detect touch move. + open override func touchesMoved(_ touches: Set, with event: UIEvent?) { + if settings.passTouchesToSuperview { super.touchesMoved(touches, with: event) } + guard let location = touchLocationFromBeginningOfRating(touches) else { return } + onDidTouch(location) + } + + /// Returns the distance of the touch relative to the left edge of the first star + func touchLocationFromBeginningOfRating(_ touches: Set) -> CGFloat? { + guard let touch = touches.first else { return nil } + var location = touch.location(in: self).x + + // In right-to-left languages, the first star will be on the right + if RightToLeft.isRightToLeft(self) { location = bounds.width - location } + + return location + } + + /// Detecting event when the user lifts their finger. + open override func touchesEnded(_ touches: Set, with event: UIEvent?) { + if settings.passTouchesToSuperview { super.touchesEnded(touches, with: event) } + didFinishTouchingCosmos?(rating) + } + + /** + + Detecting event when the touches are cancelled (can happen in a scroll view). + Behave as if user has lifted their finger. + + */ + open override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + if settings.passTouchesToSuperview { super.touchesCancelled(touches, with: event) } + didFinishTouchingCosmos?(rating) + } + + /** + + Called when the view is touched. + + - parameter locationX: The horizontal location of the touch relative to the width of the stars. + + - parameter starsWidth: The width of the stars excluding the text. + + */ + func onDidTouch(_ locationX: CGFloat) { + let calculatedTouchRating = CosmosTouch.touchRating(locationX, settings: settings) + + if settings.updateOnTouch { + rating = calculatedTouchRating + } + + if calculatedTouchRating == previousRatingForDidTouchCallback { + // Do not call didTouchCosmos if rating has not changed + return + } + + didTouchCosmos?(calculatedTouchRating) + previousRatingForDidTouchCallback = calculatedTouchRating + } + + private var previousRatingForDidTouchCallback: Double = -123.192 + + /// Increase the hitsize of the view if it's less than 44px for easier touching. + override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + let oprimizedBounds = CosmosTouchTarget.optimize(bounds) + return oprimizedBounds.contains(point) + } + + + // MARK: - Properties inspectable from the storyboard + + @IBInspectable var totalStars: Int = CosmosDefaultSettings.totalStars { + didSet { + settings.totalStars = totalStars + } + } + + @IBInspectable var starSize: Double = CosmosDefaultSettings.starSize { + didSet { + settings.starSize = starSize + } + } + + @IBInspectable var filledColor: UIColor = CosmosDefaultSettings.filledColor { + didSet { + settings.filledColor = filledColor + } + } + + @IBInspectable var emptyColor: UIColor = CosmosDefaultSettings.emptyColor { + didSet { + settings.emptyColor = emptyColor + } + } + + @IBInspectable var emptyBorderColor: UIColor = CosmosDefaultSettings.emptyBorderColor { + didSet { + settings.emptyBorderColor = emptyBorderColor + } + } + + @IBInspectable var emptyBorderWidth: Double = CosmosDefaultSettings.emptyBorderWidth { + didSet { + settings.emptyBorderWidth = emptyBorderWidth + } + } + + @IBInspectable var filledBorderColor: UIColor = CosmosDefaultSettings.filledBorderColor { + didSet { + settings.filledBorderColor = filledBorderColor + } + } + + @IBInspectable var filledBorderWidth: Double = CosmosDefaultSettings.filledBorderWidth { + didSet { + settings.filledBorderWidth = filledBorderWidth + } + } + + @IBInspectable var starMargin: Double = CosmosDefaultSettings.starMargin { + didSet { + settings.starMargin = starMargin + } + } + + @IBInspectable var fillMode: Int = CosmosDefaultSettings.fillMode.rawValue { + didSet { + settings.fillMode = StarFillMode(rawValue: fillMode) ?? CosmosDefaultSettings.fillMode + } + } + + @IBInspectable var textSize: Double = CosmosDefaultSettings.textSize { + didSet { + settings.textFont = settings.textFont.withSize(CGFloat(textSize)) + } + } + + @IBInspectable var textMargin: Double = CosmosDefaultSettings.textMargin { + didSet { + settings.textMargin = textMargin + } + } + + @IBInspectable var textColor: UIColor = CosmosDefaultSettings.textColor { + didSet { + settings.textColor = textColor + } + } + + @IBInspectable var updateOnTouch: Bool = CosmosDefaultSettings.updateOnTouch { + didSet { + settings.updateOnTouch = updateOnTouch + } + } + + @IBInspectable var minTouchRating: Double = CosmosDefaultSettings.minTouchRating { + didSet { + settings.minTouchRating = minTouchRating + } + } + + @IBInspectable var filledImage: UIImage? { + didSet { + settings.filledImage = filledImage + } + } + + @IBInspectable var emptyImage: UIImage? { + didSet { + settings.emptyImage = emptyImage + } + } + + /// Draw the stars in interface buidler + open override func prepareForInterfaceBuilder() { + super.prepareForInterfaceBuilder() + + update() + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/Helpers/CosmosTouchTarget.swift b/Travo-App/Pods/Cosmos/Cosmos/Helpers/CosmosTouchTarget.swift new file mode 100644 index 0000000..6685ad6 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/Helpers/CosmosTouchTarget.swift @@ -0,0 +1,24 @@ +import UIKit + +/** + +Helper function to make sure bounds are big enought to be used as touch target. +The function is used in pointInside(point: CGPoint, withEvent event: UIEvent?) of UIImageView. + +*/ +struct CosmosTouchTarget { + static func optimize(_ bounds: CGRect) -> CGRect { + let recommendedHitSize: CGFloat = 44 + + var hitWidthIncrease:CGFloat = recommendedHitSize - bounds.width + var hitHeightIncrease:CGFloat = recommendedHitSize - bounds.height + + if hitWidthIncrease < 0 { hitWidthIncrease = 0 } + if hitHeightIncrease < 0 { hitHeightIncrease = 0 } + + let extendedBounds: CGRect = bounds.insetBy(dx: -hitWidthIncrease / 2, + dy: -hitHeightIncrease / 2) + + return extendedBounds + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/Helpers/RightToLeft.swift b/Travo-App/Pods/Cosmos/Cosmos/Helpers/RightToLeft.swift new file mode 100644 index 0000000..7bbf5d2 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/Helpers/RightToLeft.swift @@ -0,0 +1,17 @@ +import UIKit + +/** + + Helper functions for dealing with right-to-left languages. + + */ +struct RightToLeft { + static func isRightToLeft(_ view: UIView) -> Bool { + if #available(iOS 9.0, *) { + return UIView.userInterfaceLayoutDirection( + for: view.semanticContentAttribute) == .rightToLeft + } else { + return false + } + } +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/StarFillMode.swift b/Travo-App/Pods/Cosmos/Cosmos/StarFillMode.swift new file mode 100644 index 0000000..6261af2 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/StarFillMode.swift @@ -0,0 +1,17 @@ +import Foundation + +/** + +Defines how the star is filled when the rating is not an integer number. For example, if rating is 4.6 and the fill more is Half, the star will appear to be half filled. + +*/ +public enum StarFillMode: Int { + /// Show only fully filled stars. For example, fourth star will be empty for 3.2. + case full = 0 + + /// Show fully filled and half-filled stars. For example, fourth star will be half filled for 3.6. + case half = 1 + + /// Fill star according to decimal rating. For example, fourth star will be 20% filled for 3.2. + case precise = 2 +} diff --git a/Travo-App/Pods/Cosmos/Cosmos/StarLayer.swift b/Travo-App/Pods/Cosmos/Cosmos/StarLayer.swift new file mode 100644 index 0000000..9237295 --- /dev/null +++ b/Travo-App/Pods/Cosmos/Cosmos/StarLayer.swift @@ -0,0 +1,159 @@ +import UIKit + +/** + +Creates a layer with a single star in it. + +*/ +struct StarLayer { + /** + + Creates a square layer with given size and draws the star shape in it. + + - parameter starPoints: Array of points for drawing a closed shape. The size of enclosing rectangle is 100 by 100. + + - parameter size: The width and height of the layer. The star shape is scaled to fill the size of the layer. + + - parameter lineWidth: The width of the star stroke. + + - parameter fillColor: Star shape fill color. Fill color is invisible if it is a clear color. + + - parameter strokeColor: Star shape stroke color. Stroke is invisible if it is a clear color. + + - returns: New layer containing the star shape. + + */ + static func create(_ starPoints: [CGPoint], size: Double, + lineWidth: Double, fillColor: UIColor, strokeColor: UIColor) -> CALayer { + + let containerLayer = createContainerLayer(size) + let path = createStarPath(starPoints, size: size, lineWidth: lineWidth) + + let shapeLayer = createShapeLayer(path.cgPath, lineWidth: lineWidth, + fillColor: fillColor, strokeColor: strokeColor, size: size) + + containerLayer.addSublayer(shapeLayer) + + return containerLayer + } + + /** + + Creates the star layer from an image + + - parameter image: a star image to be shown. + + - parameter size: The width and height of the layer. The image is scaled to fit the layer. + + */ + static func create(image: UIImage, size: Double) -> CALayer { + let containerLayer = createContainerLayer(size) + let imageLayer = createContainerLayer(size) + + containerLayer.addSublayer(imageLayer) + imageLayer.contents = image.cgImage + imageLayer.contentsGravity = CALayerContentsGravity.resizeAspect + + return containerLayer + } + + /** + + Creates the star shape layer. + + - parameter path: The star shape path. + + - parameter lineWidth: The width of the star stroke. + + - parameter fillColor: Star shape fill color. Fill color is invisible if it is a clear color. + + - parameter strokeColor: Star shape stroke color. Stroke is invisible if it is a clear color. + + - returns: New shape layer. + + */ + static func createShapeLayer(_ path: CGPath, lineWidth: Double, fillColor: UIColor, + strokeColor: UIColor, size: Double) -> CALayer { + + let layer = CAShapeLayer() + layer.anchorPoint = CGPoint() + layer.contentsScale = UIScreen.main.scale + layer.strokeColor = strokeColor.cgColor + layer.fillColor = fillColor.cgColor + layer.lineWidth = CGFloat(lineWidth) + layer.bounds.size = CGSize(width: size, height: size) + layer.masksToBounds = true + layer.path = path + layer.isOpaque = true + return layer + } + + /** + + Creates a layer that will contain the shape layer. + + - returns: New container layer. + + */ + static func createContainerLayer(_ size: Double) -> CALayer { + let layer = CALayer() + layer.contentsScale = UIScreen.main.scale + layer.anchorPoint = CGPoint() + layer.masksToBounds = true + layer.bounds.size = CGSize(width: size, height: size) + layer.isOpaque = true + return layer + } + + /** + + Creates a path for the given star points and size. The star points specify a shape of size 100 by 100. The star shape will be scaled if the size parameter is not 100. For exampe, if size parameter is 200 the shape will be scaled by 2. + + - parameter starPoints: Array of points for drawing a closed shape. The size of enclosing rectangle is 100 by 100. + + - parameter size: Specifies the size of the shape to return. + + - returns: New shape path. + + */ + static func createStarPath(_ starPoints: [CGPoint], size: Double, + lineWidth: Double) -> UIBezierPath { + + let lineWidthLocal = lineWidth + ceil(lineWidth * 0.3) + let sizeWithoutLineWidth = size - lineWidthLocal * 2 + + let points = scaleStar(starPoints, factor: sizeWithoutLineWidth / 100, + lineWidth: lineWidthLocal) + + let path = UIBezierPath() + path.move(to: points[0]) + let remainingPoints = Array(points[1.. [CGPoint] { + return starPoints.map { point in + return CGPoint( + x: point.x * CGFloat(factor) + CGFloat(lineWidth), + y: point.y * CGFloat(factor) + CGFloat(lineWidth) + ) + } + } +} diff --git a/Travo-App/Pods/Cosmos/LICENSE b/Travo-App/Pods/Cosmos/LICENSE new file mode 100644 index 0000000..276da5f --- /dev/null +++ b/Travo-App/Pods/Cosmos/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2015 Evgenii Neumerzhitckii + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Travo-App/Pods/Cosmos/README.md b/Travo-App/Pods/Cosmos/README.md new file mode 100644 index 0000000..f3db104 --- /dev/null +++ b/Travo-App/Pods/Cosmos/README.md @@ -0,0 +1,228 @@ +# Cosmos, a star rating control for iOS and tvOS + +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![CocoaPods Version](https://img.shields.io/cocoapods/v/Cosmos.svg?style=flat)](http://cocoadocs.org/docsets/Cosmos) +[![License](https://img.shields.io/cocoapods/l/Cosmos.svg?style=flat)](LICENSE) +[![Platform](https://img.shields.io/cocoapods/p/Cosmos.svg?style=flat)](http://cocoadocs.org/docsets/Cosmos) + +Cosmos, star rating control for iOS / Swift + +This is a UI control for iOS and tvOS written in Swift. It shows a star rating and takes rating input from the user. Cosmos is a subclass of a UIView that will allow your users to post those inescapable 1-star reviews! + +* Shows star rating with an optional text label. +* Can be used as a rating input control (iOS only). +* Cosmos view can be customized in the Storyboard without writing code. +* Includes different star filling modes: full, half-filled and precise. +* Cosmos is accessible and works with voice-over. +* Supports right-to-left languages. + + +Binary star system of Sirius A and Sirius B (artist's impression) + +*Picture of binary star system of Sirius A and Sirius B by [NASA](http://www.nasa.gov), [ESA](http://www.esa.int/ESA) and G. Bacon ([STScI](http://www.stsci.edu/portal/)). Source: [spacetelescope.org](http://www.spacetelescope.org/images/heic0516b/).* + +## Video tutorial + +Thanks to Alex Nagy from [rebeloper.com](https://rebeloper.com/) for creating this amazing [video tutorial](https://www.youtube.com/watch?v=Y4A_y29cy7Q) that shows how to use and customize Cosmos from code. + +Cosmos rating video tutorial for Swift 4.2 (Xcode10) + + +## Setup + +There are three ways you can add Cosmos to your Xcode project. + +#### Add source (iOS 8+) + +Simply add [CosmosDistrib.swift](https://github.com/evgenyneu/Cosmos/blob/master/Distrib/CosmosDistrib.swift) file into your Xcode project. + +#### Setup with Carthage (iOS 8+) + +Alternatively, add `github "evgenyneu/Cosmos" ~> 19.0` to your Cartfile and run `carthage update`. + +#### Setup with CocoaPods (iOS 8+) + +If you are using CocoaPods add this text to your Podfile and run `pod install`. + + use_frameworks! + target 'Your target name' + pod 'Cosmos', '~> 19.0' + + +#### Legacy Swift versions + +Setup a [previous version](https://github.com/evgenyneu/Cosmos/wiki/Legacy-Swift-versions) of the library if you use an older version of Swift. + + +## Usage + + +1) Drag `View` object from the *Object Library* into your storyboard. + + +Add view control in attributes inspector + + +2) Set the view's class to `CosmosView` in the *Identity Inspector*. Set its *module* property to `Cosmos` if you used Carthage or CocoaPods setup methods. + + +Add Cosmos rating view to the storyboard + +*tvOS note*: read the collowing [setup instructions for tvOS](https://github.com/evgenyneu/Cosmos/wiki/tvOS-CocoaPods-error) if you see build errors at this stage. + + +3) Customize the Cosmos view appearance in the *Attributes Inspector*. If storyboard does not show the stars click **Refresh All Views** from the **Editor** menu. + + +Customize cosmos appearance in the attributes inspector in Xcode. + + +## Positioning the Cosmos view + +One can position the Cosmos view using Auto Layout constaints. The width and height of the view is determined automatically based on the size of its content - stars and text. Therefore, there is no need to set width/height constaints on the Cosmos view. + +## Using Cosmos in code + +Add `import Cosmos` to your source code if you used Carthage or CocoaPods setup methods. + +You can style and control Cosmos view from your code by creating an outlet in your view controller. Alternatively, one can instantiate `CosmosView` class and add it to the view manually without using Storyboard. + + +```Swift +// Change the cosmos view rating +cosmosView.rating = 4 + +// Change the text +cosmosView.text = "(123)" + +// Called when user finishes changing the rating by lifting the finger from the view. +// This may be a good place to save the rating in the database or send to the server. +cosmosView.didFinishTouchingCosmos = { rating in } + +// A closure that is called when user changes the rating by touching the view. +// This can be used to update UI as the rating is being changed by moving a finger. +cosmosView.didTouchCosmos = { rating in } +``` + + +## Customization + +One can customize Cosmos from code by changing its `settings`. See the [Cosmos configuration manual](https://github.com/evgenyneu/Cosmos/wiki/Cosmos-configuration) for the complete list of configuration options. + +```Swift +// Do not change rating when touched +// Use if you need just to show the stars without getting user's input +cosmosView.settings.updateOnTouch = false + +// Show only fully filled stars +cosmosView.settings.fillMode = .full +// Other fill modes: .half, .precise + +// Change the size of the stars +cosmosView.settings.starSize = 30 + +// Set the distance between stars +cosmosView.settings.starMargin = 5 + +// Set the color of a filled star +cosmosView.settings.filledColor = UIColor.orange + +// Set the border color of an empty star +cosmosView.settings.emptyBorderColor = UIColor.orange + +// Set the border color of a filled star +cosmosView.settings.filledBorderColor = UIColor.orange +``` + + + +## Supplying images for the stars + +By default, Cosmos draws the stars from an array of points. Alternatively, one can supply custom images for the stars, both in the Storyboard and from code. + +#### Using star images from the Storyboard + +Supplying an image for a star in Xcode. + +#### Using star images from code + +```Swift +// Set image for the filled star +cosmosView.settings.filledImage = UIImage(named: "GoldStarFilled") + +// Set image for the empty star +cosmosView.settings.emptyImage = UIImage(named: "GoldStarEmpty") +``` +Note: you need to have the images for the filled and empty star in your project for this code to work. + +#### Download star image files + +Images for the golden star used in the demo app are available in [here](https://github.com/evgenyneu/Cosmos/tree/master/graphics/Stars/GoldStar). Contributions for other star images are very welcome: add vector images to `/graphics/Stars/` directory and submit a pull request. + + +## Using Cosmos in a scroll/table view + +[Here](https://github.com/evgenyneu/Cosmos/wiki/Using-Cosmos-in-a-scroll-view) is how to use Cosmos in a scroll view or a table view. + +## Using Cosmos settings from Objective-C + +[This manual](https://github.com/evgenyneu/Cosmos/wiki/Using-Cosmos-settings-in-Objective-C) describes how to set/read Cosmos settings in Objective-C apps. + + +## Demo app + +This project includes a demo iOS app. + +Five star rating control for iOS written in Swift + +#### Using cosmos in a table view + +Using cosmos in a table view + + + +## Alternative solutions + +Here are some other star rating controls for iOS: + +* [danwilliams64/DJWStarRatingView](https://github.com/danwilliams64/DJWStarRatingView) +* [dlinsin/DLStarRating](https://github.com/dlinsin/DLStarRating) +* [dyang/DYRateView](https://github.com/dyang/DYRateView) +* [erndev/EDStarRating](https://github.com/erndev/EDStarRating) +* [hugocampossousa/HCSStarRatingView](https://github.com/hugocampossousa/HCSStarRatingView) +* [shuhrat10/STRatingControl](https://github.com/shuhrat10/STRatingControl) +* [strekfus/FloatRatingView](https://github.com/strekfus/FloatRatingView) +* [yanguango/ASStarRatingView](https://github.com/yanguango/ASStarRatingView) + +## Thanks 👍 + +We would like to thank the following people for their valuable contributions. + +* [jsahoo](https://github.com/jsahoo) for additing ability to customize the Cosmos view from the interface builder with Carthage setup method. +* [0x7fffffff](https://github.com/0x7fffffff) for changing `public` access-level modifiers to `open`. +* [ali-zahedi](https://github.com/ali-zahedi) for updating to the latest version of Swift 3.0. +* [augmentedworks](https://github.com/augmentedworks) for adding borders to filled stars. +* [craiggrummitt](https://github.com/craiggrummitt) for Xcode 8 beta 4 support. +* [JimiSmith](https://github.com/JimiSmith) for Xcode 8 beta 6 support. +* [nickhart](https://github.com/nickhart) for adding compatibility with Xcode 6. +* [staticdreams](https://github.com/staticdreams) for bringing tvOS support. +* [wagnersouz4](https://github.com/wagnersouz4) for Swift 3.1 update. +* [paoloq](https://github.com/paoloq) for reporting the CosmoView frame size issue when the view is used without Auto Layout. +* [danshevluk](https://github.com/danshevluk) for adding ability to reuse settings in multiple cosmos views. +* [xrayman](https://github.com/xrayman) for reporting a table view reusability bug and improving the table view screen of the demo app. +* [chlumik](https://github.com/chlumik) for updating to Swift 4.2. +* [rebeloper](https://github.com/rebeloper) for creating a [video tutorial](https://www.youtube.com/watch?v=Y4A_y29cy7Q). +* [yuravake](https://github.com/yuravake) for adding `passTouchesToSuperview` setting. + + + +## License + +Cosmos is released under the [MIT License](LICENSE). + +## 🌌⭐️🌕🚀🌠 + +> We are a way for the cosmos to know itself. + +*Carl Sagan, from 1980 "Cosmos: A Personal Voyage" TV series.* diff --git a/Travo-App/Pods/Manifest.lock b/Travo-App/Pods/Manifest.lock new file mode 100644 index 0000000..523a2f3 --- /dev/null +++ b/Travo-App/Pods/Manifest.lock @@ -0,0 +1,20 @@ +PODS: + - Cosmos (19.0.3) + - TinyConstraints (4.0.1) + +DEPENDENCIES: + - Cosmos + - TinyConstraints + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Cosmos + - TinyConstraints + +SPEC CHECKSUMS: + Cosmos: a6fb17284281fa12cf4c85c2efecd440a215ec44 + TinyConstraints: 8dd91295e56797648c7bc335dd20e1d91ec4c192 + +PODFILE CHECKSUM: 513ed71287c25b43ec049ad0bb47c21ecce1335c + +COCOAPODS: 1.7.5 diff --git a/Travo-App/Pods/Pods.xcodeproj/project.pbxproj b/Travo-App/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c267857 --- /dev/null +++ b/Travo-App/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1046 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 049FC8D781A7ECAED15F25718502D54E /* CosmosAccessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2314E774FEC3BB8BF9003AEE30193FA5 /* CosmosAccessibility.swift */; }; + 05DFD786F217BD0DFBFB5F57D80236A5 /* CosmosTouch.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC703D66A0EAA9831BE1168789CFCD81 /* CosmosTouch.swift */; }; + 0D24FEFEF4298905C4AE3E9FC22DBC38 /* TinyConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD821EDADD6AE27D6B05EB8D94F01D8F /* TinyConstraints.swift */; }; + 10A44B18B300E2B0BF5BF88F6F2E585F /* CosmosRating.swift in Sources */ = {isa = PBXBuildFile; fileRef = 342FC4292DF6EBF8EC782442063F6549 /* CosmosRating.swift */; }; + 2FADA7115AEFDCC59593DD4201572539 /* CosmosLayers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF86DDAB03D41E046E28A23B4632A19 /* CosmosLayers.swift */; }; + 41E5B21F4758B2411A95A7C72523536D /* CosmosView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1F8C860D905E0D34B28304DF9803C8 /* CosmosView.swift */; }; + 4221AB8F56B1444AE176F2B13F81C557 /* StarLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAB75564D1B52661B81B8C81B13AC9A /* StarLayer.swift */; }; + 4404A9C8152865C62A5B59B88640811C /* CosmosSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2A0ACFF9AFFCABBD4943673DF034A6 /* CosmosSize.swift */; }; + 5C7B76FBAD8574062F60041B012FE052 /* CosmosTouchTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E78F3D2800FAD6DEDE345734062327 /* CosmosTouchTarget.swift */; }; + 602071FBBC9CE2E7E138D4B67223D4A9 /* TinyConstraints-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 025D964E785641679535D6048D61F8DA /* TinyConstraints-dummy.m */; }; + 61857850A19756A357AD6696D42E69A4 /* RightToLeft.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7610FAA6820E787A4CD5022F4DC32 /* RightToLeft.swift */; }; + 65F94D681746617BA0EC74858C4B6354 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + 66C55F598883BB9E871ECFEFF5B3D11E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + 7F686C87FC60238F640B1973302B6D08 /* TinyConstraints-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F17AAC399F870CD93CC6BB8FA6CB7A6E /* TinyConstraints-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80C64F8B50FDB2E25A939480C3FEC43A /* TinyConstraints+superview.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87E7E9DBB4D806456AA79753D1F8777 /* TinyConstraints+superview.swift */; }; + 860CCDA854EC5725962A3AE3D06D3DEA /* Pods-Travo-App-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3928E3C2092B0B02B30CD03C8484207F /* Pods-Travo-App-dummy.m */; }; + 9D60235277EEB2A0A45939E8F09A7D71 /* Cosmos-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C1F7E7198DFD00F60FAB6EC594E53901 /* Cosmos-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC7DAE5B261F8CDE268794A1B7B06F56 /* CosmosText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 828FAFBF9BC5F2D9EC3D24424F81E5B8 /* CosmosText.swift */; }; + B102CDDA26BD865D262C55794359A9AB /* Pods-Travo-AppUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EE8D574431A9C6AF8990FAB14F2ECDAF /* Pods-Travo-AppUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B594E04185C4C7522C612C631B8AD97A /* Cosmos-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C33C11C3425EE01A705B1895BEA3CC /* Cosmos-dummy.m */; }; + B5FB0A4B3A0F25C4C12431D9CB875B41 /* Pods-Travo-App-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E2DE1E227F8FEDA5E31EE40DF696E4A1 /* Pods-Travo-App-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0D5F472F17B5A0F9824C362F35A7132 /* CosmosLocalizedRating.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B3D9732FAF3AEE27A25FB6A8D7731F /* CosmosLocalizedRating.swift */; }; + C2D4109CA6435A89D7E9447C51AFC74A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + CBF8630B51B556B1D93FF064C433A66E /* Constraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E625421E9D25C6899DAA4A048984996 /* Constraints.swift */; }; + CCAEE4BF0C676D5173590E04D29BAE92 /* TinyEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ABF0AC7FBE0FC09E7625AA6F50E455 /* TinyEdgeInsets.swift */; }; + CFF984D0BDE08492C60CC2D9C75E2C96 /* Abstraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 118F831C3A01B3D6343EF51EDC8782B2 /* Abstraction.swift */; }; + DB4EACD980222A2D5C4BEE721DA4AC13 /* Pods-Travo-AppUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 77F27A010AEB64E6A93F14097381E14B /* Pods-Travo-AppUITests-dummy.m */; }; + DF7A6BC0D371FF7ECA74781F562C475F /* Stack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D868C6F6EC9E4448100F77B4E743B3B6 /* Stack.swift */; }; + E0FD27E2F7F5C05D3390126C7DF35EA6 /* CosmosSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DB2CD26299C831CB270ED6EF633FAD /* CosmosSettings.swift */; }; + E189E12EEDDD9A1484602416282A19F9 /* CosmosLayerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8E4E7BC89B8C64FA59C5672F7CB2A7 /* CosmosLayerHelper.swift */; }; + E776F53E707AD1ACF7223305E9EEDBFC /* CosmosDefaultSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3873E89540B9CF3299CDA44F25402115 /* CosmosDefaultSettings.swift */; }; + E9A920FE6E5FC6F5F58B6F3AA9B3FDAF /* StarFillMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = E349D90F5157B264D30DC9DE31486D6B /* StarFillMode.swift */; }; + EAB56C7B2652650A976538B12FBAC59D /* Constrainable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47273F6C87D88277C8D4E35129192BBD /* Constrainable.swift */; }; + F89DDE2BE4B4C16826AC30BBC21ACC57 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2E2723268B3162D92BB84F962E9DC89A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 45C4E325E7851DD54CC3AD44C7A71935; + remoteInfo = TinyConstraints; + }; + F1FE837C49D89748014553F7DF93759E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7C7061FC8186FD4E562D65401FD70688; + remoteInfo = "Pods-Travo-App"; + }; + F447390D9DEFA78D85DC17246B823679 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 00F31BD5217A20974B5E9AAC6256D98E; + remoteInfo = Cosmos; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 025D964E785641679535D6048D61F8DA /* TinyConstraints-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TinyConstraints-dummy.m"; sourceTree = ""; }; + 05249FE35803D25A4D17B2D86A58C116 /* Pods-Travo-AppUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Travo-AppUITests.modulemap"; sourceTree = ""; }; + 05C4280976BF93DA8B36818DE2E2A5E0 /* Cosmos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Cosmos.framework; path = Cosmos.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0CF86DDAB03D41E046E28A23B4632A19 /* CosmosLayers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosLayers.swift; path = Cosmos/CosmosLayers.swift; sourceTree = ""; }; + 118F831C3A01B3D6343EF51EDC8782B2 /* Abstraction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Abstraction.swift; path = TinyConstraints/Classes/Abstraction.swift; sourceTree = ""; }; + 2314E774FEC3BB8BF9003AEE30193FA5 /* CosmosAccessibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosAccessibility.swift; path = Cosmos/CosmosAccessibility.swift; sourceTree = ""; }; + 248EB203AE249596FFC55952F5590D95 /* TinyConstraints.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TinyConstraints.framework; path = TinyConstraints.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 342FC4292DF6EBF8EC782442063F6549 /* CosmosRating.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosRating.swift; path = Cosmos/CosmosRating.swift; sourceTree = ""; }; + 34C33C11C3425EE01A705B1895BEA3CC /* Cosmos-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Cosmos-dummy.m"; sourceTree = ""; }; + 3592869BFECBA22BCA42F176F0A3C490 /* Pods_Travo_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Travo_App.framework; path = "Pods-Travo-App.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3873E89540B9CF3299CDA44F25402115 /* CosmosDefaultSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosDefaultSettings.swift; path = Cosmos/CosmosDefaultSettings.swift; sourceTree = ""; }; + 3928E3C2092B0B02B30CD03C8484207F /* Pods-Travo-App-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Travo-App-dummy.m"; sourceTree = ""; }; + 47273F6C87D88277C8D4E35129192BBD /* Constrainable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constrainable.swift; path = TinyConstraints/Classes/Constrainable.swift; sourceTree = ""; }; + 50DB2CD26299C831CB270ED6EF633FAD /* CosmosSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosSettings.swift; path = Cosmos/CosmosSettings.swift; sourceTree = ""; }; + 57D8CCEAC553B86A616C0CFEA6BF74DC /* Pods_Travo_AppUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Travo_AppUITests.framework; path = "Pods-Travo-AppUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 63ABF0AC7FBE0FC09E7625AA6F50E455 /* TinyEdgeInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TinyEdgeInsets.swift; path = TinyConstraints/Classes/TinyEdgeInsets.swift; sourceTree = ""; }; + 6FAB75564D1B52661B81B8C81B13AC9A /* StarLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StarLayer.swift; path = Cosmos/StarLayer.swift; sourceTree = ""; }; + 7540D1A4E50B44D594E65FD5A50E6ACB /* Cosmos-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Cosmos-prefix.pch"; sourceTree = ""; }; + 76B3D9732FAF3AEE27A25FB6A8D7731F /* CosmosLocalizedRating.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosLocalizedRating.swift; path = Cosmos/CosmosLocalizedRating.swift; sourceTree = ""; }; + 77F27A010AEB64E6A93F14097381E14B /* Pods-Travo-AppUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Travo-AppUITests-dummy.m"; sourceTree = ""; }; + 7E625421E9D25C6899DAA4A048984996 /* Constraints.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraints.swift; path = TinyConstraints/Classes/Constraints.swift; sourceTree = ""; }; + 7FB39F1458ACDA008079E42697060DFB /* Pods-Travo-App-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Travo-App-frameworks.sh"; sourceTree = ""; }; + 82559720AD58D19820B8C5A4F9C96419 /* Pods-Travo-App.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Travo-App.modulemap"; sourceTree = ""; }; + 828FAFBF9BC5F2D9EC3D24424F81E5B8 /* CosmosText.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosText.swift; path = Cosmos/CosmosText.swift; sourceTree = ""; }; + 89656914340400F68AF1F5E71801C8D5 /* Pods-Travo-AppUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Travo-AppUITests-Info.plist"; sourceTree = ""; }; + 8E92B2929C31C972A6B70EC5A7ADC87F /* Pods-Travo-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Travo-App.release.xcconfig"; sourceTree = ""; }; + 94DEE14D05AE5B4AA742461ACE743496 /* Cosmos.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Cosmos.xcconfig; sourceTree = ""; }; + 9722DEDB35EC45FA39E34053614CDEC6 /* Pods-Travo-AppUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Travo-AppUITests-acknowledgements.markdown"; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A3AF7EDD696758EF60992017909D7EF8 /* Pods-Travo-App-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Travo-App-acknowledgements.markdown"; sourceTree = ""; }; + A4C1C80F779279790C54A39BF868AC90 /* Pods-Travo-App-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Travo-App-acknowledgements.plist"; sourceTree = ""; }; + A9E78F3D2800FAD6DEDE345734062327 /* CosmosTouchTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosTouchTarget.swift; path = Cosmos/Helpers/CosmosTouchTarget.swift; sourceTree = ""; }; + AD821EDADD6AE27D6B05EB8D94F01D8F /* TinyConstraints.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TinyConstraints.swift; path = TinyConstraints/Classes/TinyConstraints.swift; sourceTree = ""; }; + B0FA966DF83E45BA1D31FA3C552EE41A /* Pods-Travo-AppUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Travo-AppUITests-acknowledgements.plist"; sourceTree = ""; }; + B382EEF163BF8B2460D99B87B06685C7 /* Pods-Travo-App-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Travo-App-Info.plist"; sourceTree = ""; }; + BAC96A9FEA84E7B4B831C4B4919D2C01 /* TinyConstraints.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TinyConstraints.xcconfig; sourceTree = ""; }; + BC703D66A0EAA9831BE1168789CFCD81 /* CosmosTouch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosTouch.swift; path = Cosmos/CosmosTouch.swift; sourceTree = ""; }; + BC9DB14FB333ADAB067EDCD14EB3388F /* Pods-Travo-AppUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Travo-AppUITests.debug.xcconfig"; sourceTree = ""; }; + BE1F8C860D905E0D34B28304DF9803C8 /* CosmosView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosView.swift; path = Cosmos/CosmosView.swift; sourceTree = ""; }; + C13884D8FF84B3C44B6FDFDAEC0C2AE4 /* TinyConstraints-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TinyConstraints-prefix.pch"; sourceTree = ""; }; + C1F7E7198DFD00F60FAB6EC594E53901 /* Cosmos-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Cosmos-umbrella.h"; sourceTree = ""; }; + CCC7610FAA6820E787A4CD5022F4DC32 /* RightToLeft.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RightToLeft.swift; path = Cosmos/Helpers/RightToLeft.swift; sourceTree = ""; }; + CD8E4E7BC89B8C64FA59C5672F7CB2A7 /* CosmosLayerHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosLayerHelper.swift; path = Cosmos/CosmosLayerHelper.swift; sourceTree = ""; }; + D0FFA7D138D112F913CAA8A2D1D0F4A4 /* Pods-Travo-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Travo-App.debug.xcconfig"; sourceTree = ""; }; + D563FCCD21187EE5B97EF13DC21D8C7D /* Cosmos.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Cosmos.modulemap; sourceTree = ""; }; + D868C6F6EC9E4448100F77B4E743B3B6 /* Stack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stack.swift; path = TinyConstraints/Classes/Stack.swift; sourceTree = ""; }; + DD2A0ACFF9AFFCABBD4943673DF034A6 /* CosmosSize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CosmosSize.swift; path = Cosmos/CosmosSize.swift; sourceTree = ""; }; + E2DE1E227F8FEDA5E31EE40DF696E4A1 /* Pods-Travo-App-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Travo-App-umbrella.h"; sourceTree = ""; }; + E349D90F5157B264D30DC9DE31486D6B /* StarFillMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StarFillMode.swift; path = Cosmos/StarFillMode.swift; sourceTree = ""; }; + E87E7E9DBB4D806456AA79753D1F8777 /* TinyConstraints+superview.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TinyConstraints+superview.swift"; path = "TinyConstraints/Classes/TinyConstraints+superview.swift"; sourceTree = ""; }; + EE8D574431A9C6AF8990FAB14F2ECDAF /* Pods-Travo-AppUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Travo-AppUITests-umbrella.h"; sourceTree = ""; }; + F0D78FF0DD96AD2CFD8973AE5202029C /* Pods-Travo-AppUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Travo-AppUITests.release.xcconfig"; sourceTree = ""; }; + F17AAC399F870CD93CC6BB8FA6CB7A6E /* TinyConstraints-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TinyConstraints-umbrella.h"; sourceTree = ""; }; + F940012D5EE7D7BC4D52E36CE40B1207 /* TinyConstraints.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TinyConstraints.modulemap; sourceTree = ""; }; + FE664E1F0AC08E8410553473CA152224 /* Cosmos-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Cosmos-Info.plist"; sourceTree = ""; }; + FF9468386C44A785655C3B8C24F11056 /* TinyConstraints-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TinyConstraints-Info.plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 36535A7B888AFE58F76BDA6B07CEB9C6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F89DDE2BE4B4C16826AC30BBC21ACC57 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43A36526B188704C10243F567E95EAC1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C2D4109CA6435A89D7E9447C51AFC74A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB6E52D502B671C0EF70A7F36D0C5923 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 65F94D681746617BA0EC74858C4B6354 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FE1AF85FC1246D05E670ED0CE453B016 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 66C55F598883BB9E871ECFEFF5B3D11E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1A838E120FFB82721DFC40D30FF2FB3F /* Support Files */ = { + isa = PBXGroup; + children = ( + D563FCCD21187EE5B97EF13DC21D8C7D /* Cosmos.modulemap */, + 94DEE14D05AE5B4AA742461ACE743496 /* Cosmos.xcconfig */, + 34C33C11C3425EE01A705B1895BEA3CC /* Cosmos-dummy.m */, + FE664E1F0AC08E8410553473CA152224 /* Cosmos-Info.plist */, + 7540D1A4E50B44D594E65FD5A50E6ACB /* Cosmos-prefix.pch */, + C1F7E7198DFD00F60FAB6EC594E53901 /* Cosmos-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Cosmos"; + sourceTree = ""; + }; + 2B5B31EC1C53BAE026CB5BD35D9AB8D3 /* Pods-Travo-AppUITests */ = { + isa = PBXGroup; + children = ( + 05249FE35803D25A4D17B2D86A58C116 /* Pods-Travo-AppUITests.modulemap */, + 9722DEDB35EC45FA39E34053614CDEC6 /* Pods-Travo-AppUITests-acknowledgements.markdown */, + B0FA966DF83E45BA1D31FA3C552EE41A /* Pods-Travo-AppUITests-acknowledgements.plist */, + 77F27A010AEB64E6A93F14097381E14B /* Pods-Travo-AppUITests-dummy.m */, + 89656914340400F68AF1F5E71801C8D5 /* Pods-Travo-AppUITests-Info.plist */, + EE8D574431A9C6AF8990FAB14F2ECDAF /* Pods-Travo-AppUITests-umbrella.h */, + BC9DB14FB333ADAB067EDCD14EB3388F /* Pods-Travo-AppUITests.debug.xcconfig */, + F0D78FF0DD96AD2CFD8973AE5202029C /* Pods-Travo-AppUITests.release.xcconfig */, + ); + name = "Pods-Travo-AppUITests"; + path = "Target Support Files/Pods-Travo-AppUITests"; + sourceTree = ""; + }; + 59FF07D0526340714EA575ED2E02D809 /* Pods */ = { + isa = PBXGroup; + children = ( + AB6F73015E96B63F53EC0138C0934D20 /* Cosmos */, + 8B8BF0CA049CE39843CBB9E89C4EDE0A /* TinyConstraints */, + ); + name = Pods; + sourceTree = ""; + }; + 6D8FCE289C1E612AAE3E62C41D730D28 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + C21391CFFBD43CCCCFCC53E49CE9A17B /* Pods-Travo-App */, + 2B5B31EC1C53BAE026CB5BD35D9AB8D3 /* Pods-Travo-AppUITests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 8B8BF0CA049CE39843CBB9E89C4EDE0A /* TinyConstraints */ = { + isa = PBXGroup; + children = ( + 118F831C3A01B3D6343EF51EDC8782B2 /* Abstraction.swift */, + 47273F6C87D88277C8D4E35129192BBD /* Constrainable.swift */, + 7E625421E9D25C6899DAA4A048984996 /* Constraints.swift */, + D868C6F6EC9E4448100F77B4E743B3B6 /* Stack.swift */, + AD821EDADD6AE27D6B05EB8D94F01D8F /* TinyConstraints.swift */, + E87E7E9DBB4D806456AA79753D1F8777 /* TinyConstraints+superview.swift */, + 63ABF0AC7FBE0FC09E7625AA6F50E455 /* TinyEdgeInsets.swift */, + B134408B033B71945842305945F1128F /* Support Files */, + ); + name = TinyConstraints; + path = TinyConstraints; + sourceTree = ""; + }; + AB6F73015E96B63F53EC0138C0934D20 /* Cosmos */ = { + isa = PBXGroup; + children = ( + 2314E774FEC3BB8BF9003AEE30193FA5 /* CosmosAccessibility.swift */, + 3873E89540B9CF3299CDA44F25402115 /* CosmosDefaultSettings.swift */, + CD8E4E7BC89B8C64FA59C5672F7CB2A7 /* CosmosLayerHelper.swift */, + 0CF86DDAB03D41E046E28A23B4632A19 /* CosmosLayers.swift */, + 76B3D9732FAF3AEE27A25FB6A8D7731F /* CosmosLocalizedRating.swift */, + 342FC4292DF6EBF8EC782442063F6549 /* CosmosRating.swift */, + 50DB2CD26299C831CB270ED6EF633FAD /* CosmosSettings.swift */, + DD2A0ACFF9AFFCABBD4943673DF034A6 /* CosmosSize.swift */, + 828FAFBF9BC5F2D9EC3D24424F81E5B8 /* CosmosText.swift */, + BC703D66A0EAA9831BE1168789CFCD81 /* CosmosTouch.swift */, + A9E78F3D2800FAD6DEDE345734062327 /* CosmosTouchTarget.swift */, + BE1F8C860D905E0D34B28304DF9803C8 /* CosmosView.swift */, + CCC7610FAA6820E787A4CD5022F4DC32 /* RightToLeft.swift */, + E349D90F5157B264D30DC9DE31486D6B /* StarFillMode.swift */, + 6FAB75564D1B52661B81B8C81B13AC9A /* StarLayer.swift */, + 1A838E120FFB82721DFC40D30FF2FB3F /* Support Files */, + ); + name = Cosmos; + path = Cosmos; + sourceTree = ""; + }; + B134408B033B71945842305945F1128F /* Support Files */ = { + isa = PBXGroup; + children = ( + F940012D5EE7D7BC4D52E36CE40B1207 /* TinyConstraints.modulemap */, + BAC96A9FEA84E7B4B831C4B4919D2C01 /* TinyConstraints.xcconfig */, + 025D964E785641679535D6048D61F8DA /* TinyConstraints-dummy.m */, + FF9468386C44A785655C3B8C24F11056 /* TinyConstraints-Info.plist */, + C13884D8FF84B3C44B6FDFDAEC0C2AE4 /* TinyConstraints-prefix.pch */, + F17AAC399F870CD93CC6BB8FA6CB7A6E /* TinyConstraints-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/TinyConstraints"; + sourceTree = ""; + }; + C0834CEBB1379A84116EF29F93051C60 /* iOS */ = { + isa = PBXGroup; + children = ( + 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + C21391CFFBD43CCCCFCC53E49CE9A17B /* Pods-Travo-App */ = { + isa = PBXGroup; + children = ( + 82559720AD58D19820B8C5A4F9C96419 /* Pods-Travo-App.modulemap */, + A3AF7EDD696758EF60992017909D7EF8 /* Pods-Travo-App-acknowledgements.markdown */, + A4C1C80F779279790C54A39BF868AC90 /* Pods-Travo-App-acknowledgements.plist */, + 3928E3C2092B0B02B30CD03C8484207F /* Pods-Travo-App-dummy.m */, + 7FB39F1458ACDA008079E42697060DFB /* Pods-Travo-App-frameworks.sh */, + B382EEF163BF8B2460D99B87B06685C7 /* Pods-Travo-App-Info.plist */, + E2DE1E227F8FEDA5E31EE40DF696E4A1 /* Pods-Travo-App-umbrella.h */, + D0FFA7D138D112F913CAA8A2D1D0F4A4 /* Pods-Travo-App.debug.xcconfig */, + 8E92B2929C31C972A6B70EC5A7ADC87F /* Pods-Travo-App.release.xcconfig */, + ); + name = "Pods-Travo-App"; + path = "Target Support Files/Pods-Travo-App"; + sourceTree = ""; + }; + C3CA8D6CEAC075419F7BF2B0F497FD13 /* Products */ = { + isa = PBXGroup; + children = ( + 05C4280976BF93DA8B36818DE2E2A5E0 /* Cosmos.framework */, + 3592869BFECBA22BCA42F176F0A3C490 /* Pods_Travo_App.framework */, + 57D8CCEAC553B86A616C0CFEA6BF74DC /* Pods_Travo_AppUITests.framework */, + 248EB203AE249596FFC55952F5590D95 /* TinyConstraints.framework */, + ); + name = Products; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + 59FF07D0526340714EA575ED2E02D809 /* Pods */, + C3CA8D6CEAC075419F7BF2B0F497FD13 /* Products */, + 6D8FCE289C1E612AAE3E62C41D730D28 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C0834CEBB1379A84116EF29F93051C60 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 98FE3D0A640F390EA7AEA8E88F47DEDA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7F686C87FC60238F640B1973302B6D08 /* TinyConstraints-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B322FEDA9FF4BA8B0BEC872F3EE3F648 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D60235277EEB2A0A45939E8F09A7D71 /* Cosmos-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D4E4FE34D691966C5F600494E0A9FA40 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B102CDDA26BD865D262C55794359A9AB /* Pods-Travo-AppUITests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F834B330BF4AC2200F901CB33DEB42F5 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B5FB0A4B3A0F25C4C12431D9CB875B41 /* Pods-Travo-App-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 00F31BD5217A20974B5E9AAC6256D98E /* Cosmos */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9C4761D1E5276039F76D9BA8BF0272D7 /* Build configuration list for PBXNativeTarget "Cosmos" */; + buildPhases = ( + B322FEDA9FF4BA8B0BEC872F3EE3F648 /* Headers */, + 53D2AD99A3C2BFB2E1448B62E35F78AB /* Sources */, + FE1AF85FC1246D05E670ED0CE453B016 /* Frameworks */, + 6571FF59854C9ED976246EA41FEA37C1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Cosmos; + productName = Cosmos; + productReference = 05C4280976BF93DA8B36818DE2E2A5E0 /* Cosmos.framework */; + productType = "com.apple.product-type.framework"; + }; + 45C4E325E7851DD54CC3AD44C7A71935 /* TinyConstraints */ = { + isa = PBXNativeTarget; + buildConfigurationList = DED162CA822CAFF9F3B82904FBA2988C /* Build configuration list for PBXNativeTarget "TinyConstraints" */; + buildPhases = ( + 98FE3D0A640F390EA7AEA8E88F47DEDA /* Headers */, + B22F16F1C73358E59AE260C86E3D1F1D /* Sources */, + 36535A7B888AFE58F76BDA6B07CEB9C6 /* Frameworks */, + 7465A1319E37DADA12A8BAEB409143AA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TinyConstraints; + productName = TinyConstraints; + productReference = 248EB203AE249596FFC55952F5590D95 /* TinyConstraints.framework */; + productType = "com.apple.product-type.framework"; + }; + 7C7061FC8186FD4E562D65401FD70688 /* Pods-Travo-App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 16BD0888381429C88C218B88C18066DD /* Build configuration list for PBXNativeTarget "Pods-Travo-App" */; + buildPhases = ( + F834B330BF4AC2200F901CB33DEB42F5 /* Headers */, + D061BF165D55B3B63963FABFDBC4A17D /* Sources */, + 43A36526B188704C10243F567E95EAC1 /* Frameworks */, + 0EF1EE4946DB99370EF79508A870A637 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + E5BC4D64E16A4ED0822ABE08D86E833A /* PBXTargetDependency */, + 9A17A28D7D59CBF3A84ACF73DC002964 /* PBXTargetDependency */, + ); + name = "Pods-Travo-App"; + productName = "Pods-Travo-App"; + productReference = 3592869BFECBA22BCA42F176F0A3C490 /* Pods_Travo_App.framework */; + productType = "com.apple.product-type.framework"; + }; + A83793EA294629748F52E7E0FA7DEFE9 /* Pods-Travo-AppUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 05E6232FE4FBE9DE7144DB9C05F65A41 /* Build configuration list for PBXNativeTarget "Pods-Travo-AppUITests" */; + buildPhases = ( + D4E4FE34D691966C5F600494E0A9FA40 /* Headers */, + 78ED46DD098D788693067970ADB98090 /* Sources */, + CB6E52D502B671C0EF70A7F36D0C5923 /* Frameworks */, + 2D38CAAE593632FE6C65DA6DC1BCE9DE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2D62190D5BC5840A18FD69483A060946 /* PBXTargetDependency */, + ); + name = "Pods-Travo-AppUITests"; + productName = "Pods-Travo-AppUITests"; + productReference = 57D8CCEAC553B86A616C0CFEA6BF74DC /* Pods_Travo_AppUITests.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = C3CA8D6CEAC075419F7BF2B0F497FD13 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 00F31BD5217A20974B5E9AAC6256D98E /* Cosmos */, + 7C7061FC8186FD4E562D65401FD70688 /* Pods-Travo-App */, + A83793EA294629748F52E7E0FA7DEFE9 /* Pods-Travo-AppUITests */, + 45C4E325E7851DD54CC3AD44C7A71935 /* TinyConstraints */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0EF1EE4946DB99370EF79508A870A637 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D38CAAE593632FE6C65DA6DC1BCE9DE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6571FF59854C9ED976246EA41FEA37C1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7465A1319E37DADA12A8BAEB409143AA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53D2AD99A3C2BFB2E1448B62E35F78AB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B594E04185C4C7522C612C631B8AD97A /* Cosmos-dummy.m in Sources */, + 049FC8D781A7ECAED15F25718502D54E /* CosmosAccessibility.swift in Sources */, + E776F53E707AD1ACF7223305E9EEDBFC /* CosmosDefaultSettings.swift in Sources */, + E189E12EEDDD9A1484602416282A19F9 /* CosmosLayerHelper.swift in Sources */, + 2FADA7115AEFDCC59593DD4201572539 /* CosmosLayers.swift in Sources */, + C0D5F472F17B5A0F9824C362F35A7132 /* CosmosLocalizedRating.swift in Sources */, + 10A44B18B300E2B0BF5BF88F6F2E585F /* CosmosRating.swift in Sources */, + E0FD27E2F7F5C05D3390126C7DF35EA6 /* CosmosSettings.swift in Sources */, + 4404A9C8152865C62A5B59B88640811C /* CosmosSize.swift in Sources */, + AC7DAE5B261F8CDE268794A1B7B06F56 /* CosmosText.swift in Sources */, + 05DFD786F217BD0DFBFB5F57D80236A5 /* CosmosTouch.swift in Sources */, + 5C7B76FBAD8574062F60041B012FE052 /* CosmosTouchTarget.swift in Sources */, + 41E5B21F4758B2411A95A7C72523536D /* CosmosView.swift in Sources */, + 61857850A19756A357AD6696D42E69A4 /* RightToLeft.swift in Sources */, + E9A920FE6E5FC6F5F58B6F3AA9B3FDAF /* StarFillMode.swift in Sources */, + 4221AB8F56B1444AE176F2B13F81C557 /* StarLayer.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 78ED46DD098D788693067970ADB98090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DB4EACD980222A2D5C4BEE721DA4AC13 /* Pods-Travo-AppUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B22F16F1C73358E59AE260C86E3D1F1D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CFF984D0BDE08492C60CC2D9C75E2C96 /* Abstraction.swift in Sources */, + EAB56C7B2652650A976538B12FBAC59D /* Constrainable.swift in Sources */, + CBF8630B51B556B1D93FF064C433A66E /* Constraints.swift in Sources */, + DF7A6BC0D371FF7ECA74781F562C475F /* Stack.swift in Sources */, + 80C64F8B50FDB2E25A939480C3FEC43A /* TinyConstraints+superview.swift in Sources */, + 602071FBBC9CE2E7E138D4B67223D4A9 /* TinyConstraints-dummy.m in Sources */, + 0D24FEFEF4298905C4AE3E9FC22DBC38 /* TinyConstraints.swift in Sources */, + CCAEE4BF0C676D5173590E04D29BAE92 /* TinyEdgeInsets.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D061BF165D55B3B63963FABFDBC4A17D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 860CCDA854EC5725962A3AE3D06D3DEA /* Pods-Travo-App-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2D62190D5BC5840A18FD69483A060946 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-Travo-App"; + target = 7C7061FC8186FD4E562D65401FD70688 /* Pods-Travo-App */; + targetProxy = F1FE837C49D89748014553F7DF93759E /* PBXContainerItemProxy */; + }; + 9A17A28D7D59CBF3A84ACF73DC002964 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = TinyConstraints; + target = 45C4E325E7851DD54CC3AD44C7A71935 /* TinyConstraints */; + targetProxy = 2E2723268B3162D92BB84F962E9DC89A /* PBXContainerItemProxy */; + }; + E5BC4D64E16A4ED0822ABE08D86E833A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Cosmos; + target = 00F31BD5217A20974B5E9AAC6256D98E /* Cosmos */; + targetProxy = F447390D9DEFA78D85DC17246B823679 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 05A3705D5CBFBEAAAE493B7ECBE50D91 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8E92B2929C31C972A6B70EC5A7ADC87F /* Pods-Travo-App.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-Travo-App/Pods-Travo-App-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Travo-App/Pods-Travo-App.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 38F6C2A50524859FFE4613E5B6270EB8 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 94DEE14D05AE5B4AA742461ACE743496 /* Cosmos.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Cosmos/Cosmos-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Cosmos/Cosmos-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Cosmos/Cosmos.modulemap"; + PRODUCT_MODULE_NAME = Cosmos; + PRODUCT_NAME = Cosmos; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 6410F571BA8C1AEC6A19403F1B61B0B5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 808EA8BE922628A603EFF6A61532F38E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BAC96A9FEA84E7B4B831C4B4919D2C01 /* TinyConstraints.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/TinyConstraints/TinyConstraints-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TinyConstraints/TinyConstraints-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/TinyConstraints/TinyConstraints.modulemap"; + PRODUCT_MODULE_NAME = TinyConstraints; + PRODUCT_NAME = TinyConstraints; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9A3277E87FB6873B0809FFC982A9E472 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D0FFA7D138D112F913CAA8A2D1D0F4A4 /* Pods-Travo-App.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-Travo-App/Pods-Travo-App-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Travo-App/Pods-Travo-App.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + A27713CB74E99AF202AADC23200A32F4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + BE255F0EA766E29DADFA3DA22B13F348 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC9DB14FB333ADAB067EDCD14EB3388F /* Pods-Travo-AppUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DD039E802F24E5ADA372694B29D3B3F8 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 94DEE14D05AE5B4AA742461ACE743496 /* Cosmos.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Cosmos/Cosmos-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Cosmos/Cosmos-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Cosmos/Cosmos.modulemap"; + PRODUCT_MODULE_NAME = Cosmos; + PRODUCT_NAME = Cosmos; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F2B0D8CA131D01709F6298EB0D703891 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F0D78FF0DD96AD2CFD8973AE5202029C /* Pods-Travo-AppUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F94F9A7A89188A502D190530F866A5BE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BAC96A9FEA84E7B4B831C4B4919D2C01 /* TinyConstraints.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/TinyConstraints/TinyConstraints-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TinyConstraints/TinyConstraints-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/TinyConstraints/TinyConstraints.modulemap"; + PRODUCT_MODULE_NAME = TinyConstraints; + PRODUCT_NAME = TinyConstraints; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 05E6232FE4FBE9DE7144DB9C05F65A41 /* Build configuration list for PBXNativeTarget "Pods-Travo-AppUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BE255F0EA766E29DADFA3DA22B13F348 /* Debug */, + F2B0D8CA131D01709F6298EB0D703891 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 16BD0888381429C88C218B88C18066DD /* Build configuration list for PBXNativeTarget "Pods-Travo-App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9A3277E87FB6873B0809FFC982A9E472 /* Debug */, + 05A3705D5CBFBEAAAE493B7ECBE50D91 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6410F571BA8C1AEC6A19403F1B61B0B5 /* Debug */, + A27713CB74E99AF202AADC23200A32F4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9C4761D1E5276039F76D9BA8BF0272D7 /* Build configuration list for PBXNativeTarget "Cosmos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DD039E802F24E5ADA372694B29D3B3F8 /* Debug */, + 38F6C2A50524859FFE4613E5B6270EB8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DED162CA822CAFF9F3B82904FBA2988C /* Build configuration list for PBXNativeTarget "TinyConstraints" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 808EA8BE922628A603EFF6A61532F38E /* Debug */, + F94F9A7A89188A502D190530F866A5BE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-Info.plist b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-Info.plist new file mode 100644 index 0000000..a7744ee --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 19.0.3 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-dummy.m b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-dummy.m new file mode 100644 index 0000000..9994434 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Cosmos : NSObject +@end +@implementation PodsDummy_Cosmos +@end diff --git a/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-prefix.pch b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-umbrella.h b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-umbrella.h new file mode 100644 index 0000000..5eb01bb --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double CosmosVersionNumber; +FOUNDATION_EXPORT const unsigned char CosmosVersionString[]; + diff --git a/Travo-App/Pods/Target Support Files/Cosmos/Cosmos.modulemap b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos.modulemap new file mode 100644 index 0000000..b636c84 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos.modulemap @@ -0,0 +1,6 @@ +framework module Cosmos { + umbrella header "Cosmos-umbrella.h" + + export * + module * { export * } +} diff --git a/Travo-App/Pods/Target Support Files/Cosmos/Cosmos.xcconfig b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos.xcconfig new file mode 100644 index 0000000..744c8d6 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Cosmos/Cosmos.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Cosmos +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Cosmos +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-Info.plist b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.markdown b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.markdown new file mode 100644 index 0000000..a55f4c1 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.markdown @@ -0,0 +1,53 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Cosmos + +The MIT License + +Copyright (c) 2015 Evgenii Neumerzhitckii + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## TinyConstraints + + +MIT License + +Copyright (c) 2017 Robert-Hein Hooijmans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.plist b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.plist new file mode 100644 index 0000000..4406c13 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-acknowledgements.plist @@ -0,0 +1,91 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License + +Copyright (c) 2015 Evgenii Neumerzhitckii + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + License + MIT + Title + Cosmos + Type + PSGroupSpecifier + + + FooterText + +MIT License + +Copyright (c) 2017 Robert-Hein Hooijmans <rh.hooijmans@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + License + MIT + Title + TinyConstraints + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-dummy.m b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-dummy.m new file mode 100644 index 0000000..14a2b09 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Travo_App : NSObject +@end +@implementation PodsDummy_Pods_Travo_App +@end diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-input-files.xcfilelist b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..b9e5ac2 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh +${BUILT_PRODUCTS_DIR}/Cosmos/Cosmos.framework +${BUILT_PRODUCTS_DIR}/TinyConstraints/TinyConstraints.framework \ No newline at end of file diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-output-files.xcfilelist b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..92df563 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cosmos.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TinyConstraints.framework \ No newline at end of file diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-input-files.xcfilelist b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..b9e5ac2 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh +${BUILT_PRODUCTS_DIR}/Cosmos/Cosmos.framework +${BUILT_PRODUCTS_DIR}/TinyConstraints/TinyConstraints.framework \ No newline at end of file diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-output-files.xcfilelist b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..92df563 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cosmos.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TinyConstraints.framework \ No newline at end of file diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh new file mode 100755 index 0000000..94e4356 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh @@ -0,0 +1,173 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Cosmos/Cosmos.framework" + install_framework "${BUILT_PRODUCTS_DIR}/TinyConstraints/TinyConstraints.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Cosmos/Cosmos.framework" + install_framework "${BUILT_PRODUCTS_DIR}/TinyConstraints/TinyConstraints.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-umbrella.h b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-umbrella.h new file mode 100644 index 0000000..9611bdf --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_Travo_AppVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_Travo_AppVersionString[]; + diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.debug.xcconfig b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.debug.xcconfig new file mode 100644 index 0000000..012ea86 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.debug.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos/Cosmos.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints/TinyConstraints.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "Cosmos" -framework "TinyConstraints" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.modulemap b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.modulemap new file mode 100644 index 0000000..636b325 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Travo_App { + umbrella header "Pods-Travo-App-umbrella.h" + + export * + module * { export * } +} diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.release.xcconfig b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.release.xcconfig new file mode 100644 index 0000000..012ea86 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-App/Pods-Travo-App.release.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos/Cosmos.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints/TinyConstraints.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "Cosmos" -framework "TinyConstraints" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-Info.plist b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.markdown b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.plist b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-dummy.m b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-dummy.m new file mode 100644 index 0000000..303d5d2 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Travo_AppUITests : NSObject +@end +@implementation PodsDummy_Pods_Travo_AppUITests +@end diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-umbrella.h b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-umbrella.h new file mode 100644 index 0000000..6a3b513 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_Travo_AppUITestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_Travo_AppUITestsVersionString[]; + diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.debug.xcconfig b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.debug.xcconfig new file mode 100644 index 0000000..e47f23e --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos/Cosmos.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints/TinyConstraints.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Cosmos" -framework "TinyConstraints" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.modulemap b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.modulemap new file mode 100644 index 0000000..3830582 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Travo_AppUITests { + umbrella header "Pods-Travo-AppUITests-umbrella.h" + + export * + module * { export * } +} diff --git a/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.release.xcconfig b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.release.xcconfig new file mode 100644 index 0000000..e47f23e --- /dev/null +++ b/Travo-App/Pods/Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Cosmos/Cosmos.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints/TinyConstraints.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Cosmos" -framework "TinyConstraints" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-Info.plist b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-Info.plist new file mode 100644 index 0000000..b672cd7 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 4.0.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-dummy.m b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-dummy.m new file mode 100644 index 0000000..f7a9b95 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_TinyConstraints : NSObject +@end +@implementation PodsDummy_TinyConstraints +@end diff --git a/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-prefix.pch b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-umbrella.h b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-umbrella.h new file mode 100644 index 0000000..2c2d12c --- /dev/null +++ b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double TinyConstraintsVersionNumber; +FOUNDATION_EXPORT const unsigned char TinyConstraintsVersionString[]; + diff --git a/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.modulemap b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.modulemap new file mode 100644 index 0000000..b004e3e --- /dev/null +++ b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.modulemap @@ -0,0 +1,6 @@ +framework module TinyConstraints { + umbrella header "TinyConstraints-umbrella.h" + + export * + module * { export * } +} diff --git a/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.xcconfig b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.xcconfig new file mode 100644 index 0000000..58db566 --- /dev/null +++ b/Travo-App/Pods/Target Support Files/TinyConstraints/TinyConstraints.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TinyConstraints +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/TinyConstraints +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Travo-App/Pods/TinyConstraints/LICENSE b/Travo-App/Pods/TinyConstraints/LICENSE new file mode 100644 index 0000000..c5a8fd3 --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/LICENSE @@ -0,0 +1,22 @@ + +MIT License + +Copyright (c) 2017 Robert-Hein Hooijmans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Travo-App/Pods/TinyConstraints/README.md b/Travo-App/Pods/TinyConstraints/README.md new file mode 100644 index 0000000..64ce97d --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/README.md @@ -0,0 +1,188 @@ +**TinyConstraints** is the syntactic sugar that makes Auto Layout sweeter for human use. + +

+ TinyConstraints + TinyConstraints +

+ +## Features + +- [X] Pure Swift 5 sweetness. +- [X] Everything you can do with Auto Layout, but shorter. +- [X] Constraints are active by default. +- [X] 100% compatible with other Auto Layout code. +- [X] Optionally store your constraints. +- [X] Set constraint priorities upon creation. +- [X] Constrain directly to the superview. +- [X] Stack views together with one line of code. +- [X] No need to set `translatesAutoresizingMaskIntoConstraints` because `TinyConstraints` does it for you. + +## Examples +### Edges +Attaching a view to its superview with `NSLayoutConstraint`: + +```swift +NSLayoutConstraint.activate([ + view.topAnchor.constraint(equalTo: superview.topAnchor, constant: 0), + view.leadingAnchor.constraint(equalTo: superview.leadingAnchor, constant: 0), + view.bottomAnchor.constraint(equalTo: superview.bottomAnchor, constant: 0), + view.trailingAnchor.constraint(equalTo: superview.trailingAnchor, constant: 0) +]) +``` + +with `TinyConstraints`: + +```swift +view.edgesToSuperView() +``` + +or: + +```swift +view.edgesToSuperView(insets: .top(10) + .left(10)) +``` +### Center +Constraining the center of a view to its superview with `NSLayoutConstraint`: + +```swift +NSLayoutConstraint.activate([ + view.centerXAnchor.constraint(equalTo: superview.centerXAnchor, constant: 0) + view.centerYAnchor.constraint(equalTo: superview.centerYAnchor, constant: 0) +]) +``` + +with `TinyConstraints`: + +```swift +view.center(in: superview) +``` + +or: + +```swift +view.center(in: superview, offset: CGPoint(x: 10, y: 10)) +``` + +## Basic Use + +### Typealiases + +`TinyConstraints` gives you convenient and tiny typealiases for handling constraints. + +- `Constraint` = `NSLayoutConstraint` +- `Constraints` = `[NSLayoutConstraint]` + +### Equal and Unequal Anchors +This constraints the `top-anchor` of the view to the `top-anchor` of the superview: + +```swift +view.top(to: superview) +``` + +This constraints the `top-anchor` of `firstView` to the `bottom-anchor` of `secondView`: + +```swift +firstView.topToBottom(of: secondView) +``` + +### Constrain to Superview +Often you need to constrain a view to it's superview, with TinyConstraints you can do this super easy: + +```swift +view.edgesToSuperview() +``` + +Or only one edge: + +```swift +view.topToSuperview() +``` + +Or you can attach all edges except one, like this: + +```swift +view.edgesToSuperview(excluding: .bottom) +``` + +### Relation and Priority +For almost all constraints you can set the `relation` and `priority` properties. The default relation is `.equal` and the default priority is `.required`: + +```swift +container.width(150, relation: .equalOrLess, priority: .high) +``` + +### Storing Constraints +Here we create a set of inactive constraints and store these to our property: + +```swift +let constraints = view.size(CGSize(width: 100, height: 100), isActive: false) +``` + +### Activation and Deactivation +Besides the default `NSLayoutConstraint` activation, `TinyConstraints` also provides a way to activate *a set* of constraints: + +```swift +constraints.activate() +``` + +You can also do this in an animation: + +```swift +oldConstraints.deActivate() + +constraints.activate() +UIViewPropertyAnimator(duration: 1, dampingRatio: 0.4) { + self.layoutIfNeeded() +}.startAnimation() +``` + +### Animating Constraint Constants +Here we add a height constraint to a view, store it and animate it later: + +```swift +let height = view.height(100) + +height.constant = 200 +UIViewPropertyAnimator(duration: 1, dampingRatio: 0.4) { + self.layoutIfNeeded() +}.startAnimation() +``` + +### Stack +Stack provides a way of constraining views together in a superview: + +```swift +let views = [logo, title, description] +superview.stack(views, axis: .vertical, spacing: 10) +``` + +##### Find these examples and more in the *Example Project*. + +## Installation + +### CocoaPods + +TinyConstraints is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod "TinyConstraints" +``` + +### Carthage + +TinyConstraints is available through [Carthage](https://github.com/Carthage/Carthage). To install +it, simply add the following line to your Cartfile: + +``` +github "roberthein/TinyConstraints" +``` + +## Tutorials + +Here are some [video tutorials](https://www.youtube.com/playlist?list=PL_csAAO9PQ8ZDbGk57RlBRnNpxBGBAEOc) made by [Alex Nagy](https://github.com/rebeloper). + + +## Suggestions or feedback? + +Feel free to create a pull request, open an issue or find [me on Twitter](https://twitter.com/roberthein). diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Abstraction.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Abstraction.swift new file mode 100644 index 0000000..a192365 --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Abstraction.swift @@ -0,0 +1,48 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Foundation + +#if os(OSX) + import AppKit + + public typealias View = NSView + public typealias LayoutGuide = NSLayoutGuide + public typealias ConstraintAxis = NSLayoutConstraint.Orientation + public typealias LayoutPriority = NSLayoutConstraint.Priority + public typealias TinyEdgeInsets = NSEdgeInsets + + public extension NSEdgeInsets { + static var zero = NSEdgeInsetsZero + } +#else + import UIKit + + public typealias View = UIView + public typealias LayoutGuide = UILayoutGuide + public typealias ConstraintAxis = NSLayoutConstraint.Axis + public typealias LayoutPriority = UILayoutPriority + + public typealias TinyEdgeInsets = UIEdgeInsets +#endif + diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constrainable.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constrainable.swift new file mode 100644 index 0000000..a8c4cff --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constrainable.swift @@ -0,0 +1,60 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(OSX) + import AppKit +#else + import UIKit +#endif + +extension View: Constrainable { + + @discardableResult + public func prepareForLayout() -> Self { + translatesAutoresizingMaskIntoConstraints = false + return self + } +} + +extension LayoutGuide: Constrainable { + @discardableResult + public func prepareForLayout() -> Self { return self } +} + +public protocol Constrainable { + var topAnchor: NSLayoutYAxisAnchor { get } + var bottomAnchor: NSLayoutYAxisAnchor { get } + var leftAnchor: NSLayoutXAxisAnchor { get } + var rightAnchor: NSLayoutXAxisAnchor { get } + var leadingAnchor: NSLayoutXAxisAnchor { get } + var trailingAnchor: NSLayoutXAxisAnchor { get } + + var centerXAnchor: NSLayoutXAxisAnchor { get } + var centerYAnchor: NSLayoutYAxisAnchor { get } + + var widthAnchor: NSLayoutDimension { get } + var heightAnchor: NSLayoutDimension { get } + + @discardableResult + func prepareForLayout() -> Self +} diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constraints.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constraints.swift new file mode 100644 index 0000000..d56a9a4 --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Constraints.swift @@ -0,0 +1,84 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if os(OSX) + import AppKit +#else + import UIKit +#endif + +public typealias Constraint = NSLayoutConstraint +public typealias Constraints = [Constraint] + +public enum ConstraintRelation: Int { + case equal = 0 + case equalOrLess = -1 + case equalOrGreater = 1 +} + +public extension Collection where Iterator.Element == Constraint { + + func activate() { + + if let constraints = self as? Constraints { + Constraint.activate(constraints) + } + } + + func deActivate() { + + if let constraints = self as? Constraints { + Constraint.deactivate(constraints) + } + } +} + +#if os(OSX) +public extension Constraint { + @objc + func with(_ p: Constraint.Priority) -> Self { + priority = p + return self + } + + func set(_ active: Bool) -> Self { + isActive = active + return self + } +} +#else + public extension Constraint { + @objc + func with(_ p: LayoutPriority) -> Self { + priority = p + return self + } + + func set(_ active: Bool) -> Self { + isActive = active + return self + } +} +#endif + diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Stack.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Stack.swift new file mode 100644 index 0000000..923fb26 --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/Stack.swift @@ -0,0 +1,81 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if os(OSX) + import AppKit +#else + import UIKit +#endif + +public extension View { + + @discardableResult + func stack(_ views: [View], axis: ConstraintAxis = .vertical, width: CGFloat? = nil, height: CGFloat? = nil, spacing: CGFloat = 0) -> Constraints { + + translatesAutoresizingMaskIntoConstraints = false + + var offset: CGFloat = 0 + var previous: View? + var constraints: Constraints = [] + + for view in views { + view.translatesAutoresizingMaskIntoConstraints = false + addSubview(view) + + switch axis { + case .vertical: + constraints.append(view.top(to: previous ?? self, previous?.bottomAnchor ?? topAnchor, offset: offset)) + constraints.append(view.leftToSuperview()) + constraints.append(view.rightToSuperview()) + + if let lastView = views.last, view == lastView { + constraints.append(view.bottomToSuperview()) + } + case .horizontal: + constraints.append(view.topToSuperview()) + constraints.append(view.bottomToSuperview()) + constraints.append(view.left(to: previous ?? self, previous?.rightAnchor ?? leftAnchor, offset: offset)) + + if let lastView = views.last, view == lastView { + constraints.append(view.rightToSuperview()) + } + @unknown default: + fatalError() + } + + if let width = width { + constraints.append(view.width(width)) + } + + if let height = height { + constraints.append(view.height(height)) + } + + offset = spacing + previous = view + } + + return constraints + } +} diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints+superview.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints+superview.swift new file mode 100644 index 0000000..6b99e34 --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints+superview.swift @@ -0,0 +1,247 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if os(OSX) + import AppKit + + public extension View { + + @discardableResult + func edgesToSuperview(excluding excludedEdge: LayoutEdge = .none, insets: TinyEdgeInsets = .zero, usingSafeArea: Bool = false) -> Constraints { + var constraints = Constraints() + + if !excludedEdge.contains(.top) { + constraints.append(topToSuperview(offset: insets.top, usingSafeArea: usingSafeArea)) + } + + if !excludedEdge.contains(.left) { + constraints.append(leftToSuperview(offset: insets.left, usingSafeArea: usingSafeArea)) + } + + if !excludedEdge.contains(.right) { + constraints.append(rightToSuperview(offset: -insets.right, usingSafeArea: usingSafeArea)) + } + + if !excludedEdge.contains(.bottom) { + constraints.append(bottomToSuperview(offset: -insets.bottom, usingSafeArea: usingSafeArea)) + } + + return constraints + } + } +#else + import UIKit + + public extension View { + + @available(tvOS 10.0, *) + @available(iOS 10.0, *) + @discardableResult + func edgesToSuperview(excluding excludedEdge: LayoutEdge = .none, insets: TinyEdgeInsets = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraints { + var constraints = Constraints() + + if !excludedEdge.contains(.top) { + constraints.append(topToSuperview(offset: insets.top, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + + if effectiveUserInterfaceLayoutDirection == .leftToRight { + + if !(excludedEdge.contains(.leading) || excludedEdge.contains(.left)) { + constraints.append(leftToSuperview(offset: insets.left, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + + if !(excludedEdge.contains(.trailing) || excludedEdge.contains(.right)) { + constraints.append(rightToSuperview(offset: -insets.right, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + } else { + + if !(excludedEdge.contains(.leading) || excludedEdge.contains(.right)) { + constraints.append(rightToSuperview(offset: -insets.right, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + + if !(excludedEdge.contains(.trailing) || excludedEdge.contains(.left)) { + constraints.append(leftToSuperview(offset: insets.left, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + } + + if !excludedEdge.contains(.bottom) { + constraints.append(bottomToSuperview(offset: -insets.bottom, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + + return constraints + } + + @available(tvOS 10.0, *) + @available(iOS 10.0, *) + @discardableResult + func leadingToSuperview( _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + + if effectiveUserInterfaceLayoutDirection == .rightToLeft { + return leading(to: constrainable, anchor, offset: -offset, relation: relation, priority: priority, isActive: isActive) + } else { + return leading(to: constrainable, anchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + } + + @available(tvOS 10.0, *) + @available(iOS 10.0, *) + @discardableResult + func trailingToSuperview( _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + + if effectiveUserInterfaceLayoutDirection == .rightToLeft { + return trailing(to: constrainable, anchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } else { + return trailing(to: constrainable, anchor, offset: -offset, relation: relation, priority: priority, isActive: isActive) + } + } + + @available(tvOS 10.0, *) + @available(iOS 10.0, *) + @discardableResult + func horizontalToSuperview(insets: TinyEdgeInsets = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraints { + + var constraints = Constraints() + + if effectiveUserInterfaceLayoutDirection == .leftToRight { + constraints.append(leftToSuperview(offset: insets.left, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + constraints.append(rightToSuperview(offset: -insets.right, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } else { + constraints.append(rightToSuperview(offset: -insets.right, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + constraints.append(leftToSuperview(offset: insets.left, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea)) + } + + return constraints + } + + @available(tvOS 10.0, *) + @available(iOS 10.0, *) + @discardableResult + func verticalToSuperview(insets: TinyEdgeInsets = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraints { + + let constraints = Constraints(arrayLiteral: + topToSuperview(offset: insets.top, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea), + bottomToSuperview(offset: -insets.bottom, relation: relation, priority: priority, isActive: isActive, usingSafeArea: usingSafeArea) + ) + return constraints + } + } +#endif + +public struct LayoutEdge: OptionSet { + public let rawValue: UInt8 + public init(rawValue: UInt8) { + self.rawValue = rawValue + } + public static let top = LayoutEdge(rawValue: 1 << 0) + public static let bottom = LayoutEdge(rawValue: 1 << 1) + public static let trailing = LayoutEdge(rawValue: 1 << 2) + public static let leading = LayoutEdge(rawValue: 1 << 3) + public static let left = LayoutEdge(rawValue: 1 << 4) + public static let right = LayoutEdge(rawValue: 1 << 5) + public static let none = LayoutEdge(rawValue: 1 << 6) +} + +public extension View { + + private func safeConstrainable(for superview: View?, usingSafeArea: Bool) -> Constrainable { + guard let superview = superview else { + fatalError("Unable to create this constraint to it's superview, because it has no superview.") + } + + prepareForLayout() + + #if os(iOS) || os(tvOS) + if #available(iOS 11, tvOS 11, *){ + if usingSafeArea { + return superview.safeAreaLayoutGuide + } + } + #endif + + return superview + } + + + @discardableResult + func centerInSuperview(offset: CGPoint = .zero, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraints { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return center(in: constrainable, offset: offset, priority: priority, isActive: isActive) + } + + @discardableResult + func originToSuperview(insets: TinyEdgeInsets = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraints { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return origin(to: constrainable, insets: insets, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func widthToSuperview( _ dimension: NSLayoutDimension? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return width(to: constrainable, dimension, multiplier: multiplier, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func heightToSuperview( _ dimension: NSLayoutDimension? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return height(to: constrainable, dimension, multiplier: multiplier, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func leftToSuperview( _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return left(to: constrainable, anchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func rightToSuperview( _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return right(to: constrainable, anchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func topToSuperview( _ anchor: NSLayoutYAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return top(to: constrainable, anchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func bottomToSuperview( _ anchor: NSLayoutYAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return bottom(to: constrainable, anchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func centerXToSuperview( _ anchor: NSLayoutXAxisAnchor? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return centerX(to: constrainable, anchor, multiplier: multiplier, offset: offset, priority: priority, isActive: isActive) + } + + @discardableResult + func centerYToSuperview( _ anchor: NSLayoutYAxisAnchor? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, priority: LayoutPriority = .required, isActive: Bool = true, usingSafeArea: Bool = false) -> Constraint { + let constrainable = safeConstrainable(for: superview, usingSafeArea: usingSafeArea) + return centerY(to: constrainable, anchor, multiplier: multiplier, offset: offset, priority: priority, isActive: isActive) + } +} diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints.swift new file mode 100644 index 0000000..d8bf10c --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyConstraints.swift @@ -0,0 +1,351 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if os(OSX) + import AppKit +#else + import UIKit +#endif + +public extension Constrainable { + + @discardableResult + func center(in view: Constrainable, offset: CGPoint = .zero, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + let constraints = [ + centerX(to: view, offset: offset.x, priority: priority, isActive: isActive), + centerY(to: view, offset: offset.y, priority: priority, isActive: isActive) + ] + + return constraints + } + + @discardableResult + func edges(to view: Constrainable, excluding excludedEdge: LayoutEdge = .none, insets: TinyEdgeInsets = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + var constraints = Constraints() + + if !excludedEdge.contains(.top) { + constraints.append(top(to: view, offset: insets.top, relation: relation, priority: priority, isActive: isActive)) + } + + if !excludedEdge.contains(.left) { + constraints.append(left(to: view, offset: insets.left, relation: relation, priority: priority, isActive: isActive)) + } + + if !excludedEdge.contains(.bottom) { + constraints.append(bottom(to: view, offset: -insets.bottom, relation: relation, priority: priority, isActive: isActive)) + } + + if !excludedEdge.contains(.right) { + constraints.append(right(to: view, offset: -insets.right, relation: relation, priority: priority, isActive: isActive)) + } + + return constraints + } + + @discardableResult + func size(_ size: CGSize, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + let constraints = [ + width(size.width, relation: relation, priority: priority, isActive: isActive), + height(size.height, relation: relation, priority: priority, isActive: isActive) + ] + + return constraints + } + + @discardableResult + func size(to view: Constrainable, multiplier: CGFloat = 1, insets: CGSize = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + let constraints = [ + width(to: view, multiplier: multiplier, offset: insets.width, relation: relation, priority: priority, isActive: isActive), + height(to: view, multiplier: multiplier, offset: insets.height, relation: relation, priority: priority, isActive: isActive) + ] + + return constraints + } + + @discardableResult + func origin(to view: Constrainable, insets: TinyEdgeInsets = .zero, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + let constraints = [ + left(to: view, offset: insets.left, relation: relation, priority: priority, isActive: isActive), + top(to: view, offset: insets.top, relation: relation, priority: priority, isActive: isActive) + ] + + return constraints + } + + @discardableResult + func width(_ width: CGFloat, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return widthAnchor.constraint(equalToConstant: width).with(priority).set(isActive) + case .equalOrLess: return widthAnchor.constraint(lessThanOrEqualToConstant: width).with(priority).set(isActive) + case .equalOrGreater: return widthAnchor.constraint(greaterThanOrEqualToConstant: width).with(priority).set(isActive) + } + } + + @discardableResult + func width(to view: Constrainable, _ dimension: NSLayoutDimension? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return widthAnchor.constraint(equalTo: dimension ?? view.widthAnchor, multiplier: multiplier, constant: offset).with(priority).set(isActive) + case .equalOrLess: return widthAnchor.constraint(lessThanOrEqualTo: dimension ?? view.widthAnchor, multiplier: multiplier, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return widthAnchor.constraint(greaterThanOrEqualTo: dimension ?? view.widthAnchor, multiplier: multiplier, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func widthToHeight(of view: Constrainable, multiplier: CGFloat = 1, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + return width(to: view, view.heightAnchor, multiplier: multiplier, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func width(min: CGFloat? = nil, max: CGFloat? = nil, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + var constraints: Constraints = [] + + if let min = min { + let constraint = widthAnchor.constraint(greaterThanOrEqualToConstant: min).with(priority) + constraint.isActive = isActive + constraints.append(constraint) + } + + if let max = max { + let constraint = widthAnchor.constraint(lessThanOrEqualToConstant: max).with(priority) + constraint.isActive = isActive + constraints.append(constraint) + } + + return constraints + } + + @discardableResult + func height(_ height: CGFloat, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return heightAnchor.constraint(equalToConstant: height).with(priority).set(isActive) + case .equalOrLess: return heightAnchor.constraint(lessThanOrEqualToConstant: height).with(priority).set(isActive) + case .equalOrGreater: return heightAnchor.constraint(greaterThanOrEqualToConstant: height).with(priority).set(isActive) + } + } + + @discardableResult + func height(to view: Constrainable, _ dimension: NSLayoutDimension? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return heightAnchor.constraint(equalTo: dimension ?? view.heightAnchor, multiplier: multiplier, constant: offset).with(priority).set(isActive) + case .equalOrLess: return heightAnchor.constraint(lessThanOrEqualTo: dimension ?? view.heightAnchor, multiplier: multiplier, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return heightAnchor.constraint(greaterThanOrEqualTo: dimension ?? view.heightAnchor, multiplier: multiplier, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func heightToWidth(of view: Constrainable, multiplier: CGFloat = 1, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + return height(to: view, view.widthAnchor, multiplier: multiplier, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func height(min: CGFloat? = nil, max: CGFloat? = nil, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraints { + prepareForLayout() + + var constraints: Constraints = [] + + if let min = min { + let constraint = heightAnchor.constraint(greaterThanOrEqualToConstant: min).with(priority) + constraint.isActive = isActive + constraints.append(constraint) + } + + if let max = max { + let constraint = heightAnchor.constraint(lessThanOrEqualToConstant: max).with(priority) + constraint.isActive = isActive + constraints.append(constraint) + } + + return constraints + } + + @discardableResult + func aspectRatio(_ ratio: CGFloat, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + return widthToHeight(of: self, multiplier: ratio, offset: 0, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func leadingToTrailing(of view: Constrainable, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + return leading(to: view, view.trailingAnchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func leading(to view: Constrainable, _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return leadingAnchor.constraint(equalTo: anchor ?? view.leadingAnchor, constant: offset).with(priority).set(isActive) + case .equalOrLess: return leadingAnchor.constraint(lessThanOrEqualTo: anchor ?? view.leadingAnchor, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return leadingAnchor.constraint(greaterThanOrEqualTo: anchor ?? view.leadingAnchor, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func leftToRight(of view: Constrainable, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + return left(to: view, view.rightAnchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func left(to view: Constrainable, _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return leftAnchor.constraint(equalTo: anchor ?? view.leftAnchor, constant: offset).with(priority).set(isActive) + case .equalOrLess: return leftAnchor.constraint(lessThanOrEqualTo: anchor ?? view.leftAnchor, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return leftAnchor.constraint(greaterThanOrEqualTo: anchor ?? view.leftAnchor, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func trailingToLeading(of view: Constrainable, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + return trailing(to: view, view.leadingAnchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func trailing(to view: Constrainable, _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return trailingAnchor.constraint(equalTo: anchor ?? view.trailingAnchor, constant: offset).with(priority).set(isActive) + case .equalOrLess: return trailingAnchor.constraint(lessThanOrEqualTo: anchor ?? view.trailingAnchor, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return trailingAnchor.constraint(greaterThanOrEqualTo: anchor ?? view.trailingAnchor, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func rightToLeft(of view: Constrainable, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + return right(to: view, view.leftAnchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func right(to view: Constrainable, _ anchor: NSLayoutXAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return rightAnchor.constraint(equalTo: anchor ?? view.rightAnchor, constant: offset).with(priority).set(isActive) + case .equalOrLess: return rightAnchor.constraint(lessThanOrEqualTo: anchor ?? view.rightAnchor, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return rightAnchor.constraint(greaterThanOrEqualTo: anchor ?? view.rightAnchor, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func topToBottom(of view: Constrainable, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + return top(to: view, view.bottomAnchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func top(to view: Constrainable, _ anchor: NSLayoutYAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return topAnchor.constraint(equalTo: anchor ?? view.topAnchor, constant: offset).with(priority).set(isActive) + case .equalOrLess: return topAnchor.constraint(lessThanOrEqualTo: anchor ?? view.topAnchor, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return topAnchor.constraint(greaterThanOrEqualTo: anchor ?? view.topAnchor, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func bottomToTop(of view: Constrainable, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + return bottom(to: view, view.topAnchor, offset: offset, relation: relation, priority: priority, isActive: isActive) + } + + @discardableResult + func bottom(to view: Constrainable, _ anchor: NSLayoutYAxisAnchor? = nil, offset: CGFloat = 0, relation: ConstraintRelation = .equal, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + switch relation { + case .equal: return bottomAnchor.constraint(equalTo: anchor ?? view.bottomAnchor, constant: offset).with(priority).set(isActive) + case .equalOrLess: return bottomAnchor.constraint(lessThanOrEqualTo: anchor ?? view.bottomAnchor, constant: offset).with(priority).set(isActive) + case .equalOrGreater: return bottomAnchor.constraint(greaterThanOrEqualTo: anchor ?? view.bottomAnchor, constant: offset).with(priority).set(isActive) + } + } + + @discardableResult + func centerX(to view: Constrainable, _ anchor: NSLayoutXAxisAnchor? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + let constraint: Constraint + + if let anchor = anchor { + constraint = centerXAnchor.constraint(equalTo: anchor, constant: offset).with(priority) + } else { + constraint = NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: multiplier, constant: offset).with(priority) + } + + constraint.isActive = isActive + return constraint + } + + @discardableResult + func centerY(to view: Constrainable, _ anchor: NSLayoutYAxisAnchor? = nil, multiplier: CGFloat = 1, offset: CGFloat = 0, priority: LayoutPriority = .required, isActive: Bool = true) -> Constraint { + prepareForLayout() + + let constraint: Constraint + + if let anchor = anchor { + constraint = centerYAnchor.constraint(equalTo: anchor, constant: offset).with(priority) + } else { + constraint = NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: multiplier, constant: offset).with(priority) + } + + constraint.isActive = isActive + return constraint + } +} + +public extension View { + + func setHugging(_ priority: LayoutPriority, for axis: ConstraintAxis) { + setContentHuggingPriority(priority, for: axis) + } + + func setCompressionResistance(_ priority: LayoutPriority, for axis: ConstraintAxis) { + setContentCompressionResistancePriority(priority, for: axis) + } +} diff --git a/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyEdgeInsets.swift b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyEdgeInsets.swift new file mode 100644 index 0000000..a83d641 --- /dev/null +++ b/Travo-App/Pods/TinyConstraints/TinyConstraints/Classes/TinyEdgeInsets.swift @@ -0,0 +1,64 @@ +// +// MIT License +// +// Copyright (c) 2017 Robert-Hein Hooijmans +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if os(OSX) + import AppKit +#else + import UIKit +#endif + +extension TinyEdgeInsets { + + public static func uniform(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: value, left: value, bottom: value, right: value) + } + + public static func top(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: value, left: 0, bottom: 0, right: 0) + } + + public static func left(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: 0, left: value, bottom: 0, right: 0) + } + + public static func bottom(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: 0, left: 0, bottom: value, right: 0) + } + + public static func right(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: 0, left: 0, bottom: 0, right: value) + } + + public static func horizontal(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: 0, left: value, bottom: 0, right: value) + } + + public static func vertical(_ value: CGFloat) -> TinyEdgeInsets { + return TinyEdgeInsets(top: value, left: 0, bottom: value, right: 0) + } +} + +public func + (lhs: TinyEdgeInsets, rhs: TinyEdgeInsets) -> TinyEdgeInsets { + return .init(top: lhs.top + rhs.top, left: lhs.left + rhs.left, bottom: lhs.bottom + rhs.bottom, right: lhs.right + rhs.right) +} diff --git a/Travo-App/Travo-App.xcodeproj/project.pbxproj b/Travo-App/Travo-App.xcodeproj/project.pbxproj index ccb7549..c18fa2b 100644 --- a/Travo-App/Travo-App.xcodeproj/project.pbxproj +++ b/Travo-App/Travo-App.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 32A19D808285A9F88854BA3C /* Pods_Travo_AppUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27B6421737912049669A6181 /* Pods_Travo_AppUITests.framework */; }; 552BAA892318AB210000BBC4 /* FeelingLucky.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 552BAA882318AB210000BBC4 /* FeelingLucky.storyboard */; }; 552BAA8B2318AB390000BBC4 /* Camera.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 552BAA8A2318AB390000BBC4 /* Camera.storyboard */; }; 5571DBCF2325D29D00C9BE2F /* Favourites.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5571DBCE2325D29D00C9BE2F /* Favourites.storyboard */; }; @@ -43,6 +44,7 @@ BDD041E5230CFB39004F28DF /* Login.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BDD041E4230CFB39004F28DF /* Login.storyboard */; }; BDD041E7230D075F004F28DF /* UnderlinedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD041E6230D075F004F28DF /* UnderlinedTextField.swift */; }; BDD041E9230D45E3004F28DF /* Register.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BDD041E8230D45E3004F28DF /* Register.storyboard */; }; + E37BE05BD3D9002614A43AE7 /* Pods_Travo_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2069CEF8312877F15045B094 /* Pods_Travo_App.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -56,6 +58,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 2069CEF8312877F15045B094 /* Pods_Travo_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Travo_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 27B6421737912049669A6181 /* Pods_Travo_AppUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Travo_AppUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2897C1F998D97B21F1F40238 /* Pods-Travo-AppUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Travo-AppUITests.debug.xcconfig"; path = "Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.debug.xcconfig"; sourceTree = ""; }; 552BAA882318AB210000BBC4 /* FeelingLucky.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = FeelingLucky.storyboard; sourceTree = ""; }; 552BAA8A2318AB390000BBC4 /* Camera.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Camera.storyboard; sourceTree = ""; }; 554FA11C233074E000BD5156 /* Places.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Places.swift; sourceTree = ""; }; @@ -79,6 +84,7 @@ 773EACDF232F72190009808A /* ProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; 773EACE1232F734A0009808A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = "Travo-AppUITests/Assets.xcassets"; sourceTree = SOURCE_ROOT; }; 773EAD01233051B00009808A /* CityVisitedCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CityVisitedCollectionViewCell.swift; sourceTree = ""; }; + 7740432AD8EAA6C2EA8E4F4B /* Pods-Travo-AppUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Travo-AppUITests.release.xcconfig"; path = "Target Support Files/Pods-Travo-AppUITests/Pods-Travo-AppUITests.release.xcconfig"; sourceTree = ""; }; 77425D0423272E4C00C6B844 /* Place.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Place.swift; sourceTree = ""; }; 77425D0823272EF300C6B844 /* CardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardView.swift; sourceTree = ""; }; 7745DA9E232E2B20006C2E0E /* Profile.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Profile.storyboard; sourceTree = ""; }; @@ -99,6 +105,8 @@ BDD041E4230CFB39004F28DF /* Login.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Login.storyboard; sourceTree = ""; }; BDD041E6230D075F004F28DF /* UnderlinedTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = UnderlinedTextField.swift; path = "Travo-App/View/UnderlinedTextField.swift"; sourceTree = SOURCE_ROOT; }; BDD041E8230D45E3004F28DF /* Register.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Register.storyboard; sourceTree = ""; }; + C1E566E19AB20E01108B91A6 /* Pods-Travo-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Travo-App.release.xcconfig"; path = "Target Support Files/Pods-Travo-App/Pods-Travo-App.release.xcconfig"; sourceTree = ""; }; + E066A955BC4ECF21432C9DD1 /* Pods-Travo-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Travo-App.debug.xcconfig"; path = "Target Support Files/Pods-Travo-App/Pods-Travo-App.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,6 +114,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 32A19D808285A9F88854BA3C /* Pods_Travo_AppUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,6 +122,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E37BE05BD3D9002614A43AE7 /* Pods_Travo_App.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -145,6 +155,15 @@ path = Favourites; sourceTree = ""; }; + 5925E2F4FAB64A96F869B22A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2069CEF8312877F15045B094 /* Pods_Travo_App.framework */, + 27B6421737912049669A6181 /* Pods_Travo_AppUITests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 7783A64423036FFA00ED25F3 = { isa = PBXGroup; children = ( @@ -152,6 +171,8 @@ 55971C73232E7AEF0018ABF8 /* Travo-AppUITests */, 7783A64E23036FFA00ED25F3 /* Products */, 55971C64232E55450018ABF8 /* Recovered References */, + D4DE7AB1473CF6EB08ACB114 /* Pods */, + 5925E2F4FAB64A96F869B22A /* Frameworks */, ); sourceTree = ""; }; @@ -232,6 +253,18 @@ path = ViewModel; sourceTree = ""; }; + D4DE7AB1473CF6EB08ACB114 /* Pods */ = { + isa = PBXGroup; + children = ( + E066A955BC4ECF21432C9DD1 /* Pods-Travo-App.debug.xcconfig */, + C1E566E19AB20E01108B91A6 /* Pods-Travo-App.release.xcconfig */, + 2897C1F998D97B21F1F40238 /* Pods-Travo-AppUITests.debug.xcconfig */, + 7740432AD8EAA6C2EA8E4F4B /* Pods-Travo-AppUITests.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -239,6 +272,7 @@ isa = PBXNativeTarget; buildConfigurationList = 55971C79232E7AEF0018ABF8 /* Build configuration list for PBXNativeTarget "Travo-AppUITests" */; buildPhases = ( + 8272577C4042555B0E00D441 /* [CP] Check Pods Manifest.lock */, 55971C6E232E7AEF0018ABF8 /* Sources */, 55971C6F232E7AEF0018ABF8 /* Frameworks */, 55971C70232E7AEF0018ABF8 /* Resources */, @@ -257,9 +291,11 @@ isa = PBXNativeTarget; buildConfigurationList = 7783A65F23036FFC00ED25F3 /* Build configuration list for PBXNativeTarget "Travo-App" */; buildPhases = ( + C904A1E3784D6DFD948651E9 /* [CP] Check Pods Manifest.lock */, 7783A64923036FFA00ED25F3 /* Sources */, 7783A64A23036FFA00ED25F3 /* Frameworks */, 7783A64B23036FFA00ED25F3 /* Resources */, + 4C3DB0BAC08EE03C45996DC8 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -336,6 +372,70 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 4C3DB0BAC08EE03C45996DC8 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Travo-App/Pods-Travo-App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 8272577C4042555B0E00D441 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Travo-AppUITests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C904A1E3784D6DFD948651E9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Travo-App-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 55971C6E232E7AEF0018ABF8 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -409,6 +509,7 @@ /* Begin XCBuildConfiguration section */ 55971C7A232E7AEF0018ABF8 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2897C1F998D97B21F1F40238 /* Pods-Travo-AppUITests.debug.xcconfig */; buildSettings = { CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 56CT9TQ9TD; @@ -428,6 +529,7 @@ }; 55971C7B232E7AEF0018ABF8 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7740432AD8EAA6C2EA8E4F4B /* Pods-Travo-AppUITests.release.xcconfig */; buildSettings = { CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 56CT9TQ9TD; @@ -563,6 +665,7 @@ }; 7783A66023036FFC00ED25F3 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E066A955BC4ECF21432C9DD1 /* Pods-Travo-App.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; @@ -581,6 +684,7 @@ }; 7783A66123036FFC00ED25F3 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C1E566E19AB20E01108B91A6 /* Pods-Travo-App.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; diff --git a/Travo-App/Travo-App.xcworkspace/contents.xcworkspacedata b/Travo-App/Travo-App.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a4b559f --- /dev/null +++ b/Travo-App/Travo-App.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Travo-App/Travo-App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Travo-App/Travo-App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Travo-App/Travo-App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Travo-App/Travo-App/Model/Places.swift b/Travo-App/Travo-App/Model/Places.swift index 628beee..b4eaa2c 100644 --- a/Travo-App/Travo-App/Model/Places.swift +++ b/Travo-App/Travo-App/Model/Places.swift @@ -10,7 +10,7 @@ import Foundation class Places{ - private var _places:[Place] = [] + private var _places:[Place] = [] var places:[Place]{ return _places; @@ -20,7 +20,7 @@ class Places{ populatePlaces() } - func sortFavourites() -> [Place]{ + func sortPopularity() -> [Place]{ return places.sorted(by: { $0.popularityScale > $1.popularityScale }) } @@ -30,7 +30,7 @@ class Places{ //temporary hard coded data for the places private func populatePlaces(){ - let placeOne = Place(name: "Federation Square",desc: "Federation Square is a venue for arts, culture and public events on the edge of the Melbourne central business district. It covers an area of 3.2 ha (7.9 acres) at the intersection of Flinders and Swanston Streets built above busy railway lines and across the road from Flinders Street station.", location: "Melbourne", address: "Corner Swanston and Flinders Streets, Melbourne", imageURL: "place_federation", openTime: "Open 24 Hours", starRating: 4.5,popularityScale: 10) + let placeOne = Place(name: "Federation Square",desc: "Federation Square is a venue for arts, culture and public events on the edge of the Melbourne central business district. It covers an area of 3.2 ha (7.9 acres) at the intersection of Flinders and Swanston Streets built above busy railway lines and across the road from Flinders Street station.", location: "Melbourne", address: "Corner Swanston and Flinders Streets, Melbourne", imageURL: "place_federation", openTime: "Open 24 Hours", starRating: 5.0,popularityScale: 10) self._places.append(placeOne) let placeTwo = Place(name: "Royal Botanical Garden",desc: "In the heart of green parkland extending south of the Yarra River, about two kilometers from the CBD, the Royal Botanic Gardens are among the finest of their kind in the world. Established in 1846, the gardens encompass two locations: Melbourne and Cranbourne. The Melbourne Gardens cover an area of 38 hectares with more than 8,500 species of plants, including many rare specimens.", location: "Melbourne", address: "Birdwood Ave, South Yarra", imageURL: "place_botanical_garden", openTime: "7.30AM - 6.30PM", starRating: 4.8,popularityScale: 8) diff --git a/Travo-App/Travo-App/View/Favourites.storyboard b/Travo-App/Travo-App/View/Favourites.storyboard index c7d59f8..95e2be3 100644 --- a/Travo-App/Travo-App/View/Favourites.storyboard +++ b/Travo-App/Travo-App/View/Favourites.storyboard @@ -44,8 +44,11 @@ - - - - - - - - - - + - - - - - - - + - - - - + @@ -213,6 +176,5 @@ - diff --git a/Travo-App/Travo-App/View/Home.storyboard b/Travo-App/Travo-App/View/Home.storyboard index 99f9033..6bdd58f 100644 --- a/Travo-App/Travo-App/View/Home.storyboard +++ b/Travo-App/Travo-App/View/Home.storyboard @@ -229,21 +229,21 @@ today? - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + - - - - - + @@ -376,6 +346,7 @@ today? + diff --git a/Travo-App/Travo-App/View/Place.storyboard b/Travo-App/Travo-App/View/Place.storyboard index ffbf9ff..4989097 100644 --- a/Travo-App/Travo-App/View/Place.storyboard +++ b/Travo-App/Travo-App/View/Place.storyboard @@ -70,112 +70,82 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - + + - + - - + - - - @@ -186,7 +156,7 @@ - + @@ -197,7 +167,7 @@ + - diff --git a/Travo-App/Travo-App/ViewModel/Favourites/FavouritesViewController.swift b/Travo-App/Travo-App/ViewModel/Favourites/FavouritesViewController.swift index 6454de3..0e4ffee 100644 --- a/Travo-App/Travo-App/ViewModel/Favourites/FavouritesViewController.swift +++ b/Travo-App/Travo-App/ViewModel/Favourites/FavouritesViewController.swift @@ -7,6 +7,7 @@ // import UIKit +import Cosmos class FavouritesViewController: UIViewController { @@ -15,6 +16,7 @@ class FavouritesViewController: UIViewController // var favourites = Favourites.fetchFavourites() var viewModel = PlacesViewModel() + let cellScaling:CGFloat = 1.0 @@ -43,12 +45,13 @@ extension FavouritesViewController : UICollectionViewDataSource let location = cell.viewWithTag((1001)) as! UILabel let openTime = cell.viewWithTag((1002)) as! UILabel let imageView = cell.viewWithTag((1003)) as! UIImageView - let starRating = cell.viewWithTag((1004)) as! UILabel + let starRating = cell.viewWithTag((1004)) as! CosmosView title.text = viewModel.getTitleFor(index: indexPath.row) location.text = viewModel.getLocationFor(index: indexPath.row) openTime.text = viewModel.getOpenTimeFor(index: indexPath.row) imageView.image = viewModel.getImageURLFor(index: indexPath.row) + starRating.rating = viewModel.getStarRating(index: indexPath.row) starRating.text = String(viewModel.getStarRating(index: indexPath.row)) return cell diff --git a/Travo-App/Travo-App/ViewModel/HomeViewController.swift b/Travo-App/Travo-App/ViewModel/HomeViewController.swift index c55f867..120975d 100644 --- a/Travo-App/Travo-App/ViewModel/HomeViewController.swift +++ b/Travo-App/Travo-App/ViewModel/HomeViewController.swift @@ -25,6 +25,11 @@ class HomeViewController: UIViewController,UICollectionViewDelegate,UICollection var loggedInUser:User? + var viewModel = PlacesViewModel() + + let CAROUSEL_MAX:Int = 5 + let CATEGORIES_MAX:Int = 10 + override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. @@ -44,11 +49,11 @@ class HomeViewController: UIViewController,UICollectionViewDelegate,UICollection //MARK:- Collection View Size func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if collectionView == self.popularPlaces{ - return items.count + return CAROUSEL_MAX }else if(collectionView == self.categoryCollection){ - return 6 + return CATEGORIES_MAX }else if(collectionView == self.recommendedCollection){ - return 4 + return CAROUSEL_MAX } return 0 } @@ -59,14 +64,18 @@ extension HomeViewController{ //MARK:-- Setting up all collection views func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + + let tempRecommended = viewModel.getRecommended() + let tempPopular = viewModel.getPopularity() + if collectionView == popularPlaces { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "popularCell", for: indexPath) as! PlacesCollectionViewCell cell.layer.cornerRadius = 10 cell.layer.borderColor = UIColor.black.cgColor cell.layer.borderWidth = 0.5 - cell.backgroundImage.image = UIImage(named: "place_botanical_garden") + cell.backgroundImage.image = UIImage(named:tempPopular[indexPath.row].imageURL) cell.backgroundImage.contentMode = UIView.ContentMode.scaleToFill - cell.label1.text = "Federation Square" + cell.label1.text = tempPopular[indexPath.row].name cell.label1.textColor = UIColor.white cell.label1.numberOfLines = 2 cell.label1.lineBreakMode = NSLineBreakMode.byWordWrapping @@ -78,10 +87,15 @@ extension HomeViewController{ return cell }else{ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "recommendedCell", for: indexPath) as! RecommendedCollectionViewCell - cell.locationLabel.text = "Federation Square" - cell.placeImage.image = UIImage(named: "place_federation") - cell.cityLabel.text = "Melbourne" - cell.timeLabel.text = "7AM - 5PM" + + cell.locationLabel.text = tempRecommended[indexPath.row].name + cell.placeImage.image = UIImage(named: tempRecommended[indexPath.row].imageURL) + cell.cityLabel.text = tempRecommended[indexPath.row].location + cell.timeLabel.text = tempRecommended[indexPath.row].openTime + cell.placeRating.settings.updateOnTouch = false + cell.placeRating.settings.fillMode = .precise + cell.placeRating.rating = tempRecommended[indexPath.row].starRating + cell.placeRating.text = String(tempRecommended[indexPath.row].starRating) cell.likeBtn.imageView?.contentMode = UIView.ContentMode.scaleAspectFit return cell } diff --git a/Travo-App/Travo-App/ViewModel/PlaceViewController.swift b/Travo-App/Travo-App/ViewModel/PlaceViewController.swift index eeb266b..041fa52 100644 --- a/Travo-App/Travo-App/ViewModel/PlaceViewController.swift +++ b/Travo-App/Travo-App/ViewModel/PlaceViewController.swift @@ -9,6 +9,7 @@ import Foundation import UIKit import MapKit +import Cosmos class PlaceViewController: UIViewController { @@ -38,7 +39,8 @@ class PlaceViewController: UIViewController { @IBOutlet weak var placeTitle: UILabel! @IBOutlet weak var placeDescription: UILabel! @IBOutlet weak var placeOpenHours: UILabel! - @IBOutlet weak var placeRating: UILabel! + @IBOutlet weak var placeRating: CosmosView! + var index:Int? @@ -46,13 +48,17 @@ class PlaceViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - index = 3; + index = 1; placeImage.contentMode = .scaleAspectFill placeTitle.text = viewModel.getTitleFor(index: index!) placeDescription.text = viewModel.getDescFor(index: index!) placeOpenHours.text = viewModel.getOpenTimeFor(index: index!) - placeRating.text = String(viewModel.getStarRating(index: index!)) +// placeRating.text = String(viewModel.getStarRating(index: index!)) placeImage.image = viewModel.getImageURLFor(index: index!) + placeRating.settings.updateOnTouch = false + placeRating.settings.fillMode = .precise + placeRating.rating = viewModel.getStarRating(index: index!) + placeRating.text = String(viewModel.getStarRating(index: index!)) } } diff --git a/Travo-App/Travo-App/ViewModel/PlacesViewModel.swift b/Travo-App/Travo-App/ViewModel/PlacesViewModel.swift index 7c6fb7b..a989958 100644 --- a/Travo-App/Travo-App/ViewModel/PlacesViewModel.swift +++ b/Travo-App/Travo-App/ViewModel/PlacesViewModel.swift @@ -21,8 +21,8 @@ struct PlacesViewModel{ return places.count } - func getFavourites() -> [Place]{ - return model.sortFavourites() + func getPopularity() -> [Place]{ + return model.sortPopularity() } func getRecommended() -> [Place]{ diff --git a/Travo-App/Travo-App/ViewModel/RecommendedCollectionViewCell.swift b/Travo-App/Travo-App/ViewModel/RecommendedCollectionViewCell.swift index a2b6826..94642b8 100644 --- a/Travo-App/Travo-App/ViewModel/RecommendedCollectionViewCell.swift +++ b/Travo-App/Travo-App/ViewModel/RecommendedCollectionViewCell.swift @@ -7,6 +7,7 @@ // import UIKit +import Cosmos class RecommendedCollectionViewCell: UICollectionViewCell { @IBOutlet var placeImage: UIImageView! @@ -14,5 +15,5 @@ class RecommendedCollectionViewCell: UICollectionViewCell { @IBOutlet var cityLabel: UILabel! @IBOutlet var timeLabel: UILabel! @IBOutlet var likeBtn: UIButton! - + @IBOutlet weak var placeRating: CosmosView! }