From 0b357d317a954d0c1aa141fff2dcdb2a19499692 Mon Sep 17 00:00:00 2001 From: Sven Tiigi Date: Thu, 30 Jun 2022 19:03:31 +0200 Subject: [PATCH] Refactored to Swift Package structure and updated codebase --- .gitignore | 106 +- .jazzy.yaml | 9 - .swiftlint.yml | 22 - Configs/FlyoverKit.plist | 28 - Configs/FlyoverKitTests.plist | 24 - Example/AppDelegate.swift | 40 - Example/Example.xcodeproj/project.pbxproj | 356 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Example.xcscheme | 58 +- Example/Example/App.swift | 20 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 ++ Example/Example/Assets.xcassets/Contents.json | 6 + Example/Example/ContentView.swift | 268 +++++ Example/Example/Location.swift | 131 +++ .../FlyoverConfiguration.swift | 104 -- .../FlyoverConfigurationTableView.swift | 107 -- .../FlyoverConfigurationTableViewCell.swift | 241 ---- .../AppIcon.appiconset/Contents.json | 113 -- .../AppIcon.appiconset/Icon-167.png | Bin 18578 -> 0 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 13258 -> 0 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 24098 -> 0 bytes .../AppIcon.appiconset/Icon-76.png | Bin 6665 -> 0 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 18104 -> 0 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 7545 -> 0 bytes .../AppIcon.appiconset/Icon-Small-40@3x.png | Bin 13561 -> 0 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 1726 -> 0 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 4807 -> 0 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 8614 -> 0 bytes .../AppIcon.appiconset/iTunesArtwork@2x.png | Bin 252335 -> 0 bytes .../Assets.xcassets/Contents.json | 6 - .../RoundedAppIcon.imageset/Contents.json | 21 - .../iTunesArtwork@2x.png | Bin 265342 -> 0 bytes .../github.imageset/Contents.json | 23 - .../icons8-github-filled-26.png | Bin 633 -> 0 bytes .../icons8-github-filled-52.png | Bin 1268 -> 0 bytes .../icons8-github-filled-78.png | Bin 1882 -> 0 bytes .../Base.lproj/LaunchScreen.storyboard | 80 -- Example/Supporting Files/Info.plist | 43 - .../SplitScreenViewController.swift | 323 ------ Example/Supporting Files/UIColor+Main.swift | 17 - Example/ViewController.swift | 158 --- FlyoverKit.podspec | 16 - FlyoverKit.xcodeproj/project.pbxproj | 1030 ----------------- .../xcschemes/FlyoverKit-tvOS.xcscheme | 96 -- LICENSE | 13 +- Package.swift | 21 +- README.md | 342 ++---- .../AwesomePlace/FlyoverAwesomePlace.swift | 131 --- .../Camera/FlyoverCamera+Configuration.swift | 100 -- .../FlyoverCamera+RegionChangeAnimation.swift | 23 - Sources/Camera/FlyoverCamera+State.swift | 24 - Sources/Camera/FlyoverCamera.swift | 274 ----- Sources/Flyover+Operators.swift | 41 - Sources/Flyover.swift | 101 -- Sources/Flyover/Flyover+Animator.swift | 80 ++ .../Flyover+Configuration+Parameter.swift | 102 ++ Sources/Flyover/Flyover+Configuration.swift | 65 ++ Sources/Flyover/Flyover+Context.swift | 34 + Sources/Flyover/Flyover.swift | 182 +++ Sources/FlyoverMap/FlyoverMap.swift | 88 ++ Sources/FlyoverMapView/FlyoverMapView.swift | 128 ++ Sources/MapView/FlyoverMapView+MapType.swift | 65 -- Sources/MapView/FlyoverMapView.swift | 118 -- .../MapView/FlyoverMapViewController.swift | 65 -- Tests/BaseTests.swift | 71 -- Tests/FlyoverCameraTests.swift | 79 -- Tests/FlyoverMapViewTests.swift | 102 -- Tests/FlyoverProtocolTests.swift | 96 -- fastlane/.env | 1 - fastlane/Fastfile | 98 -- 72 files changed, 1711 insertions(+), 4303 deletions(-) delete mode 100644 .jazzy.yaml delete mode 100644 .swiftlint.yml delete mode 100644 Configs/FlyoverKit.plist delete mode 100644 Configs/FlyoverKitTests.plist delete mode 100644 Example/AppDelegate.swift create mode 100644 Example/Example.xcodeproj/project.pbxproj create mode 100644 Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename FlyoverKit.xcodeproj/xcshareddata/xcschemes/FlyoverKit-iOS.xcscheme => Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme (53%) create mode 100644 Example/Example/App.swift create mode 100644 Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Example/Example/Assets.xcassets/Contents.json create mode 100644 Example/Example/ContentView.swift create mode 100644 Example/Example/Location.swift delete mode 100644 Example/FlyoverConfiguration/FlyoverConfiguration.swift delete mode 100644 Example/FlyoverConfiguration/FlyoverConfigurationTableView.swift delete mode 100644 Example/FlyoverConfiguration/FlyoverConfigurationTableViewCell.swift delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-167.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-76.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/Contents.json delete mode 100644 Example/Supporting Files/Assets.xcassets/RoundedAppIcon.imageset/Contents.json delete mode 100644 Example/Supporting Files/Assets.xcassets/RoundedAppIcon.imageset/iTunesArtwork@2x.png delete mode 100644 Example/Supporting Files/Assets.xcassets/github.imageset/Contents.json delete mode 100644 Example/Supporting Files/Assets.xcassets/github.imageset/icons8-github-filled-26.png delete mode 100644 Example/Supporting Files/Assets.xcassets/github.imageset/icons8-github-filled-52.png delete mode 100644 Example/Supporting Files/Assets.xcassets/github.imageset/icons8-github-filled-78.png delete mode 100644 Example/Supporting Files/Base.lproj/LaunchScreen.storyboard delete mode 100644 Example/Supporting Files/Info.plist delete mode 100644 Example/Supporting Files/SplitScreenViewController.swift delete mode 100644 Example/Supporting Files/UIColor+Main.swift delete mode 100644 Example/ViewController.swift delete mode 100644 FlyoverKit.podspec delete mode 100644 FlyoverKit.xcodeproj/project.pbxproj delete mode 100644 FlyoverKit.xcodeproj/xcshareddata/xcschemes/FlyoverKit-tvOS.xcscheme delete mode 100644 Sources/AwesomePlace/FlyoverAwesomePlace.swift delete mode 100644 Sources/Camera/FlyoverCamera+Configuration.swift delete mode 100644 Sources/Camera/FlyoverCamera+RegionChangeAnimation.swift delete mode 100644 Sources/Camera/FlyoverCamera+State.swift delete mode 100644 Sources/Camera/FlyoverCamera.swift delete mode 100644 Sources/Flyover+Operators.swift delete mode 100644 Sources/Flyover.swift create mode 100644 Sources/Flyover/Flyover+Animator.swift create mode 100644 Sources/Flyover/Flyover+Configuration+Parameter.swift create mode 100644 Sources/Flyover/Flyover+Configuration.swift create mode 100644 Sources/Flyover/Flyover+Context.swift create mode 100644 Sources/Flyover/Flyover.swift create mode 100644 Sources/FlyoverMap/FlyoverMap.swift create mode 100644 Sources/FlyoverMapView/FlyoverMapView.swift delete mode 100644 Sources/MapView/FlyoverMapView+MapType.swift delete mode 100644 Sources/MapView/FlyoverMapView.swift delete mode 100644 Sources/MapView/FlyoverMapViewController.swift delete mode 100644 Tests/BaseTests.swift delete mode 100644 Tests/FlyoverCameraTests.swift delete mode 100644 Tests/FlyoverMapViewTests.swift delete mode 100644 Tests/FlyoverProtocolTests.swift delete mode 100644 fastlane/.env delete mode 100644 fastlane/Fastfile diff --git a/.gitignore b/.gitignore index ed3a7ac..11f1ed0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,101 +1,7 @@ - -# Created by https://www.gitignore.io/api/macos,xcode,carthage,cocoapods,fastlane - -### Carthage ### -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -Carthage/Checkouts - -Carthage/Build - -### CocoaPods ### -## CocoaPods GitIgnore Template - -# CocoaPods - Only use to conserve bandwidth / Save time on Pushing -# - Also handy if you have a large number of dependant pods -# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE -Pods/ - -### macOS ### -*.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Xcode ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## Build generated -build/ -DerivedData/ - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 +.DS_Store +/.build +/Packages +/*.xcodeproj xcuserdata/ - -## Other -*.moved-aside -*.xccheckout -*.xcscmblueprint - -### Xcode Patch ### -*.xcodeproj/* -!*.xcodeproj/project.pbxproj -!*.xcodeproj/xcshareddata/ -!*.xcworkspace/contents.xcworkspacedata -/*.gcno - -### fastlane ### -# fastlane - A streamlined workflow tool for Cocoa deployment -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -# fastlane specific -/fastlane/README.md -fastlane/report.xml - -# deliver temporary files -fastlane/Preview.html - -# snapshot generated screenshots -fastlane/screenshots/**/*.png -fastlane/screenshots/screenshots.html - -# scan temporary files -fastlane/test_output - -# End of https://www.gitignore.io/api/macos,xcode,carthage,cocoapods,fastlane \ No newline at end of file +DerivedData/ +.swiftpm/ \ No newline at end of file diff --git a/.jazzy.yaml b/.jazzy.yaml deleted file mode 100644 index 2225cd4..0000000 --- a/.jazzy.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# FlyoverKit document generator jazzy settings - -copyright: Copyright 2020 Sven Tiigi -author: Sven Tiigi -github_url: https://github.com/SvenTiigi/FlyoverKit -xcodebuild_arguments: [-target, FlyoverKit-iOS] -clean: true -output: ./Documentation -min_acl: private diff --git a/.swiftlint.yml b/.swiftlint.yml deleted file mode 100644 index f914a3b..0000000 --- a/.swiftlint.yml +++ /dev/null @@ -1,22 +0,0 @@ -opt_in_rules: # some rules are only opt-in - - empty_count - - redundant_nil_coalescing - - switch_case_on_newline - - force_unwrapping - - conditional_returns_on_newline - - closure_spacing - - implicitly_unwrapped_optional - - sorted_imports - -included: - - Sources - -excluded: # paths to ignore during linting. Takes precedence over `included`. - - Tests - - Example - -disabled_rules: # rule identifiers to exclude from running - - trailing_whitespace - - identifier_name - -line_length: 130 \ No newline at end of file diff --git a/Configs/FlyoverKit.plist b/Configs/FlyoverKit.plist deleted file mode 100644 index 4c37321..0000000 --- a/Configs/FlyoverKit.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.3.1 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2018 Sven Tiigi. All rights reserved - NSPrincipalClass - - - diff --git a/Configs/FlyoverKitTests.plist b/Configs/FlyoverKitTests.plist deleted file mode 100644 index 6b123c1..0000000 --- a/Configs/FlyoverKitTests.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.3.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Example/AppDelegate.swift b/Example/AppDelegate.swift deleted file mode 100644 index 0fb12f9..0000000 --- a/Example/AppDelegate.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// AppDelegate.swift -// FlyoverKit-Example -// -// Created by Sven Tiigi on 22.04.18. -// Copyright © 2018 FlyoverKit. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - /// The UINavigationController with ViewController as root - lazy private var navigationController: UINavigationController = { - let navigationController = UINavigationController(rootViewController: ViewController()) - navigationController.navigationBar.prefersLargeTitles = true - navigationController.navigationBar.largeTitleTextAttributes = [ - .foregroundColor: UIColor.main - ] - navigationController.view.backgroundColor = .white - navigationController.navigationBar.tintColor = .main - navigationController.navigationBar.titleTextAttributes = [ - .foregroundColor: UIColor.main - ] - return navigationController - }() - - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - self.window = UIWindow(frame: UIScreen.main.bounds) - self.window?.rootViewController = self.navigationController - self.window?.makeKeyAndVisible() - return true - } - -} diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..33cec23 --- /dev/null +++ b/Example/Example.xcodeproj/project.pbxproj @@ -0,0 +1,356 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 3D2A4E212857A0ED00E454D6 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D2A4E202857A0ED00E454D6 /* App.swift */; }; + 3D2A4E232857A0ED00E454D6 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D2A4E222857A0ED00E454D6 /* ContentView.swift */; }; + 3D2A4E252857A0ED00E454D6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3D2A4E242857A0ED00E454D6 /* Assets.xcassets */; }; + 3D85E3B0286711B200CDDC8F /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D85E3AF286711B200CDDC8F /* Location.swift */; }; + 3DCB60562857A10500336B67 /* FlyoverKit in Frameworks */ = {isa = PBXBuildFile; productRef = 3DCB60552857A10500336B67 /* FlyoverKit */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 3D2A4E1D2857A0ED00E454D6 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3D2A4E202857A0ED00E454D6 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; + 3D2A4E222857A0ED00E454D6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 3D2A4E242857A0ED00E454D6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 3D85E3AF286711B200CDDC8F /* Location.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = ""; }; + 3DCB60532857A0FF00336B67 /* FlyoverKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlyoverKit; path = ..; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3D2A4E1A2857A0ED00E454D6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3DCB60562857A10500336B67 /* FlyoverKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3D2A4E142857A0ED00E454D6 = { + isa = PBXGroup; + children = ( + 3D2A4E1F2857A0ED00E454D6 /* Example */, + 3D2A4E1E2857A0ED00E454D6 /* Products */, + 3DCB60542857A10500336B67 /* Frameworks */, + 3DCB60532857A0FF00336B67 /* FlyoverKit */, + ); + sourceTree = ""; + }; + 3D2A4E1E2857A0ED00E454D6 /* Products */ = { + isa = PBXGroup; + children = ( + 3D2A4E1D2857A0ED00E454D6 /* Example.app */, + ); + name = Products; + sourceTree = ""; + }; + 3D2A4E1F2857A0ED00E454D6 /* Example */ = { + isa = PBXGroup; + children = ( + 3D2A4E202857A0ED00E454D6 /* App.swift */, + 3D2A4E222857A0ED00E454D6 /* ContentView.swift */, + 3D85E3AF286711B200CDDC8F /* Location.swift */, + 3D2A4E242857A0ED00E454D6 /* Assets.xcassets */, + ); + path = Example; + sourceTree = ""; + }; + 3DCB60542857A10500336B67 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 3D2A4E1C2857A0ED00E454D6 /* Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3D2A4E2B2857A0ED00E454D6 /* Build configuration list for PBXNativeTarget "Example" */; + buildPhases = ( + 3D2A4E192857A0ED00E454D6 /* Sources */, + 3D2A4E1A2857A0ED00E454D6 /* Frameworks */, + 3D2A4E1B2857A0ED00E454D6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Example; + packageProductDependencies = ( + 3DCB60552857A10500336B67 /* FlyoverKit */, + ); + productName = Example; + productReference = 3D2A4E1D2857A0ED00E454D6 /* Example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3D2A4E152857A0ED00E454D6 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1340; + LastUpgradeCheck = 1340; + TargetAttributes = { + 3D2A4E1C2857A0ED00E454D6 = { + CreatedOnToolsVersion = 13.4; + }; + }; + }; + buildConfigurationList = 3D2A4E182857A0ED00E454D6 /* Build configuration list for PBXProject "Example" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 3D2A4E142857A0ED00E454D6; + productRefGroup = 3D2A4E1E2857A0ED00E454D6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 3D2A4E1C2857A0ED00E454D6 /* Example */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 3D2A4E1B2857A0ED00E454D6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D2A4E252857A0ED00E454D6 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3D2A4E192857A0ED00E454D6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D2A4E232857A0ED00E454D6 /* ContentView.swift in Sources */, + 3D85E3B0286711B200CDDC8F /* Location.swift in Sources */, + 3D2A4E212857A0ED00E454D6 /* App.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 3D2A4E292857A0ED00E454D6 /* 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++17"; + 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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 = ( + "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 = 15.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 3D2A4E2A2857A0ED00E454D6 /* 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++17"; + 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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_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 = 15.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3D2A4E2C2857A0ED00E454D6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = de.tiigi.FlyoverKit.Example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3D2A4E2D2857A0ED00E454D6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = de.tiigi.FlyoverKit.Example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3D2A4E182857A0ED00E454D6 /* Build configuration list for PBXProject "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3D2A4E292857A0ED00E454D6 /* Debug */, + 3D2A4E2A2857A0ED00E454D6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3D2A4E2B2857A0ED00E454D6 /* Build configuration list for PBXNativeTarget "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3D2A4E2C2857A0ED00E454D6 /* Debug */, + 3D2A4E2D2857A0ED00E454D6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 3DCB60552857A10500336B67 /* FlyoverKit */ = { + isa = XCSwiftPackageProductDependency; + productName = FlyoverKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 3D2A4E152857A0ED00E454D6 /* Project object */; +} diff --git a/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/FlyoverKit.xcodeproj/xcshareddata/xcschemes/FlyoverKit-iOS.xcscheme b/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme similarity index 53% rename from FlyoverKit.xcodeproj/xcshareddata/xcschemes/FlyoverKit-iOS.xcscheme rename to Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme index e6ab2b8..a1a1127 100644 --- a/FlyoverKit.xcodeproj/xcshareddata/xcschemes/FlyoverKit-iOS.xcscheme +++ b/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -1,6 +1,6 @@ + BlueprintIdentifier = "3D2A4E1C2857A0ED00E454D6" + BuildableName = "Example.app" + BlueprintName = "Example" + ReferencedContainer = "container:Example.xcodeproj"> @@ -26,28 +26,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES" - codeCoverageEnabled = "YES"> - - - - + shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - + + BlueprintIdentifier = "3D2A4E1C2857A0ED00E454D6" + BuildableName = "Example.app" + BlueprintName = "Example" + ReferencedContainer = "container:Example.xcodeproj"> - + - + + BlueprintIdentifier = "3D2A4E1C2857A0ED00E454D6" + BuildableName = "Example.app" + BlueprintName = "Example" + ReferencedContainer = "container:Example.xcodeproj"> - + diff --git a/Example/Example/App.swift b/Example/Example/App.swift new file mode 100644 index 0000000..bdea0de --- /dev/null +++ b/Example/Example/App.swift @@ -0,0 +1,20 @@ +import SwiftUI + +// MARK: - App + +/// The App +@main +struct App {} + +// MARK: - SwiftUI.App + +extension App: SwiftUI.App { + + /// The content and behavior of the app + var body: some Scene { + WindowGroup { + ContentView() + } + } + +} diff --git a/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json b/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/Assets.xcassets/Contents.json b/Example/Example/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example/Example/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/ContentView.swift b/Example/Example/ContentView.swift new file mode 100644 index 0000000..0f2430a --- /dev/null +++ b/Example/Example/ContentView.swift @@ -0,0 +1,268 @@ +import FlyoverKit +import MapKit +import SwiftUI + +// MARK: - ContentView + +/// The ContentView +struct ContentView { + + /// Bool value whether Flyover is currently started or stopped + @State + private var isStarted = true + + /// Bool value if options are visible + @State + private var isOptionsVisible = true + + /// The location + @State + private var location: Location = .applePark + + /// The altitude above the ground, measured in meters + @State + private var altitude: Double = 2000 + + /// The viewing angle of the camera, measured in degrees + @State + private var pitch: Double = 50 + + /// The heading step of the camera + @State + private var headingStep: Double = 1.5 + + /// The map type + @State + private var mapType: MKMapType = .standard + +} + +// MARK: - View + +extension ContentView: View { + + /// The content and behavior of the view. + var body: some View { + ZStack { + FlyoverMap( + isStarted: self.isStarted, + coordinate: self.location.coordinate, + configuration: .init( + altitude: .init(self.altitude), + pitch: .init(self.pitch), + heading: .increment(by: self.headingStep) + ), + mapType: self.mapType + ) + .ignoresSafeArea() + self.actionButtons + VStack { + Spacer() + if self.isOptionsVisible { + self.options + .transition( + .opacity.combined(with: .move(edge: .bottom)) + ) + } + } + .padding(.bottom, 35) + self.statusBarOverlay + } + .animation( + .spring(), + value: self.isOptionsVisible + ) + } + +} + +// MARK: - StatusBar Overlay + +private extension ContentView { + + /// A statusbar overlay View + var statusBarOverlay: some View { + GeometryReader { geometry in + Rectangle() + .fill(Color.clear) + .background(.regularMaterial) + .frame(height: geometry.safeAreaInsets.top) + .ignoresSafeArea() + } + } + +} + +// MARK: - Action Buttons + +private extension ContentView { + + /// The action buttons View + var actionButtons: some View { + VStack { + HStack { + Spacer() + VStack { + Button { + self.isStarted.toggle() + } label: { + Image( + systemName: self.isStarted ? "pause.circle" : "play.circle" + ) + .symbolRenderingMode(.hierarchical) + .font(.title) + .foregroundColor(.accentColor) + .padding(5) + .background(.regularMaterial) + .cornerRadius(8) + .shadow(radius: 0.5) + } + Button { + self.isOptionsVisible.toggle() + } label: { + Image( + systemName: self.isOptionsVisible ? "gear.circle.fill" : "gear.circle" + ) + .symbolRenderingMode(.hierarchical) + .font(.title) + .foregroundColor(.accentColor) + .padding(5) + .background(.regularMaterial) + .cornerRadius(8) + .shadow(radius: 0.5) + } + } + } + Spacer() + } + .padding(.trailing, 8) + .padding(.top, 10) + } + +} + +// MARK: - Options + +private extension ContentView { + + /// An options View + var options: some View { + ScrollView( + .horizontal, + showsIndicators: false + ) { + HStack { + self.optionsCell( + title: "Map Type", + content: Picker( + "Map Type", + selection: self.$mapType + ) { + Text( + verbatim: "Standard" + ) + .tag(MKMapType.standard) + Text( + verbatim: "Satellite" + ) + .tag(MKMapType.satellite) + Text( + verbatim: "Hybrid" + ) + .tag(MKMapType.hybrid) + } + .pickerStyle(.menu) + ) + self.optionsCell( + title: "Location", + content: Picker( + "Location", + selection: self.$location + ) { + ForEach( + Location.all, + id: \.self + ) { location in + Text( + verbatim: location.name + ) + .tag(location) + } + } + .pickerStyle(.menu) + ) + self.optionsCell( + title: "Altitude", + content: Slider( + value: self.$altitude, + in: 0...2000, + label: { EmptyView() }, + minimumValueLabel: { Text(verbatim: "") }, + maximumValueLabel: { + Text( + verbatim: "\(Int(self.altitude))m" + ) + .font(.subheadline.monospaced()) + } + ) + .frame(width: 250) + ) + self.optionsCell( + title: "Pitch", + content: Slider( + value: self.$pitch, + in: 0...90, + label: { EmptyView() }, + minimumValueLabel: { Text(verbatim: "") }, + maximumValueLabel: { + Text( + verbatim: "\(Int(self.pitch))" + ) + .font(.subheadline.monospaced()) + } + ) + .frame(width: 200) + ) + self.optionsCell( + title: "Heading Step", + content: Slider( + value: self.$headingStep, + in: 1...10, + label: { EmptyView() }, + minimumValueLabel: { Text(verbatim: "") }, + maximumValueLabel: { + Text( + verbatim: "\(Int(self.headingStep))" + ) + .font(.subheadline.monospaced()) + } + ) + .frame(width: 200) + ) + } + .padding(.horizontal) + } + } + + /// Options cell View + /// - Parameters: + /// - title: The title + /// - content: The Content + func optionsCell( + title: String, + content: Content + ) -> some View { + VStack(alignment: .leading) { + Text( + verbatim: title + ) + .font(.title3.weight(.semibold)) + content + } + .padding() + .background(.regularMaterial) + .cornerRadius(12) + .shadow(radius: 0.5) + } + +} diff --git a/Example/Example/Location.swift b/Example/Example/Location.swift new file mode 100644 index 0000000..0ed7769 --- /dev/null +++ b/Example/Example/Location.swift @@ -0,0 +1,131 @@ +import CoreLocation + +// MARK: - Location + +/// A Location +struct Location { + + /// The name + let name: String + + /// The coordinate + let coordinate: CLLocationCoordinate2D + +} + +// MARK: - Equatable + +extension Location: Equatable { + + /// Returns a Boolean value indicating whether two values are equal + /// - Parameters: + /// - lhs: A value to compare + /// - rhs: Another value to compare + static func == ( + lhs: Self, + rhs: Self + ) -> Bool { + lhs.name == rhs.name + && lhs.coordinate.latitude == rhs.coordinate.latitude + && lhs.coordinate.longitude == rhs.coordinate.longitude + } + +} + +// MARK: - Hashable + +extension Location: Hashable { + + /// Hashes the essential components of this value by feeding them into the given hasher + /// - Parameter hasher: The hasher to use when combining the components of this instance + func hash( + into hasher: inout Hasher + ) { + hasher.combine(self.name) + hasher.combine(self.coordinate.latitude) + hasher.combine(self.coordinate.longitude) + } + +} + +// MARK: - Apple Park + +extension Location { + + /// Apple Park Location + static let applePark = Self( + name: "Apple Park", + coordinate: .init( + latitude: 37.3348, + longitude: -122.0090 + ) + ) + +} + +// MARK: - All + +extension Location { + + /// All locations + static let all: [Self] = [ + .applePark, + .init( + name: "Infinite Loop", + coordinate: .init( + latitude: 37.3317, + longitude: -122.0302 + ) + ), + .init( + name: "Golden Gate Bridge", + coordinate: .init( + latitude: 37.8199, + longitude: -122.4783 + ) + ), + .init( + name: "Coit Tower", + coordinate: .init( + latitude: 37.8024, + longitude: -122.4058 + ) + ), + .init( + name: "Fisherman's Wharf", + coordinate: .init( + latitude: 37.8099, + longitude: -122.4103 + ) + ), + .init( + name: "Ferry Building", + coordinate: .init( + latitude: 37.7956, + longitude: -122.3935 + ) + ), + .init( + name: "Oracle Park", + coordinate: .init( + latitude: 37.7786, + longitude: -122.3893 + ) + ), + .init( + name: "Big Ben", + coordinate: .init( + latitude: 51.4994, + longitude: -0.1245 + ) + ), + .init( + name: "Tower Bridge", + coordinate: .init( + latitude: 51.5055, + longitude: -0.0754 + ) + ) + ] + +} diff --git a/Example/FlyoverConfiguration/FlyoverConfiguration.swift b/Example/FlyoverConfiguration/FlyoverConfiguration.swift deleted file mode 100644 index 6bef65d..0000000 --- a/Example/FlyoverConfiguration/FlyoverConfiguration.swift +++ /dev/null @@ -1,104 +0,0 @@ -// -// Configuration.swift -// FlyoverKit-Example -// -// Created by Sven Tiigi on 21.02.18. -// Copyright © 2018 Sven Tiigi. All rights reserved. -// - -import Foundation -import MapKit - -// MARK: - Configuration - -/// The FlyoverConfiguration Enumeration -enum FlyoverConfiguration { - - /// Flyover start/stop boolean - case flyover(Bool) - /// The mapType - case mapType(MKMapType) - /// The duration - case duration(Double) - /// The altitude - case altitude(Double) - /// The pitch - case pitch(Double) - /// The heading step - case headingStep(Double) - - /// Retrieve the Display Name for the Configuration - /// - /// - Returns: The display name string - func getDisplayName() -> String { - switch self { - case .flyover: - return "Flyover" - case .mapType: - return "MapType" - case .duration: - return "Duration" - case .altitude: - return "Altitude" - case .pitch: - return "Pitch" - case .headingStep: - return "HeadingStep" - } - } - - /// Retrieve the minimum Value for Configuration case - /// - /// - Returns: The minimum value - func getMinimumValue() -> Float { - return 0 - } - - /// Retrieve the maximum value for Configuration case - /// - /// - Returns: The maximum value - func getMaximumValue() -> Float { - switch self { - case .duration: - return 50 - case .altitude: - return 2000 - case .pitch: - return 100 - case .headingStep: - return 100 - default: - return 0 - } - } - -} - -// MARK: - RawRepresentable - -extension FlyoverConfiguration: RawRepresentable { - - /// Associated type RawValue as String - typealias RawValue = String - - /// RawRepresentable initializer. Which always returns nil - /// - /// - Parameters: - /// - rawValue: The rawValue - init?(rawValue: String) { - // Returning nil to avoid constructing enum with String - return nil - } - - /// The enumeration name as String - var rawValue: RawValue { - // Retrieve label via Mirror for Enum with associcated value - guard let label = Mirror(reflecting: self).children.first?.label else { - // Return String describing self enumeration with no asscoiated value - return String(describing: self) - } - // Return label - return label - } - -} diff --git a/Example/FlyoverConfiguration/FlyoverConfigurationTableView.swift b/Example/FlyoverConfiguration/FlyoverConfigurationTableView.swift deleted file mode 100644 index 566b5cc..0000000 --- a/Example/FlyoverConfiguration/FlyoverConfigurationTableView.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// FlyoverConfigurationTableView.swift -// FlyoverKit-Example -// -// Created by Sven Tiigi on 21.02.18. -// Copyright © 2018 Sven Tiigi. All rights reserved. -// - -import UIKit - -// MARK: - FlyoverConfigurationTableViewDelegate - -/// The FlyoverConfigurationTableViewDelegate -protocol FlyoverConfigurationTableViewDelegate: class { - /// On Configuration Change - /// - /// - Parameter configuration: The updated configuration - func onChange(_ configuration: FlyoverConfiguration) -} - -// MARK: - FlyoverConfigurationTableView - -class FlyoverConfigurationTableView: UITableView { - - // MARK: Properties - - /// The FlyoverConfigurationTableViewDelegate - weak var configurationDelegate: FlyoverConfigurationTableViewDelegate? { - didSet { - // Set delegate on cell - self.cells.forEach { - $0.delegate = self.configurationDelegate - } - } - } - - /// The cells constructed with default configuration and delegate - private lazy var cells: [FlyoverConfigurationTableViewCell] = { - // Initialize default configurations - let defaultConfigurations: [FlyoverConfiguration] = [ - .flyover(true), - .mapType(.standard), - .altitude(600.0), - .pitch(45.0), - .headingStep(20.0), - .duration(4.0) - ] - // Map to Cells - return defaultConfigurations.map { - FlyoverConfigurationTableViewCell($0) - } - }() - - // MARK: Initializer - - /// Default initializer - init() { - // Super init - super.init(frame: .zero, style: .plain) - // Set delegate to self - self.delegate = self - // Set datasource to self - self.dataSource = self - // Clear TableFooterView - self.tableFooterView = UIView() - // Add bottom space - self.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 0) - } - - /// Initializer with NSCoder returns nil - required init?(coder aDecoder: NSCoder) { - return nil - } - -} - -// MARK: - UITableViewDataSource - -extension FlyoverConfigurationTableView: UITableViewDataSource { - - func numberOfSections(in tableView: UITableView) -> Int { - // Return 1 section - return 1 - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - // Return count of cells - return self.cells.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - // Return cell at index path - return self.cells[indexPath.row] - } - -} - -// MARK: - UITableViewDelegate - -extension FlyoverConfigurationTableView: UITableViewDelegate { - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - // First two rows smaller then the rest - return indexPath.row < 2 ? 65 : 100 - } - -} diff --git a/Example/FlyoverConfiguration/FlyoverConfigurationTableViewCell.swift b/Example/FlyoverConfiguration/FlyoverConfigurationTableViewCell.swift deleted file mode 100644 index 782a2c2..0000000 --- a/Example/FlyoverConfiguration/FlyoverConfigurationTableViewCell.swift +++ /dev/null @@ -1,241 +0,0 @@ -// -// FlyoverConfigurationTableViewCell.swift -// FlyoverKit-Example -// -// Created by Sven Tiigi on 21.02.18. -// Copyright © 2018 Sven Tiigi. All rights reserved. -// - -import MapKit -import UIKit - -// MARK: - FlyoverConfigurationTableViewCell - -class FlyoverConfigurationTableViewCell: UITableViewCell { - - // MARK: Properties - - /// The Configuration - var configuration: FlyoverConfiguration - - /// The FlyoverConfigurationTableViewDelegate - weak var delegate: FlyoverConfigurationTableViewDelegate? - - /// The title label - lazy var titleLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 18, weight: .semibold) - return label - }() - - /// The value label - lazy var valueLabel: UILabel = { - let label = UILabel() - label.textColor = .lightGray - label.textAlignment = .right - return label - }() - - /// The slider - lazy var slider: UISlider = { - let slider = UISlider() - slider.tintColor = .main - slider.addTarget(self, action: #selector(sliderValueChanged), for: .valueChanged) - slider.addTarget(self, action: #selector(sliderValueDidChanged), for: [.touchUpInside, .touchUpOutside]) - return slider - }() - - /// The switch flyover (start/stop) - lazy var switchFlyover: UISwitch = { - let switchFlyover = UISwitch() - switchFlyover.tintColor = .main - switchFlyover.onTintColor = .main - switchFlyover.addTarget(self, action: #selector(switchValueChanged), for: .valueChanged) - return switchFlyover - }() - - /// The segmented control - lazy var segmentedControl: UISegmentedControl = { - let segmentedControl = UISegmentedControl(items: ["Standard", "SatelliteFlyover", "HybridFlyover"]) - segmentedControl.tintColor = .main - segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged), for: .valueChanged) - return segmentedControl - }() - - // MARK: Initializer - - /// Default initializer with Configuration - /// - /// - Parameters: - /// - configuration: The Configuration - init(_ configuration: FlyoverConfiguration) { - // Set configuration - self.configuration = configuration - // Super Init - super.init(style: .default, reuseIdentifier: configuration.rawValue) - // Set clear background color - self.backgroundColor = .clear - // Disable selection style - self.selectionStyle = .none - // Switch on configuration to configure and add subviews - switch configuration { - case .flyover(let started): - self.titleLabel.text = self.configuration.getDisplayName() - self.switchFlyover.isOn = started - self.contentView.addSubview(self.titleLabel) - self.contentView.addSubview(self.switchFlyover) - case .mapType: - self.segmentedControl.selectedSegmentIndex = 0 - self.contentView.addSubview(self.segmentedControl) - case .duration(let duration): - self.addSliderConfigurationViews(value: duration) - case .altitude(let altitude): - self.addSliderConfigurationViews(value: altitude) - case .pitch(let pitch): - self.addSliderConfigurationViews(value: pitch) - case .headingStep(let headingStep): - self.addSliderConfigurationViews(value: headingStep) - } - } - - /// Initializer with decoder returns nil - required init?(coder aDecoder: NSCoder) { - return nil - } - - // MARK: View-Lifecycle - - /// LayoutSubviews - override func layoutSubviews() { - super.layoutSubviews() - let height = self.contentView.frame.size.height - let width = self.contentView.frame.size.width - if case .flyover = self.configuration { - self.switchFlyover.frame = CGRect( - x: width - self.switchFlyover.frame.size.width - 15, - y: height/2 - self.switchFlyover.frame.size.height / 2, - width: self.switchFlyover.frame.size.width, - height: self.switchFlyover.frame.size.height - ) - self.titleLabel.frame = CGRect( - x: 15, - y: 0, - width: self.switchFlyover.frame.origin.x, - height: height - ) - } else if case .mapType = self.configuration { - self.segmentedControl.frame = CGRect( - x: 18, - y: (height / 2) - (height - 18 * 2) / 2, - width: width - 18 * 2, - height: height - 18 * 2 - ) - } else { - self.valueLabel.frame = CGRect( - x: width / 2, - y: 0, width: - width / 2 - 15, - height: height / 2 - ) - self.titleLabel.frame = CGRect( - x: 15, - y: 0, - width: self.valueLabel.frame.origin.x, - height: height / 2 - ) - self.slider.frame = CGRect( - x: 15, - y: height / 2, - width: width - 15 * 2, - height: height / 2 - ) - } - } - - /// Add Slider Configuration Views - /// - /// - Parameter value: The slider value - func addSliderConfigurationViews(value: Double) { - self.titleLabel.text = self.configuration.getDisplayName() - self.valueLabel.text = String(describing: value) - self.slider.minimumValue = configuration.getMinimumValue() - self.slider.maximumValue = configuration.getMaximumValue() - self.slider.value = Float(value) - self.contentView.addSubview(self.titleLabel) - self.contentView.addSubview(self.valueLabel) - self.contentView.addSubview(self.slider) - } - - // MARK: Action Handler - - /// Switch value changed action handler - @objc private func switchValueChanged() { - // Check if case is flyover and retrieve associated value bool - if case .flyover(let started) = self.configuration { - // Update configuration with inverted bool value - self.configuration = .flyover(!started) - // OnChange with update configuration - self.delegate?.onChange(self.configuration) - } - } - - /// Slider value changed action handler - @objc private func sliderValueChanged() { - // Set rounded slider value - self.slider.value = roundf(self.slider.value) - // Set value label text - self.valueLabel.text = String(describing: self.slider.value) - } - - /// Slider value did changed action handler - @objc private func sliderValueDidChanged() { - // Set rounded slider value - self.slider.value = roundf(self.slider.value) - // Set value label text - self.valueLabel.text = String(describing: self.slider.value) - // Initialize value of Double slider value type - let value = Double(self.slider.value) - // Declare updated configuration - let updatedConfiguration: FlyoverConfiguration? - // Switch on configuration - switch self.configuration { - case .duration: - updatedConfiguration = .duration(value) - case .altitude: - updatedConfiguration = .altitude(value) - case .pitch: - updatedConfiguration = .pitch(value) - case .headingStep: - updatedConfiguration = .headingStep(value) - default: - updatedConfiguration = nil - } - // Unwrap updatedConfigration - guard let configuration = updatedConfiguration else { - // Not available return - return - } - // Set the configuration - self.configuration = configuration - // OnChange with updated configuration - self.delegate?.onChange(self.configuration) - } - - /// SegmentedControl value changed action handler - @objc private func segmentedControlValueChanged() { - // Switch on selectedSegmentIndex - switch self.segmentedControl.selectedSegmentIndex { - case 0: - self.configuration = .mapType(.standard) - case 1: - self.configuration = .mapType(.satelliteFlyover) - case 2: - self.configuration = .mapType(.hybridFlyover) - default: - self.configuration = .mapType(.standard) - } - // OnChange with updated configuration - self.delegate?.onChange(self.configuration) - } - -} diff --git a/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 212b38a..0000000 --- a/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-Small@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-Small@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-Small-40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-Small-40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-60@3x.png", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-Small.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-Small@2x.png", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-167.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "iTunesArtwork@2x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "pre-rendered" : true - } -} \ No newline at end of file diff --git a/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-167.png b/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-167.png deleted file mode 100644 index 6a9ebf6b5e011901b28ee44fa7b73125ba28adbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18578 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
m_DdRY7z)4!?9Ck~Di@L`zZ`@-_(s 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 diff --git a/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png deleted file mode 100644 index 1bcc0346ee8e002b314a46dc2083955bb575b615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13258 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
PGwIZK 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 diff --git a/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/Example/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-76.png deleted file mode 100644 index ea3973f5d4a5cb5e1b41ed53d56efcf5fcc1c1d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6665 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