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 @@
+
+
+
+
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 @@
+
+
+
+
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
+
+
+