diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..dfe500f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [kharrison] diff --git a/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..330b13d --- /dev/null +++ b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..997f1a0 --- /dev/null +++ b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..00f2aca --- /dev/null +++ b/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AllVisible/AllVisible.xcodeproj/project.pbxproj b/AllVisible/AllVisible.xcodeproj/project.pbxproj index 6c1007d..68c02d2 100644 --- a/AllVisible/AllVisible.xcodeproj/project.pbxproj +++ b/AllVisible/AllVisible.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53AA2EB11DA2A957008EBF84 = { @@ -310,6 +310,7 @@ 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; @@ -335,7 +336,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -370,6 +371,7 @@ 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; @@ -389,7 +391,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..78219e1 --- /dev/null +++ b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..729e605 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ce2a0d9 --- /dev/null +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5fc5b6e --- /dev/null +++ b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..948f33d --- /dev/null +++ b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..05bb496 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2c11c20 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7c537ff --- /dev/null +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,6 @@ + + + + + diff --git a/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0502574 --- /dev/null +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a339ef4 --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8ac9b61 --- /dev/null +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..edc712f --- /dev/null +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ef00988 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..82063ef --- /dev/null +++ b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ea9b143 --- /dev/null +++ b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..dc746e2 --- /dev/null +++ b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..3f19229 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d8ef532 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d8ef532 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c73bb89 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..31c29ea --- /dev/null +++ b/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e92800f --- /dev/null +++ b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e92800f --- /dev/null +++ b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 8707dce..cf90168 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -9,14 +9,18 @@ /* Begin PBXBuildFile section */ 531B320A1861EFB6005F2332 /* UYLScaledTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */; }; 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */; }; - 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52D17F83CB600AD2292 /* Foundation.framework */; }; - 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */; }; - 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B53117F83CB600AD2292 /* UIKit.framework */; }; - 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53617F83CB600AD2292 /* InfoPlist.strings */; }; - 5393B53A17F83CB600AD2292 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53917F83CB600AD2292 /* main.m */; }; + 53855AB82655769D0033DD1E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AB72655769D0033DD1E /* AppDelegate.swift */; }; + 53855ABA2655769D0033DD1E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AB92655769D0033DD1E /* SceneDelegate.swift */; }; + 53855ABC2655769D0033DD1E /* UYLTextStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */; }; + 53855ACA265577880033DD1E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53855AC9265577880033DD1E /* main.m */; }; + 53855AD026557D590033DD1E /* UYLScaledTextStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */; }; + 53855AD3265581DE0033DD1E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD1265581DE0033DD1E /* Main.storyboard */; }; + 53855AD52655834B0033DD1E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD42655834B0033DD1E /* Assets.xcassets */; }; + 53855AD8265583680033DD1E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD6265583680033DD1E /* LaunchScreen.storyboard */; }; + 53855ADA2655AAA70033DD1E /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */; }; 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */; }; 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53F17F83CB600AD2292 /* Main.storyboard */; }; - 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Images.xcassets */; }; + 5393B54617F83CB600AD2292 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Assets.xcassets */; }; 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */; }; 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */; }; /* End PBXBuildFile section */ @@ -26,18 +30,26 @@ 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLScaledTextStyleViewController.m; sourceTree = ""; }; 5325F8AD18020B0B0000A32A /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 53615D2E1F41B67900C7D904 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53855AB52655769D0033DD1E /* DynamicTextSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicTextSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53855AB72655769D0033DD1E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53855AB92655769D0033DD1E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UYLTextStyleViewController.swift; sourceTree = ""; }; + 53855AC52655769E0033DD1E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53855AC9265577880033DD1E /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UYLScaledTextStyleViewController.swift; sourceTree = ""; }; + 53855AD2265581DE0033DD1E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53855AD42655834B0033DD1E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53855AD7265583680033DD1E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Extension.swift"; sourceTree = ""; }; 5393B52A17F83CB600AD2292 /* DynamicText.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicText.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5393B52D17F83CB600AD2292 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 5393B53117F83CB600AD2292 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 5393B53517F83CB600AD2292 /* DynamicText-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DynamicText-Info.plist"; sourceTree = ""; }; - 5393B53717F83CB600AD2292 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5393B53917F83CB600AD2292 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 5393B53B17F83CB600AD2292 /* DynamicText-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DynamicText-Prefix.pch"; sourceTree = ""; }; + 5393B53517F83CB600AD2292 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5393B53C17F83CB600AD2292 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 5393B54017F83CB600AD2292 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 5393B54517F83CB600AD2292 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5393B54517F83CB600AD2292 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 5393B54C17F83CB600AD2292 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTextStyleViewController.h; sourceTree = ""; }; 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTextStyleViewController.m; sourceTree = ""; }; @@ -46,24 +58,45 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 53855AB22655769D0033DD1E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52717F83CB600AD2292 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */, - 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */, - 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53855AB62655769D0033DD1E /* DynamicTextSwift */ = { + isa = PBXGroup; + children = ( + 53855AD42655834B0033DD1E /* Assets.xcassets */, + 53855AD1265581DE0033DD1E /* Main.storyboard */, + 53855AD6265583680033DD1E /* LaunchScreen.storyboard */, + 53855AB72655769D0033DD1E /* AppDelegate.swift */, + 53855AB92655769D0033DD1E /* SceneDelegate.swift */, + 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */, + 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */, + 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */, + 53855AC52655769E0033DD1E /* Info.plist */, + ); + path = DynamicTextSwift; + sourceTree = ""; + }; 5393B52117F83CB600AD2292 = { isa = PBXGroup; children = ( 5325F8AD18020B0B0000A32A /* README.md */, 5393B53317F83CB600AD2292 /* DynamicText */, + 53855AB62655769D0033DD1E /* DynamicTextSwift */, 5393B52C17F83CB600AD2292 /* Frameworks */, 5393B52B17F83CB600AD2292 /* Products */, ); @@ -73,6 +106,7 @@ isa = PBXGroup; children = ( 5393B52A17F83CB600AD2292 /* DynamicText.app */, + 53855AB52655769D0033DD1E /* DynamicTextSwift.app */, ); name = Products; sourceTree = ""; @@ -91,6 +125,7 @@ 5393B53317F83CB600AD2292 /* DynamicText */ = { isa = PBXGroup; children = ( + 5393B53F17F83CB600AD2292 /* Main.storyboard */, 5393B53C17F83CB600AD2292 /* UYLAppDelegate.h */, 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */, 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */, @@ -99,9 +134,8 @@ 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */, 53FE524A1871CDB700DE5F24 /* UIFont+UYLScaledFont.h */, 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */, - 5393B53F17F83CB600AD2292 /* Main.storyboard */, + 5393B54517F83CB600AD2292 /* Assets.xcassets */, 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */, - 5393B54517F83CB600AD2292 /* Images.xcassets */, 5393B53417F83CB600AD2292 /* Supporting Files */, ); path = DynamicText; @@ -110,10 +144,8 @@ 5393B53417F83CB600AD2292 /* Supporting Files */ = { isa = PBXGroup; children = ( - 5393B53517F83CB600AD2292 /* DynamicText-Info.plist */, - 5393B53617F83CB600AD2292 /* InfoPlist.strings */, - 5393B53917F83CB600AD2292 /* main.m */, - 5393B53B17F83CB600AD2292 /* DynamicText-Prefix.pch */, + 53855AC9265577880033DD1E /* main.m */, + 5393B53517F83CB600AD2292 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -121,6 +153,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 53855AB42655769D0033DD1E /* DynamicTextSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53855AC62655769E0033DD1E /* Build configuration list for PBXNativeTarget "DynamicTextSwift" */; + buildPhases = ( + 53855AB12655769D0033DD1E /* Sources */, + 53855AB22655769D0033DD1E /* Frameworks */, + 53855AB32655769D0033DD1E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DynamicTextSwift; + productName = DynamicTextSwift; + productReference = 53855AB52655769D0033DD1E /* DynamicTextSwift.app */; + productType = "com.apple.product-type.application"; + }; 5393B52917F83CB600AD2292 /* DynamicText */ = { isa = PBXNativeTarget; buildConfigurationList = 5393B55C17F83CB600AD2292 /* Build configuration list for PBXNativeTarget "DynamicText" */; @@ -145,8 +194,14 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 1120; + LastSwiftUpdateCheck = 1250; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53855AB42655769D0033DD1E = { + CreatedOnToolsVersion = 12.5; + }; + }; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; compatibilityVersion = "Xcode 11.0"; @@ -162,18 +217,28 @@ projectRoot = ""; targets = ( 5393B52917F83CB600AD2292 /* DynamicText */, + 53855AB42655769D0033DD1E /* DynamicTextSwift */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 53855AB32655769D0033DD1E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53855AD8265583680033DD1E /* LaunchScreen.storyboard in Resources */, + 53855AD52655834B0033DD1E /* Assets.xcassets in Resources */, + 53855AD3265581DE0033DD1E /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52817F83CB600AD2292 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */, + 5393B54617F83CB600AD2292 /* Assets.xcassets in Resources */, 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */, - 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */, 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -181,11 +246,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 53855AB12655769D0033DD1E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53855AD026557D590033DD1E /* UYLScaledTextStyleViewController.swift in Sources */, + 53855ABC2655769D0033DD1E /* UYLTextStyleViewController.swift in Sources */, + 53855AB82655769D0033DD1E /* AppDelegate.swift in Sources */, + 53855ADA2655AAA70033DD1E /* UIFont+Extension.swift in Sources */, + 53855ABA2655769D0033DD1E /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52617F83CB600AD2292 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5393B53A17F83CB600AD2292 /* main.m in Sources */, + 53855ACA265577880033DD1E /* main.m in Sources */, 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */, 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */, 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */, @@ -204,12 +281,20 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; - 5393B53617F83CB600AD2292 /* InfoPlist.strings */ = { + 53855AD1265581DE0033DD1E /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53855AD2265581DE0033DD1E /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53855AD6265583680033DD1E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 5393B53717F83CB600AD2292 /* en */, + 53855AD7265583680033DD1E /* Base */, ); - name = InfoPlist.strings; + name = LaunchScreen.storyboard; sourceTree = ""; }; 5393B53F17F83CB600AD2292 /* Main.storyboard */ = { @@ -223,6 +308,73 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 53855AC72655769E0033DD1E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = DynamicTextSwift/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicTextSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53855AC82655769E0033DD1E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = DynamicTextSwift/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicTextSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 5393B55A17F83CB600AD2292 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -246,6 +398,7 @@ 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; @@ -299,6 +452,7 @@ 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; @@ -326,12 +480,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1.3; + CURRENT_PROJECT_VERSION = 1.4; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; - MARKETING_VERSION = 1.3; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = DynamicText/Info.plist; + MARKETING_VERSION = 1.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -343,12 +497,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1.3; + CURRENT_PROJECT_VERSION = 1.4; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; - MARKETING_VERSION = 1.3; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = DynamicText/Info.plist; + MARKETING_VERSION = 1.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -359,6 +513,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 53855AC62655769E0033DD1E /* Build configuration list for PBXNativeTarget "DynamicTextSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53855AC72655769E0033DD1E /* Debug */, + 53855AC82655769E0033DD1E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0f1a28d --- /dev/null +++ b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..22c4bb0 --- /dev/null +++ b/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-1024.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-1024.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-120.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-120.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-167.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-167.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-180.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-180.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-20.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-20.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-41.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-41.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-42.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-42.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png diff --git a/DynamicText/DynamicText/Assets.xcassets/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicText/DynamicText/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first30.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first30.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first60.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first90.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first90.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second30.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second30.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second60.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second90.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second90.png diff --git a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard index f746012..e16eba7 100644 --- a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard +++ b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard @@ -1,15 +1,14 @@ - - - - + + - + + - + @@ -18,18 +17,17 @@ - + - + - - + - + @@ -38,16 +36,15 @@ - + - + - - + @@ -61,17 +58,58 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/Base.lproj/Main.storyboard b/DynamicText/DynamicText/Base.lproj/Main.storyboard index f069627..2606c66 100644 --- a/DynamicText/DynamicText/Base.lproj/Main.storyboard +++ b/DynamicText/DynamicText/Base.lproj/Main.storyboard @@ -1,200 +1,260 @@ - + - + + + + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + + - + + + + + + + + + + + + + - + @@ -208,17 +268,58 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/DynamicText-Prefix.pch b/DynamicText/DynamicText/DynamicText-Prefix.pch deleted file mode 100644 index 82a2bb4..0000000 --- a/DynamicText/DynamicText/DynamicText-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/DynamicText/DynamicText/Images.xcassets/Contents.json b/DynamicText/DynamicText/Images.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/DynamicText/DynamicText/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/DynamicText/DynamicText/DynamicText-Info.plist b/DynamicText/DynamicText/Info.plist similarity index 100% rename from DynamicText/DynamicText/DynamicText-Info.plist rename to DynamicText/DynamicText/Info.plist diff --git a/DynamicText/DynamicText/UIFont+UYLScaledFont.h b/DynamicText/DynamicText/UIFont+UYLScaledFont.h index 3dc52dd..3704d97 100644 --- a/DynamicText/DynamicText/UIFont+UYLScaledFont.h +++ b/DynamicText/DynamicText/UIFont+UYLScaledFont.h @@ -1,9 +1,4 @@ -// -// UIFont+UYLScaledFont.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,11 +26,11 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UIFont (UYLScaledFont) -// +uylPreferredFontForTextStyle:scale: +// +preferredFontForTextStyle:scale: // // Return a UIFont object for the specified text style that is scaled by the // speficied scale factor. @@ -45,6 +40,6 @@ // The scaleFactor modifies the default point size of the text style. So for // a font that is twice the default size specify a scaleFactor of 2.0. -+ (UIFont *)uylPreferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor; ++ (UIFont *)preferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor; @end diff --git a/DynamicText/DynamicText/UIFont+UYLScaledFont.m b/DynamicText/DynamicText/UIFont+UYLScaledFont.m index 0efddd2..781264b 100644 --- a/DynamicText/DynamicText/UIFont+UYLScaledFont.m +++ b/DynamicText/DynamicText/UIFont+UYLScaledFont.m @@ -1,9 +1,4 @@ -// -// UIFont+UYLScaledFont.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -35,12 +30,10 @@ @implementation UIFont (UYLScaledFont) -+ (UIFont *)uylPreferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor ++ (UIFont *)preferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor { - UIFontDescriptor *descriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:style]; - CGFloat pointSize = descriptor.pointSize * scaleFactor; - UIFont *font = [UIFont fontWithDescriptor:descriptor size:pointSize]; - return font; + UIFont *font = [UIFont preferredFontForTextStyle:style]; + return [font fontWithSize:font.pointSize * scaleFactor]; } @end diff --git a/DynamicText/DynamicText/UYLAppDelegate.h b/DynamicText/DynamicText/UYLAppDelegate.h index 5efc6de..920cfe0 100644 --- a/DynamicText/DynamicText/UYLAppDelegate.h +++ b/DynamicText/DynamicText/UYLAppDelegate.h @@ -1,9 +1,4 @@ -// -// UYLAppDelegate.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,10 +26,8 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UYLAppDelegate : UIResponder - @property (strong, nonatomic) UIWindow *window; - @end diff --git a/DynamicText/DynamicText/UYLAppDelegate.m b/DynamicText/DynamicText/UYLAppDelegate.m index 59ba911..5a307a4 100644 --- a/DynamicText/DynamicText/UYLAppDelegate.m +++ b/DynamicText/DynamicText/UYLAppDelegate.m @@ -1,9 +1,4 @@ -// -// UYLAppDelegate.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -33,5 +28,4 @@ #import "UYLAppDelegate.h" @implementation UYLAppDelegate - -@end \ No newline at end of file +@end diff --git a/DynamicText/DynamicText/UYLScaledTextStyleViewController.h b/DynamicText/DynamicText/UYLScaledTextStyleViewController.h index 3c408b4..986a63c 100644 --- a/DynamicText/DynamicText/UYLScaledTextStyleViewController.h +++ b/DynamicText/DynamicText/UYLScaledTextStyleViewController.h @@ -1,13 +1,32 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. // -// UYLScaledTextStyleViewController.h -// DynamicText +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Created by Keith Harrison on 18/12/2013. -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. -#import "UYLTextStyleViewController.h" - -@interface UYLScaledTextStyleViewController : UYLTextStyleViewController +@import UIKit; +@interface UYLScaledTextStyleViewController : UIViewController @end diff --git a/DynamicText/DynamicText/UYLScaledTextStyleViewController.m b/DynamicText/DynamicText/UYLScaledTextStyleViewController.m index 5214e5e..b706e52 100644 --- a/DynamicText/DynamicText/UYLScaledTextStyleViewController.m +++ b/DynamicText/DynamicText/UYLScaledTextStyleViewController.m @@ -9,22 +9,56 @@ #import "UYLScaledTextStyleViewController.h" #import "UIFont+UYLScaledFont.h" +@interface UYLScaledTextStyleViewController () +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *allLabels; + +@property (weak, nonatomic) IBOutlet UILabel *title1Label; +@property (weak, nonatomic) IBOutlet UILabel *title2Label; +@property (weak, nonatomic) IBOutlet UILabel *title3Label; +@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; +@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; +@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; +@property (weak, nonatomic) IBOutlet UILabel *calloutLabel; +@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; +@property (weak, nonatomic) IBOutlet UILabel *caption1Label; +@property (weak, nonatomic) IBOutlet UILabel *caption2Label; +@end + @implementation UYLScaledTextStyleViewController #pragma mark - #pragma mark === View Life Cycle === #pragma mark - -- (void)configureView -{ +- (void)viewDidLoad { + [super viewDidLoad]; + [self configureView]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateTextStyles:) + name:UIContentSizeCategoryDidChangeNotification + object:nil]; +} + +- (void)configureView { CGFloat scaleFactor = 2.0; - self.textSizeLabel.text = [[UIApplication sharedApplication] preferredContentSizeCategory]; - self.headlineLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleHeadline scale:scaleFactor]; - self.subheadLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleSubheadline scale:scaleFactor]; - self.bodyLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleBody scale:scaleFactor]; - self.caption1Label.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleCaption1 scale:scaleFactor]; - self.caption2Label.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleCaption2 scale:scaleFactor]; - self.footnoteLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleFootnote scale:scaleFactor]; + + self.title1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1 scale:scaleFactor]; + self.title2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2 scale:scaleFactor]; + self.title3Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3 scale:scaleFactor]; + self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline scale:scaleFactor]; + self.subheadLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline scale:scaleFactor]; + self.bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody scale:scaleFactor]; + self.calloutLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout scale:scaleFactor]; + self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote scale:scaleFactor]; + self.caption1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1 scale:scaleFactor]; + self.caption2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2 scale:scaleFactor]; } +#pragma mark - +#pragma mark === Notification Methods === +#pragma mark - + +- (void)updateTextStyles:(NSNotification *)notification { + [self configureView]; +} @end diff --git a/DynamicText/DynamicText/UYLTextStyleViewController.h b/DynamicText/DynamicText/UYLTextStyleViewController.h index 88bbcef..6c64a99 100644 --- a/DynamicText/DynamicText/UYLTextStyleViewController.h +++ b/DynamicText/DynamicText/UYLTextStyleViewController.h @@ -1,9 +1,4 @@ -// -// UYLTableViewController.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -30,17 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import +@import UIKit; @interface UYLTextStyleViewController : UIViewController - -@property (weak, nonatomic) IBOutlet UILabel *textSizeLabel; -@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; -@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; -@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; -@property (weak, nonatomic) IBOutlet UILabel *caption1Label; -@property (weak, nonatomic) IBOutlet UILabel *caption2Label; -@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; - @end diff --git a/DynamicText/DynamicText/UYLTextStyleViewController.m b/DynamicText/DynamicText/UYLTextStyleViewController.m index 6871248..98b752d 100644 --- a/DynamicText/DynamicText/UYLTextStyleViewController.m +++ b/DynamicText/DynamicText/UYLTextStyleViewController.m @@ -1,77 +1,83 @@ +// Copyright © 2013-2021 Keith Harrison. All rights reserved. // -// UYLTableViewController.m -// DynamicText +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. // -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. // -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. #import "UYLTextStyleViewController.h" +@interface UYLTextStyleViewController () +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *allLabels; + +@property (weak, nonatomic) IBOutlet UILabel *title1Label; +@property (weak, nonatomic) IBOutlet UILabel *title2Label; +@property (weak, nonatomic) IBOutlet UILabel *title3Label; +@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; +@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; +@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; +@property (weak, nonatomic) IBOutlet UILabel *calloutLabel; +@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; +@property (weak, nonatomic) IBOutlet UILabel *caption1Label; +@property (weak, nonatomic) IBOutlet UILabel *caption2Label; +@end + @implementation UYLTextStyleViewController #pragma mark - #pragma mark === View Life Cycle === #pragma mark - -- (void)viewDidLoad -{ - [super viewDidLoad]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(didChangePreferredContentSize:) - name:UIContentSizeCategoryDidChangeNotification - object:nil]; +- (void)viewDidLoad { + [super viewDidLoad]; + if (@available(iOS 10, *)) { + for (UILabel *label in self.allLabels) { + label.adjustsFontForContentSizeCategory = YES; + } + } else { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateTextStyles:) + name:UIContentSizeCategoryDidChangeNotification + object:nil]; + } } -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - [self configureView]; -} +#pragma mark - +#pragma mark === Notification Methods === +#pragma mark - -- (void)configureView -{ - self.textSizeLabel.text = [[UIApplication sharedApplication] preferredContentSizeCategory]; +- (void)updateTextStyles:(NSNotification *)notification { + self.title1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1]; + self.title2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2]; + self.title3Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3]; self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; self.subheadLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; self.bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + self.calloutLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout]; + self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; self.caption1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; self.caption2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; - self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; -} - -#pragma mark - -#pragma mark === Notification Methods === -#pragma mark - - -- (void)didChangePreferredContentSize:(NSNotification *)notification -{ - [self configureView]; } @end diff --git a/DynamicText/DynamicText/en.lproj/InfoPlist.strings b/DynamicText/DynamicText/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/DynamicText/DynamicText/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/DynamicText/DynamicText/main.m b/DynamicText/DynamicText/main.m index 94553a1..0530728 100644 --- a/DynamicText/DynamicText/main.m +++ b/DynamicText/DynamicText/main.m @@ -1,9 +1,4 @@ -// -// main.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: diff --git a/DynamicText/DynamicTextSwift/AppDelegate.swift b/DynamicText/DynamicTextSwift/AppDelegate.swift new file mode 100644 index 0000000..972061e --- /dev/null +++ b/DynamicText/DynamicTextSwift/AppDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { +} diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..9b711cb --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemBlueColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 71% rename from ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json rename to DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json index d8db8d6..1120389 100644 --- a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,93 +1,111 @@ { "images" : [ { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-40.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-60.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-40@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-120.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", "scale" : "3x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-41.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-42.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", "scale" : "2x" }, { - "idiom" : "ios-marketing", "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", "scale" : "1x" } ], diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000..4a1a9de Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png new file mode 100644 index 0000000..d4b42eb Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000..0a5ec66 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-180.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-180.png new file mode 100644 index 0000000..e943cc3 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-180.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png new file mode 100644 index 0000000..3c16adf Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 0000000..b918cea Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000..3c599a5 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000..7759c83 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 0000000..f32646a Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40.png new file mode 100644 index 0000000..c663546 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png new file mode 100644 index 0000000..afcf538 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 0000000..611f339 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-41.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-41.png new file mode 100644 index 0000000..c663546 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-41.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-42.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-42.png new file mode 100644 index 0000000..c663546 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-42.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60.png new file mode 100644 index 0000000..fd2eff6 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000..515d2b6 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 0000000..90d600a Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 0000000..6b529b8 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/Contents.json new file mode 100644 index 0000000..f7afaee --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first30.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "first60.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "first90.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first30.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first30.png new file mode 100644 index 0000000..e7f0902 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first30.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png new file mode 100644 index 0000000..975a75f Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png new file mode 100644 index 0000000..92341c2 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/Contents.json new file mode 100644 index 0000000..fd58914 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second30.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "second60.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "second90.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second30.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second30.png new file mode 100644 index 0000000..728d7f6 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second30.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second60.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second60.png new file mode 100644 index 0000000..9cd7cb3 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second60.png differ diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png new file mode 100644 index 0000000..6170461 Binary files /dev/null and b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png differ diff --git a/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e16eba7 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard b/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52c8196 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicTextSwift/Info.plist b/DynamicText/DynamicTextSwift/Info.plist new file mode 100644 index 0000000..5b531f7 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Info.plist @@ -0,0 +1,66 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/DynamicText/DynamicTextSwift/SceneDelegate.swift b/DynamicText/DynamicTextSwift/SceneDelegate.swift new file mode 100644 index 0000000..8b6fc47 --- /dev/null +++ b/DynamicText/DynamicTextSwift/SceneDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/DynamicText/DynamicTextSwift/UIFont+Extension.swift b/DynamicText/DynamicTextSwift/UIFont+Extension.swift new file mode 100644 index 0000000..3174e89 --- /dev/null +++ b/DynamicText/DynamicTextSwift/UIFont+Extension.swift @@ -0,0 +1,36 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +extension UIFont { + static func preferredFont(forTextStyle style: UIFont.TextStyle, scaleFactor: CGFloat) -> UIFont { + let font = UIFont.preferredFont(forTextStyle: style) + return font.withSize(font.pointSize * scaleFactor) + } +} diff --git a/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift b/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift new file mode 100644 index 0000000..9812038 --- /dev/null +++ b/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift @@ -0,0 +1,68 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class UYLScaledTextStyleViewController: UIViewController { + @IBOutlet private var allLabels: [UILabel]! + @IBOutlet private var title1Label: UILabel! + @IBOutlet private var title2Label: UILabel! + @IBOutlet private var title3Label: UILabel! + @IBOutlet private var headlineLabel: UILabel! + @IBOutlet private var subheadLabel: UILabel! + @IBOutlet private var bodyLabel: UILabel! + @IBOutlet private var calloutLabel: UILabel! + @IBOutlet private var footnoteLabel: UILabel! + @IBOutlet private var caption1Label: UILabel! + @IBOutlet private var caption2Label: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + configureView() + NotificationCenter.default.addObserver(self, selector: #selector(updateTextStyles(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + } + + @objc private func updateTextStyles(_ notification: Notification) { + configureView() + } + + private func configureView() { + let scaleFactor: CGFloat = 2.0 + + title1Label.font = UIFont.preferredFont(forTextStyle: .title1, scaleFactor: scaleFactor) + title2Label.font = UIFont.preferredFont(forTextStyle: .title2, scaleFactor: scaleFactor) + title3Label.font = UIFont.preferredFont(forTextStyle: .title3, scaleFactor: scaleFactor) + headlineLabel.font = UIFont.preferredFont(forTextStyle: .headline, scaleFactor: scaleFactor) + subheadLabel.font = UIFont.preferredFont(forTextStyle: .subheadline, scaleFactor: scaleFactor) + bodyLabel.font = UIFont.preferredFont(forTextStyle: .body, scaleFactor: scaleFactor) + calloutLabel.font = UIFont.preferredFont(forTextStyle: .callout, scaleFactor: scaleFactor) + footnoteLabel.font = UIFont.preferredFont(forTextStyle: .footnote, scaleFactor: scaleFactor) + caption1Label.font = UIFont.preferredFont(forTextStyle: .caption1, scaleFactor: scaleFactor) + caption2Label.font = UIFont.preferredFont(forTextStyle: .caption2, scaleFactor: scaleFactor) + } +} diff --git a/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift b/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift new file mode 100644 index 0000000..ecff87a --- /dev/null +++ b/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift @@ -0,0 +1,68 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class UYLTextStyleViewController: UIViewController { + @IBOutlet private var allLabels: [UILabel]! + @IBOutlet private weak var title1Label: UILabel! + @IBOutlet private weak var title2Label: UILabel! + @IBOutlet private weak var title3Label: UILabel! + @IBOutlet private weak var headlineLabel: UILabel! + @IBOutlet private weak var subheadLabel: UILabel! + @IBOutlet private weak var bodyLabel: UILabel! + @IBOutlet private weak var calloutLabel: UILabel! + @IBOutlet private weak var footnoteLabel: UILabel! + @IBOutlet private weak var caption1Label: UILabel! + @IBOutlet private weak var caption2Label: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + + if #available(iOS 10, *) { + allLabels.forEach { + $0.adjustsFontForContentSizeCategory = true + } + } else { + NotificationCenter.default.addObserver(self, selector: #selector(updateTextStyles(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + } + } + + @objc private func updateTextStyles(_ notification: Notification) { + title1Label.font = UIFont.preferredFont(forTextStyle: .title1) + title2Label.font = UIFont.preferredFont(forTextStyle: .title2) + title3Label.font = UIFont.preferredFont(forTextStyle: .title3) + headlineLabel.font = UIFont.preferredFont(forTextStyle: .headline) + subheadLabel.font = UIFont.preferredFont(forTextStyle: .subheadline) + bodyLabel.font = UIFont.preferredFont(forTextStyle: .body) + calloutLabel.font = UIFont.preferredFont(forTextStyle: .callout) + footnoteLabel.font = UIFont.preferredFont(forTextStyle: .footnote) + caption1Label.font = UIFont.preferredFont(forTextStyle: .caption1) + caption2Label.font = UIFont.preferredFont(forTextStyle: .caption2) + } +} diff --git a/DynamicText/README.md b/DynamicText/README.md index 14c9d11..c1e8637 100644 --- a/DynamicText/README.md +++ b/DynamicText/README.md @@ -5,7 +5,7 @@ This is a example project showing how to respond to the user changing the preferred text size. -**Minimum deployment target is now iOS 9.0 using Xcode 11** +**Minimum deployment target is now iOS 9.0 using Xcode 12** The `UYLTextStyleViewController` shows the standard way to listen for and respond to changes to the users preferred text size using the @@ -22,11 +22,12 @@ category of `UIFont` for this purpose. For further details see the following blog post: -+ [Scaling Synamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) ++ [Scaling Dynamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) ## History -Version 1.3 11 January 2020 Updated for Xcode 11 +Version 1.4 19 May 2021 Updated for Xcode 12 and Swift +Version 1.3 11 January 2020 Updated for Xcode 11 Version 1.2 14 August 2017 Updated for Xcode 8 and iOS 10 Version 1.1 30 December 2013 Added UYLScaledTextViewController Version 1.0 06 October 2013 Initial version. diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index 995fc45..aa1b646 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -31,6 +31,7 @@ 53A2B54C1F94DC9700095FAD /* default.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = default.html; sourceTree = ""; }; 53A2B54E1F94DD8200095FAD /* stylesheet.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = stylesheet.css; sourceTree = ""; }; 53A2B5501F94F14800095FAD /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53C25DE92617A45300E8BC02 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 53E34DFF2403D67600EE575E /* 001-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001-dark@2x.png"; sourceTree = ""; }; 53E34E002403D67600EE575E /* 001@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001@2x.png"; sourceTree = ""; }; 53E34E012403D67600EE575E /* 001.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 001.png; sourceTree = ""; }; @@ -54,6 +55,7 @@ 53A2B5501F94F14800095FAD /* README.md */, 53A2B5391F94DBE500095FAD /* DynamicWebKit */, 53A2B5381F94DBE500095FAD /* Products */, + 53C25DE82617A45300E8BC02 /* Frameworks */, ); sourceTree = ""; }; @@ -79,6 +81,14 @@ path = DynamicWebKit; sourceTree = ""; }; + 53C25DE82617A45300E8BC02 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 53C25DE92617A45300E8BC02 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 53E34DFE2403D58400EE575E /* HTML */ = { isa = PBXGroup; children = ( @@ -119,7 +129,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53A2B5361F94DBE500095FAD = { @@ -223,6 +233,7 @@ 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; @@ -248,7 +259,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -282,6 +293,7 @@ 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; @@ -301,7 +313,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..df636b7 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json index 1d060ed..9221b9b 100644 --- a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -2,92 +2,97 @@ "images" : [ { "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" + "scale" : "3x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" + "scale" : "3x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" + "scale" : "2x", + "size" : "60x60" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" + "scale" : "3x", + "size" : "60x60" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" + "scale" : "1x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" + "scale" : "1x", + "size" : "29x29" }, { "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" + "scale" : "1x", + "size" : "40x40" }, { "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" + "scale" : "1x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" + "scale" : "2x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json new file mode 100644 index 0000000..3aee322 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json @@ -0,0 +1,13 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "backward.svg", + "idiom" : "universal", + "language-direction" : "left-to-right" + } + ] +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg new file mode 100644 index 0000000..f32a098 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg @@ -0,0 +1,161 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.2.0 + Requires Xcode 12 or greater + Generated from chevron.backward + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json new file mode 100644 index 0000000..b8b271f --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json @@ -0,0 +1,13 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "forward.svg", + "idiom" : "universal", + "language-direction" : "left-to-right" + } + ] +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg new file mode 100644 index 0000000..c387b82 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg @@ -0,0 +1,161 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.2.0 + Requires Xcode 12 or greater + Generated from chevron.forward + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard index c0a6762..97443bd 100644 --- a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard +++ b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -15,10 +15,27 @@ - + - + + + + + + + + + + + + + + + + + + @@ -43,4 +60,8 @@ + + + + diff --git a/DynamicWebKit/DynamicWebKit/Info.plist b/DynamicWebKit/DynamicWebKit/Info.plist index 16be3b6..cf8aa00 100644 --- a/DynamicWebKit/DynamicWebKit/Info.plist +++ b/DynamicWebKit/DynamicWebKit/Info.plist @@ -41,5 +41,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + WKAppBoundDomains + + useyourloaf.com + github.com + apple.com + diff --git a/DynamicWebKit/DynamicWebKit/WebViewController.swift b/DynamicWebKit/DynamicWebKit/WebViewController.swift index 90b5382..91632b7 100644 --- a/DynamicWebKit/DynamicWebKit/WebViewController.swift +++ b/DynamicWebKit/DynamicWebKit/WebViewController.swift @@ -31,6 +31,9 @@ import UIKit import WebKit final class WebViewController: UIViewController { + @IBOutlet private var backwardButton: UIBarButtonItem! + @IBOutlet private var forwardButton: UIBarButtonItem! + var html: String = "default" { didSet { loadHTML(html) @@ -38,11 +41,24 @@ final class WebViewController: UIViewController { } private lazy var webView: WKWebView = { - let preferences = WKPreferences() - preferences.javaScriptEnabled = false let configuration = WKWebViewConfiguration() - configuration.preferences = preferences - return WKWebView(frame: .zero, configuration: configuration) + + if #available(iOS 14.0, *) { + // Allow restricted API access on the + // app-bound domains (cookies, etc). + // Doesn't seem to be required + // configuration.limitsNavigationsToAppBoundDomains = true + } else { + // Fallback to WKPreferences for iOS 13 to + // disable javascript. + let preferences = WKPreferences() + // preferences.javaScriptEnabled = false + configuration.preferences = preferences + } + + let webView = WKWebView(frame: .zero, configuration: configuration) + webView.navigationDelegate = self + return webView }() override func loadView() { @@ -51,6 +67,14 @@ final class WebViewController: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } + @IBAction func forwardAction(_ sender: UIBarButtonItem) { + webView.goForward() + } + + @IBAction func backwardAction(_ sender: UIBarButtonItem) { + webView.goBack() + } + @objc private func contentSizeDidChange(_ notification: Notification) { webView.reload() } @@ -61,3 +85,31 @@ final class WebViewController: UIViewController { } } } + +extension WebViewController: WKNavigationDelegate { + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) { + if #available(iOS 14.0, *) { + // To disable all javascript content + // preferences.allowsContentJavaScript = true + } + decisionHandler(.allow, preferences) + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + print(error) + updateNavigationState(webView) + } + + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + updateNavigationState(webView) + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + updateNavigationState(webView) + } + + private func updateNavigationState(_ webView: WKWebView) { + backwardButton.isEnabled = webView.canGoBack + forwardButton.isEnabled = webView.canGoForward + } +} diff --git a/DynamicWebKit/README.md b/DynamicWebKit/README.md index 3f59978..40310c5 100644 --- a/DynamicWebKit/README.md +++ b/DynamicWebKit/README.md @@ -2,9 +2,9 @@ An example of how to use the Apple system fonts in a CSS stylesheet so static HTML content in a web view respects the user's choice of content size. -## Adding Support For Dark Mode +## Adding Support For Dark Mode And App Bound Domains -I've updated this project to support dark mode (requires iOS 13). +I've updated this project to support dark mode (requires iOS 13) and app bound domains (iOS 14). ## Further Details @@ -12,3 +12,4 @@ For further details see the following blog posts: + [Using Dynamic Type With Web Views](https://useyourloaf.com/blog/using-dynamic-type-with-web-views/) + [Supporting Dark Mode In WkWebView](https://useyourloaf.com/blog/supporting-dark-mode-in-wkwebview/) ++ [App Bound Domains](https://useyourloaf.com/blog/app-bound-domains/) diff --git a/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cb96726 --- /dev/null +++ b/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index 8324803..58f1176 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -143,7 +143,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 531CCB861EAA45D2008349F4 = { @@ -320,6 +320,7 @@ 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; @@ -344,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -380,6 +381,7 @@ 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; @@ -398,7 +400,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -414,7 +416,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -432,7 +434,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0540ebe --- /dev/null +++ b/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..774407d --- /dev/null +++ b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..911133b --- /dev/null +++ b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ListCollection/List.xcodeproj/project.pbxproj b/ListCollection/List.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6e3bc05 --- /dev/null +++ b/ListCollection/List.xcodeproj/project.pbxproj @@ -0,0 +1,356 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 53; + objects = { + +/* Begin PBXBuildFile section */ + 531BAEAA24AF76BE0052D465 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEA924AF76BE0052D465 /* AppDelegate.swift */; }; + 531BAEAC24AF76BE0052D465 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEAB24AF76BE0052D465 /* SceneDelegate.swift */; }; + 531BAEB124AF76BE0052D465 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEAF24AF76BE0052D465 /* Main.storyboard */; }; + 531BAEB324AF76C00052D465 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEB224AF76C00052D465 /* Assets.xcassets */; }; + 531BAEB624AF76C10052D465 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEB424AF76C10052D465 /* LaunchScreen.storyboard */; }; + 531BAEBE24AF7FCF0052D465 /* ListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEBD24AF7FCF0052D465 /* ListController.swift */; }; + 531BAEC024B0CA5E0052D465 /* Country.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEBF24B0CA5E0052D465 /* Country.swift */; }; + 531BAEC224B0D9A50052D465 /* countryInfo.json in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEC124B0CB000052D465 /* countryInfo.json */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 531BAEA624AF76BE0052D465 /* List.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = List.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 531BAEA924AF76BE0052D465 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 531BAEAB24AF76BE0052D465 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 531BAEB024AF76BE0052D465 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 531BAEB224AF76C00052D465 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 531BAEB524AF76C10052D465 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 531BAEB724AF76C10052D465 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 531BAEBD24AF7FCF0052D465 /* ListController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListController.swift; sourceTree = ""; }; + 531BAEBF24B0CA5E0052D465 /* Country.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Country.swift; sourceTree = ""; }; + 531BAEC124B0CB000052D465 /* countryInfo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = countryInfo.json; sourceTree = ""; }; + 53ABACDF24B33B500050AE6E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 531BAEA324AF76BE0052D465 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 531BAE9D24AF76BE0052D465 = { + isa = PBXGroup; + children = ( + 53ABACDF24B33B500050AE6E /* README.md */, + 531BAEA824AF76BE0052D465 /* List */, + 531BAEA724AF76BE0052D465 /* Products */, + ); + sourceTree = ""; + }; + 531BAEA724AF76BE0052D465 /* Products */ = { + isa = PBXGroup; + children = ( + 531BAEA624AF76BE0052D465 /* List.app */, + ); + name = Products; + sourceTree = ""; + }; + 531BAEA824AF76BE0052D465 /* List */ = { + isa = PBXGroup; + children = ( + 531BAEA924AF76BE0052D465 /* AppDelegate.swift */, + 531BAEAB24AF76BE0052D465 /* SceneDelegate.swift */, + 531BAEBD24AF7FCF0052D465 /* ListController.swift */, + 531BAEBF24B0CA5E0052D465 /* Country.swift */, + 531BAEAF24AF76BE0052D465 /* Main.storyboard */, + 531BAEB224AF76C00052D465 /* Assets.xcassets */, + 531BAEC124B0CB000052D465 /* countryInfo.json */, + 531BAEB424AF76C10052D465 /* LaunchScreen.storyboard */, + 531BAEB724AF76C10052D465 /* Info.plist */, + ); + path = List; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 531BAEA524AF76BE0052D465 /* List */ = { + isa = PBXNativeTarget; + buildConfigurationList = 531BAEBA24AF76C10052D465 /* Build configuration list for PBXNativeTarget "List" */; + buildPhases = ( + 531BAEA224AF76BE0052D465 /* Sources */, + 531BAEA324AF76BE0052D465 /* Frameworks */, + 531BAEA424AF76BE0052D465 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = List; + productName = List; + productReference = 531BAEA624AF76BE0052D465 /* List.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 531BAE9E24AF76BE0052D465 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1200; + LastUpgradeCheck = 1200; + TargetAttributes = { + 531BAEA524AF76BE0052D465 = { + CreatedOnToolsVersion = 12.0; + }; + }; + }; + buildConfigurationList = 531BAEA124AF76BE0052D465 /* Build configuration list for PBXProject "List" */; + compatibilityVersion = "Xcode 11.4"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 531BAE9D24AF76BE0052D465; + productRefGroup = 531BAEA724AF76BE0052D465 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 531BAEA524AF76BE0052D465 /* List */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 531BAEA424AF76BE0052D465 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 531BAEC224B0D9A50052D465 /* countryInfo.json in Resources */, + 531BAEB624AF76C10052D465 /* LaunchScreen.storyboard in Resources */, + 531BAEB324AF76C00052D465 /* Assets.xcassets in Resources */, + 531BAEB124AF76BE0052D465 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 531BAEA224AF76BE0052D465 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 531BAEC024B0CA5E0052D465 /* Country.swift in Sources */, + 531BAEAA24AF76BE0052D465 /* AppDelegate.swift in Sources */, + 531BAEAC24AF76BE0052D465 /* SceneDelegate.swift in Sources */, + 531BAEBE24AF7FCF0052D465 /* ListController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 531BAEAF24AF76BE0052D465 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 531BAEB024AF76BE0052D465 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 531BAEB424AF76C10052D465 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 531BAEB524AF76C10052D465 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 531BAEB824AF76C10052D465 /* 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_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 = 14.0; + 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; + }; + 531BAEB924AF76C10052D465 /* 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_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 = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 531BAEBB24AF76C10052D465 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = List/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.List; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 531BAEBC24AF76C10052D465 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = List/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.List; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 531BAEA124AF76BE0052D465 /* Build configuration list for PBXProject "List" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 531BAEB824AF76C10052D465 /* Debug */, + 531BAEB924AF76C10052D465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 531BAEBA24AF76C10052D465 /* Build configuration list for PBXNativeTarget "List" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 531BAEBB24AF76C10052D465 /* Debug */, + 531BAEBC24AF76C10052D465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 531BAE9E24AF76BE0052D465 /* Project object */; +} diff --git a/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme b/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme new file mode 100644 index 0000000..370e826 --- /dev/null +++ b/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScaledFont/ScaledFont/AppDelegate.swift b/ListCollection/List/AppDelegate.swift similarity index 95% rename from ScaledFont/ScaledFont/AppDelegate.swift rename to ListCollection/List/AppDelegate.swift index 6420758..2d32c08 100644 --- a/ScaledFont/ScaledFont/AppDelegate.swift +++ b/ListCollection/List/AppDelegate.swift @@ -1,5 +1,5 @@ // Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright © 2020 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,5 +31,4 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? } diff --git a/ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/AppIcon.appiconset/Contents.json b/ListCollection/List/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ListCollection/List/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/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..db2c315 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemPurpleColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/Contents.json b/ListCollection/List/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..89b5d90 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemYellowColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Base.lproj/LaunchScreen.storyboard b/ListCollection/List/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..1efaf14 --- /dev/null +++ b/ListCollection/List/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Base.lproj/Main.storyboard b/ListCollection/List/Base.lproj/Main.storyboard new file mode 100644 index 0000000..866e872 --- /dev/null +++ b/ListCollection/List/Base.lproj/Main.storyboard @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Country.swift b/ListCollection/List/Country.swift new file mode 100644 index 0000000..0c525b0 --- /dev/null +++ b/ListCollection/List/Country.swift @@ -0,0 +1,118 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +struct Country: Hashable { + var name: String + var capital: String? + var continent: String + var currency: String? + var area: Double + var population: Int + var visited: Bool + + var formattedPopulation: String { + NumberFormatter.localizedString(from: population as NSNumber, number: .decimal) + } + + var formattedArea: String { + NumberFormatter.localizedString(from: area as NSNumber, number: .decimal) + } + + init(name: String, capital: String? = nil, continent: String, currency: String? = nil, area: Double = 0, population: Int = 0, visited: Bool = false) { + self.name = name + self.capital = capital + self.continent = continent + self.currency = currency + self.area = area + self.population = population + self.visited = visited + } +} + +// MARK: - Codable +extension Country: Codable { + enum CodingKeys: String, CodingKey { + case name = "countryName" + case capital + case continent = "continentName" + case currency = "currencyCode" + case area = "areaInSqKm" + case population + case visited + } + + init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + name = try values.decode(String.self, forKey: .name) + capital = try values.decodeIfPresent(String.self, forKey: .capital) + continent = try values.decode(String.self, forKey: .continent) + currency = try values.decodeIfPresent(String.self, forKey: .currency) + + let areaString = try values.decode(String.self, forKey: .area) + let popString = try values.decode(String.self, forKey: .population) + + let numberFormatter = NumberFormatter() + numberFormatter.locale = Locale(identifier: "en-US") + if let areaNumber = numberFormatter.number(from: areaString) { + area = areaNumber.doubleValue + } else { + throw DecodingError.dataCorruptedError(forKey: .area, in: values, debugDescription: "Expected a double, got [\(areaString)]") + } + + if let popNumber = numberFormatter.number(from: popString) { + population = popNumber.intValue + } else { + throw DecodingError.dataCorruptedError(forKey: .population, in: values, debugDescription: "Expected an Int, got \(popString)") + } + + visited = try values.decodeIfPresent(Bool.self, forKey: .visited) ?? false + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(name, forKey: .name) + try container.encode(capital, forKey: .capital) + try container.encode(continent, forKey: .continent) + try container.encode(currency, forKey: .currency) + + let numberFormatter = NumberFormatter() + let areaString = numberFormatter.string(from: NSNumber(value: area)) + let popString = numberFormatter.string(from: NSNumber(value: population)) + try container.encode(areaString, forKey: .area) + try container.encode(popString, forKey: .population) + + try container.encode(visited, forKey: .visited) + } +} + +struct CountryInfo: Codable { + var geonames: [Country] +} diff --git a/ListCollection/List/Info.plist b/ListCollection/List/Info.plist new file mode 100644 index 0000000..dbc1db6 --- /dev/null +++ b/ListCollection/List/Info.plist @@ -0,0 +1,106 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + com.useyourloaf.list + CFBundleURLSchemes + + facts + + + + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchScreens + + UIDefaultLaunchScreen + HomeScreen + UILaunchScreenDefinitions + + + UIColorName + BackgroundColor + UILaunchScreenIdentifier + HomeScreen + UINavigationBar + + + + UIColorName + EditBackgroundColor + UILaunchScreenIdentifier + EditScreen + UINavigationBar + + + + UIURLToLaunchScreenAssociations + + facts://country + EditScreen + + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ListCollection/List/ListController.swift b/ListCollection/List/ListController.swift new file mode 100644 index 0000000..af95527 --- /dev/null +++ b/ListCollection/List/ListController.swift @@ -0,0 +1,96 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class ListController: UICollectionViewController { + var countries = [Country]() { + didSet { + applySnapshot() + } + } + + private enum Section: CaseIterable { + case main + } + + private lazy var dataSource: UICollectionViewDiffableDataSource = { + let cellRegistration = UICollectionView.CellRegistration { cell, _, country in + var content = cell.defaultContentConfiguration() + content.text = country.name + + content.secondaryText = country.capital + content.secondaryTextProperties.color = .secondaryLabel + content.secondaryTextProperties.font = UIFont.preferredFont(forTextStyle: .subheadline) + + content.image = UIImage(systemName: "globe") + content.imageProperties.preferredSymbolConfiguration = .init(font: content.textProperties.font, scale: .large) + + cell.contentConfiguration = content + + // Example of setting a background configuration +// var background = UIBackgroundConfiguration.listPlainCell() +// background.backgroundColor = .systemYellow +// cell.backgroundConfiguration = background + + cell.accessories = [.disclosureIndicator()] + cell.tintColor = .systemPurple + } + + return UICollectionViewDiffableDataSource(collectionView: collectionView) { (collectionView, indexPath, country) -> UICollectionViewCell? in + collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: country) + } + }() + + override func viewDidLoad() { + super.viewDidLoad() + createLayout() + applySnapshot(animatingDifferences: false) + } + + private func applySnapshot(animatingDifferences: Bool = true) { + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections(Section.allCases) + snapshot.appendItems(countries) + dataSource.apply(snapshot, animatingDifferences: animatingDifferences) + } + + private func createLayout() { + var config = UICollectionLayoutListConfiguration(appearance: .insetGrouped) + config.backgroundColor = UIColor(named: "BackgroundColor") + collectionView.collectionViewLayout = UICollectionViewCompositionalLayout.list(using: config) + } + + override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if let country = dataSource.itemIdentifier(for: indexPath) { + print("didSelect \(country.name)") + collectionView.deselectItem(at: indexPath, animated: true) + } + } +} diff --git a/ListCollection/List/SceneDelegate.swift b/ListCollection/List/SceneDelegate.swift new file mode 100644 index 0000000..18313c1 --- /dev/null +++ b/ListCollection/List/SceneDelegate.swift @@ -0,0 +1,61 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + private var listController: ListController? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + if let navController = window?.rootViewController as? UINavigationController { + listController = navController.topViewController as? ListController + loadData() + } + } + + private func loadData() { + guard let url = Bundle.main.url(forResource: "countryInfo", withExtension: "json") else { + return + } + + DispatchQueue.global(qos: .userInteractive).async { + do { + let data = try Data(contentsOf: url) + let countryInfo = try JSONDecoder().decode(CountryInfo.self, from: data) + let countries = countryInfo.geonames.sorted(by: { $0.name < $1.name }) + DispatchQueue.main.async { + self.listController?.countries = countries + } + } catch { + print("Unable to load data: \(error)") + } + } + } +} diff --git a/ListCollection/List/countryInfo.json b/ListCollection/List/countryInfo.json new file mode 100644 index 0000000..026c805 --- /dev/null +++ b/ListCollection/List/countryInfo.json @@ -0,0 +1,4752 @@ +{"geonames": [ + { + "continent": "EU", + "capital": "Andorra la Vella", + "languages": "ca", + "geonameId": 3041565, + "south": 42.42874300100004, + "isoAlpha3": "AND", + "north": 42.65576500000003, + "fipsCode": "AN", + "population": "77006", + "east": 1.786576000000025, + "isoNumeric": "020", + "areaInSqKm": "468.0", + "countryCode": "AD", + "west": 1.413760001000071, + "countryName": "Andorra", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "Abu Dhabi", + "languages": "ar-AE,fa,en,hi,ur", + "geonameId": 290557, + "south": 22.6315119400001, + "isoAlpha3": "ARE", + "north": 26.0693916590001, + "fipsCode": "AE", + "population": "9630959", + "east": 56.381222289, + "isoNumeric": "784", + "areaInSqKm": "82880.0", + "countryCode": "AE", + "west": 51.5904085340001, + "countryName": "United Arab Emirates", + "continentName": "Asia", + "currencyCode": "AED" + }, + { + "continent": "AS", + "capital": "Kabul", + "languages": "fa-AF,ps,uz-AF,tk", + "geonameId": 1149361, + "south": 29.3770645357176, + "isoAlpha3": "AFG", + "north": 38.4907920755748, + "fipsCode": "AF", + "population": "37172386", + "east": 74.8894511481168, + "isoNumeric": "004", + "areaInSqKm": "647500.0", + "countryCode": "AF", + "west": 60.4720833972263, + "countryName": "Afghanistan", + "continentName": "Asia", + "currencyCode": "AFN" + }, + { + "continent": "NA", + "capital": "St John's", + "languages": "en-AG", + "geonameId": 3576396, + "south": 16.9986381530001, + "isoAlpha3": "ATG", + "north": 17.72910877443121, + "fipsCode": "AC", + "population": "96286", + "east": -61.672164917, + "isoNumeric": "028", + "areaInSqKm": "443.0", + "countryCode": "AG", + "west": -61.90630722, + "countryName": "Antigua and Barbuda", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "NA", + "capital": "The Valley", + "languages": "en-AI", + "geonameId": 3573511, + "south": 18.160292974311673, + "isoAlpha3": "AIA", + "north": 18.276901971658063, + "fipsCode": "AV", + "population": "13254", + "east": -62.96655544577948, + "isoNumeric": "660", + "areaInSqKm": "102.0", + "countryCode": "AI", + "west": -63.16808989603879, + "countryName": "Anguilla", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "EU", + "capital": "Tirana", + "languages": "sq,el", + "geonameId": 783754, + "south": 39.6448624829142, + "isoAlpha3": "ALB", + "north": 42.6611669383269, + "fipsCode": "AL", + "population": "2866376", + "east": 21.0574334835312, + "isoNumeric": "008", + "areaInSqKm": "28748.0", + "countryCode": "AL", + "west": 19.2639112711741, + "countryName": "Albania", + "continentName": "Europe", + "currencyCode": "ALL" + }, + { + "continent": "AS", + "capital": "Yerevan", + "languages": "hy", + "geonameId": 174982, + "south": 38.840244, + "isoAlpha3": "ARM", + "north": 41.3009930000001, + "fipsCode": "AM", + "population": "2951776", + "east": 46.6342220000001, + "isoNumeric": "051", + "areaInSqKm": "29800.0", + "countryCode": "AM", + "west": 43.447417525, + "countryName": "Armenia", + "continentName": "Asia", + "currencyCode": "AMD" + }, + { + "continent": "AF", + "capital": "Luanda", + "languages": "pt-AO", + "geonameId": 3351879, + "south": -18.042076, + "isoAlpha3": "AGO", + "north": -4.376826, + "fipsCode": "AO", + "population": "30809762", + "east": 24.082119, + "isoNumeric": "024", + "areaInSqKm": "1246700.0", + "countryCode": "AO", + "west": 11.679219, + "countryName": "Angola", + "continentName": "Africa", + "currencyCode": "AOA" + }, + { + "continent": "AN", + "capital": "", + "languages": "", + "geonameId": 6697173, + "south": -89.9999, + "isoAlpha3": "ATA", + "north": -60.515533, + "fipsCode": "AY", + "population": "0", + "east": 179.9999, + "isoNumeric": "010", + "areaInSqKm": "1.4E7", + "countryCode": "AQ", + "west": -179.9999, + "countryName": "Antarctica", + "continentName": "Antarctica", + "currencyCode": "" + }, + { + "continent": "SA", + "capital": "Buenos Aires", + "languages": "es-AR,en,it,de,fr,gn", + "geonameId": 3865483, + "south": -55.0576984539999, + "isoAlpha3": "ARG", + "north": -21.777951173, + "fipsCode": "AR", + "population": "44494502", + "east": -53.637962552, + "isoNumeric": "032", + "areaInSqKm": "2766890.0", + "countryCode": "AR", + "west": -73.566302817, + "countryName": "Argentina", + "continentName": "South America", + "currencyCode": "ARS" + }, + { + "continent": "OC", + "capital": "Pago Pago", + "languages": "en-AS,sm,to", + "geonameId": 5880801, + "south": -14.373776, + "isoAlpha3": "ASM", + "north": -11.047857, + "fipsCode": "AQ", + "population": "55465", + "east": -169.418925, + "isoNumeric": "016", + "areaInSqKm": "199.0", + "countryCode": "AS", + "west": -171.090042, + "countryName": "American Samoa", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Vienna", + "languages": "de-AT,hr,hu,sl", + "geonameId": 2782113, + "south": 46.3726520216244, + "isoAlpha3": "AUT", + "north": 49.0211627691393, + "fipsCode": "AU", + "population": "8847037", + "east": 17.1620685652599, + "isoNumeric": "040", + "areaInSqKm": "83858.0", + "countryCode": "AT", + "west": 9.53095237240833, + "countryName": "Austria", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Canberra", + "languages": "en-AU", + "geonameId": 2077456, + "south": -43.643194904, + "isoAlpha3": "AUS", + "north": -10.059130975, + "fipsCode": "AS", + "population": "24992369", + "east": 153.638727019, + "isoNumeric": "036", + "areaInSqKm": "7686850.0", + "countryCode": "AU", + "west": 112.921113949, + "countryName": "Australia", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "NA", + "capital": "Oranjestad", + "languages": "nl-AW,pap,es,en", + "geonameId": 3577279, + "south": 12.411707706190716, + "isoAlpha3": "ABW", + "north": 12.623718127152925, + "fipsCode": "AA", + "population": "105845", + "east": -69.86575120104982, + "isoNumeric": "533", + "areaInSqKm": "193.0", + "countryCode": "AW", + "west": -70.0644737196045, + "countryName": "Aruba", + "continentName": "North America", + "currencyCode": "AWG" + }, + { + "continent": "EU", + "capital": "Mariehamn", + "languages": "sv-AX", + "geonameId": 661882, + "south": 59.90675, + "isoAlpha3": "ALA", + "north": 60.488861, + "fipsCode": "", + "population": "26711", + "east": 21.011862, + "isoNumeric": "248", + "areaInSqKm": "1580.0", + "countryCode": "AX", + "west": 19.317694, + "countryName": "Åland", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "Baku", + "languages": "az,ru,hy", + "geonameId": 587116, + "south": 38.3922170010001, + "isoAlpha3": "AZE", + "north": 41.9123400010001, + "fipsCode": "AJ", + "population": "9942334", + "east": 50.3700828550001, + "isoNumeric": "031", + "areaInSqKm": "86600.0", + "countryCode": "AZ", + "west": 44.764683001, + "countryName": "Azerbaijan", + "continentName": "Asia", + "currencyCode": "AZN" + }, + { + "continent": "EU", + "capital": "Sarajevo", + "languages": "bs,hr-BA,sr-BA", + "geonameId": 3277605, + "south": 42.555473846, + "isoAlpha3": "BIH", + "north": 45.276539649, + "fipsCode": "BK", + "population": "3323929", + "east": 19.6237016800001, + "isoNumeric": "070", + "areaInSqKm": "51129.0", + "countryCode": "BA", + "west": 15.728732108, + "countryName": "Bosnia and Herzegovina", + "continentName": "Europe", + "currencyCode": "BAM" + }, + { + "continent": "NA", + "capital": "Bridgetown", + "languages": "en-BB", + "geonameId": 3374084, + "south": 13.0448331850001, + "isoAlpha3": "BRB", + "north": 13.3358612060001, + "fipsCode": "BB", + "population": "286641", + "east": -59.420749664, + "isoNumeric": "052", + "areaInSqKm": "431.0", + "countryCode": "BB", + "west": -59.6526374819999, + "countryName": "Barbados", + "continentName": "North America", + "currencyCode": "BBD" + }, + { + "continent": "AS", + "capital": "Dhaka", + "languages": "bn-BD,en", + "geonameId": 1210997, + "south": 20.743334, + "isoAlpha3": "BGD", + "north": 26.631945, + "fipsCode": "BG", + "population": "161356039", + "east": 92.673668, + "isoNumeric": "050", + "areaInSqKm": "144000.0", + "countryCode": "BD", + "west": 88.028336, + "countryName": "Bangladesh", + "continentName": "Asia", + "currencyCode": "BDT" + }, + { + "continent": "EU", + "capital": "Brussels", + "languages": "nl-BE,fr-BE,de-BE", + "geonameId": 2802361, + "south": 49.496968483036, + "isoAlpha3": "BEL", + "north": 51.5051118897455, + "fipsCode": "BE", + "population": "11422068", + "east": 6.40793743953125, + "isoNumeric": "056", + "areaInSqKm": "30510.0", + "countryCode": "BE", + "west": 2.54132898439873, + "countryName": "Belgium", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Ouagadougou", + "languages": "fr-BF,mos", + "geonameId": 2361809, + "south": 9.41047177500008, + "isoAlpha3": "BFA", + "north": 15.084033447, + "fipsCode": "UV", + "population": "19751535", + "east": 2.40435976900005, + "isoNumeric": "854", + "areaInSqKm": "274200.0", + "countryCode": "BF", + "west": -5.51324157299996, + "countryName": "Burkina Faso", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "EU", + "capital": "Sofia", + "languages": "bg,tr-BG,rom", + "geonameId": 732800, + "south": 41.2353414930001, + "isoAlpha3": "BGR", + "north": 44.215451, + "fipsCode": "BU", + "population": "7000039", + "east": 28.6102771760001, + "isoNumeric": "100", + "areaInSqKm": "110910.0", + "countryCode": "BG", + "west": 22.357156753, + "countryName": "Bulgaria", + "continentName": "Europe", + "currencyCode": "BGN" + }, + { + "continent": "AS", + "capital": "Manama", + "languages": "ar-BH,en,fa,ur", + "geonameId": 290291, + "south": 25.790910001, + "isoAlpha3": "BHR", + "north": 26.3308150010001, + "fipsCode": "BA", + "population": "1569439", + "east": 50.720622, + "isoNumeric": "048", + "areaInSqKm": "665.0", + "countryCode": "BH", + "west": 50.3158550000001, + "countryName": "Bahrain", + "continentName": "Asia", + "currencyCode": "BHD" + }, + { + "continent": "AF", + "capital": "Gitega", + "languages": "fr-BI,rn", + "geonameId": 433561, + "south": -4.46932899899997, + "isoAlpha3": "BDI", + "north": -2.30973016299993, + "fipsCode": "BY", + "population": "11175378", + "east": 30.84954, + "isoNumeric": "108", + "areaInSqKm": "27830.0", + "countryCode": "BI", + "west": 29.0009680000001, + "countryName": "Burundi", + "continentName": "Africa", + "currencyCode": "BIF" + }, + { + "continent": "AF", + "capital": "Porto-Novo", + "languages": "fr-BJ", + "geonameId": 2395170, + "south": 6.23477794100006, + "isoAlpha3": "BEN", + "north": 12.4086110000001, + "fipsCode": "BN", + "population": "11485048", + "east": 3.84306303800003, + "isoNumeric": "204", + "areaInSqKm": "112620.0", + "countryCode": "BJ", + "west": 0.775412326000037, + "countryName": "Benin", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "NA", + "capital": "Gustavia", + "languages": "fr", + "geonameId": 3578476, + "south": 17.878183227405575, + "isoAlpha3": "BLM", + "north": 17.928808791949283, + "fipsCode": "TB", + "population": "8450", + "east": -62.788983372985854, + "isoNumeric": "652", + "areaInSqKm": "21.0", + "countryCode": "BL", + "west": -62.8739118253784, + "countryName": "Saint Barthélemy", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "NA", + "capital": "Hamilton", + "languages": "en-BM,pt", + "geonameId": 3573345, + "south": 32.247240870129, + "isoAlpha3": "BMU", + "north": 32.3909785046382, + "fipsCode": "BD", + "population": "63968", + "east": -64.6473267161152, + "isoNumeric": "060", + "areaInSqKm": "53.0", + "countryCode": "BM", + "west": -64.8870418687384, + "countryName": "Bermuda", + "continentName": "North America", + "currencyCode": "BMD" + }, + { + "continent": "AS", + "capital": "Bandar Seri Begawan", + "languages": "ms-BN,en-BN", + "geonameId": 1820814, + "south": 4.00264384400003, + "isoAlpha3": "BRN", + "north": 5.04571171901151, + "fipsCode": "BX", + "population": "428962", + "east": 115.364671704, + "isoNumeric": "096", + "areaInSqKm": "5770.0", + "countryCode": "BN", + "west": 114.075926291, + "countryName": "Brunei", + "continentName": "Asia", + "currencyCode": "BND" + }, + { + "continent": "SA", + "capital": "Sucre", + "languages": "es-BO,qu,ay", + "geonameId": 3923057, + "south": -22.89809, + "isoAlpha3": "BOL", + "north": -9.66932299899997, + "fipsCode": "BL", + "population": "11353142", + "east": -57.4538029999999, + "isoNumeric": "068", + "areaInSqKm": "1098580.0", + "countryCode": "BO", + "west": -69.644939573, + "countryName": "Bolivia", + "continentName": "South America", + "currencyCode": "BOB" + }, + { + "continent": "NA", + "capital": "Kralendijk", + "languages": "nl,pap,en", + "geonameId": 7626844, + "south": 12.024024222896262, + "isoAlpha3": "BES", + "north": 12.312385778727828, + "fipsCode": "", + "population": "18012", + "east": -68.19423837039591, + "isoNumeric": "535", + "areaInSqKm": "328.0", + "countryCode": "BQ", + "west": -68.42092654856276, + "countryName": "Bonaire, Sint Eustatius, and Saba", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "SA", + "capital": "Brasília", + "languages": "pt-BR,es,en,fr", + "geonameId": 3469034, + "south": -33.750706, + "isoAlpha3": "BRA", + "north": 5.264877, + "fipsCode": "BR", + "population": "209469333", + "east": -32.392998, + "isoNumeric": "076", + "areaInSqKm": "8511965.0", + "countryCode": "BR", + "west": -73.985535, + "countryName": "Brazil", + "continentName": "South America", + "currencyCode": "BRL" + }, + { + "continent": "NA", + "capital": "Nassau", + "languages": "en-BS", + "geonameId": 3572887, + "south": 22.852743, + "isoAlpha3": "BHS", + "north": 26.919243, + "fipsCode": "BF", + "population": "385640", + "east": -74.423874, + "isoNumeric": "044", + "areaInSqKm": "13940.0", + "countryCode": "BS", + "west": -78.999528159018, + "countryName": "Bahamas", + "continentName": "North America", + "currencyCode": "BSD" + }, + { + "continent": "AS", + "capital": "Thimphu", + "languages": "dz", + "geonameId": 1252634, + "south": 26.702020985, + "isoAlpha3": "BTN", + "north": 28.246987001, + "fipsCode": "BT", + "population": "754394", + "east": 92.12523192, + "isoNumeric": "064", + "areaInSqKm": "47000.0", + "countryCode": "BT", + "west": 88.7455215570001, + "countryName": "Bhutan", + "continentName": "Asia", + "currencyCode": "BTN" + }, + { + "continent": "AN", + "capital": "", + "languages": "", + "geonameId": 3371123, + "south": -54.4507993522734, + "isoAlpha3": "BVT", + "north": -54.3887383509872, + "fipsCode": "BV", + "population": "0", + "east": 3.434845577758324, + "isoNumeric": "074", + "areaInSqKm": "49.0", + "countryCode": "BV", + "west": 3.286776428037342, + "countryName": "Bouvet Island", + "continentName": "Antarctica", + "currencyCode": "NOK" + }, + { + "continent": "AF", + "capital": "Gaborone", + "languages": "en-BW,tn-BW", + "geonameId": 933860, + "south": -26.907545, + "isoAlpha3": "BWA", + "north": -17.778136999, + "fipsCode": "BC", + "population": "2254126", + "east": 29.375304, + "isoNumeric": "072", + "areaInSqKm": "600370.0", + "countryCode": "BW", + "west": 19.998903, + "countryName": "Botswana", + "continentName": "Africa", + "currencyCode": "BWP" + }, + { + "continent": "EU", + "capital": "Minsk", + "languages": "be,ru", + "geonameId": 630336, + "south": 51.262011, + "isoAlpha3": "BLR", + "north": 56.1724940010001, + "fipsCode": "BO", + "population": "9485386", + "east": 32.776820001, + "isoNumeric": "112", + "areaInSqKm": "207600.0", + "countryCode": "BY", + "west": 23.1781980010001, + "countryName": "Belarus", + "continentName": "Europe", + "currencyCode": "BYN" + }, + { + "continent": "NA", + "capital": "Belmopan", + "languages": "en-BZ,es", + "geonameId": 3582678, + "south": 15.8893, + "isoAlpha3": "BLZ", + "north": 18.496557, + "fipsCode": "BH", + "population": "383071", + "east": -87.776985, + "isoNumeric": "084", + "areaInSqKm": "22966.0", + "countryCode": "BZ", + "west": -89.224815, + "countryName": "Belize", + "continentName": "North America", + "currencyCode": "BZD" + }, + { + "continent": "NA", + "capital": "Ottawa", + "languages": "en-CA,fr-CA,iu", + "geonameId": 6251999, + "south": 41.67598, + "isoAlpha3": "CAN", + "north": 83.110626, + "fipsCode": "CA", + "population": "37058856", + "east": -52.636291, + "isoNumeric": "124", + "areaInSqKm": "9984670.0", + "countryCode": "CA", + "west": -141, + "countryName": "Canada", + "continentName": "North America", + "currencyCode": "CAD" + }, + { + "continent": "AS", + "capital": "West Island", + "languages": "ms-CC,en", + "geonameId": 1547376, + "south": -12.208725839, + "isoAlpha3": "CCK", + "north": -12.072459094, + "fipsCode": "CK", + "population": "628", + "east": 96.929489344, + "isoNumeric": "166", + "areaInSqKm": "14.0", + "countryCode": "CC", + "west": 96.816941408, + "countryName": "Cocos [Keeling] Islands", + "continentName": "Asia", + "currencyCode": "AUD" + }, + { + "continent": "AF", + "capital": "Kinshasa", + "languages": "fr-CD,ln,ktu,kg,sw,lua", + "geonameId": 203312, + "south": -13.459034999, + "isoAlpha3": "COD", + "north": 5.39200300000005, + "fipsCode": "CG", + "population": "84068091", + "east": 31.3146120000001, + "isoNumeric": "180", + "areaInSqKm": "2345410.0", + "countryCode": "CD", + "west": 12.202361491, + "countryName": "DR Congo", + "continentName": "Africa", + "currencyCode": "CDF" + }, + { + "continent": "AF", + "capital": "Bangui", + "languages": "fr-CF,sg,ln,kg", + "geonameId": 239880, + "south": 2.22305300000005, + "isoAlpha3": "CAF", + "north": 11.017957, + "fipsCode": "CT", + "population": "4666377", + "east": 27.4583050000001, + "isoNumeric": "140", + "areaInSqKm": "622984.0", + "countryCode": "CF", + "west": 14.4150980000001, + "countryName": "Central African Republic", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "AF", + "capital": "Brazzaville", + "languages": "fr-CG,kg,ln-CG", + "geonameId": 2260494, + "south": -5.04072158799994, + "isoAlpha3": "COG", + "north": 3.70779100000004, + "fipsCode": "CF", + "population": "5244363", + "east": 18.65042119, + "isoNumeric": "178", + "areaInSqKm": "342000.0", + "countryCode": "CG", + "west": 11.1520760600001, + "countryName": "Congo Republic", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "EU", + "capital": "Bern", + "languages": "de-CH,fr-CH,it-CH,rm", + "geonameId": 2658434, + "south": 45.8191539516188, + "isoAlpha3": "CHE", + "north": 47.8098679329775, + "fipsCode": "SZ", + "population": "8516543", + "east": 10.4934735095497, + "isoNumeric": "756", + "areaInSqKm": "41290.0", + "countryCode": "CH", + "west": 5.95661377423453, + "countryName": "Switzerland", + "continentName": "Europe", + "currencyCode": "CHF" + }, + { + "continent": "AF", + "capital": "Yamoussoukro", + "languages": "fr-CI", + "geonameId": 2287781, + "south": 4.36035248000007, + "isoAlpha3": "CIV", + "north": 10.740015, + "fipsCode": "IV", + "population": "25069229", + "east": -2.49303099999997, + "isoNumeric": "384", + "areaInSqKm": "322460.0", + "countryCode": "CI", + "west": -8.60205899999994, + "countryName": "Ivory Coast", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "OC", + "capital": "Avarua", + "languages": "en-CK,mi", + "geonameId": 1899402, + "south": -21.944164, + "isoAlpha3": "COK", + "north": -10.023114, + "fipsCode": "CW", + "population": "21388", + "east": -157.312134, + "isoNumeric": "184", + "areaInSqKm": "240.0", + "countryCode": "CK", + "west": -161.093658, + "countryName": "Cook Islands", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "SA", + "capital": "Santiago", + "languages": "es-CL", + "geonameId": 3895114, + "south": -55.909795409, + "isoAlpha3": "CHL", + "north": -17.4977759459999, + "fipsCode": "CI", + "population": "18729160", + "east": -66.416152278, + "isoNumeric": "152", + "areaInSqKm": "756950.0", + "countryCode": "CL", + "west": -80.8370287079999, + "countryName": "Chile", + "continentName": "South America", + "currencyCode": "CLP" + }, + { + "continent": "AF", + "capital": "Yaoundé", + "languages": "en-CM,fr-CM", + "geonameId": 2233387, + "south": 1.65590000000003, + "isoAlpha3": "CMR", + "north": 13.083334, + "fipsCode": "CM", + "population": "25216237", + "east": 16.1944080000001, + "isoNumeric": "120", + "areaInSqKm": "475440.0", + "countryCode": "CM", + "west": 8.49843402900007, + "countryName": "Cameroon", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "AS", + "capital": "Beijing", + "languages": "zh-CN,yue,wuu,dta,ug,za", + "geonameId": 1814991, + "south": 15.775416, + "isoAlpha3": "CHN", + "north": 53.560974001, + "fipsCode": "CH", + "population": "1392730000", + "east": 134.7754563, + "isoNumeric": "156", + "areaInSqKm": "9596960.0", + "countryCode": "CN", + "west": 73.4994140000001, + "countryName": "China", + "continentName": "Asia", + "currencyCode": "CNY" + }, + { + "continent": "SA", + "capital": "Bogotá", + "languages": "es-CO", + "geonameId": 3686110, + "south": -4.22839224299997, + "isoAlpha3": "COL", + "north": 13.38600323, + "fipsCode": "CO", + "population": "49648685", + "east": -66.8472153989999, + "isoNumeric": "170", + "areaInSqKm": "1138910.0", + "countryCode": "CO", + "west": -81.735775648, + "countryName": "Colombia", + "continentName": "South America", + "currencyCode": "COP" + }, + { + "continent": "NA", + "capital": "San José", + "languages": "es-CR,en", + "geonameId": 3624060, + "south": 8.03962731803416, + "isoAlpha3": "CRI", + "north": 11.2197589122308, + "fipsCode": "CS", + "population": "4999441", + "east": -82.552318987959, + "isoNumeric": "188", + "areaInSqKm": "51100.0", + "countryCode": "CR", + "west": -85.9502523586265, + "countryName": "Costa Rica", + "continentName": "North America", + "currencyCode": "CRC" + }, + { + "continent": "NA", + "capital": "Havana", + "languages": "es-CU,pap", + "geonameId": 3562981, + "south": 19.828083, + "isoAlpha3": "CUB", + "north": 23.226042, + "fipsCode": "CU", + "population": "11338138", + "east": -74.131775, + "isoNumeric": "192", + "areaInSqKm": "110860.0", + "countryCode": "CU", + "west": -84.957428, + "countryName": "Cuba", + "continentName": "North America", + "currencyCode": "CUP" + }, + { + "continent": "AF", + "capital": "Praia", + "languages": "pt-CV", + "geonameId": 3374766, + "south": 14.8152942670001, + "isoAlpha3": "CPV", + "north": 17.204706193, + "fipsCode": "CV", + "population": "543767", + "east": -22.6674270629999, + "isoNumeric": "132", + "areaInSqKm": "4033.0", + "countryCode": "CV", + "west": -25.3609161379999, + "countryName": "Cabo Verde", + "continentName": "Africa", + "currencyCode": "CVE" + }, + { + "continent": "NA", + "capital": "Willemstad", + "languages": "nl,pap", + "geonameId": 7626836, + "south": 12.032745, + "isoAlpha3": "CUW", + "north": 12.385672, + "fipsCode": "UC", + "population": "159849", + "east": -68.733948, + "isoNumeric": "531", + "areaInSqKm": "444.0", + "countryCode": "CW", + "west": -69.157204, + "countryName": "Curaçao", + "continentName": "North America", + "currencyCode": "ANG" + }, + { + "continent": "OC", + "capital": "Flying Fish Cove", + "languages": "en,zh,ms-CC", + "geonameId": 2078138, + "south": -10.5704829995, + "isoAlpha3": "CXR", + "north": -10.412356007, + "fipsCode": "KT", + "population": "1500", + "east": 105.712596992, + "isoNumeric": "162", + "areaInSqKm": "135.0", + "countryCode": "CX", + "west": 105.533276992, + "countryName": "Christmas Island", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "EU", + "capital": "Nicosia", + "languages": "el-CY,tr-CY,en", + "geonameId": 146669, + "south": 34.6332846722908, + "isoAlpha3": "CYP", + "north": 35.701527, + "fipsCode": "CY", + "population": "1189265", + "east": 34.59791599999994, + "isoNumeric": "196", + "areaInSqKm": "9250.0", + "countryCode": "CY", + "west": 32.27308300000004, + "countryName": "Cyprus", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Prague", + "languages": "cs,sk", + "geonameId": 3077311, + "south": 48.551892864201, + "isoAlpha3": "CZE", + "north": 51.0557782422661, + "fipsCode": "EZ", + "population": "10625695", + "east": 18.8592743799298, + "isoNumeric": "203", + "areaInSqKm": "78866.0", + "countryCode": "CZ", + "west": 12.0906691601139, + "countryName": "Czechia", + "continentName": "Europe", + "currencyCode": "CZK" + }, + { + "continent": "EU", + "capital": "Berlin", + "languages": "de", + "geonameId": 2921044, + "south": 47.2701236047002, + "isoAlpha3": "DEU", + "north": 55.0583836008072, + "fipsCode": "GM", + "population": "82927922", + "east": 15.0418156516163, + "isoNumeric": "276", + "areaInSqKm": "357021.0", + "countryCode": "DE", + "west": 5.8663152683722, + "countryName": "Germany", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Djibouti", + "languages": "fr-DJ,ar,so-DJ,aa", + "geonameId": 223816, + "south": 10.9129530000001, + "isoAlpha3": "DJI", + "north": 12.7136967920001, + "fipsCode": "DJ", + "population": "958920", + "east": 43.4175099920001, + "isoNumeric": "262", + "areaInSqKm": "23000.0", + "countryCode": "DJ", + "west": 41.7708460000001, + "countryName": "Djibouti", + "continentName": "Africa", + "currencyCode": "DJF" + }, + { + "continent": "EU", + "capital": "Copenhagen", + "languages": "da-DK,en,fo,de-DK", + "geonameId": 2623032, + "south": 54.5590783718363, + "isoAlpha3": "DNK", + "north": 57.3282078631757, + "fipsCode": "DA", + "population": "5797446", + "east": 15.1569721573943, + "isoNumeric": "208", + "areaInSqKm": "43094.0", + "countryCode": "DK", + "west": 8.07250975308422, + "countryName": "Denmark", + "continentName": "Europe", + "currencyCode": "DKK" + }, + { + "continent": "NA", + "capital": "Roseau", + "languages": "en-DM", + "geonameId": 3575830, + "south": 15.206540651392563, + "isoAlpha3": "DMA", + "north": 15.639901700674933, + "fipsCode": "DO", + "population": "71625", + "east": -61.241630129651185, + "isoNumeric": "212", + "areaInSqKm": "754.0", + "countryCode": "DM", + "west": -61.4808292002466, + "countryName": "Dominica", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "NA", + "capital": "Santo Domingo", + "languages": "es-DO", + "geonameId": 3508796, + "south": 17.5395066830409, + "isoAlpha3": "DOM", + "north": 19.9321257501267, + "fipsCode": "DR", + "population": "10627165", + "east": -68.3229591969468, + "isoNumeric": "214", + "areaInSqKm": "48730.0", + "countryCode": "DO", + "west": -72.0114723981787, + "countryName": "Dominican Republic", + "continentName": "North America", + "currencyCode": "DOP" + }, + { + "continent": "AF", + "capital": "Algiers", + "languages": "ar-DZ", + "geonameId": 2589581, + "south": 18.968147, + "isoAlpha3": "DZA", + "north": 37.089801381, + "fipsCode": "AG", + "population": "42228429", + "east": 11.9984999060001, + "isoNumeric": "012", + "areaInSqKm": "2381740.0", + "countryCode": "DZ", + "west": -8.66761116299995, + "countryName": "Algeria", + "continentName": "Africa", + "currencyCode": "DZD" + }, + { + "continent": "SA", + "capital": "Quito", + "languages": "es-EC", + "geonameId": 3658394, + "south": -5.01615732302488, + "isoAlpha3": "ECU", + "north": 1.43523516349953, + "fipsCode": "EC", + "population": "17084357", + "east": -75.1871465547501, + "isoNumeric": "218", + "areaInSqKm": "283560.0", + "countryCode": "EC", + "west": -81.0836838953894, + "countryName": "Ecuador", + "continentName": "South America", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Tallinn", + "languages": "et,ru", + "geonameId": 453733, + "south": 57.5093097920079, + "isoAlpha3": "EST", + "north": 59.6753143130129, + "fipsCode": "EN", + "population": "1320884", + "east": 28.2090381531431, + "isoNumeric": "233", + "areaInSqKm": "45226.0", + "countryCode": "EE", + "west": 21.8285886498081, + "countryName": "Estonia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Cairo", + "languages": "ar-EG,en,fr", + "geonameId": 357994, + "south": 21.724952, + "isoAlpha3": "EGY", + "north": 31.6709930000001, + "fipsCode": "EG", + "population": "98423595", + "east": 35.7935441020001, + "isoNumeric": "818", + "areaInSqKm": "1001450.0", + "countryCode": "EG", + "west": 24.6967750000001, + "countryName": "Egypt", + "continentName": "Africa", + "currencyCode": "EGP" + }, + { + "continent": "AF", + "capital": "", + "languages": "ar,mey", + "geonameId": 2461445, + "south": 20.774158, + "isoAlpha3": "ESH", + "north": 27.669674, + "fipsCode": "WI", + "population": "273008", + "east": -8.670276, + "isoNumeric": "732", + "areaInSqKm": "266000.0", + "countryCode": "EH", + "west": -17.103182, + "countryName": "Western Sahara", + "continentName": "Africa", + "currencyCode": "MAD" + }, + { + "continent": "AF", + "capital": "Asmara", + "languages": "aa-ER,ar,tig,kun,ti-ER", + "geonameId": 338010, + "south": 12.359555, + "isoAlpha3": "ERI", + "north": 18.003084, + "fipsCode": "ER", + "population": "0", + "east": 43.13464, + "isoNumeric": "232", + "areaInSqKm": "121320.0", + "countryCode": "ER", + "west": 36.438778, + "countryName": "Eritrea", + "continentName": "Africa", + "currencyCode": "ERN" + }, + { + "continent": "EU", + "capital": "Madrid", + "languages": "es-ES,ca,gl,eu,oc", + "geonameId": 2510769, + "south": 36.0001044260548, + "isoAlpha3": "ESP", + "north": 43.7913565913767, + "fipsCode": "SP", + "population": "46723749", + "east": 4.32778473043961, + "isoNumeric": "724", + "areaInSqKm": "504782.0", + "countryCode": "ES", + "west": -9.30151567231899, + "countryName": "Spain", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Addis Ababa", + "languages": "am,en-ET,om-ET,ti-ET,so-ET,sid", + "geonameId": 337996, + "south": 3.40413700100004, + "isoAlpha3": "ETH", + "north": 14.894214, + "fipsCode": "ET", + "population": "109224559", + "east": 48.0010560010001, + "isoNumeric": "231", + "areaInSqKm": "1127127.0", + "countryCode": "ET", + "west": 32.997734001, + "countryName": "Ethiopia", + "continentName": "Africa", + "currencyCode": "ETB" + }, + { + "continent": "EU", + "capital": "Helsinki", + "languages": "fi-FI,sv-FI,smn", + "geonameId": 660013, + "south": 59.808777, + "isoAlpha3": "FIN", + "north": 70.096054, + "fipsCode": "FI", + "population": "5518050", + "east": 31.580944, + "isoNumeric": "246", + "areaInSqKm": "337030.0", + "countryCode": "FI", + "west": 20.556944, + "countryName": "Finland", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Suva", + "languages": "en-FJ,fj", + "geonameId": 2205218, + "south": -20.67597, + "isoAlpha3": "FJI", + "north": -12.4795295382484, + "fipsCode": "FJ", + "population": "883483", + "east": -178.424438, + "isoNumeric": "242", + "areaInSqKm": "18270.0", + "countryCode": "FJ", + "west": 177.140015279982, + "countryName": "Fiji", + "continentName": "Oceania", + "currencyCode": "FJD" + }, + { + "continent": "SA", + "capital": "Stanley", + "languages": "en-FK", + "geonameId": 3474414, + "south": -52.383984175, + "isoAlpha3": "FLK", + "north": -51.2331394719999, + "fipsCode": "FK", + "population": "2638", + "east": -57.718087652, + "isoNumeric": "238", + "areaInSqKm": "12173.0", + "countryCode": "FK", + "west": -61.3474566739999, + "countryName": "Falkland Islands", + "continentName": "South America", + "currencyCode": "FKP" + }, + { + "continent": "OC", + "capital": "Palikir", + "languages": "en-FM,chk,pon,yap,kos,uli,woe,nkr,kpg", + "geonameId": 2081918, + "south": 1.02629, + "isoAlpha3": "FSM", + "north": 10.08904, + "fipsCode": "FM", + "population": "112640", + "east": 163.03717, + "isoNumeric": "583", + "areaInSqKm": "702.0", + "countryCode": "FM", + "west": 137.33648, + "countryName": "Micronesia", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Tórshavn", + "languages": "fo,da-FO", + "geonameId": 2622320, + "south": 61.3910302656013, + "isoAlpha3": "FRO", + "north": 62.3938884414274, + "fipsCode": "FO", + "population": "48497", + "east": -6.25655957192113, + "isoNumeric": "234", + "areaInSqKm": "1399.0", + "countryCode": "FO", + "west": -7.688191677774624, + "countryName": "Faroe Islands", + "continentName": "Europe", + "currencyCode": "DKK" + }, + { + "continent": "EU", + "capital": "Paris", + "languages": "fr-FR,frp,br,co,ca,eu,oc", + "geonameId": 3017382, + "south": 41.3645589826522, + "isoAlpha3": "FRA", + "north": 51.0889894407743, + "fipsCode": "FR", + "population": "66987244", + "east": 9.56009360694225, + "isoNumeric": "250", + "areaInSqKm": "547030.0", + "countryCode": "FR", + "west": -5.14127657354623, + "countryName": "France", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Libreville", + "languages": "fr-GA", + "geonameId": 2400553, + "south": -3.96180775999994, + "isoAlpha3": "GAB", + "north": 2.31810900100004, + "fipsCode": "GB", + "population": "2119275", + "east": 14.5269230000001, + "isoNumeric": "266", + "areaInSqKm": "267667.0", + "countryCode": "GA", + "west": 8.69940944700005, + "countryName": "Gabon", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "EU", + "capital": "London", + "languages": "en-GB,cy-GB,gd", + "geonameId": 2635167, + "south": 49.9028622252397, + "isoAlpha3": "GBR", + "north": 59.3607741849963, + "fipsCode": "UK", + "population": "66488991", + "east": 1.7689121033873, + "isoNumeric": "826", + "areaInSqKm": "244820.0", + "countryCode": "GB", + "west": -8.61772077108559, + "countryName": "United Kingdom", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "NA", + "capital": "St. George's", + "languages": "en-GD", + "geonameId": 3580239, + "south": 11.986893, + "isoAlpha3": "GRD", + "north": 12.318283928171299, + "fipsCode": "GJ", + "population": "111454", + "east": -61.57676970108031, + "isoNumeric": "308", + "areaInSqKm": "344.0", + "countryCode": "GD", + "west": -61.802344, + "countryName": "Grenada", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "AS", + "capital": "Tbilisi", + "languages": "ka,ru,hy,az", + "geonameId": 614540, + "south": 41.054942, + "isoAlpha3": "GEO", + "north": 43.5866270000001, + "fipsCode": "GG", + "population": "3731000", + "east": 46.736119, + "isoNumeric": "268", + "areaInSqKm": "69700.0", + "countryCode": "GE", + "west": 40.006604, + "countryName": "Georgia", + "continentName": "Asia", + "currencyCode": "GEL" + }, + { + "continent": "SA", + "capital": "Cayenne", + "languages": "fr-GF", + "geonameId": 3381670, + "south": 2.11107565187642, + "isoAlpha3": "GUF", + "north": 5.74725188917531, + "fipsCode": "FG", + "population": "195506", + "east": -51.619065827085, + "isoNumeric": "254", + "areaInSqKm": "91000.0", + "countryCode": "GF", + "west": -54.6024155447667, + "countryName": "French Guiana", + "continentName": "South America", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "St Peter Port", + "languages": "en,nrf", + "geonameId": 3042362, + "south": 49.40764156876899, + "isoAlpha3": "GGY", + "north": 49.731727816705416, + "fipsCode": "GK", + "population": "65228", + "east": -2.1577152112246267, + "isoNumeric": "831", + "areaInSqKm": "78.0", + "countryCode": "GG", + "west": -2.673194593476069, + "countryName": "Guernsey", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "AF", + "capital": "Accra", + "languages": "en-GH,ak,ee,tw", + "geonameId": 2300660, + "south": 4.73894544800004, + "isoAlpha3": "GHA", + "north": 11.174952907, + "fipsCode": "GH", + "population": "29767108", + "east": 1.19948138100006, + "isoNumeric": "288", + "areaInSqKm": "239460.0", + "countryCode": "GH", + "west": -3.26078599999994, + "countryName": "Ghana", + "continentName": "Africa", + "currencyCode": "GHS" + }, + { + "continent": "EU", + "capital": "Gibraltar", + "languages": "en-GI,es,it,pt", + "geonameId": 2411586, + "south": 36.10903070140248, + "isoAlpha3": "GIB", + "north": 36.155439135670726, + "fipsCode": "GI", + "population": "33718", + "east": -5.338285164001491, + "isoNumeric": "292", + "areaInSqKm": "6.5", + "countryCode": "GI", + "west": -5.36626149743654, + "countryName": "Gibraltar", + "continentName": "Europe", + "currencyCode": "GIP" + }, + { + "continent": "NA", + "capital": "Nuuk", + "languages": "kl,da-GL,en", + "geonameId": 3425505, + "south": 59.777401, + "isoAlpha3": "GRL", + "north": 83.627357, + "fipsCode": "GL", + "population": "56025", + "east": -11.312319, + "isoNumeric": "304", + "areaInSqKm": "2166086.0", + "countryCode": "GL", + "west": -73.04203, + "countryName": "Greenland", + "continentName": "North America", + "currencyCode": "DKK" + }, + { + "continent": "AF", + "capital": "Banjul", + "languages": "en-GM,mnk,wof,wo,ff", + "geonameId": 2413451, + "south": 13.063718062, + "isoAlpha3": "GMB", + "north": 13.825058106, + "fipsCode": "GA", + "population": "2280102", + "east": -13.791386179, + "isoNumeric": "270", + "areaInSqKm": "11300.0", + "countryCode": "GM", + "west": -16.8136100139999, + "countryName": "Gambia", + "continentName": "Africa", + "currencyCode": "GMD" + }, + { + "continent": "AF", + "capital": "Conakry", + "languages": "fr-GN", + "geonameId": 2420477, + "south": 7.193553, + "isoAlpha3": "GIN", + "north": 12.67622, + "fipsCode": "GV", + "population": "12414318", + "east": -7.641071, + "isoNumeric": "324", + "areaInSqKm": "245857.0", + "countryCode": "GN", + "west": -14.926619, + "countryName": "Guinea", + "continentName": "Africa", + "currencyCode": "GNF" + }, + { + "continent": "NA", + "capital": "Basse-Terre", + "languages": "fr-GP", + "geonameId": 3579143, + "south": 15.8665030910918, + "isoAlpha3": "GLP", + "north": 16.5144923539361, + "fipsCode": "GP", + "population": "443000", + "east": -61.0019590353041, + "isoNumeric": "312", + "areaInSqKm": "1780.0", + "countryCode": "GP", + "west": -61.5508178989899, + "countryName": "Guadeloupe", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Malabo", + "languages": "es-GQ,fr", + "geonameId": 2309096, + "south": 0.92086, + "isoAlpha3": "GNQ", + "north": 2.346989, + "fipsCode": "EK", + "population": "1308974", + "east": 11.335724, + "isoNumeric": "226", + "areaInSqKm": "28051.0", + "countryCode": "GQ", + "west": 9.346865, + "countryName": "Equatorial Guinea", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "EU", + "capital": "Athens", + "languages": "el-GR,en,fr", + "geonameId": 390903, + "south": 34.8020663391466, + "isoAlpha3": "GRC", + "north": 41.7484999849641, + "fipsCode": "GR", + "population": "10727668", + "east": 28.2470831714347, + "isoNumeric": "300", + "areaInSqKm": "131940.0", + "countryCode": "GR", + "west": 19.3736035624134, + "countryName": "Greece", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AN", + "capital": "Grytviken", + "languages": "en", + "geonameId": 3474415, + "south": -59.46319341, + "isoAlpha3": "SGS", + "north": -53.980896636, + "fipsCode": "SX", + "population": "30", + "east": -26.252069712, + "isoNumeric": "239", + "areaInSqKm": "3903.0", + "countryCode": "GS", + "west": -38.0479509639999, + "countryName": "South Georgia and South Sandwich Islands", + "continentName": "Antarctica", + "currencyCode": "GBP" + }, + { + "continent": "NA", + "capital": "Guatemala City", + "languages": "es-GT", + "geonameId": 3595528, + "south": 13.7400210010001, + "isoAlpha3": "GTM", + "north": 17.815695169, + "fipsCode": "GT", + "population": "17247807", + "east": -88.233001934, + "isoNumeric": "320", + "areaInSqKm": "108890.0", + "countryCode": "GT", + "west": -92.231143101, + "countryName": "Guatemala", + "continentName": "North America", + "currencyCode": "GTQ" + }, + { + "continent": "OC", + "capital": "Hagåtña", + "languages": "en-GU,ch-GU", + "geonameId": 4043988, + "south": 13.23376, + "isoAlpha3": "GUM", + "north": 13.654402, + "fipsCode": "GQ", + "population": "165768", + "east": 144.956894, + "isoNumeric": "316", + "areaInSqKm": "549.0", + "countryCode": "GU", + "west": 144.618318, + "countryName": "Guam", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "AF", + "capital": "Bissau", + "languages": "pt-GW,pov", + "geonameId": 2372248, + "south": 10.924265, + "isoAlpha3": "GNB", + "north": 12.680789, + "fipsCode": "PU", + "population": "1874309", + "east": -13.636522, + "isoNumeric": "624", + "areaInSqKm": "36120.0", + "countryCode": "GW", + "west": -16.717535, + "countryName": "Guinea-Bissau", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "SA", + "capital": "Georgetown", + "languages": "en-GY", + "geonameId": 3378535, + "south": 1.17508, + "isoAlpha3": "GUY", + "north": 8.557567, + "fipsCode": "GY", + "population": "779004", + "east": -56.480251, + "isoNumeric": "328", + "areaInSqKm": "214970.0", + "countryCode": "GY", + "west": -61.384762, + "countryName": "Guyana", + "continentName": "South America", + "currencyCode": "GYD" + }, + { + "continent": "AS", + "capital": "Hong Kong", + "languages": "zh-HK,yue,zh,en", + "geonameId": 1819730, + "south": 22.1552256413502, + "isoAlpha3": "HKG", + "north": 22.5619493557973, + "fipsCode": "HK", + "population": "7451000", + "east": 114.441993257571, + "isoNumeric": "344", + "areaInSqKm": "1092.0", + "countryCode": "HK", + "west": 113.839212676903, + "countryName": "Hong Kong", + "continentName": "Asia", + "currencyCode": "HKD" + }, + { + "continent": "AN", + "capital": "", + "languages": "", + "geonameId": 1547314, + "south": -53.192001, + "isoAlpha3": "HMD", + "north": -52.909416, + "fipsCode": "HM", + "population": "0", + "east": 73.859146, + "isoNumeric": "334", + "areaInSqKm": "412.0", + "countryCode": "HM", + "west": 72.596535, + "countryName": "Heard Island and McDonald Islands", + "continentName": "Antarctica", + "currencyCode": "AUD" + }, + { + "continent": "NA", + "capital": "Tegucigalpa", + "languages": "es-HN,cab,miq", + "geonameId": 3608932, + "south": 12.982411, + "isoAlpha3": "HND", + "north": 16.510256, + "fipsCode": "HO", + "population": "9587522", + "east": -83.155403, + "isoNumeric": "340", + "areaInSqKm": "112090.0", + "countryCode": "HN", + "west": -89.350792, + "countryName": "Honduras", + "continentName": "North America", + "currencyCode": "HNL" + }, + { + "continent": "EU", + "capital": "Zagreb", + "languages": "hr-HR,sr", + "geonameId": 3202326, + "south": 42.43589, + "isoAlpha3": "HRV", + "north": 46.5549629558487, + "fipsCode": "HR", + "population": "4089400", + "east": 19.427389, + "isoNumeric": "191", + "areaInSqKm": "56542.0", + "countryCode": "HR", + "west": 13.493222, + "countryName": "Croatia", + "continentName": "Europe", + "currencyCode": "HRK" + }, + { + "continent": "NA", + "capital": "Port-au-Prince", + "languages": "ht,fr-HT", + "geonameId": 3723988, + "south": 18.021032, + "isoAlpha3": "HTI", + "north": 20.08782, + "fipsCode": "HA", + "population": "11123176", + "east": -71.613358, + "isoNumeric": "332", + "areaInSqKm": "27750.0", + "countryCode": "HT", + "west": -74.478584, + "countryName": "Haiti", + "continentName": "North America", + "currencyCode": "HTG" + }, + { + "continent": "EU", + "capital": "Budapest", + "languages": "hu-HU", + "geonameId": 719819, + "south": 45.7370495590001, + "isoAlpha3": "HUN", + "north": 48.585336, + "fipsCode": "HU", + "population": "9768785", + "east": 22.896564336, + "isoNumeric": "348", + "areaInSqKm": "93030.0", + "countryCode": "HU", + "west": 16.113795, + "countryName": "Hungary", + "continentName": "Europe", + "currencyCode": "HUF" + }, + { + "continent": "AS", + "capital": "Jakarta", + "languages": "id,en,nl,jv", + "geonameId": 1643084, + "south": -10.9431056999999, + "isoAlpha3": "IDN", + "north": 5.90722980000004, + "fipsCode": "ID", + "population": "267663435", + "east": 141.0194, + "isoNumeric": "360", + "areaInSqKm": "1919440.0", + "countryCode": "ID", + "west": 95.0111465000001, + "countryName": "Indonesia", + "continentName": "Asia", + "currencyCode": "IDR" + }, + { + "continent": "EU", + "capital": "Dublin", + "languages": "en-IE,ga-IE", + "geonameId": 2963597, + "south": 51.4475491577615, + "isoAlpha3": "IRL", + "north": 55.3829431564742, + "fipsCode": "EI", + "population": "4853506", + "east": -5.99804990172185, + "isoNumeric": "372", + "areaInSqKm": "70280.0", + "countryCode": "IE", + "west": -10.4800035816853, + "countryName": "Ireland", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "", + "languages": "he,ar-IL,en-IL,", + "geonameId": 294640, + "south": 29.490654862, + "isoAlpha3": "ISR", + "north": 33.2908350000001, + "fipsCode": "IS", + "population": "8883800", + "east": 35.67033, + "isoNumeric": "376", + "areaInSqKm": "20770.0", + "countryCode": "IL", + "west": 34.267257, + "countryName": "Israel", + "continentName": "Asia", + "currencyCode": "ILS" + }, + { + "continent": "EU", + "capital": "Douglas", + "languages": "en,gv", + "geonameId": 3042225, + "south": 54.055916, + "isoAlpha3": "IMN", + "north": 54.419724, + "fipsCode": "IM", + "population": "84077", + "east": -4.3115, + "isoNumeric": "833", + "areaInSqKm": "572.0", + "countryCode": "IM", + "west": -4.798722, + "countryName": "Isle of Man", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "AS", + "capital": "New Delhi", + "languages": "en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc", + "geonameId": 1269750, + "south": 6.7559528993543, + "isoAlpha3": "IND", + "north": 35.524548272882, + "fipsCode": "IN", + "population": "1352617328", + "east": 97.4152926679075, + "isoNumeric": "356", + "areaInSqKm": "3287590.0", + "countryCode": "IN", + "west": 68.4840183183648, + "countryName": "India", + "continentName": "Asia", + "currencyCode": "INR" + }, + { + "continent": "AS", + "capital": "", + "languages": "en-IO", + "geonameId": 1282588, + "south": -7.438028, + "isoAlpha3": "IOT", + "north": -5.268333, + "fipsCode": "IO", + "population": "4000", + "east": 72.493164, + "isoNumeric": "086", + "areaInSqKm": "60.0", + "countryCode": "IO", + "west": 71.259972, + "countryName": "British Indian Ocean Territory", + "continentName": "Asia", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "Baghdad", + "languages": "ar-IQ,ku,hy", + "geonameId": 99237, + "south": 29.0612080000001, + "isoAlpha3": "IRQ", + "north": 37.380746001, + "fipsCode": "IZ", + "population": "38433600", + "east": 48.6117360000001, + "isoNumeric": "368", + "areaInSqKm": "437072.0", + "countryCode": "IQ", + "west": 38.7936740000001, + "countryName": "Iraq", + "continentName": "Asia", + "currencyCode": "IQD" + }, + { + "continent": "AS", + "capital": "Tehran", + "languages": "fa-IR,ku", + "geonameId": 130758, + "south": 25.060388566, + "isoAlpha3": "IRN", + "north": 39.7822393340001, + "fipsCode": "IR", + "population": "81800269", + "east": 63.333337, + "isoNumeric": "364", + "areaInSqKm": "1648000.0", + "countryCode": "IR", + "west": 44.032638708, + "countryName": "Iran", + "continentName": "Asia", + "currencyCode": "IRR" + }, + { + "continent": "EU", + "capital": "Reykjavik", + "languages": "is,en,de,da,sv,no", + "geonameId": 2629691, + "south": 63.394392778588, + "isoAlpha3": "ISL", + "north": 66.5377933098397, + "fipsCode": "IC", + "population": "353574", + "east": -13.4946206239501, + "isoNumeric": "352", + "areaInSqKm": "103000.0", + "countryCode": "IS", + "west": -24.5326753866625, + "countryName": "Iceland", + "continentName": "Europe", + "currencyCode": "ISK" + }, + { + "continent": "EU", + "capital": "Rome", + "languages": "it-IT,de-IT,fr-IT,sc,ca,co,sl", + "geonameId": 3175395, + "south": 36.6440816661648, + "isoAlpha3": "ITA", + "north": 47.0917837415439, + "fipsCode": "IT", + "population": "60431283", + "east": 18.5203814091888, + "isoNumeric": "380", + "areaInSqKm": "301230.0", + "countryCode": "IT", + "west": 6.62662135986088, + "countryName": "Italy", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Saint Helier", + "languages": "en,fr,nrf", + "geonameId": 3042142, + "south": 49.169834, + "isoAlpha3": "JEY", + "north": 49.265057, + "fipsCode": "JE", + "population": "90812", + "east": -2.022083, + "isoNumeric": "832", + "areaInSqKm": "116.0", + "countryCode": "JE", + "west": -2.260028, + "countryName": "Jersey", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "NA", + "capital": "Kingston", + "languages": "en-JM", + "geonameId": 3489940, + "south": 17.7059966193696, + "isoAlpha3": "JAM", + "north": 18.524766185516, + "fipsCode": "JM", + "population": "2934855", + "east": -76.1830989848426, + "isoNumeric": "388", + "areaInSqKm": "10991.0", + "countryCode": "JM", + "west": -78.3690062954957, + "countryName": "Jamaica", + "continentName": "North America", + "currencyCode": "JMD" + }, + { + "continent": "AS", + "capital": "Amman", + "languages": "ar-JO,en", + "geonameId": 248816, + "south": 29.1850360010001, + "isoAlpha3": "JOR", + "north": 33.374735, + "fipsCode": "JO", + "population": "9956011", + "east": 39.3011540000001, + "isoNumeric": "400", + "areaInSqKm": "92300.0", + "countryCode": "JO", + "west": 34.955471039, + "countryName": "Jordan", + "continentName": "Asia", + "currencyCode": "JOD" + }, + { + "continent": "AS", + "capital": "Tokyo", + "languages": "ja", + "geonameId": 1861060, + "south": 24.255169441, + "isoAlpha3": "JPN", + "north": 45.52295736, + "fipsCode": "JA", + "population": "126529100", + "east": 145.817458885, + "isoNumeric": "392", + "areaInSqKm": "377835.0", + "countryCode": "JP", + "west": 122.933653061, + "countryName": "Japan", + "continentName": "Asia", + "currencyCode": "JPY" + }, + { + "continent": "AF", + "capital": "Nairobi", + "languages": "en-KE,sw-KE", + "geonameId": 192950, + "south": -4.67989449199996, + "isoAlpha3": "KEN", + "north": 5.03342100100002, + "fipsCode": "KE", + "population": "51393010", + "east": 41.9069450000001, + "isoNumeric": "404", + "areaInSqKm": "582650.0", + "countryCode": "KE", + "west": 33.9098210000001, + "countryName": "Kenya", + "continentName": "Africa", + "currencyCode": "KES" + }, + { + "continent": "AS", + "capital": "Bishkek", + "languages": "ky,uz,ru", + "geonameId": 1527747, + "south": 39.172832, + "isoAlpha3": "KGZ", + "north": 43.238224, + "fipsCode": "KG", + "population": "6315800", + "east": 80.283165, + "isoNumeric": "417", + "areaInSqKm": "198500.0", + "countryCode": "KG", + "west": 69.276611, + "countryName": "Kyrgyzstan", + "continentName": "Asia", + "currencyCode": "KGS" + }, + { + "continent": "AS", + "capital": "Phnom Penh", + "languages": "km,fr,en", + "geonameId": 1831722, + "south": 10.409083, + "isoAlpha3": "KHM", + "north": 14.686417, + "fipsCode": "CB", + "population": "16249798", + "east": 107.627724, + "isoNumeric": "116", + "areaInSqKm": "181040.0", + "countryCode": "KH", + "west": 102.339996, + "countryName": "Cambodia", + "continentName": "Asia", + "currencyCode": "KHR" + }, + { + "continent": "OC", + "capital": "Tarawa", + "languages": "en-KI,gil", + "geonameId": 4030945, + "south": -11.4460499999991, + "isoAlpha3": "KIR", + "north": 3.93942799999973, + "fipsCode": "KR", + "population": "115847", + "east": -150.2345115032905, + "isoNumeric": "296", + "areaInSqKm": "811.0", + "countryCode": "KI", + "west": 169.548692, + "countryName": "Kiribati", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "AF", + "capital": "Moroni", + "languages": "ar,fr-KM", + "geonameId": 921929, + "south": -12.387857, + "isoAlpha3": "COM", + "north": -11.362381, + "fipsCode": "CN", + "population": "832322", + "east": 44.538223, + "isoNumeric": "174", + "areaInSqKm": "2170.0", + "countryCode": "KM", + "west": 43.21579, + "countryName": "Comoros", + "continentName": "Africa", + "currencyCode": "KMF" + }, + { + "continent": "NA", + "capital": "Basseterre", + "languages": "en-KN", + "geonameId": 3575174, + "south": 17.094276497441214, + "isoAlpha3": "KNA", + "north": 17.418152531334183, + "fipsCode": "SC", + "population": "52441", + "east": -62.53964136573717, + "isoNumeric": "659", + "areaInSqKm": "261.0", + "countryCode": "KN", + "west": -62.86483931213377, + "countryName": "St Kitts and Nevis", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "AS", + "capital": "Pyongyang", + "languages": "ko-KP", + "geonameId": 1873107, + "south": 37.673332, + "isoAlpha3": "PRK", + "north": 43.006054, + "fipsCode": "KN", + "population": "25549819", + "east": 130.674866, + "isoNumeric": "408", + "areaInSqKm": "120540.0", + "countryCode": "KP", + "west": 124.315887, + "countryName": "North Korea", + "continentName": "Asia", + "currencyCode": "KPW" + }, + { + "continent": "AS", + "capital": "Seoul", + "languages": "ko-KR,en", + "geonameId": 1835841, + "south": 33.1954102977009, + "isoAlpha3": "KOR", + "north": 38.5933891092225, + "fipsCode": "KS", + "population": "51635256", + "east": 129.583016157998, + "isoNumeric": "410", + "areaInSqKm": "98480.0", + "countryCode": "KR", + "west": 125.887442375577, + "countryName": "South Korea", + "continentName": "Asia", + "currencyCode": "KRW" + }, + { + "continent": "AS", + "capital": "Kuwait City", + "languages": "ar-KW,en", + "geonameId": 285570, + "south": 28.524611, + "isoAlpha3": "KWT", + "north": 30.095945, + "fipsCode": "KU", + "population": "4137309", + "east": 48.431473, + "isoNumeric": "414", + "areaInSqKm": "17820.0", + "countryCode": "KW", + "west": 46.555557, + "countryName": "Kuwait", + "continentName": "Asia", + "currencyCode": "KWD" + }, + { + "continent": "NA", + "capital": "George Town", + "languages": "en-KY", + "geonameId": 3580718, + "south": 19.263029, + "isoAlpha3": "CYM", + "north": 19.7617, + "fipsCode": "CJ", + "population": "64174", + "east": -79.727272, + "isoNumeric": "136", + "areaInSqKm": "262.0", + "countryCode": "KY", + "west": -81.432777, + "countryName": "Cayman Islands", + "continentName": "North America", + "currencyCode": "KYD" + }, + { + "continent": "AS", + "capital": "Nur-Sultan", + "languages": "kk,ru", + "geonameId": 1522867, + "south": 40.5686884990001, + "isoAlpha3": "KAZ", + "north": 55.441984001, + "fipsCode": "KZ", + "population": "18276499", + "east": 87.3154150010001, + "isoNumeric": "398", + "areaInSqKm": "2717300.0", + "countryCode": "KZ", + "west": 46.4936720000001, + "countryName": "Kazakhstan", + "continentName": "Asia", + "currencyCode": "KZT" + }, + { + "continent": "AS", + "capital": "Vientiane", + "languages": "lo,fr,en", + "geonameId": 1655842, + "south": 13.909720001, + "isoAlpha3": "LAO", + "north": 22.50904495, + "fipsCode": "LA", + "population": "7061507", + "east": 107.635093936, + "isoNumeric": "418", + "areaInSqKm": "236800.0", + "countryCode": "LA", + "west": 100.083872, + "countryName": "Laos", + "continentName": "Asia", + "currencyCode": "LAK" + }, + { + "continent": "AS", + "capital": "Beirut", + "languages": "ar-LB,fr-LB,en,hy", + "geonameId": 272103, + "south": 33.0550260000001, + "isoAlpha3": "LBN", + "north": 34.6920900000001, + "fipsCode": "LE", + "population": "6848925", + "east": 36.62372, + "isoNumeric": "422", + "areaInSqKm": "10400.0", + "countryCode": "LB", + "west": 35.103668213, + "countryName": "Lebanon", + "continentName": "Asia", + "currencyCode": "LBP" + }, + { + "continent": "NA", + "capital": "Castries", + "languages": "en-LC", + "geonameId": 3576468, + "south": 13.7072692224982, + "isoAlpha3": "LCA", + "north": 14.110317287646, + "fipsCode": "ST", + "population": "181889", + "east": -60.8732306422271, + "isoNumeric": "662", + "areaInSqKm": "616.0", + "countryCode": "LC", + "west": -61.07995730159752, + "countryName": "Saint Lucia", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "EU", + "capital": "Vaduz", + "languages": "de-LI", + "geonameId": 3042058, + "south": 47.0484284123471, + "isoAlpha3": "LIE", + "north": 47.2706251386959, + "fipsCode": "LS", + "population": "37910", + "east": 9.63564281136796, + "isoNumeric": "438", + "areaInSqKm": "160.0", + "countryCode": "LI", + "west": 9.47167359782014, + "countryName": "Liechtenstein", + "continentName": "Europe", + "currencyCode": "CHF" + }, + { + "continent": "AS", + "capital": "Colombo", + "languages": "si,ta,en", + "geonameId": 1227603, + "south": 5.91869676126554, + "isoAlpha3": "LKA", + "north": 9.83586297688552, + "fipsCode": "CE", + "population": "21670000", + "east": 81.8790900303934, + "isoNumeric": "144", + "areaInSqKm": "65610.0", + "countryCode": "LK", + "west": 79.6505518289324, + "countryName": "Sri Lanka", + "continentName": "Asia", + "currencyCode": "LKR" + }, + { + "continent": "AF", + "capital": "Monrovia", + "languages": "en-LR", + "geonameId": 2275384, + "south": 4.35326143300006, + "isoAlpha3": "LBR", + "north": 8.55198600000006, + "fipsCode": "LI", + "population": "4818977", + "east": -7.36925499999995, + "isoNumeric": "430", + "areaInSqKm": "111370.0", + "countryCode": "LR", + "west": -11.4993114059999, + "countryName": "Liberia", + "continentName": "Africa", + "currencyCode": "LRD" + }, + { + "continent": "AF", + "capital": "Maseru", + "languages": "en-LS,st,zu,xh", + "geonameId": 932692, + "south": -30.6755750029999, + "isoAlpha3": "LSO", + "north": -28.5708, + "fipsCode": "LT", + "population": "2108132", + "east": 29.4557099420001, + "isoNumeric": "426", + "areaInSqKm": "30355.0", + "countryCode": "LS", + "west": 27.011229998, + "countryName": "Lesotho", + "continentName": "Africa", + "currencyCode": "LSL" + }, + { + "continent": "EU", + "capital": "Vilnius", + "languages": "lt,ru,pl", + "geonameId": 597427, + "south": 53.89679499, + "isoAlpha3": "LTU", + "north": 56.4504065100001, + "fipsCode": "LH", + "population": "2789533", + "east": 26.8355231, + "isoNumeric": "440", + "areaInSqKm": "65200.0", + "countryCode": "LT", + "west": 20.941528, + "countryName": "Lithuania", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Luxembourg", + "languages": "lb,de-LU,fr-LU", + "geonameId": 2960313, + "south": 49.447858677765716, + "isoAlpha3": "LUX", + "north": 50.182772453796446, + "fipsCode": "LU", + "population": "607728", + "east": 6.5308980672559525, + "isoNumeric": "442", + "areaInSqKm": "2586.0", + "countryCode": "LU", + "west": 5.735698938390786, + "countryName": "Luxembourg", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Riga", + "languages": "lv,ru,lt", + "geonameId": 458258, + "south": 55.6746669350001, + "isoAlpha3": "LVA", + "north": 58.085568788, + "fipsCode": "LG", + "population": "1926542", + "east": 28.241403, + "isoNumeric": "428", + "areaInSqKm": "64589.0", + "countryCode": "LV", + "west": 20.9691104890001, + "countryName": "Latvia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Tripoli", + "languages": "ar-LY,it,en", + "geonameId": 2215636, + "south": 19.508045, + "isoAlpha3": "LBY", + "north": 33.168999, + "fipsCode": "LY", + "population": "6678567", + "east": 25.150612, + "isoNumeric": "434", + "areaInSqKm": "1759540.0", + "countryCode": "LY", + "west": 9.38702, + "countryName": "Libya", + "continentName": "Africa", + "currencyCode": "LYD" + }, + { + "continent": "AF", + "capital": "Rabat", + "languages": "ar-MA,ber,fr", + "geonameId": 2542007, + "south": 27.6672694750001, + "isoAlpha3": "MAR", + "north": 35.922341095, + "fipsCode": "MO", + "population": "36029138", + "east": -0.996975780999946, + "isoNumeric": "504", + "areaInSqKm": "446550.0", + "countryCode": "MA", + "west": -13.1722970399999, + "countryName": "Morocco", + "continentName": "Africa", + "currencyCode": "MAD" + }, + { + "continent": "EU", + "capital": "Monaco", + "languages": "fr-MC,en,it", + "geonameId": 2993457, + "south": 43.72472839869377, + "isoAlpha3": "MCO", + "north": 43.75196717037228, + "fipsCode": "MN", + "population": "38682", + "east": 7.439939260482788, + "isoNumeric": "492", + "areaInSqKm": "1.95", + "countryCode": "MC", + "west": 7.408962249755859, + "countryName": "Monaco", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Chișinău", + "languages": "ro,ru,gag,tr", + "geonameId": 617790, + "south": 45.4674379630001, + "isoAlpha3": "MDA", + "north": 48.492029003, + "fipsCode": "MD", + "population": "3545883", + "east": 30.1635900000001, + "isoNumeric": "498", + "areaInSqKm": "33843.0", + "countryCode": "MD", + "west": 26.6164249990001, + "countryName": "Moldova", + "continentName": "Europe", + "currencyCode": "MDL" + }, + { + "continent": "EU", + "capital": "Podgorica", + "languages": "sr,hu,bs,sq,hr,rom", + "geonameId": 3194884, + "south": 41.868751527, + "isoAlpha3": "MNE", + "north": 43.558230232, + "fipsCode": "MJ", + "population": "622345", + "east": 20.352926, + "isoNumeric": "499", + "areaInSqKm": "14026.0", + "countryCode": "ME", + "west": 18.4335595800001, + "countryName": "Montenegro", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "NA", + "capital": "Marigot", + "languages": "fr", + "geonameId": 3578421, + "south": 18.04717219103021, + "isoAlpha3": "MAF", + "north": 18.125295191246206, + "fipsCode": "RN", + "population": "37264", + "east": -63.01059106320133, + "isoNumeric": "663", + "areaInSqKm": "53.0", + "countryCode": "MF", + "west": -63.15036103890611, + "countryName": "Saint Martin", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Antananarivo", + "languages": "fr-MG,mg", + "geonameId": 1062947, + "south": -25.608952, + "isoAlpha3": "MDG", + "north": -11.945433, + "fipsCode": "MA", + "population": "26262368", + "east": 50.48378, + "isoNumeric": "450", + "areaInSqKm": "587040.0", + "countryCode": "MG", + "west": 43.224876, + "countryName": "Madagascar", + "continentName": "Africa", + "currencyCode": "MGA" + }, + { + "continent": "OC", + "capital": "Majuro", + "languages": "mh,en-MH", + "geonameId": 2080185, + "south": 5.587639, + "isoAlpha3": "MHL", + "north": 14.62, + "fipsCode": "RM", + "population": "58413", + "east": 171.931808, + "isoNumeric": "584", + "areaInSqKm": "181.3", + "countryCode": "MH", + "west": 165.524918, + "countryName": "Marshall Islands", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Skopje", + "languages": "mk,sq,tr,rmm,sr", + "geonameId": 718075, + "south": 40.8539489400001, + "isoAlpha3": "MKD", + "north": 42.3736460000001, + "fipsCode": "MK", + "population": "2082958", + "east": 23.0340440310001, + "isoNumeric": "807", + "areaInSqKm": "25333.0", + "countryCode": "MK", + "west": 20.4524230000001, + "countryName": "North Macedonia", + "continentName": "Europe", + "currencyCode": "MKD" + }, + { + "continent": "AF", + "capital": "Bamako", + "languages": "fr-ML,bm", + "geonameId": 2453866, + "south": 10.147811, + "isoAlpha3": "MLI", + "north": 25.001084, + "fipsCode": "ML", + "population": "19077690", + "east": 4.26666786900006, + "isoNumeric": "466", + "areaInSqKm": "1240000.0", + "countryCode": "ML", + "west": -12.240344643, + "countryName": "Mali", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "AS", + "capital": "Nay Pyi Taw", + "languages": "my", + "geonameId": 1327865, + "south": 9.784583, + "isoAlpha3": "MMR", + "north": 28.543249, + "fipsCode": "BM", + "population": "53708395", + "east": 101.176781, + "isoNumeric": "104", + "areaInSqKm": "678500.0", + "countryCode": "MM", + "west": 92.189278, + "countryName": "Myanmar", + "continentName": "Asia", + "currencyCode": "MMK" + }, + { + "continent": "AS", + "capital": "Ulaanbaatar", + "languages": "mn,ru", + "geonameId": 2029969, + "south": 41.5818330000001, + "isoAlpha3": "MNG", + "north": 52.1483550020001, + "fipsCode": "MG", + "population": "3170208", + "east": 119.931509803, + "isoNumeric": "496", + "areaInSqKm": "1565000.0", + "countryCode": "MN", + "west": 87.7344790560001, + "countryName": "Mongolia", + "continentName": "Asia", + "currencyCode": "MNT" + }, + { + "continent": "AS", + "capital": "Macao", + "languages": "zh,zh-MO,pt", + "geonameId": 1821275, + "south": 22.109952693, + "isoAlpha3": "MAC", + "north": 22.2170590110001, + "fipsCode": "MC", + "population": "631636", + "east": 113.59234495800001, + "isoNumeric": "446", + "areaInSqKm": "254.0", + "countryCode": "MO", + "west": 113.528563856, + "countryName": "Macao", + "continentName": "Asia", + "currencyCode": "MOP" + }, + { + "continent": "OC", + "capital": "Saipan", + "languages": "fil,tl,zh,ch-MP,en-MP", + "geonameId": 4041468, + "south": 14.11023, + "isoAlpha3": "MNP", + "north": 20.55344, + "fipsCode": "CQ", + "population": "56882", + "east": 146.06528, + "isoNumeric": "580", + "areaInSqKm": "477.0", + "countryCode": "MP", + "west": 144.88626, + "countryName": "Northern Mariana Islands", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Fort-de-France", + "languages": "fr-MQ", + "geonameId": 3570311, + "south": 14.3946961023016, + "isoAlpha3": "MTQ", + "north": 14.8787232943029, + "fipsCode": "MB", + "population": "432900", + "east": -60.8096896756103, + "isoNumeric": "474", + "areaInSqKm": "1100.0", + "countryCode": "MQ", + "west": -61.229041406022, + "countryName": "Martinique", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Nouakchott", + "languages": "ar-MR,fuc,snk,fr,mey,wo", + "geonameId": 2378080, + "south": 14.715547, + "isoAlpha3": "MRT", + "north": 27.298073, + "fipsCode": "MR", + "population": "4403319", + "east": -4.827674, + "isoNumeric": "478", + "areaInSqKm": "1030700.0", + "countryCode": "MR", + "west": -17.066521, + "countryName": "Mauritania", + "continentName": "Africa", + "currencyCode": "MRU" + }, + { + "continent": "NA", + "capital": "Plymouth", + "languages": "en-MS", + "geonameId": 3578097, + "south": 16.674768935441556, + "isoAlpha3": "MSR", + "north": 16.824060205313184, + "fipsCode": "MH", + "population": "9341", + "east": -62.144100129608205, + "isoNumeric": "500", + "areaInSqKm": "102.0", + "countryCode": "MS", + "west": -62.24138237036129, + "countryName": "Montserrat", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "EU", + "capital": "Valletta", + "languages": "mt,en-MT", + "geonameId": 2562770, + "south": 35.8061835000002, + "isoAlpha3": "MLT", + "north": 36.0821530995456, + "fipsCode": "MT", + "population": "483530", + "east": 14.5764915000002, + "isoNumeric": "470", + "areaInSqKm": "316.0", + "countryCode": "MT", + "west": 14.1834251000001, + "countryName": "Malta", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Port Louis", + "languages": "en-MU,bho,fr", + "geonameId": 934292, + "south": -20.5255565639999, + "isoAlpha3": "MUS", + "north": -10.336483002, + "fipsCode": "MP", + "population": "1265303", + "east": 63.5028269640001, + "isoNumeric": "480", + "areaInSqKm": "2040.0", + "countryCode": "MU", + "west": 56.584918976, + "countryName": "Mauritius", + "continentName": "Africa", + "currencyCode": "MUR" + }, + { + "continent": "AS", + "capital": "Malé", + "languages": "dv,en", + "geonameId": 1282028, + "south": -0.692694, + "isoAlpha3": "MDV", + "north": 7.091587495414767, + "fipsCode": "MV", + "population": "515696", + "east": 73.637276, + "isoNumeric": "462", + "areaInSqKm": "300.0", + "countryCode": "MV", + "west": 72.693222, + "countryName": "Maldives", + "continentName": "Asia", + "currencyCode": "MVR" + }, + { + "continent": "AF", + "capital": "Lilongwe", + "languages": "ny,yao,tum,swk", + "geonameId": 927384, + "south": -17.1295217059999, + "isoAlpha3": "MWI", + "north": -9.36722739199996, + "fipsCode": "MI", + "population": "17563749", + "east": 35.9185731040001, + "isoNumeric": "454", + "areaInSqKm": "118480.0", + "countryCode": "MW", + "west": 32.6725205490001, + "countryName": "Malawi", + "continentName": "Africa", + "currencyCode": "MWK" + }, + { + "continent": "NA", + "capital": "Mexico City", + "languages": "es-MX", + "geonameId": 3996063, + "south": 14.532866, + "isoAlpha3": "MEX", + "north": 32.716759, + "fipsCode": "MX", + "population": "126190788", + "east": -86.703392, + "isoNumeric": "484", + "areaInSqKm": "1972550.0", + "countryCode": "MX", + "west": -118.453949, + "countryName": "Mexico", + "continentName": "North America", + "currencyCode": "MXN" + }, + { + "continent": "AS", + "capital": "Kuala Lumpur", + "languages": "ms-MY,en,zh,ta,te,ml,pa,th", + "geonameId": 1733045, + "south": 0.855222, + "isoAlpha3": "MYS", + "north": 7.363417, + "fipsCode": "MY", + "population": "31528585", + "east": 119.267502, + "isoNumeric": "458", + "areaInSqKm": "329750.0", + "countryCode": "MY", + "west": 99.643448, + "countryName": "Malaysia", + "continentName": "Asia", + "currencyCode": "MYR" + }, + { + "continent": "AF", + "capital": "Maputo", + "languages": "pt-MZ,vmw", + "geonameId": 1036973, + "south": -26.868162, + "isoAlpha3": "MOZ", + "north": -10.4731756319999, + "fipsCode": "MZ", + "population": "29495962", + "east": 40.838104211, + "isoNumeric": "508", + "areaInSqKm": "801590.0", + "countryCode": "MZ", + "west": 30.2155500000001, + "countryName": "Mozambique", + "continentName": "Africa", + "currencyCode": "MZN" + }, + { + "continent": "AF", + "capital": "Windhoek", + "languages": "en-NA,af,de,hz,naq", + "geonameId": 3355338, + "south": -28.9706389999999, + "isoAlpha3": "NAM", + "north": -16.963488173, + "fipsCode": "WA", + "population": "2448255", + "east": 25.2617520000001, + "isoNumeric": "516", + "areaInSqKm": "825418.0", + "countryCode": "NA", + "west": 11.737502061, + "countryName": "Namibia", + "continentName": "Africa", + "currencyCode": "NAD" + }, + { + "continent": "OC", + "capital": "Noumea", + "languages": "fr-NC", + "geonameId": 2139685, + "south": -22.698, + "isoAlpha3": "NCL", + "north": -19.549778, + "fipsCode": "NC", + "population": "284060", + "east": 168.129135, + "isoNumeric": "540", + "areaInSqKm": "19060.0", + "countryCode": "NC", + "west": 163.564667, + "countryName": "New Caledonia", + "continentName": "Oceania", + "currencyCode": "XPF" + }, + { + "continent": "AF", + "capital": "Niamey", + "languages": "fr-NE,ha,kr,dje", + "geonameId": 2440476, + "south": 11.6937560000001, + "isoAlpha3": "NER", + "north": 23.5149999920001, + "fipsCode": "NG", + "population": "22442948", + "east": 15.9990340000001, + "isoNumeric": "562", + "areaInSqKm": "1267000.0", + "countryCode": "NE", + "west": 0.162193643000023, + "countryName": "Niger", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "OC", + "capital": "Kingston", + "languages": "en-NF", + "geonameId": 2155115, + "south": -29.063076742954735, + "isoAlpha3": "NFK", + "north": -28.995170686948427, + "fipsCode": "NF", + "population": "1828", + "east": 167.99773740209957, + "isoNumeric": "574", + "areaInSqKm": "34.6", + "countryCode": "NF", + "west": 167.91543230151365, + "countryName": "Norfolk Island", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "AF", + "capital": "Abuja", + "languages": "en-NG,ha,yo,ig,ff", + "geonameId": 2328926, + "south": 4.27058531900002, + "isoAlpha3": "NGA", + "north": 13.885645000000068, + "fipsCode": "NI", + "population": "195874740", + "east": 14.677982000000043, + "isoNumeric": "566", + "areaInSqKm": "923768.0", + "countryCode": "NG", + "west": 2.663560999000026, + "countryName": "Nigeria", + "continentName": "Africa", + "currencyCode": "NGN" + }, + { + "continent": "NA", + "capital": "Managua", + "languages": "es-NI,en", + "geonameId": 3617476, + "south": 10.707543, + "isoAlpha3": "NIC", + "north": 15.025909, + "fipsCode": "NU", + "population": "6465513", + "east": -82.738289, + "isoNumeric": "558", + "areaInSqKm": "129494.0", + "countryCode": "NI", + "west": -87.690308, + "countryName": "Nicaragua", + "continentName": "North America", + "currencyCode": "NIO" + }, + { + "continent": "EU", + "capital": "Amsterdam", + "languages": "nl-NL,fy-NL", + "geonameId": 2750405, + "south": 50.7503674993741, + "isoAlpha3": "NLD", + "north": 53.5157125645109, + "fipsCode": "NL", + "population": "17231017", + "east": 7.22749859212922, + "isoNumeric": "528", + "areaInSqKm": "41526.0", + "countryCode": "NL", + "west": 3.35837827202, + "countryName": "Netherlands", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Oslo", + "languages": "no,nb,nn,se,fi", + "geonameId": 3144096, + "south": 57.97987783489344, + "isoAlpha3": "NOR", + "north": 71.1854764998959, + "fipsCode": "NO", + "population": "5314336", + "east": 31.063740342248376, + "isoNumeric": "578", + "areaInSqKm": "324220.0", + "countryCode": "NO", + "west": 4.64182374183584, + "countryName": "Norway", + "continentName": "Europe", + "currencyCode": "NOK" + }, + { + "continent": "AS", + "capital": "Kathmandu", + "languages": "ne,en", + "geonameId": 1282988, + "south": 26.3479660710001, + "isoAlpha3": "NPL", + "north": 30.447389748, + "fipsCode": "NP", + "population": "28087871", + "east": 88.2015257450001, + "isoNumeric": "524", + "areaInSqKm": "140800.0", + "countryCode": "NP", + "west": 80.058450824, + "countryName": "Nepal", + "continentName": "Asia", + "currencyCode": "NPR" + }, + { + "continent": "OC", + "capital": "Yaren District", + "languages": "na,en-NR", + "geonameId": 2110425, + "south": -0.5541467234752249, + "isoAlpha3": "NRU", + "north": -0.502657000000004, + "fipsCode": "NR", + "population": "12704", + "east": 166.95899600000007, + "isoNumeric": "520", + "areaInSqKm": "21.0", + "countryCode": "NR", + "west": 166.90968999999996, + "countryName": "Nauru", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "OC", + "capital": "Alofi", + "languages": "niu,en-NU", + "geonameId": 4036232, + "south": -19.152193, + "isoAlpha3": "NIU", + "north": -18.951069, + "fipsCode": "NE", + "population": "2166", + "east": -169.775177, + "isoNumeric": "570", + "areaInSqKm": "260.0", + "countryCode": "NU", + "west": -169.951004, + "countryName": "Niue", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "OC", + "capital": "Wellington", + "languages": "en-NZ,mi", + "geonameId": 2186224, + "south": -47.286026, + "isoAlpha3": "NZL", + "north": -34.389668, + "fipsCode": "NZ", + "population": "4885500", + "east": -180, + "isoNumeric": "554", + "areaInSqKm": "268680.0", + "countryCode": "NZ", + "west": 166.7155, + "countryName": "New Zealand", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "AS", + "capital": "Muscat", + "languages": "ar-OM,en,bal,ur", + "geonameId": 286963, + "south": 16.6500835430001, + "isoAlpha3": "OMN", + "north": 26.3863334660001, + "fipsCode": "MU", + "population": "4829483", + "east": 59.8379173280001, + "isoNumeric": "512", + "areaInSqKm": "212460.0", + "countryCode": "OM", + "west": 52.0000000000001, + "countryName": "Oman", + "continentName": "Asia", + "currencyCode": "OMR" + }, + { + "continent": "NA", + "capital": "Panama City", + "languages": "es-PA,en", + "geonameId": 3703430, + "south": 7.20236920646422, + "isoAlpha3": "PAN", + "north": 9.6474132494631, + "fipsCode": "PM", + "population": "4176873", + "east": -77.1563637579897, + "isoNumeric": "591", + "areaInSqKm": "78200.0", + "countryCode": "PA", + "west": -83.0523988577088, + "countryName": "Panama", + "continentName": "North America", + "currencyCode": "PAB" + }, + { + "continent": "SA", + "capital": "Lima", + "languages": "es-PE,qu,ay", + "geonameId": 3932488, + "south": -18.3509277356587, + "isoAlpha3": "PER", + "north": -0.0386059686681167, + "fipsCode": "PE", + "population": "31989256", + "east": -68.6522791042853, + "isoNumeric": "604", + "areaInSqKm": "1285220.0", + "countryCode": "PE", + "west": -81.3281953622301, + "countryName": "Peru", + "continentName": "South America", + "currencyCode": "PEN" + }, + { + "continent": "OC", + "capital": "Papeete", + "languages": "fr-PF,ty", + "geonameId": 4030656, + "south": -27.653572, + "isoAlpha3": "PYF", + "north": -7.903573, + "fipsCode": "FP", + "population": "277679", + "east": -134.929825, + "isoNumeric": "258", + "areaInSqKm": "4167.0", + "countryCode": "PF", + "west": -152.877167, + "countryName": "French Polynesia", + "continentName": "Oceania", + "currencyCode": "XPF" + }, + { + "continent": "OC", + "capital": "Port Moresby", + "languages": "en-PG,ho,meu,tpi", + "geonameId": 2088628, + "south": -11.657972335, + "isoAlpha3": "PNG", + "north": -1.31544446799995, + "fipsCode": "PP", + "population": "8606316", + "east": 155.968780519, + "isoNumeric": "598", + "areaInSqKm": "462840.0", + "countryCode": "PG", + "west": 140.841969, + "countryName": "Papua New Guinea", + "continentName": "Oceania", + "currencyCode": "PGK" + }, + { + "continent": "AS", + "capital": "Manila", + "languages": "tl,en-PH,fil,ceb,tgl,ilo,hil,war,pam,bik,bcl,pag,mrw,tsg,mdh,cbk,krj,sgd,msb,akl,ibg,yka,mta,abx", + "geonameId": 1694008, + "south": 4.64209796365014, + "isoAlpha3": "PHL", + "north": 21.1218854788318, + "fipsCode": "RP", + "population": "106651922", + "east": 126.60497402182328, + "isoNumeric": "608", + "areaInSqKm": "300000.0", + "countryCode": "PH", + "west": 116.9288644959, + "countryName": "Philippines", + "continentName": "Asia", + "currencyCode": "PHP" + }, + { + "continent": "AS", + "capital": "Islamabad", + "languages": "ur-PK,en-PK,pa,sd,ps,brh", + "geonameId": 1168579, + "south": 23.769527435, + "isoAlpha3": "PAK", + "north": 37.0841070010001, + "fipsCode": "PK", + "population": "212215030", + "east": 77.0132974640001, + "isoNumeric": "586", + "areaInSqKm": "803940.0", + "countryCode": "PK", + "west": 60.8729720000001, + "countryName": "Pakistan", + "continentName": "Asia", + "currencyCode": "PKR" + }, + { + "continent": "EU", + "capital": "Warsaw", + "languages": "pl", + "geonameId": 798544, + "south": 49.0020465193443, + "isoAlpha3": "POL", + "north": 54.8357886595169, + "fipsCode": "PL", + "population": "37978548", + "east": 24.1457828491313, + "isoNumeric": "616", + "areaInSqKm": "312685.0", + "countryCode": "PL", + "west": 14.1228850233809, + "countryName": "Poland", + "continentName": "Europe", + "currencyCode": "PLN" + }, + { + "continent": "NA", + "capital": "Saint-Pierre", + "languages": "fr-PM", + "geonameId": 3424932, + "south": 46.78264970849848, + "isoAlpha3": "SPM", + "north": 47.14376802942701, + "fipsCode": "SB", + "population": "7012", + "east": -56.1253298443454, + "isoNumeric": "666", + "areaInSqKm": "242.0", + "countryCode": "PM", + "west": -56.40709223087083, + "countryName": "Saint Pierre and Miquelon", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Adamstown", + "languages": "en-PN", + "geonameId": 4030699, + "south": -24.672565, + "isoAlpha3": "PCN", + "north": -24.3299386198549, + "fipsCode": "PC", + "population": "46", + "east": -124.77285, + "isoNumeric": "612", + "areaInSqKm": "47.0", + "countryCode": "PN", + "west": -128.35699011119425, + "countryName": "Pitcairn Islands", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "NA", + "capital": "San Juan", + "languages": "en-PR,es-PR", + "geonameId": 4566966, + "south": 17.9269004394039, + "isoAlpha3": "PRI", + "north": 18.5159687270238, + "fipsCode": "RQ", + "population": "3195153", + "east": -65.2442099429843, + "isoNumeric": "630", + "areaInSqKm": "9104.0", + "countryCode": "PR", + "west": -67.9461344974432, + "countryName": "Puerto Rico", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "", + "languages": "ar-PS", + "geonameId": 6254930, + "south": 31.2200520000001, + "isoAlpha3": "PSE", + "north": 32.5520881030001, + "fipsCode": "WE", + "population": "4569087", + "east": 35.5740520000001, + "isoNumeric": "275", + "areaInSqKm": "5970.0", + "countryCode": "PS", + "west": 34.2186994300001, + "countryName": "Palestine", + "continentName": "Asia", + "currencyCode": "ILS" + }, + { + "continent": "EU", + "capital": "Lisbon", + "languages": "pt-PT,mwl", + "geonameId": 2264397, + "south": 36.96125, + "isoAlpha3": "PRT", + "north": 42.154311127408, + "fipsCode": "PO", + "population": "10281762", + "east": -6.18915930748288, + "isoNumeric": "620", + "areaInSqKm": "92391.0", + "countryCode": "PT", + "west": -9.50052660716588, + "countryName": "Portugal", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Ngerulmud", + "languages": "pau,sov,en-PW,tox,ja,fil,zh", + "geonameId": 1559582, + "south": 2.8036, + "isoAlpha3": "PLW", + "north": 8.46966, + "fipsCode": "PS", + "population": "17907", + "east": 134.72307, + "isoNumeric": "585", + "areaInSqKm": "458.0", + "countryCode": "PW", + "west": 131.11788, + "countryName": "Palau", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "SA", + "capital": "Asunción", + "languages": "es-PY,gn", + "geonameId": 3437598, + "south": -27.5918335646318, + "isoAlpha3": "PRY", + "north": -19.2896000004762, + "fipsCode": "PA", + "population": "6956071", + "east": -54.2589239104835, + "isoNumeric": "600", + "areaInSqKm": "406750.0", + "countryCode": "PY", + "west": -62.6446174378624, + "countryName": "Paraguay", + "continentName": "South America", + "currencyCode": "PYG" + }, + { + "continent": "AS", + "capital": "Doha", + "languages": "ar-QA,es", + "geonameId": 289688, + "south": 24.4711111230001, + "isoAlpha3": "QAT", + "north": 26.1578818880001, + "fipsCode": "QA", + "population": "2781677", + "east": 51.6315537500001, + "isoNumeric": "634", + "areaInSqKm": "11437.0", + "countryCode": "QA", + "west": 50.750030995, + "countryName": "Qatar", + "continentName": "Asia", + "currencyCode": "QAR" + }, + { + "continent": "AF", + "capital": "Saint-Denis", + "languages": "fr-RE", + "geonameId": 935317, + "south": -21.3896307613732, + "isoAlpha3": "REU", + "north": -20.8718271541163, + "fipsCode": "RE", + "population": "776948", + "east": 55.8366292267104, + "isoNumeric": "638", + "areaInSqKm": "2517.0", + "countryCode": "RE", + "west": 55.2165259976951, + "countryName": "Réunion", + "continentName": "Africa", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Bucharest", + "languages": "ro,hu,rom", + "geonameId": 798549, + "south": 43.6190166499833, + "isoAlpha3": "ROU", + "north": 48.2653912058468, + "fipsCode": "RO", + "population": "19473936", + "east": 29.7152986907701, + "isoNumeric": "642", + "areaInSqKm": "237500.0", + "countryCode": "RO", + "west": 20.2619949052262, + "countryName": "Romania", + "continentName": "Europe", + "currencyCode": "RON" + }, + { + "continent": "EU", + "capital": "Belgrade", + "languages": "sr,hu,bs,rom", + "geonameId": 6290252, + "south": 42.2315030010001, + "isoAlpha3": "SRB", + "north": 46.189446, + "fipsCode": "RI", + "population": "6982084", + "east": 23.0063870060001, + "isoNumeric": "688", + "areaInSqKm": "88361.0", + "countryCode": "RS", + "west": 18.838044043, + "countryName": "Serbia", + "continentName": "Europe", + "currencyCode": "RSD" + }, + { + "continent": "EU", + "capital": "Moscow", + "languages": "ru,tt,xal,cau,ady,kv,ce,tyv,cv,udm,tut,mns,bua,myv,mdf,chm,ba,inh,tut,kbd,krc,av,sah,nog", + "geonameId": 2017370, + "south": 41.1853530000001, + "isoAlpha3": "RUS", + "north": 81.8616409300001, + "fipsCode": "RS", + "population": "144478050", + "east": -169.05, + "isoNumeric": "643", + "areaInSqKm": "1.71E7", + "countryCode": "RU", + "west": 19.25, + "countryName": "Russia", + "continentName": "Europe", + "currencyCode": "RUB" + }, + { + "continent": "AF", + "capital": "Kigali", + "languages": "rw,en-RW,fr-RW,sw", + "geonameId": 49518, + "south": -2.84023010213747, + "isoAlpha3": "RWA", + "north": -1.04716670707785, + "fipsCode": "RW", + "population": "12301939", + "east": 30.8997466415943, + "isoNumeric": "646", + "areaInSqKm": "26338.0", + "countryCode": "RW", + "west": 28.8617308206209, + "countryName": "Rwanda", + "continentName": "Africa", + "currencyCode": "RWF" + }, + { + "continent": "AS", + "capital": "Riyadh", + "languages": "ar-SA", + "geonameId": 102358, + "south": 16.379528001, + "isoAlpha3": "SAU", + "north": 32.1542840000001, + "fipsCode": "SA", + "population": "33699947", + "east": 55.6667, + "isoNumeric": "682", + "areaInSqKm": "1960582.0", + "countryCode": "SA", + "west": 34.495693, + "countryName": "Saudi Arabia", + "continentName": "Asia", + "currencyCode": "SAR" + }, + { + "continent": "OC", + "capital": "Honiara", + "languages": "en-SB,tpi", + "geonameId": 2103350, + "south": -11.88141903, + "isoAlpha3": "SLB", + "north": -6.58897397999996, + "fipsCode": "BP", + "population": "652858", + "east": 166.99122396, + "isoNumeric": "090", + "areaInSqKm": "28450.0", + "countryCode": "SB", + "west": 155.51227512, + "countryName": "Solomon Islands", + "continentName": "Oceania", + "currencyCode": "SBD" + }, + { + "continent": "AF", + "capital": "Victoria", + "languages": "en-SC,fr-SC", + "geonameId": 241170, + "south": -9.753867, + "isoAlpha3": "SYC", + "north": -4.283717, + "fipsCode": "SE", + "population": "96762", + "east": 56.29770287937299, + "isoNumeric": "690", + "areaInSqKm": "455.0", + "countryCode": "SC", + "west": 46.204769, + "countryName": "Seychelles", + "continentName": "Africa", + "currencyCode": "SCR" + }, + { + "continent": "AF", + "capital": "Khartoum", + "languages": "ar-SD,en,fia", + "geonameId": 366755, + "south": 9.48888700000003, + "isoAlpha3": "SDN", + "north": 23.1464092140001, + "fipsCode": "SU", + "population": "41801533", + "east": 38.5822502880001, + "isoNumeric": "729", + "areaInSqKm": "1861484.0", + "countryCode": "SD", + "west": 21.8146345210001, + "countryName": "Sudan", + "continentName": "Africa", + "currencyCode": "SDG" + }, + { + "continent": "EU", + "capital": "Stockholm", + "languages": "sv-SE,se,sma,fi-SE", + "geonameId": 2661886, + "south": 55.3374438220002, + "isoAlpha3": "SWE", + "north": 69.0599672666879, + "fipsCode": "SW", + "population": "10183175", + "east": 24.155245238099, + "isoNumeric": "752", + "areaInSqKm": "449964.0", + "countryCode": "SE", + "west": 11.109499387126, + "countryName": "Sweden", + "continentName": "Europe", + "currencyCode": "SEK" + }, + { + "continent": "AS", + "capital": "Singapore", + "languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG", + "geonameId": 1880251, + "south": 1.21065456224784, + "isoAlpha3": "SGP", + "north": 1.47077483208476, + "fipsCode": "SN", + "population": "5638676", + "east": 104.043617447514, + "isoNumeric": "702", + "areaInSqKm": "692.7", + "countryCode": "SG", + "west": 103.605700705134, + "countryName": "Singapore", + "continentName": "Asia", + "currencyCode": "SGD" + }, + { + "continent": "AF", + "capital": "Jamestown", + "languages": "en-SH", + "geonameId": 3370751, + "south": -16.019543, + "isoAlpha3": "SHN", + "north": -7.887815, + "fipsCode": "SH", + "population": "7460", + "east": -5.638753, + "isoNumeric": "654", + "areaInSqKm": "410.0", + "countryCode": "SH", + "west": -14.42123, + "countryName": "Saint Helena", + "continentName": "Africa", + "currencyCode": "SHP" + }, + { + "continent": "EU", + "capital": "Ljubljana", + "languages": "sl,sh", + "geonameId": 3190538, + "south": 45.421812998164, + "isoAlpha3": "SVN", + "north": 46.8766275518195, + "fipsCode": "SI", + "population": "2067372", + "east": 16.6106311807, + "isoNumeric": "705", + "areaInSqKm": "20273.0", + "countryCode": "SI", + "west": 13.3753342064709, + "countryName": "Slovenia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Longyearbyen", + "languages": "no,ru", + "geonameId": 607072, + "south": 79.220306, + "isoAlpha3": "SJM", + "north": 80.762085, + "fipsCode": "SV", + "population": "2550", + "east": 33.287334, + "isoNumeric": "744", + "areaInSqKm": "62049.0", + "countryCode": "SJ", + "west": 17.699389, + "countryName": "Svalbard and Jan Mayen", + "continentName": "Europe", + "currencyCode": "NOK" + }, + { + "continent": "EU", + "capital": "Bratislava", + "languages": "sk,hu", + "geonameId": 3057568, + "south": 47.7313590000001, + "isoAlpha3": "SVK", + "north": 49.6137360000001, + "fipsCode": "LO", + "population": "5447011", + "east": 22.5657383340001, + "isoNumeric": "703", + "areaInSqKm": "48845.0", + "countryCode": "SK", + "west": 16.8334234020001, + "countryName": "Slovakia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Freetown", + "languages": "en-SL,men,tem", + "geonameId": 2403846, + "south": 6.92343700100002, + "isoAlpha3": "SLE", + "north": 9.99997300000007, + "fipsCode": "SL", + "population": "7650154", + "east": -10.2716829999999, + "isoNumeric": "694", + "areaInSqKm": "71740.0", + "countryCode": "SL", + "west": -13.302128077, + "countryName": "Sierra Leone", + "continentName": "Africa", + "currencyCode": "SLL" + }, + { + "continent": "EU", + "capital": "San Marino", + "languages": "it-SM", + "geonameId": 3168068, + "south": 43.8937002210188, + "isoAlpha3": "SMR", + "north": 43.9920929668161, + "fipsCode": "SM", + "population": "33785", + "east": 12.51584904544211, + "isoNumeric": "674", + "areaInSqKm": "61.2", + "countryCode": "SM", + "west": 12.403605260165023, + "countryName": "San Marino", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Dakar", + "languages": "fr-SN,wo,fuc,mnk", + "geonameId": 2245662, + "south": 12.307289079, + "isoAlpha3": "SEN", + "north": 16.6929572170001, + "fipsCode": "SG", + "population": "15854360", + "east": -11.345768371, + "isoNumeric": "686", + "areaInSqKm": "196190.0", + "countryCode": "SN", + "west": -17.529520035, + "countryName": "Senegal", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "AF", + "capital": "Mogadishu", + "languages": "so-SO,ar-SO,it,en-SO", + "geonameId": 51537, + "south": -1.66203236399997, + "isoAlpha3": "SOM", + "north": 11.9887353730001, + "fipsCode": "SO", + "population": "15008154", + "east": 51.4150313960001, + "isoNumeric": "706", + "areaInSqKm": "637657.0", + "countryCode": "SO", + "west": 40.9943730000001, + "countryName": "Somalia", + "continentName": "Africa", + "currencyCode": "SOS" + }, + { + "continent": "SA", + "capital": "Paramaribo", + "languages": "nl-SR,en,srn,hns,jv", + "geonameId": 3382998, + "south": 1.83730600000007, + "isoAlpha3": "SUR", + "north": 6.01550458300005, + "fipsCode": "NS", + "population": "575991", + "east": -53.978763, + "isoNumeric": "740", + "areaInSqKm": "163270.0", + "countryCode": "SR", + "west": -58.070505999, + "countryName": "Suriname", + "continentName": "South America", + "currencyCode": "SRD" + }, + { + "continent": "AF", + "capital": "Juba", + "languages": "en", + "geonameId": 7909807, + "south": 3.48898000000003, + "isoAlpha3": "SSD", + "north": 12.236389, + "fipsCode": "OD", + "population": "8260490", + "east": 35.9489970000001, + "isoNumeric": "728", + "areaInSqKm": "644329.0", + "countryCode": "SS", + "west": 23.4408490000001, + "countryName": "South Sudan", + "continentName": "Africa", + "currencyCode": "SSP" + }, + { + "continent": "AF", + "capital": "São Tomé", + "languages": "pt-ST", + "geonameId": 2410758, + "south": 0.024766, + "isoAlpha3": "STP", + "north": 1.701323, + "fipsCode": "TP", + "population": "197700", + "east": 7.466374, + "isoNumeric": "678", + "areaInSqKm": "1001.0", + "countryCode": "ST", + "west": 6.47017, + "countryName": "São Tomé and Príncipe", + "continentName": "Africa", + "currencyCode": "STD" + }, + { + "continent": "NA", + "capital": "San Salvador", + "languages": "es-SV", + "geonameId": 3585968, + "south": 13.153004391, + "isoAlpha3": "SLV", + "north": 14.450557001, + "fipsCode": "ES", + "population": "6420744", + "east": -87.692162, + "isoNumeric": "222", + "areaInSqKm": "21040.0", + "countryCode": "SV", + "west": -90.134654476, + "countryName": "El Salvador", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Philipsburg", + "languages": "nl,en", + "geonameId": 7609695, + "south": 18.00509989712575, + "isoAlpha3": "SXM", + "north": 18.0641148010001, + "fipsCode": "NN", + "population": "40654", + "east": -63.01365933767215, + "isoNumeric": "534", + "areaInSqKm": "21.0", + "countryCode": "SX", + "west": -63.13916381600001, + "countryName": "Sint Maarten", + "continentName": "North America", + "currencyCode": "ANG" + }, + { + "continent": "AS", + "capital": "Damascus", + "languages": "ar-SY,ku,hy,arc,fr,en", + "geonameId": 163843, + "south": 32.311136, + "isoAlpha3": "SYR", + "north": 37.3205689060001, + "fipsCode": "SY", + "population": "16906283", + "east": 42.376309, + "isoNumeric": "760", + "areaInSqKm": "185180.0", + "countryCode": "SY", + "west": 35.587211, + "countryName": "Syria", + "continentName": "Asia", + "currencyCode": "SYP" + }, + { + "continent": "AF", + "capital": "Mbabane", + "languages": "en-SZ,ss-SZ", + "geonameId": 934841, + "south": -27.317402, + "isoAlpha3": "SWZ", + "north": -25.7179199999999, + "fipsCode": "WZ", + "population": "1136191", + "east": 32.1349066610001, + "isoNumeric": "748", + "areaInSqKm": "17363.0", + "countryCode": "SZ", + "west": 30.7906400000001, + "countryName": "Eswatini", + "continentName": "Africa", + "currencyCode": "SZL" + }, + { + "continent": "NA", + "capital": "Cockburn Town", + "languages": "en-TC", + "geonameId": 3576916, + "south": 21.422626, + "isoAlpha3": "TCA", + "north": 21.961878, + "fipsCode": "TK", + "population": "37665", + "east": -71.123642, + "isoNumeric": "796", + "areaInSqKm": "430.0", + "countryCode": "TC", + "west": -72.483871, + "countryName": "Turks and Caicos Islands", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "AF", + "capital": "N'Djamena", + "languages": "fr-TD,ar-TD,sre", + "geonameId": 2434508, + "south": 7.44297500000005, + "isoAlpha3": "TCD", + "north": 23.4523611160001, + "fipsCode": "CD", + "population": "15477751", + "east": 24.0000000000001, + "isoNumeric": "148", + "areaInSqKm": "1284000.0", + "countryCode": "TD", + "west": 13.47, + "countryName": "Chad", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "AN", + "capital": "Port-aux-Français", + "languages": "fr", + "geonameId": 1546748, + "south": -49.735184, + "isoAlpha3": "ATF", + "north": -37.790722, + "fipsCode": "FS", + "population": "140", + "east": 77.598808, + "isoNumeric": "260", + "areaInSqKm": "7829.0", + "countryCode": "TF", + "west": 50.170258, + "countryName": "French Southern Territories", + "continentName": "Antarctica", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Lomé", + "languages": "fr-TG,ee,hna,kbp,dag,ha", + "geonameId": 2363686, + "south": 6.11225958700004, + "isoAlpha3": "TGO", + "north": 11.1394984250001, + "fipsCode": "TO", + "population": "7889094", + "east": 1.80890722900006, + "isoNumeric": "768", + "areaInSqKm": "56785.0", + "countryCode": "TG", + "west": -0.144041999999956, + "countryName": "Togo", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "AS", + "capital": "Bangkok", + "languages": "th,en", + "geonameId": 1605651, + "south": 5.61, + "isoAlpha3": "THA", + "north": 20.463194, + "fipsCode": "TH", + "population": "69428524", + "east": 105.639389, + "isoNumeric": "764", + "areaInSqKm": "514000.0", + "countryCode": "TH", + "west": 97.345642, + "countryName": "Thailand", + "continentName": "Asia", + "currencyCode": "THB" + }, + { + "continent": "AS", + "capital": "Dushanbe", + "languages": "tg,ru", + "geonameId": 1220409, + "south": 36.672037001, + "isoAlpha3": "TJK", + "north": 41.0443670000001, + "fipsCode": "TI", + "population": "9100837", + "east": 75.1539560000001, + "isoNumeric": "762", + "areaInSqKm": "143100.0", + "countryCode": "TJ", + "west": 67.3420120000001, + "countryName": "Tajikistan", + "continentName": "Asia", + "currencyCode": "TJS" + }, + { + "continent": "OC", + "capital": "", + "languages": "tkl,en-TK", + "geonameId": 4031074, + "south": -9.381111145019531, + "isoAlpha3": "TKL", + "north": -8.553613662719727, + "fipsCode": "TL", + "population": "1466", + "east": -171.21142578125, + "isoNumeric": "772", + "areaInSqKm": "10.0", + "countryCode": "TK", + "west": -172.50033569335938, + "countryName": "Tokelau", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "OC", + "capital": "Dili", + "languages": "tet,pt-TL,id,en", + "geonameId": 1966436, + "south": -9.504650115966797, + "isoAlpha3": "TLS", + "north": -8.12687015533447, + "fipsCode": "TT", + "population": "1267972", + "east": 127.34211730957031, + "isoNumeric": "626", + "areaInSqKm": "15007.0", + "countryCode": "TL", + "west": 124.04464721679688, + "countryName": "Timor-Leste", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "Ashgabat", + "languages": "tk,ru,uz", + "geonameId": 1218197, + "south": 35.1290930000001, + "isoAlpha3": "TKM", + "north": 42.7982617260001, + "fipsCode": "TX", + "population": "5850908", + "east": 66.7073530000001, + "isoNumeric": "795", + "areaInSqKm": "488100.0", + "countryCode": "TM", + "west": 52.4455780650001, + "countryName": "Turkmenistan", + "continentName": "Asia", + "currencyCode": "TMT" + }, + { + "continent": "AF", + "capital": "Tunis", + "languages": "ar-TN,fr", + "geonameId": 2464461, + "south": 30.2415834110001, + "isoAlpha3": "TUN", + "north": 37.5419886350001, + "fipsCode": "TS", + "population": "11565204", + "east": 11.608143339, + "isoNumeric": "788", + "areaInSqKm": "163610.0", + "countryCode": "TN", + "west": 7.52252789300007, + "countryName": "Tunisia", + "continentName": "Africa", + "currencyCode": "TND" + }, + { + "continent": "OC", + "capital": "Nuku'alofa", + "languages": "to,en-TO", + "geonameId": 4032283, + "south": -21.4564838739226, + "isoAlpha3": "TON", + "north": -15.566146670329, + "fipsCode": "TN", + "population": "103197", + "east": -173.902137947337, + "isoNumeric": "776", + "areaInSqKm": "748.0", + "countryCode": "TO", + "west": -175.67962556356, + "countryName": "Tonga", + "continentName": "Oceania", + "currencyCode": "TOP" + }, + { + "continent": "AS", + "capital": "Ankara", + "languages": "tr-TR,ku,diq,az,av", + "geonameId": 298795, + "south": 35.8121761290001, + "isoAlpha3": "TUR", + "north": 42.104895001, + "fipsCode": "TU", + "population": "82319724", + "east": 44.81812800000006, + "isoNumeric": "792", + "areaInSqKm": "780580.0", + "countryCode": "TR", + "west": 25.6665057269225, + "countryName": "Turkey", + "continentName": "Asia", + "currencyCode": "TRY" + }, + { + "continent": "NA", + "capital": "Port of Spain", + "languages": "en-TT,hns,fr,es,zh", + "geonameId": 3573591, + "south": 10.0411386500001, + "isoAlpha3": "TTO", + "north": 11.348472596, + "fipsCode": "TD", + "population": "1389858", + "east": -60.519332886, + "isoNumeric": "780", + "areaInSqKm": "5128.0", + "countryCode": "TT", + "west": -61.933723449, + "countryName": "Trinidad and Tobago", + "continentName": "North America", + "currencyCode": "TTD" + }, + { + "continent": "OC", + "capital": "Funafuti", + "languages": "tvl,en,sm,gil", + "geonameId": 2110297, + "south": -10.791580457901, + "isoAlpha3": "TUV", + "north": -5.64246006144929, + "fipsCode": "TV", + "population": "11508", + "east": 179.871049968689, + "isoNumeric": "798", + "areaInSqKm": "26.0", + "countryCode": "TV", + "west": 176.059056543963, + "countryName": "Tuvalu", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "AS", + "capital": "Taipei", + "languages": "zh-TW,zh,nan,hak", + "geonameId": 1668284, + "south": 21.896606934717, + "isoAlpha3": "TWN", + "north": 25.3002899036181, + "fipsCode": "TW", + "population": "22894384", + "east": 122.006739823315, + "isoNumeric": "158", + "areaInSqKm": "35980.0", + "countryCode": "TW", + "west": 119.534691, + "countryName": "Taiwan", + "continentName": "Asia", + "currencyCode": "TWD" + }, + { + "continent": "AF", + "capital": "Dodoma", + "languages": "sw-TZ,en,ar", + "geonameId": 149590, + "south": -11.761254, + "isoAlpha3": "TZA", + "north": -0.984396999999944, + "fipsCode": "TZ", + "population": "56318348", + "east": 40.4448279960001, + "isoNumeric": "834", + "areaInSqKm": "945087.0", + "countryCode": "TZ", + "west": 29.34, + "countryName": "Tanzania", + "continentName": "Africa", + "currencyCode": "TZS" + }, + { + "continent": "EU", + "capital": "Kyiv", + "languages": "uk,ru-UA,rom,pl,hu", + "geonameId": 690791, + "south": 44.3820571900001, + "isoAlpha3": "UKR", + "north": 52.3793713250001, + "fipsCode": "UP", + "population": "44622516", + "east": 40.22048033, + "isoNumeric": "804", + "areaInSqKm": "603700.0", + "countryCode": "UA", + "west": 22.137078, + "countryName": "Ukraine", + "continentName": "Europe", + "currencyCode": "UAH" + }, + { + "continent": "AF", + "capital": "Kampala", + "languages": "en-UG,lg,sw,ar", + "geonameId": 226074, + "south": -1.48153052848838, + "isoAlpha3": "UGA", + "north": 4.23136926690327, + "fipsCode": "UG", + "population": "42723139", + "east": 35.0010535324228, + "isoNumeric": "800", + "areaInSqKm": "236040.0", + "countryCode": "UG", + "west": 29.573465338129, + "countryName": "Uganda", + "continentName": "Africa", + "currencyCode": "UGX" + }, + { + "continent": "OC", + "capital": "", + "languages": "en-UM", + "geonameId": 5854968, + "south": -0.38256883746907566, + "isoAlpha3": "UMI", + "north": 28.218499990178167, + "fipsCode": "", + "population": "0", + "east": 166.657540716752, + "isoNumeric": "581", + "areaInSqKm": "0.0", + "countryCode": "UM", + "west": -177.39629361298717, + "countryName": "U.S. Minor Outlying Islands", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Washington", + "languages": "en-US,es-US,haw,fr", + "geonameId": 6252001, + "south": 24.544093, + "isoAlpha3": "USA", + "north": 49.384358, + "fipsCode": "US", + "population": "327167434", + "east": -66.949607, + "isoNumeric": "840", + "areaInSqKm": "9629091.0", + "countryCode": "US", + "west": -124.733692, + "countryName": "United States", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "SA", + "capital": "Montevideo", + "languages": "es-UY", + "geonameId": 3439705, + "south": -34.9740543027064, + "isoAlpha3": "URY", + "north": -30.0855024328825, + "fipsCode": "UY", + "population": "3449299", + "east": -53.1810509360802, + "isoNumeric": "858", + "areaInSqKm": "176220.0", + "countryCode": "UY", + "west": -58.4393489790361, + "countryName": "Uruguay", + "continentName": "South America", + "currencyCode": "UYU" + }, + { + "continent": "AS", + "capital": "Tashkent", + "languages": "uz,ru,tg", + "geonameId": 1512440, + "south": 37.172269828, + "isoAlpha3": "UZB", + "north": 45.5900750010001, + "fipsCode": "UZ", + "population": "32955400", + "east": 73.1489460000001, + "isoNumeric": "860", + "areaInSqKm": "447400.0", + "countryCode": "UZ", + "west": 55.9982180000001, + "countryName": "Uzbekistan", + "continentName": "Asia", + "currencyCode": "UZS" + }, + { + "continent": "EU", + "capital": "Vatican City", + "languages": "la,it,fr", + "geonameId": 3164670, + "south": 41.90027960306854, + "isoAlpha3": "VAT", + "north": 41.90743830885576, + "fipsCode": "VT", + "population": "921", + "east": 12.45837546629481, + "isoNumeric": "336", + "areaInSqKm": "0.44", + "countryCode": "VA", + "west": 12.44570678169205, + "countryName": "Vatican City", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "NA", + "capital": "Kingstown", + "languages": "en-VC,fr", + "geonameId": 3577815, + "south": 12.5839734740001, + "isoAlpha3": "VCT", + "north": 13.382421799995889, + "fipsCode": "VC", + "population": "110211", + "east": -61.11340272108896, + "isoNumeric": "670", + "areaInSqKm": "389.0", + "countryCode": "VC", + "west": -61.4608524069999, + "countryName": "St Vincent and Grenadines", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "SA", + "capital": "Caracas", + "languages": "es-VE", + "geonameId": 3625428, + "south": 0.626311, + "isoAlpha3": "VEN", + "north": 12.201903, + "fipsCode": "VE", + "population": "28870195", + "east": -59.80378, + "isoNumeric": "862", + "areaInSqKm": "912050.0", + "countryCode": "VE", + "west": -73.354073, + "countryName": "Venezuela", + "continentName": "South America", + "currencyCode": "VES" + }, + { + "continent": "NA", + "capital": "Road Town", + "languages": "en-VG", + "geonameId": 3577718, + "south": 18.383710898211305, + "isoAlpha3": "VGB", + "north": 18.757221, + "fipsCode": "VI", + "population": "29802", + "east": -64.268768, + "isoNumeric": "092", + "areaInSqKm": "153.0", + "countryCode": "VG", + "west": -64.71312752730364, + "countryName": "British Virgin Islands", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Charlotte Amalie", + "languages": "en-VI", + "geonameId": 4796775, + "south": 17.673931, + "isoAlpha3": "VIR", + "north": 18.415382, + "fipsCode": "VQ", + "population": "106977", + "east": -64.565193, + "isoNumeric": "850", + "areaInSqKm": "352.0", + "countryCode": "VI", + "west": -65.101333, + "countryName": "U.S. Virgin Islands", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "Hanoi", + "languages": "vi,en,fr,zh,km", + "geonameId": 1562822, + "south": 8.559611, + "isoAlpha3": "VNM", + "north": 23.388834, + "fipsCode": "VM", + "population": "95540395", + "east": 109.464638, + "isoNumeric": "704", + "areaInSqKm": "329560.0", + "countryCode": "VN", + "west": 102.148224, + "countryName": "Vietnam", + "continentName": "Asia", + "currencyCode": "VND" + }, + { + "continent": "OC", + "capital": "Port Vila", + "languages": "bi,en-VU,fr-VU", + "geonameId": 2134431, + "south": -20.2524399918312, + "isoAlpha3": "VUT", + "north": -13.0717069251352, + "fipsCode": "NH", + "population": "292680", + "east": 169.904111113607, + "isoNumeric": "548", + "areaInSqKm": "12200.0", + "countryCode": "VU", + "west": 166.541563758726, + "countryName": "Vanuatu", + "continentName": "Oceania", + "currencyCode": "VUV" + }, + { + "continent": "OC", + "capital": "Mata-Utu", + "languages": "wls,fud,fr-WF", + "geonameId": 4034749, + "south": -14.3124693963595, + "isoAlpha3": "WLF", + "north": -13.2169133113924, + "fipsCode": "WF", + "population": "16025", + "east": -176.161967235958, + "isoNumeric": "876", + "areaInSqKm": "274.0", + "countryCode": "WF", + "west": -178.181766889147, + "countryName": "Wallis and Futuna", + "continentName": "Oceania", + "currencyCode": "XPF" + }, + { + "continent": "OC", + "capital": "Apia", + "languages": "sm,en-WS", + "geonameId": 4034894, + "south": -14.049015687969286, + "isoAlpha3": "WSM", + "north": -13.440157771394277, + "fipsCode": "WS", + "population": "196130", + "east": -171.42329410058596, + "isoNumeric": "882", + "areaInSqKm": "2944.0", + "countryCode": "WS", + "west": -172.8035771799316, + "countryName": "Samoa", + "continentName": "Oceania", + "currencyCode": "WST" + }, + { + "continent": "EU", + "capital": "Pristina", + "languages": "sq,sr", + "geonameId": 831053, + "south": 41.857641001, + "isoAlpha3": "XKX", + "north": 43.2676851730001, + "fipsCode": "KV", + "population": "1845300", + "east": 21.7898670000001, + "isoNumeric": "0", + "areaInSqKm": "10908.0", + "countryCode": "XK", + "west": 20.014284, + "countryName": "Kosovo", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "Sanaa", + "languages": "ar-YE", + "geonameId": 69543, + "south": 12.1110910264462, + "isoAlpha3": "YEM", + "north": 18.9999989031009, + "fipsCode": "YM", + "population": "28498687", + "east": 54.5305388163283, + "isoNumeric": "887", + "areaInSqKm": "527970.0", + "countryCode": "YE", + "west": 42.5325394314234, + "countryName": "Yemen", + "continentName": "Asia", + "currencyCode": "YER" + }, + { + "continent": "AF", + "capital": "Mamoudzou", + "languages": "fr-YT", + "geonameId": 1024031, + "south": -13.0000903911179, + "isoAlpha3": "MYT", + "north": -12.6507257773157, + "fipsCode": "MF", + "population": "159042", + "east": 45.2999850886235, + "isoNumeric": "175", + "areaInSqKm": "374.0", + "countryCode": "YT", + "west": 45.0398136630555, + "countryName": "Mayotte", + "continentName": "Africa", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Pretoria", + "languages": "zu,xh,af,nso,en-ZA,tn,st,ts,ss,ve,nr", + "geonameId": 953987, + "south": -34.8341700029999, + "isoAlpha3": "ZAF", + "north": -22.1250300579999, + "fipsCode": "SF", + "population": "57779622", + "east": 32.944984945, + "isoNumeric": "710", + "areaInSqKm": "1219912.0", + "countryCode": "ZA", + "west": 16.45189, + "countryName": "South Africa", + "continentName": "Africa", + "currencyCode": "ZAR" + }, + { + "continent": "AF", + "capital": "Lusaka", + "languages": "en-ZM,bem,loz,lun,lue,ny,toi", + "geonameId": 895949, + "south": -18.077418, + "isoAlpha3": "ZMB", + "north": -8.20328399999994, + "fipsCode": "ZA", + "population": "17351822", + "east": 33.7090304810001, + "isoNumeric": "894", + "areaInSqKm": "752614.0", + "countryCode": "ZM", + "west": 21.999350925, + "countryName": "Zambia", + "continentName": "Africa", + "currencyCode": "ZMW" + }, + { + "continent": "AF", + "capital": "Harare", + "languages": "en-ZW,sn,nr,nd", + "geonameId": 878675, + "south": -22.421998999, + "isoAlpha3": "ZWE", + "north": -15.609318999, + "fipsCode": "ZI", + "population": "14439018", + "east": 33.0682360000001, + "isoNumeric": "716", + "areaInSqKm": "390580.0", + "countryCode": "ZW", + "west": 25.2373680000001, + "countryName": "Zimbabwe", + "continentName": "Africa", + "currencyCode": "ZWL" + } +]} \ No newline at end of file diff --git a/ListCollection/README.md b/ListCollection/README.md new file mode 100644 index 0000000..66c8eaf --- /dev/null +++ b/ListCollection/README.md @@ -0,0 +1,40 @@ +# Creating List Layouts with UICollectionView + +Sample code for using the iOS 14 list layout collection view, diffable data source and cell configurations. See the following post for more details: + +* [Creating lists with collection view](https://useyourloaf.com/blog/creating-lists-with-collection-view/) + +# License + +Copyright © 2020 Keith Harrison. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +## GeoNames + +The [GeoNames](https://www.geonames.org/) geographical data used in this sample code is licenced under [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/). diff --git a/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..82343ea --- /dev/null +++ b/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8816e0d --- /dev/null +++ b/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2508c96 --- /dev/null +++ b/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1a89b2a --- /dev/null +++ b/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..502ca7c --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RemindMe10/RemindMe.xcodeproj/project.pbxproj b/RemindMe10/RemindMe.xcodeproj/project.pbxproj index f91d866..1302899 100644 --- a/RemindMe10/RemindMe.xcodeproj/project.pbxproj +++ b/RemindMe10/RemindMe.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -175,8 +175,9 @@ 53BA9AED1DB283D7000BD07D /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1620; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 539D5EB81DC4DBF500130F2F = { @@ -302,7 +303,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMeObjc/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -314,7 +318,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMeObjc/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -345,6 +352,7 @@ 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; @@ -356,6 +364,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -370,13 +379,13 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -406,6 +415,7 @@ 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; @@ -417,6 +427,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -425,11 +436,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -441,10 +453,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMe/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -454,10 +469,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMe/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Release; }; diff --git a/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..04b85c1 --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift index 85e52f5..1de436b 100644 --- a/RemindMe10/RemindMe/AppDelegate.swift +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -34,14 +34,14 @@ import UIKit import UserNotifications -@UIApplicationMain +@main class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let notificationDelegate = UYLNotificationDelegate() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { - let options: UNAuthorizationOptions = [.alert, .sound]; + let options: UNAuthorizationOptions = [.alert, .sound] registerForLocalNotifications(options: options) let center = UNUserNotificationCenter.current() center.delegate = notificationDelegate diff --git a/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..939427d --- /dev/null +++ b/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a861032 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScaledFont/ScaledFont/Noteworthy.plist b/ScaledFont/Fonts/Noteworthy.plist similarity index 78% rename from ScaledFont/ScaledFont/Noteworthy.plist rename to ScaledFont/Fonts/Noteworthy.plist index 4395e75..9714135 100644 --- a/ScaledFont/ScaledFont/Noteworthy.plist +++ b/ScaledFont/Fonts/Noteworthy.plist @@ -2,77 +2,77 @@ - UICTFontTextStyleTitle0 + largeTitle fontName Noteworthy-Light fontSize 34 - UICTFontTextStyleTitle1 + title fontName Noteworthy-Light fontSize 28 - UICTFontTextStyleTitle2 + title2 fontName Noteworthy-Light fontSize 22 - UICTFontTextStyleTitle3 + title3 fontName Noteworthy-Light fontSize 20 - UICTFontTextStyleHeadline + headline fontName Noteworthy-Bold fontSize 17 - UICTFontTextStyleSubhead + subheadline fontName Noteworthy-Light fontSize 15 - UICTFontTextStyleBody + body fontName Noteworthy-Light fontSize 17 - UICTFontTextStyleCallout + callout fontName Noteworthy-Light fontSize 16 - UICTFontTextStyleFootnote + footnote fontName Noteworthy-Light fontSize 13 - UICTFontTextStyleCaption1 + caption fontName Noteworthy-Light fontSize 12 - UICTFontTextStyleCaption2 + caption2 fontName Noteworthy-Light diff --git a/ScaledFont/ScaledFont/NotoSerif.plist b/ScaledFont/Fonts/NotoSerif.plist similarity index 78% rename from ScaledFont/ScaledFont/NotoSerif.plist rename to ScaledFont/Fonts/NotoSerif.plist index 2d35c45..79f5db2 100644 --- a/ScaledFont/ScaledFont/NotoSerif.plist +++ b/ScaledFont/Fonts/NotoSerif.plist @@ -2,77 +2,77 @@ - UICTFontTextStyleTitle0 + largeTitle fontName NotoSerif fontSize 34 - UICTFontTextStyleTitle1 + title fontName NotoSerif fontSize 28 - UICTFontTextStyleTitle2 + title2 fontName NotoSerif fontSize 22 - UICTFontTextStyleTitle3 + title3 fontName NotoSerif fontSize 20 - UICTFontTextStyleHeadline + headline fontName NotoSerif-Bold fontSize 17 - UICTFontTextStyleSubhead + subheadline fontName NotoSerif-Italic fontSize 15 - UICTFontTextStyleBody + body fontName NotoSerif fontSize 17 - UICTFontTextStyleCallout + callout fontName NotoSerif fontSize 16 - UICTFontTextStyleFootnote + footnote fontName NotoSerif fontSize 13 - UICTFontTextStyleCaption1 + caption fontName NotoSerif-Italic fontSize 12 - UICTFontTextStyleCaption2 + caption2 fontName NotoSerif-Italic diff --git a/ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt b/ScaledFont/Fonts/Noto_Serif/LICENSE.txt similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt rename to ScaledFont/Fonts/Noto_Serif/LICENSE.txt diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Bold.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Bold.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-BoldItalic.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-BoldItalic.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Italic.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Italic.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Regular.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Regular.ttf diff --git a/ScaledFont/README.md b/ScaledFont/README.md index d54fccd..2e30463 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -2,43 +2,86 @@ ## Using Dynamic Type With Custom Fonts -An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the Noto Serif font which was downloaded from google fonts: +An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font that Apple ships built-in to iOS and the Noto Serif font which you can download from google fonts: + [Noto Serif](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif) -*Refer to LICENSE.txt if you plan on using Noto Serif in a shipping application.* +*See the LICENSE.txt file if you plan on using Noto Serif in a shipping application.* -**This project requires iOS 11** +## Sample Targets -### ScaledFont +There are two targets in this project: -A utility class to help you use custom fonts with dynamic type. ++ Sampler - A UIKit example that requires a minimum of iOS 11 ++ SamplerUI - A SwiftUI example that requires a minimum of iOS 14 -To use this class you must supply the name of a style dictionary for the font when creating the class. The style dictionary should be stored as a property list file in the main bundle. +## Swift Package -The style dictionary contains an entry for each text style that uses the raw string value for each `UIFontTextStyle` as the key. +The ScaledFont implementation is now provided as a Swift Package Manager dependency. You can find the GitHub repository for the package here: + ++ [ScaledFont on GitHub](https://github.com/kharrison/ScaledFont) + +## ScaledFont Details + +The `ScaledFont` type is a utility type to help you use custom fonts with dynamic type. You must give the name of a style dictionary for the font when creating the `ScaledFont`. You include the style dictionary as a property list file in the main bundle of your app. + +The style dictionary contains an entry for each text style. The available text styles are: + ++ `largeTitle`, `title`, `title2`, `title3` ++ `headline`, `subheadline`, `body`, `callout` ++ `footnote`, `caption`, `caption2` The value of each entry is a dictionary with two keys: -+ fontName: A String which is the font name. -+ fontSize: A number which is the point size to use at the `.large` content size. ++ `fontName`: A `String` which is the font name. ++ `fontSize`: A number which is the point size to use at the `.large` (base) content size. For example to use a 17 pt Noteworthy-Bold font for the `.headline` style at the `.large` content size: - - UICTFontTextStyleHeadline - - fontName - Noteworthy-Bold - fontSize - 17 - - +``` + + headline + + fontName + Noteworthy-Bold + fontSize + 17 + + +``` You do not need to include an entry for every text style but if you try to use a text style that is not included in the dictionary it will fallback to the system preferred font. -### Further Details +## Using With UIKit + +For `UIKit`, apply the scaled font to text labels, text fields or text views: + + ```swift +let scaledFont = ScaledFont(fontName: "Noteworthy") +label.font = scaledFont.font(forTextStyle: .headline) +label.adjustsFontForContentSizeCategory = true +``` + +Remember to set the `adjustsFontFotContentSizeCategory` property to have the font size adjust automatically when the user changes their preferred content size. + +## Using With SwiftUI + +For `SwiftUI`, add the scaled font to the environment of a view: + + ```swift +ContentView() +.environment(\.scaledFont, scaledFont) +``` + +Then apply the scaled fint view modifier to any view containing text in the view hierarchy: + + ```swift +Text("Headline") +.scaledFont(.headline) +``` +## Further Details -See the following blog post for further details: +See these blog posts for further details: + [Using A Custom Font With Dynamic Type](https://useyourloaf.com/blog/using-a-custom-font-with-dynamic-type/) ++ [Scaling Custom SwiftUI Fonts With Dynamic Type](https://useyourloaf.com/blog/scaling-custom-swiftui-fonts-with-dynamic-type/) diff --git a/ScaledFont/Sampler/AppDelegate.swift b/ScaledFont/Sampler/AppDelegate.swift new file mode 100644 index 0000000..ed37160 --- /dev/null +++ b/ScaledFont/Sampler/AppDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { +} diff --git a/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json b/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ScaledFont/Sampler/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/ScaledFont/Sampler/Assets.xcassets/Contents.json b/ScaledFont/Sampler/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Base.lproj/Main.storyboard b/ScaledFont/Sampler/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b831831 --- /dev/null +++ b/ScaledFont/Sampler/Base.lproj/Main.storyboard @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScaledFont/Sampler/Info.plist b/ScaledFont/Sampler/Info.plist new file mode 100644 index 0000000..0622451 --- /dev/null +++ b/ScaledFont/Sampler/Info.plist @@ -0,0 +1,75 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UIMainStoryboardFile + Main + UILaunchScreen + + UINavigationBar + + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + + + diff --git a/ScaledFont/Sampler/SceneDelegate.swift b/ScaledFont/Sampler/SceneDelegate.swift new file mode 100644 index 0000000..80bb407 --- /dev/null +++ b/ScaledFont/Sampler/SceneDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/ScaledFont/ScaledFont/ViewController.swift b/ScaledFont/Sampler/StyleViewController.swift similarity index 96% rename from ScaledFont/ScaledFont/ViewController.swift rename to ScaledFont/Sampler/StyleViewController.swift index 315a7fd..d11b721 100644 --- a/ScaledFont/ScaledFont/ViewController.swift +++ b/ScaledFont/Sampler/StyleViewController.swift @@ -1,5 +1,4 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright © 2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -27,9 +26,10 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. +import ScaledFont import UIKit -class ViewController: UIViewController { +final class StyleViewController: UIViewController { // private let fontName = "Default" // private let fontName = "Noteworthy" private let fontName = "NotoSerif" diff --git a/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ScaledFont/SamplerUI/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/ScaledFont/SamplerUI/Assets.xcassets/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/ScaledFont/Info.plist b/ScaledFont/SamplerUI/Info.plist similarity index 82% rename from ScaledFont/ScaledFont/Info.plist rename to ScaledFont/SamplerUI/Info.plist index 24cd042..d7f7654 100644 --- a/ScaledFont/ScaledFont/Info.plist +++ b/ScaledFont/SamplerUI/Info.plist @@ -13,23 +13,25 @@ CFBundleName $(PRODUCT_NAME) CFBundlePackageType - APPL + $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 CFBundleVersion 1 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIAppFonts - - NotoSerif-Regular.ttf - NotoSerif-Bold.ttf - NotoSerif-Italic.ttf - + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIApplicationSupportsIndirectInputEvents + + UILaunchScreen + + UINavigationBar + + UIRequiredDeviceCapabilities armv7 @@ -39,7 +41,6 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad @@ -48,5 +49,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + diff --git a/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json b/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/SamplerUIApp.swift b/ScaledFont/SamplerUI/SamplerUIApp.swift new file mode 100644 index 0000000..d85ee8e --- /dev/null +++ b/ScaledFont/SamplerUI/SamplerUIApp.swift @@ -0,0 +1,44 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import ScaledFont +import SwiftUI + +@main +struct SamplerUIApp: App { +// let fontName = "Default" + let fontName = "Noteworthy" +// let fontName = "NotoSerif" + + var body: some Scene { + WindowGroup { + StyleView(fontName: fontName) + .environment(\.scaledFont, ScaledFont(fontName: fontName)) + } + } +} diff --git a/ScaledFont/SamplerUI/StyleView.swift b/ScaledFont/SamplerUI/StyleView.swift new file mode 100644 index 0000000..93f6160 --- /dev/null +++ b/ScaledFont/SamplerUI/StyleView.swift @@ -0,0 +1,100 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import ScaledFont +import SwiftUI + +struct StyleView: View { + let fontName: String + + var body: some View { + NavigationView { + ScrollView { + TextStyles() + } + .navigationBarTitle(fontName, displayMode: .inline) + } + } +} + +private struct TextStyles: View { + var defaultSpacing: CGFloat = 8.0 + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: defaultSpacing) { + Text("Title 1") + .scaledFont(.title) + + if #available(iOS 14.0, *) { + Text("Title 2") + .scaledFont(.title2) + } + + if #available(iOS 14.0, *) { + Text("Title 3") + .scaledFont(.title3) + } + + Text("Headline") + .scaledFont(.headline) + + Text("Subheadline") + .scaledFont(.subheadline) + + Text("Body") + .scaledFont(.body) + + Text("Callout") + .scaledFont(.callout) + + Text("Footnote") + .scaledFont(.footnote) + + Text("Caption 1") + .scaledFont(.caption) + + if #available(iOS 14.0, *) { + Text("Caption 2") + .scaledFont(.caption2) + } + } + .padding() + .frame(maxWidth: .infinity, alignment: .leading) + } + } +} + +struct ContentView_Previews: PreviewProvider { + static let fontName = "Noteworthy" + + static var previews: some View { + StyleView(fontName: fontName) + .environment(\.scaledFont, ScaledFont(fontName: fontName)) + } +} diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index 59a6cc6..c209d8b 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -3,24 +3,41 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ - 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; - 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; - 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; - 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; - 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; - 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */; }; - 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919201F3FA05700FF9E25 /* ViewController.swift */; }; - 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919221F3FA05700FF9E25 /* Main.storyboard */; }; - 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 537919251F3FA05700FF9E25 /* Assets.xcassets */; }; - 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */; }; - 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919301F3FA0B500FF9E25 /* ScaledFont.swift */; }; + 53581E7A25F7D6B6000DAD54 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */; }; + 53581E7C25F7D6B6000DAD54 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */; }; + 53581E7E25F7D6B6000DAD54 /* StyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */; }; + 53581E8125F7D6B6000DAD54 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53581E7F25F7D6B6000DAD54 /* Main.storyboard */; }; + 53581E8325F7D6B6000DAD54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53581E8225F7D6B6000DAD54 /* Assets.xcassets */; }; + 53581E8E25F7D6C0000DAD54 /* ScaledFont in Frameworks */ = {isa = PBXBuildFile; productRef = 53581E8D25F7D6C0000DAD54 /* ScaledFont */; }; + 53581E9325F7DEFF000DAD54 /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 53581E9725F7DF07000DAD54 /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 53581E9925F7DF0A000DAD54 /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; + 53581E9C25F7DF19000DAD54 /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 53581E9E25F7DF1B000DAD54 /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 53A0BBE925F912AF0061BB67 /* SamplerUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */; }; + 53A0BBEB25F912AF0061BB67 /* StyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A0BBEA25F912AF0061BB67 /* StyleView.swift */; }; + 53A0BBED25F912B00061BB67 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A0BBEC25F912B00061BB67 /* Assets.xcassets */; }; + 53A0BBF025F912B00061BB67 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */; }; + 53A0BC0625F916180061BB67 /* ScaledFont in Frameworks */ = {isa = PBXBuildFile; productRef = 53A0BC0525F916180061BB67 /* ScaledFont */; }; + 53A0BC0925F9193F0061BB67 /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 53A0BC0C25F919420061BB67 /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 53A0BC0F25F919480061BB67 /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 53A0BC1225F9194B0061BB67 /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 53A0BC1525F9194F0061BB67 /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 53581E7725F7D6B6000DAD54 /* Sampler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sampler.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleViewController.swift; sourceTree = ""; }; + 53581E8025F7D6B6000DAD54 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53581E8225F7D6B6000DAD54 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53581E8725F7D6B6000DAD54 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 537709DD1F40AFD80041A64F /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Bold.ttf"; sourceTree = ""; }; 537709DF1F40AFD80041A64F /* NotoSerif-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-BoldItalic.ttf"; sourceTree = ""; }; @@ -28,28 +45,55 @@ 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Regular.ttf"; sourceTree = ""; }; 537709E51F40B18B0041A64F /* NotoSerif.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = NotoSerif.plist; sourceTree = ""; }; 537709E71F40F3B80041A64F /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 5379191B1F3FA05700FF9E25 /* ScaledFont.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScaledFont.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 537919201F3FA05700FF9E25 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 537919231F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 537919251F3FA05700FF9E25 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 537919281F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 5379192A1F3FA05700FF9E25 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 537919301F3FA0B500FF9E25 /* ScaledFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScaledFont.swift; sourceTree = ""; }; 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Noteworthy.plist; sourceTree = ""; }; + 53A0BBE625F912AF0061BB67 /* SamplerUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SamplerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplerUIApp.swift; sourceTree = ""; }; + 53A0BBEA25F912AF0061BB67 /* StyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleView.swift; sourceTree = ""; }; + 53A0BBEC25F912B00061BB67 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 53A0BBF125F912B00061BB67 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 537919181F3FA05700FF9E25 /* Frameworks */ = { + 53581E7425F7D6B6000DAD54 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 53581E8E25F7D6C0000DAD54 /* ScaledFont in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE325F912AF0061BB67 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A0BC0625F916180061BB67 /* ScaledFont in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53581E7825F7D6B6000DAD54 /* Sampler */ = { + isa = PBXGroup; + children = ( + 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */, + 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */, + 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */, + 53581E7F25F7D6B6000DAD54 /* Main.storyboard */, + 53581E8225F7D6B6000DAD54 /* Assets.xcassets */, + 53581E8725F7D6B6000DAD54 /* Info.plist */, + ); + path = Sampler; + sourceTree = ""; + }; + 53581E8C25F7D6C0000DAD54 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; 537709DC1F40AFD80041A64F /* Noto_Serif */ = { isa = PBXGroup; children = ( @@ -66,54 +110,94 @@ isa = PBXGroup; children = ( 537709E71F40F3B80041A64F /* README.md */, - 5379191D1F3FA05700FF9E25 /* ScaledFont */, + 5379191D1F3FA05700FF9E25 /* Fonts */, + 53581E7825F7D6B6000DAD54 /* Sampler */, + 53A0BBE725F912AF0061BB67 /* SamplerUI */, 5379191C1F3FA05700FF9E25 /* Products */, + 53581E8C25F7D6C0000DAD54 /* Frameworks */, ); sourceTree = ""; }; 5379191C1F3FA05700FF9E25 /* Products */ = { isa = PBXGroup; children = ( - 5379191B1F3FA05700FF9E25 /* ScaledFont.app */, + 53581E7725F7D6B6000DAD54 /* Sampler.app */, + 53A0BBE625F912AF0061BB67 /* SamplerUI.app */, ); name = Products; sourceTree = ""; }; - 5379191D1F3FA05700FF9E25 /* ScaledFont */ = { + 5379191D1F3FA05700FF9E25 /* Fonts */ = { isa = PBXGroup; children = ( 537709DC1F40AFD80041A64F /* Noto_Serif */, - 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */, - 537919201F3FA05700FF9E25 /* ViewController.swift */, - 537919301F3FA0B500FF9E25 /* ScaledFont.swift */, 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */, 537709E51F40B18B0041A64F /* NotoSerif.plist */, - 537919221F3FA05700FF9E25 /* Main.storyboard */, - 537919251F3FA05700FF9E25 /* Assets.xcassets */, - 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */, - 5379192A1F3FA05700FF9E25 /* Info.plist */, ); - path = ScaledFont; + path = Fonts; + sourceTree = ""; + }; + 53A0BBE725F912AF0061BB67 /* SamplerUI */ = { + isa = PBXGroup; + children = ( + 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */, + 53A0BBEA25F912AF0061BB67 /* StyleView.swift */, + 53A0BBEC25F912B00061BB67 /* Assets.xcassets */, + 53A0BBF125F912B00061BB67 /* Info.plist */, + 53A0BBEE25F912B00061BB67 /* Preview Content */, + ); + path = SamplerUI; + sourceTree = ""; + }; + 53A0BBEE25F912B00061BB67 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 5379191A1F3FA05700FF9E25 /* ScaledFont */ = { + 53581E7625F7D6B6000DAD54 /* Sampler */ = { isa = PBXNativeTarget; - buildConfigurationList = 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */; + buildConfigurationList = 53581E8825F7D6B6000DAD54 /* Build configuration list for PBXNativeTarget "Sampler" */; buildPhases = ( - 537919171F3FA05700FF9E25 /* Sources */, - 537919181F3FA05700FF9E25 /* Frameworks */, - 537919191F3FA05700FF9E25 /* Resources */, + 53581E7325F7D6B6000DAD54 /* Sources */, + 53581E7425F7D6B6000DAD54 /* Frameworks */, + 53581E7525F7D6B6000DAD54 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = ScaledFont; - productName = ScaledFont; - productReference = 5379191B1F3FA05700FF9E25 /* ScaledFont.app */; + name = Sampler; + packageProductDependencies = ( + 53581E8D25F7D6C0000DAD54 /* ScaledFont */, + ); + productName = Sampler; + productReference = 53581E7725F7D6B6000DAD54 /* Sampler.app */; + productType = "com.apple.product-type.application"; + }; + 53A0BBE525F912AF0061BB67 /* SamplerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53A0BBF225F912B00061BB67 /* Build configuration list for PBXNativeTarget "SamplerUI" */; + buildPhases = ( + 53A0BBE225F912AF0061BB67 /* Sources */, + 53A0BBE325F912AF0061BB67 /* Frameworks */, + 53A0BBE425F912AF0061BB67 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SamplerUI; + packageProductDependencies = ( + 53A0BC0525F916180061BB67 /* ScaledFont */, + ); + productName = SamplerUI; + productReference = 53A0BBE625F912AF0061BB67 /* SamplerUI.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -122,13 +206,15 @@ 537919131F3FA05700FF9E25 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0940; + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1310; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { - 5379191A1F3FA05700FF9E25 = { - CreatedOnToolsVersion = 9.0; - LastSwiftMigration = 1020; + 53581E7625F7D6B6000DAD54 = { + CreatedOnToolsVersion = 12.4; + }; + 53A0BBE525F912AF0061BB67 = { + CreatedOnToolsVersion = 12.4; }; }; }; @@ -141,66 +227,129 @@ Base, ); mainGroup = 537919121F3FA05700FF9E25; + packageReferences = ( + 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */, + ); productRefGroup = 5379191C1F3FA05700FF9E25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 5379191A1F3FA05700FF9E25 /* ScaledFont */, + 53581E7625F7D6B6000DAD54 /* Sampler */, + 53A0BBE525F912AF0061BB67 /* SamplerUI */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 537919191F3FA05700FF9E25 /* Resources */ = { + 53581E7525F7D6B6000DAD54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53581E8325F7D6B6000DAD54 /* Assets.xcassets in Resources */, + 53581E9925F7DF0A000DAD54 /* NotoSerif-Regular.ttf in Resources */, + 53581E9725F7DF07000DAD54 /* NotoSerif-Italic.ttf in Resources */, + 53581E9C25F7DF19000DAD54 /* Noteworthy.plist in Resources */, + 53581E9325F7DEFF000DAD54 /* NotoSerif-Bold.ttf in Resources */, + 53581E9E25F7DF1B000DAD54 /* NotoSerif.plist in Resources */, + 53581E8125F7D6B6000DAD54 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE425F912AF0061BB67 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */, - 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */, - 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */, - 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */, - 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */, - 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */, - 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */, - 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */, + 53A0BC0925F9193F0061BB67 /* Noteworthy.plist in Resources */, + 53A0BBF025F912B00061BB67 /* Preview Assets.xcassets in Resources */, + 53A0BC1225F9194B0061BB67 /* NotoSerif-Italic.ttf in Resources */, + 53A0BC1525F9194F0061BB67 /* NotoSerif-Regular.ttf in Resources */, + 53A0BC0F25F919480061BB67 /* NotoSerif-Bold.ttf in Resources */, + 53A0BC0C25F919420061BB67 /* NotoSerif.plist in Resources */, + 53A0BBED25F912B00061BB67 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 537919171F3FA05700FF9E25 /* Sources */ = { + 53581E7325F7D6B6000DAD54 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */, - 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */, - 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */, + 53581E7E25F7D6B6000DAD54 /* StyleViewController.swift in Sources */, + 53581E7A25F7D6B6000DAD54 /* AppDelegate.swift in Sources */, + 53581E7C25F7D6B6000DAD54 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE225F912AF0061BB67 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A0BBEB25F912AF0061BB67 /* StyleView.swift in Sources */, + 53A0BBE925F912AF0061BB67 /* SamplerUIApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 537919221F3FA05700FF9E25 /* Main.storyboard */ = { + 53581E7F25F7D6B6000DAD54 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 537919231F3FA05700FF9E25 /* Base */, + 53581E8025F7D6B6000DAD54 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 537919281F3FA05700FF9E25 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 53581E8925F7D6B6000DAD54 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Sampler/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Sampler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53581E8A25F7D6B6000DAD54 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Sampler/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Sampler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 5379192B1F3FA05700FF9E25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -226,6 +375,7 @@ 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; @@ -251,7 +401,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -285,6 +435,7 @@ 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; @@ -304,7 +455,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -313,34 +464,49 @@ }; name = Release; }; - 5379192E1F3FA05700FF9E25 /* Debug */ = { + 53A0BBF325F912B00061BB67 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"SamplerUI/Preview Content\""; DEVELOPMENT_TEAM = LCC2J94N44; - INFOPLIST_FILE = ScaledFont/Info.plist; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SamplerUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.SamplerUI; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 5379192F1F3FA05700FF9E25 /* Release */ = { + 53A0BBF425F912B00061BB67 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"SamplerUI/Preview Content\""; DEVELOPMENT_TEAM = LCC2J94N44; - INFOPLIST_FILE = ScaledFont/Info.plist; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SamplerUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.SamplerUI; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -350,6 +516,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 53581E8825F7D6B6000DAD54 /* Build configuration list for PBXNativeTarget "Sampler" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53581E8925F7D6B6000DAD54 /* Debug */, + 53581E8A25F7D6B6000DAD54 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 537919161F3FA05700FF9E25 /* Build configuration list for PBXProject "ScaledFont" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -359,16 +534,40 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */ = { + 53A0BBF225F912B00061BB67 /* Build configuration list for PBXNativeTarget "SamplerUI" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5379192E1F3FA05700FF9E25 /* Debug */, - 5379192F1F3FA05700FF9E25 /* Release */, + 53A0BBF325F912B00061BB67 /* Debug */, + 53A0BBF425F912B00061BB67 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "git@github.com:kharrison/ScaledFont.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 53581E8D25F7D6C0000DAD54 /* ScaledFont */ = { + isa = XCSwiftPackageProductDependency; + package = 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */; + productName = ScaledFont; + }; + 53A0BC0525F916180061BB67 /* ScaledFont */ = { + isa = XCSwiftPackageProductDependency; + package = 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */; + productName = ScaledFont; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 537919131F3FA05700FF9E25 /* Project object */; } diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7c6899c --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "ScaledFont", + "repositoryURL": "git@github.com:kharrison/ScaledFont.git", + "state": { + "branch": null, + "revision": "1dd4fad0ef73a62141231b604a4b1f2e50f71152", + "version": "1.0.4" + } + } + ] + }, + "version": 1 +} diff --git a/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard b/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f83f6fd..0000000 --- a/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard b/ScaledFont/ScaledFont/Base.lproj/Main.storyboard deleted file mode 100644 index f995ddd..0000000 --- a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScaledFont/ScaledFont/ScaledFont.swift b/ScaledFont/ScaledFont/ScaledFont.swift deleted file mode 100644 index 09b8b81..0000000 --- a/ScaledFont/ScaledFont/ScaledFont.swift +++ /dev/null @@ -1,113 +0,0 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -import UIKit - -/// A utility class to help you use custom fonts with -/// dynamic type. -/// -/// To use this class you must supply the name of a style -/// dictionary for the font when creating the class. The -/// style dictionary should be stored as a property list -/// file in the main bundle. -/// -/// The style dictionary contains an entry for each text -/// style that uses the raw string value for each -/// `UIFontTextStyle` as the key. -/// -/// The value of each entry is a dictionary with two keys: -/// -/// + fontName: A String which is the font name. -/// + fontSize: A number which is the point size to use -/// at the `.large` content size. -/// -/// For example to use a 17 pt Noteworthy-Bold font -/// for the `.headline` style at the `.large` content size: -/// -/// -/// UICTFontTextStyleHeadline -/// -/// fontName -/// Noteworthy-Bold -/// fontSize -/// 17 -/// -/// -/// -/// You do not need to include an entry for every text style -/// but if you try to use a text style that is not included -/// in the dictionary it will fallback to the system preferred -/// font. - -public final class ScaledFont { - private struct FontDescription: Decodable { - let fontSize: CGFloat - let fontName: String - } - - private typealias StyleDictionary = [UIFont.TextStyle.RawValue: FontDescription] - private var styleDictionary: StyleDictionary? - - /// Create a `ScaledFont` - /// - /// - Parameter fontName: Name of a plist file (without the extension) - /// in the main bundle that contains the style dictionary used to - /// scale fonts for each text style. - - public init(fontName: String) { - if let url = Bundle.main.url(forResource: fontName, withExtension: "plist"), - let data = try? Data(contentsOf: url) { - let decoder = PropertyListDecoder() - styleDictionary = try? decoder.decode(StyleDictionary.self, from: data) - } - } - - /// Get the scaled font for the given text style using the - /// style dictionary supplied at initialization. - /// - /// - Parameter textStyle: The `UIFontTextStyle` for the - /// font. - /// - Returns: A `UIFont` of the custom font that has been - /// scaled for the users currently selected preferred - /// text size. - /// - /// - Note: If the style dictionary does not have - /// a font for this text style the default preferred - /// font is returned. - - public func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { - guard let fontDescription = styleDictionary?[textStyle.rawValue], - let font = UIFont(name: fontDescription.fontName, size: fontDescription.fontSize) else { - return UIFont.preferredFont(forTextStyle: textStyle) - } - - let fontMetrics = UIFontMetrics(forTextStyle: textStyle) - return fontMetrics.scaledFont(for: font) - } -} diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c1131c3 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fe07a26 --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..347c940 --- /dev/null +++ b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6e6878a --- /dev/null +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6bfc5e4 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8da2040 --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0502574 --- /dev/null +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..683cb83 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..29776e6 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b52f47c --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5d56381 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..43c56f3 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c3a4c72 --- /dev/null +++ b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + +