From 8d800679b95b5ab4a06ff29b3bd8a25e1d948fd3 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 21:31:00 +0000 Subject: [PATCH 001/229] Update to Xcode 6.1.1 recommended project settings + LLVM 6.0 Warning - Unreachable Code + LLVM 6.0 Preprocessing - Enable Strict Checking of objc_msgSend Calls --- WorldFacts/WorldFacts.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 3b8e26f..9b66b21 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -214,7 +214,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0610; }; buildConfigurationList = 538A7972157E567E0007B8A5 /* Build configuration list for PBXProject "WorldFacts" */; compatibilityVersion = "Xcode 3.2"; @@ -294,10 +294,12 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -331,10 +333,12 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; COPY_PHASE_STRIP = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; From a33a84155e6d13e8d7c6734a3ce295ddf6b60d3b Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 21:50:58 +0000 Subject: [PATCH 002/229] Enable Modules - remove unused WorldFacts-Prefix.pch --- .../WorldFacts.xcodeproj/project.pbxproj | 28 +++++++++++-------- WorldFacts/WorldFacts/WorldFacts-Prefix.pch | 15 ---------- 2 files changed, 16 insertions(+), 27 deletions(-) delete mode 100644 WorldFacts/WorldFacts/WorldFacts-Prefix.pch diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 9b66b21..d7cc979 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -52,7 +52,6 @@ 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WorldFacts-Info.plist"; sourceTree = ""; }; 538A7988157E567F0007B8A5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 538A798A157E567F0007B8A5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 538A798C157E567F0007B8A5 /* WorldFacts-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WorldFacts-Prefix.pch"; sourceTree = ""; }; 538A798D157E567F0007B8A5 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 538A7991157E567F0007B8A5 /* WorldFacts.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WorldFacts.xcdatamodel; sourceTree = ""; }; @@ -148,7 +147,6 @@ 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */, 538A7987157E567F0007B8A5 /* InfoPlist.strings */, 538A798A157E567F0007B8A5 /* main.m */, - 538A798C157E567F0007B8A5 /* WorldFacts-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; @@ -288,16 +286,19 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -315,10 +316,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE = "F487A4E1-1961-49A4-A8BA-F43738EBAD43"; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "F487A4E1-1961-49A4-A8BA-F43738EBAD43"; + PROVISIONING_PROFILE = ""; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; }; name = Debug; @@ -327,16 +328,19 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Keith Harrison (WT6HWP7T28)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -347,10 +351,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - PROVISIONING_PROFILE = "F487A4E1-1961-49A4-A8BA-F43738EBAD43"; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "F487A4E1-1961-49A4-A8BA-F43738EBAD43"; + PROVISIONING_PROFILE = ""; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/WorldFacts/WorldFacts/WorldFacts-Prefix.pch b/WorldFacts/WorldFacts/WorldFacts-Prefix.pch deleted file mode 100644 index e128607..0000000 --- a/WorldFacts/WorldFacts/WorldFacts-Prefix.pch +++ /dev/null @@ -1,15 +0,0 @@ -// -// Prefix header for all source files of the 'WorldFacts' target in the 'WorldFacts' project -// - -#import - -#ifndef __IPHONE_3_0 -#warning "This project uses features only available in iOS SDK 3.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import - #import -#endif From 5e95f340f5e2519237cb3c31b178e73fa65b1309 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 21:54:05 +0000 Subject: [PATCH 003/229] Update project settings + Minimum deployment target now iOS 8.0 + Now a universal app --- WorldFacts/WorldFacts.xcodeproj/project.pbxproj | 2 ++ WorldFacts/WorldFacts/WorldFacts-Info.plist | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index d7cc979..0f6163a 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -367,6 +367,7 @@ GCC_PREFIX_HEADER = "WorldFacts/WorldFacts-Prefix.pch"; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -378,6 +379,7 @@ GCC_PREFIX_HEADER = "WorldFacts/WorldFacts-Prefix.pch"; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/WorldFacts/WorldFacts/WorldFacts-Info.plist b/WorldFacts/WorldFacts/WorldFacts-Info.plist index f630c4e..d0a2f06 100644 --- a/WorldFacts/WorldFacts/WorldFacts-Info.plist +++ b/WorldFacts/WorldFacts/WorldFacts-Info.plist @@ -30,13 +30,17 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 2.0 CFBundleSignature ???? CFBundleVersion - 1.0 + 2.0 LSRequiresIPhoneOS + UIMainStoryboardFile + Country + UIMainStoryboardFile~ipad + Country UIRequiredDeviceCapabilities armv7 From 482975d334d66f27d0172f3664260d0e4974722c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 22:00:55 +0000 Subject: [PATCH 004/229] Build Settings + minimum target is now iOS 8.0 + now a universal app --- .../WorldFacts.xcodeproj/project.pbxproj | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 0f6163a..0329e86 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -16,10 +16,6 @@ 53524B441691E77100719AF8 /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3D1691E77100719AF8 /* Icon-Small@2x.png */; }; 53524B451691E77100719AF8 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3E1691E77100719AF8 /* Icon.png */; }; 53524B461691E77100719AF8 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3F1691E77100719AF8 /* Icon@2x.png */; }; - 538A797D157E567F0007B8A5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 538A797C157E567F0007B8A5 /* UIKit.framework */; }; - 538A797F157E567F0007B8A5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 538A797E157E567F0007B8A5 /* Foundation.framework */; }; - 538A7981157E567F0007B8A5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 538A7980157E567F0007B8A5 /* CoreGraphics.framework */; }; - 538A7983157E567F0007B8A5 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 538A7982157E567F0007B8A5 /* CoreData.framework */; }; 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 538A7987157E567F0007B8A5 /* InfoPlist.strings */; }; 538A798B157E567F0007B8A5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798A157E567F0007B8A5 /* main.m */; }; 538A798F157E567F0007B8A5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */; }; @@ -45,10 +41,6 @@ 53524B3E1691E77100719AF8 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; 53524B3F1691E77100719AF8 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 538A7978157E567F0007B8A5 /* WorldFacts.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WorldFacts.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 538A797C157E567F0007B8A5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 538A797E157E567F0007B8A5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 538A7980157E567F0007B8A5 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 538A7982157E567F0007B8A5 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WorldFacts-Info.plist"; sourceTree = ""; }; 538A7988157E567F0007B8A5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 538A798A157E567F0007B8A5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -72,10 +64,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 538A797D157E567F0007B8A5 /* UIKit.framework in Frameworks */, - 538A797F157E567F0007B8A5 /* Foundation.framework in Frameworks */, - 538A7981157E567F0007B8A5 /* CoreGraphics.framework in Frameworks */, - 538A7983157E567F0007B8A5 /* CoreData.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -102,7 +90,6 @@ children = ( 532CADEA158D1286002BEDC8 /* README */, 538A7984157E567F0007B8A5 /* WorldFacts */, - 538A797B157E567F0007B8A5 /* Frameworks */, 538A7979157E567F0007B8A5 /* Products */, ); sourceTree = ""; @@ -115,17 +102,6 @@ name = Products; sourceTree = ""; }; - 538A797B157E567F0007B8A5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 538A797C157E567F0007B8A5 /* UIKit.framework */, - 538A797E157E567F0007B8A5 /* Foundation.framework */, - 538A7980157E567F0007B8A5 /* CoreGraphics.framework */, - 538A7982157E567F0007B8A5 /* CoreData.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 538A7984157E567F0007B8A5 /* WorldFacts */ = { isa = PBXGroup; children = ( @@ -363,8 +339,7 @@ 538A7996157E567F0007B8A5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "WorldFacts/WorldFacts-Prefix.pch"; + GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -375,8 +350,7 @@ 538A7997157E567F0007B8A5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "WorldFacts/WorldFacts-Prefix.pch"; + GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; From 9b7807b754ffc16c2b9fcf89418bd3704242639c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 22:07:11 +0000 Subject: [PATCH 005/229] Migrate to Asset Catalogs --- .../WorldFacts.xcodeproj/project.pbxproj | 8 +++ .../AppIcon.appiconset/Contents.json | 56 ++++++++++++++++++ .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 4596 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 5606 bytes .../LaunchImage.launchimage/Contents.json | 51 ++++++++++++++++ .../Default-568h@2x.png | Bin 0 -> 6012 bytes .../LaunchImage.launchimage/Default@2x.png | Bin 0 -> 5485 bytes WorldFacts/WorldFacts/WorldFacts-Info.plist | 15 +---- 8 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default@2x.png diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 0329e86..3b0cd9f 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */; }; 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; 53AE171015FA5BBE00911A7C /* CountryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 53A87BFA157FD530000DBAC9 /* CountryCell.xib */; }; + 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -57,6 +58,7 @@ 53A87BF0157FAD42000DBAC9 /* Country.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Country.m; sourceTree = ""; }; 53A87BF8157FC55A000DBAC9 /* UYLCountryTableViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UYLCountryTableViewController.xib; sourceTree = ""; }; 53A87BFA157FD530000DBAC9 /* CountryCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CountryCell.xib; sourceTree = ""; }; + 53E7826C1A3658590075A619 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -112,6 +114,7 @@ 538A7998157E56A30007B8A5 /* Controllers */, 538A7985157E567F0007B8A5 /* Supporting Files */, 53524B241691D45C00719AF8 /* Resources */, + 53E7826C1A3658590075A619 /* Images.xcassets */, ); path = WorldFacts; sourceTree = ""; @@ -215,6 +218,7 @@ 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */, 538A79A9157E5ABD0007B8A5 /* Country.storyboard in Resources */, 538A79B2157E80D40007B8A5 /* countries.plist in Resources */, + 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, 53AE171015FA5BBE00911A7C /* CountryCell.xib in Resources */, 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */, @@ -339,6 +343,8 @@ 538A7996157E567F0007B8A5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -350,6 +356,8 @@ 538A7997157E567F0007B8A5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..386c857 --- /dev/null +++ b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-Small.png b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-Small.png new file mode 100644 index 0000000000000000000000000000000000000000..154885ac90f98dfdf41de6f59afea7e182334576 GIT binary patch literal 4596 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 literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..72974991c4b2ef6837430ca1f1e86393e8c2fd18 GIT binary patch literal 5606 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 PpJxpf9p&m9<{|$BZDioO literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000..ecd898a --- /dev/null +++ b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "filename" : "Default@2x.png", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "filename" : "Default-568h@2x.png", + "minimum-system-version" : "7.0", + "subtype" : "retina4", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..613355750ec785f2f9a21995536334afff835e71 GIT binary patch literal 6012 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 literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default@2x.png b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5eccda2ee1cc7fe528d7ce77bbd63cc3a4fea6 GIT binary patch literal 5485 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 zpZyCFBundleExecutable ${EXECUTABLE_NAME} CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - Icon.png - Icon@2x.png - Icon-Small.png - Icon-Small@2x.png - - - + + CFBundleIcons~ipad + CFBundleIdentifier com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion From 597af664a0e2ccce03414ffc1eecc1b0fb780900 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 22:09:48 +0000 Subject: [PATCH 006/229] Remove old StoryBoard and XIB files --- .../WorldFacts.xcodeproj/project.pbxproj | 12 - WorldFacts/WorldFacts/Country.storyboard | 238 ------ WorldFacts/WorldFacts/CountryCell.xib | 263 ------- .../UYLCountryTableViewController.xib | 158 ---- .../WorldFacts/UYLCountryViewController.xib | 678 ------------------ 5 files changed, 1349 deletions(-) delete mode 100644 WorldFacts/WorldFacts/Country.storyboard delete mode 100644 WorldFacts/WorldFacts/CountryCell.xib delete mode 100644 WorldFacts/WorldFacts/UYLCountryTableViewController.xib delete mode 100644 WorldFacts/WorldFacts/UYLCountryViewController.xib diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 3b0cd9f..51bfdd0 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -21,17 +21,14 @@ 538A798F157E567F0007B8A5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */; }; 538A7992157E567F0007B8A5 /* WorldFacts.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 538A7990157E567F0007B8A5 /* WorldFacts.xcdatamodeld */; }; 538A79A4157E5A730007B8A5 /* UYLCountryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A79A3157E5A730007B8A5 /* UYLCountryTableViewController.m */; }; - 538A79A9157E5ABD0007B8A5 /* Country.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538A79A8157E5ABD0007B8A5 /* Country.storyboard */; }; 538A79B2157E80D40007B8A5 /* countries.plist in Resources */ = {isa = PBXBuildFile; fileRef = 538A79B1157E80D40007B8A5 /* countries.plist */; }; 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */; }; 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; - 53AE171015FA5BBE00911A7C /* CountryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 53A87BFA157FD530000DBAC9 /* CountryCell.xib */; }; 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 532CADEA158D1286002BEDC8 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; - 532CADF0158D1690002BEDC8 /* UYLCountryViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UYLCountryViewController.xib; sourceTree = ""; }; 532CADF3158D19D1002BEDC8 /* UYLCountryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryViewController.h; sourceTree = ""; }; 532CADF4158D19D1002BEDC8 /* UYLCountryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCountryViewController.m; sourceTree = ""; }; 53524B391691E77100719AF8 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; @@ -50,14 +47,11 @@ 538A7991157E567F0007B8A5 /* WorldFacts.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WorldFacts.xcdatamodel; sourceTree = ""; }; 538A79A2157E5A730007B8A5 /* UYLCountryTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryTableViewController.h; sourceTree = ""; }; 538A79A3157E5A730007B8A5 /* UYLCountryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCountryTableViewController.m; sourceTree = ""; }; - 538A79A8157E5ABD0007B8A5 /* Country.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Country.storyboard; sourceTree = ""; }; 538A79B1157E80D40007B8A5 /* countries.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = countries.plist; sourceTree = ""; }; 53A87BE5157FA30A000DBAC9 /* Country+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Country+Extensions.h"; sourceTree = ""; }; 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Country+Extensions.m"; sourceTree = ""; }; 53A87BEF157FAD42000DBAC9 /* Country.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Country.h; sourceTree = ""; }; 53A87BF0157FAD42000DBAC9 /* Country.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Country.m; sourceTree = ""; }; - 53A87BF8157FC55A000DBAC9 /* UYLCountryTableViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UYLCountryTableViewController.xib; sourceTree = ""; }; - 53A87BFA157FD530000DBAC9 /* CountryCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CountryCell.xib; sourceTree = ""; }; 53E7826C1A3658590075A619 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ @@ -156,10 +150,6 @@ 538A799A157E56BF0007B8A5 /* Views */ = { isa = PBXGroup; children = ( - 538A79A8157E5ABD0007B8A5 /* Country.storyboard */, - 53A87BF8157FC55A000DBAC9 /* UYLCountryTableViewController.xib */, - 53A87BFA157FD530000DBAC9 /* CountryCell.xib */, - 532CADF0158D1690002BEDC8 /* UYLCountryViewController.xib */, ); name = Views; sourceTree = ""; @@ -216,11 +206,9 @@ buildActionMask = 2147483647; files = ( 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */, - 538A79A9157E5ABD0007B8A5 /* Country.storyboard in Resources */, 538A79B2157E80D40007B8A5 /* countries.plist in Resources */, 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, - 53AE171015FA5BBE00911A7C /* CountryCell.xib in Resources */, 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */, 53524B411691E77100719AF8 /* Default.png in Resources */, 53524B421691E77100719AF8 /* Default@2x.png in Resources */, diff --git a/WorldFacts/WorldFacts/Country.storyboard b/WorldFacts/WorldFacts/Country.storyboard deleted file mode 100644 index c26d85d..0000000 --- a/WorldFacts/WorldFacts/Country.storyboard +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Country - Capital - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WorldFacts/WorldFacts/CountryCell.xib b/WorldFacts/WorldFacts/CountryCell.xib deleted file mode 100644 index 4544f1e..0000000 --- a/WorldFacts/WorldFacts/CountryCell.xib +++ /dev/null @@ -1,263 +0,0 @@ - - - - 1296 - 12B19 - 2549 - 1187 - 624.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1498 - - - IBProxyObject - IBUILabel - IBUITableViewCell - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - - - 256 - - - - 292 - {{20, 7}, {280, 26}} - - - _NS:9 - NO - YES - 7 - 100 - NO - IBCocoaTouchFramework - Country - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 3 - MQA - - 0 - 10 - - 2 - 14 - - - Helvetica-Bold - 14 - 16 - - - - - 292 - {{20, 33}, {140, 21}} - - - _NS:9 - NO - YES - 7 - 200 - NO - IBCocoaTouchFramework - Capital - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 12 - - 1 - 12 - - - Helvetica - 12 - 16 - - - - - 289 - {{160, 33}, {130, 21}} - - _NS:9 - NO - YES - 7 - 300 - NO - IBCocoaTouchFramework - Pop: 1,234,567,890 - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 12 - 2 - - - - - {320, 63} - - - _NS:11 - - 3 - MCAwAA - - NO - YES - 4 - YES - IBCocoaTouchFramework - - - {320, 64} - - - _NS:9 - IBCocoaTouchFramework - - UYLNibCountryCellIdentifier - - - - - - - - countryCell - - - - 8 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - UYLCountryTableViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 8 - - - - - UYLCountryTableViewController - UITableViewController - - countryCell - UITableViewCell - - - countryCell - - countryCell - UITableViewCell - - - - IBProjectSource - ./Classes/UYLCountryTableViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1498 - - diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.xib b/WorldFacts/WorldFacts/UYLCountryTableViewController.xib deleted file mode 100644 index 0f4839a..0000000 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.xib +++ /dev/null @@ -1,158 +0,0 @@ - - - - 1296 - 11E53 - 2182 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {{0, 44}, {320, 436}} - - - - _NS:9 - - 3 - MQA - - YES - - NO - - IBCocoaTouchFramework - YES - 1 - 0 - YES - 64 - 22 - 22 - - - - - - - view - - - - 5 - - - - dataSource - - - - 3 - - - - delegate - - - - 4 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - UYLCountryTableViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 5 - - - - - UYLCountryTableViewController - UITableViewController - - countryCell - UITableViewCell - - - countryCell - - countryCell - UITableViewCell - - - - IBProjectSource - ./Classes/UYLCountryTableViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - diff --git a/WorldFacts/WorldFacts/UYLCountryViewController.xib b/WorldFacts/WorldFacts/UYLCountryViewController.xib deleted file mode 100644 index 20f908c..0000000 --- a/WorldFacts/WorldFacts/UYLCountryViewController.xib +++ /dev/null @@ -1,678 +0,0 @@ - - - - 1296 - 11E53 - 2182 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUIView - IBUILabel - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 294 - {{20, 20}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Capital - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - 2 - 17 - - - Helvetica-Bold - 17 - 16 - - - - - 294 - {{20, 49}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Population - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - - - - - 294 - {{20, 78}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Area - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - - - - - 294 - {{20, 107}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Currency - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - - - - - 294 - {{20, 136}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Continent - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - - - - - 294 - {{20, 165}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Phone - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - - - - - 294 - {{20, 194}, {88, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - TLD - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - 2 - - - - - - 291 - {{122, 20}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - capital - - - 0 - 10 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 291 - {{122, 49}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - population - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - - - - - - 291 - {{122, 78}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - area - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - - - - - - 291 - {{122, 107}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - currency - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - - - - - - 291 - {{122, 136}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - continent - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - - - - - - 291 - {{122, 165}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - phone - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - - - - - - 291 - {{122, 194}, {178, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - tld - - 1 - MC40MDAwMDAwMDYgMC40MDAwMDAwMDYgMC40MDAwMDAwMDYAA - - - 0 - 10 - - - - - {{0, 64}, {320, 416}} - - - - - 3 - MQA - - 2 - - - - - NO - - IBCocoaTouchFramework - - - - - - - area - - - - 17 - - - - capital - - - - 18 - - - - continent - - - - 19 - - - - currency - - - - 20 - - - - phone - - - - 21 - - - - population - - - - 22 - - - - tld - - - - 23 - - - - view - - - - 24 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - - - UYLCountryViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 24 - - - - - UYLCountryViewController - UIViewController - - UILabel - UILabel - UILabel - UILabel - UILabel - UILabel - UILabel - - - - area - UILabel - - - capital - UILabel - - - continent - UILabel - - - currency - UILabel - - - phone - UILabel - - - population - UILabel - - - tld - UILabel - - - - IBProjectSource - ./Classes/UYLCountryViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - From b0693618601918b723ac2e5c1752875633bc2bfe Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 22:15:19 +0000 Subject: [PATCH 007/229] Add universal storyboard --- .../WorldFacts.xcodeproj/project.pbxproj | 4 + WorldFacts/WorldFacts/Main.storyboard | 307 ++++++++++++++++++ WorldFacts/WorldFacts/WorldFacts-Info.plist | 4 +- 3 files changed, 313 insertions(+), 2 deletions(-) create mode 100644 WorldFacts/WorldFacts/Main.storyboard diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 51bfdd0..09fb171 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */; }; 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; + 53E7826F1A36598D0075A619 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826E1A36598D0075A619 /* Main.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -53,6 +54,7 @@ 53A87BEF157FAD42000DBAC9 /* Country.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Country.h; sourceTree = ""; }; 53A87BF0157FAD42000DBAC9 /* Country.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Country.m; sourceTree = ""; }; 53E7826C1A3658590075A619 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 53E7826E1A36598D0075A619 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -150,6 +152,7 @@ 538A799A157E56BF0007B8A5 /* Views */ = { isa = PBXGroup; children = ( + 53E7826E1A36598D0075A619 /* Main.storyboard */, ); name = Views; sourceTree = ""; @@ -208,6 +211,7 @@ 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */, 538A79B2157E80D40007B8A5 /* countries.plist in Resources */, 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, + 53E7826F1A36598D0075A619 /* Main.storyboard in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */, 53524B411691E77100719AF8 /* Default.png in Resources */, diff --git a/WorldFacts/WorldFacts/Main.storyboard b/WorldFacts/WorldFacts/Main.storyboard new file mode 100644 index 0000000..be554f3 --- /dev/null +++ b/WorldFacts/WorldFacts/Main.storyboard @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WorldFacts/WorldFacts/WorldFacts-Info.plist b/WorldFacts/WorldFacts/WorldFacts-Info.plist index 1b60108..dedc3b1 100644 --- a/WorldFacts/WorldFacts/WorldFacts-Info.plist +++ b/WorldFacts/WorldFacts/WorldFacts-Info.plist @@ -29,9 +29,9 @@ LSRequiresIPhoneOS UIMainStoryboardFile - Country + Main UIMainStoryboardFile~ipad - Country + Main UIRequiredDeviceCapabilities armv7 From ccec89da6f3863f18b334e7b0a004338bca16992 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Dec 2014 22:18:53 +0000 Subject: [PATCH 008/229] Use Base Internationalization --- .../WorldFacts.xcodeproj/project.pbxproj | 21 +++++++++++++------ .../InfoPlist.strings | 0 .../{ => Base.lproj}/Main.storyboard | 0 3 files changed, 15 insertions(+), 6 deletions(-) rename WorldFacts/WorldFacts/{en.lproj => Base.lproj}/InfoPlist.strings (100%) rename WorldFacts/WorldFacts/{ => Base.lproj}/Main.storyboard (100%) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 09fb171..7180323 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -25,7 +25,7 @@ 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */; }; 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; - 53E7826F1A36598D0075A619 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826E1A36598D0075A619 /* Main.storyboard */; }; + 53E782701A365AE60075A619 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E782721A365AE60075A619 /* Main.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -41,7 +41,6 @@ 53524B3F1691E77100719AF8 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 538A7978157E567F0007B8A5 /* WorldFacts.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WorldFacts.app; sourceTree = BUILT_PRODUCTS_DIR; }; 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WorldFacts-Info.plist"; sourceTree = ""; }; - 538A7988157E567F0007B8A5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 538A798A157E567F0007B8A5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 538A798D157E567F0007B8A5 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; @@ -54,7 +53,8 @@ 53A87BEF157FAD42000DBAC9 /* Country.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Country.h; sourceTree = ""; }; 53A87BF0157FAD42000DBAC9 /* Country.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Country.m; sourceTree = ""; }; 53E7826C1A3658590075A619 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 53E7826E1A36598D0075A619 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 53E782731A365AF30075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53E782741A365B120075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -152,7 +152,7 @@ 538A799A157E56BF0007B8A5 /* Views */ = { isa = PBXGroup; children = ( - 53E7826E1A36598D0075A619 /* Main.storyboard */, + 53E782721A365AE60075A619 /* Main.storyboard */, ); name = Views; sourceTree = ""; @@ -192,6 +192,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 538A796D157E567E0007B8A5; productRefGroup = 538A7979157E567F0007B8A5 /* Products */; @@ -211,7 +212,7 @@ 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */, 538A79B2157E80D40007B8A5 /* countries.plist in Resources */, 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, - 53E7826F1A36598D0075A619 /* Main.storyboard in Resources */, + 53E782701A365AE60075A619 /* Main.storyboard in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */, 53524B411691E77100719AF8 /* Default.png in Resources */, @@ -246,11 +247,19 @@ 538A7987157E567F0007B8A5 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 538A7988157E567F0007B8A5 /* en */, + 53E782741A365B120075A619 /* Base */, ); name = InfoPlist.strings; sourceTree = ""; }; + 53E782721A365AE60075A619 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53E782731A365AF30075A619 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/WorldFacts/WorldFacts/en.lproj/InfoPlist.strings b/WorldFacts/WorldFacts/Base.lproj/InfoPlist.strings similarity index 100% rename from WorldFacts/WorldFacts/en.lproj/InfoPlist.strings rename to WorldFacts/WorldFacts/Base.lproj/InfoPlist.strings diff --git a/WorldFacts/WorldFacts/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard similarity index 100% rename from WorldFacts/WorldFacts/Main.storyboard rename to WorldFacts/WorldFacts/Base.lproj/Main.storyboard From 8a15c6ba0569c5f895d18f1c5d40ecb31e8b45d4 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Dec 2014 22:11:03 +0000 Subject: [PATCH 009/229] Complete set of App Icons --- WorldFacts/Icon-Small.png | Bin 4596 -> 0 bytes WorldFacts/Icon-Small@2x.png | Bin 5606 -> 0 bytes WorldFacts/Icon.png | Bin 5593 -> 0 bytes WorldFacts/Icon@2x.png | Bin 7552 -> 0 bytes .../WorldFacts.xcodeproj/project.pbxproj | 16 ------ .../AppIcon.appiconset/Contents.json | 54 +++++++++++------- .../AppIcon.appiconset/Icon-120.png | Bin 0 -> 755 bytes .../AppIcon.appiconset/Icon-180.png | Bin 0 -> 1035 bytes .../AppIcon.appiconset/Icon-40.png | Bin 0 -> 374 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 594 bytes .../AppIcon.appiconset/Icon-80-1.png | Bin 0 -> 595 bytes .../AppIcon.appiconset/Icon-80.png | Bin 0 -> 595 bytes .../AppIcon.appiconset/icon-152.png | Bin 0 -> 1019 bytes 13 files changed, 33 insertions(+), 37 deletions(-) delete mode 100644 WorldFacts/Icon-Small.png delete mode 100644 WorldFacts/Icon-Small@2x.png delete mode 100644 WorldFacts/Icon.png delete mode 100644 WorldFacts/Icon@2x.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-120.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-180.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-40.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-80-1.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-80.png create mode 100644 WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/icon-152.png diff --git a/WorldFacts/Icon-Small.png b/WorldFacts/Icon-Small.png deleted file mode 100644 index 154885ac90f98dfdf41de6f59afea7e182334576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4596 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 diff --git a/WorldFacts/Icon-Small@2x.png b/WorldFacts/Icon-Small@2x.png deleted file mode 100644 index 72974991c4b2ef6837430ca1f1e86393e8c2fd18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5606 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 PpJxpf9p&m9<{|$BZDioO diff --git a/WorldFacts/Icon.png b/WorldFacts/Icon.png deleted file mode 100644 index 86f8ee47cca347591f463c5db9ed6da933588a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5593 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 DfR5qu diff --git a/WorldFacts/Icon@2x.png b/WorldFacts/Icon@2x.png deleted file mode 100644 index 8e3ed048641e01b64571a2fa52801247fe52aac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7552 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 gkNUp)B;p#dYbZ4r1sKHn`L~ve!Xx==SH~;_u diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 7180323..ac56dee 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -12,10 +12,6 @@ 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B391691E77100719AF8 /* Default-568h@2x.png */; }; 53524B411691E77100719AF8 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3A1691E77100719AF8 /* Default.png */; }; 53524B421691E77100719AF8 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3B1691E77100719AF8 /* Default@2x.png */; }; - 53524B431691E77100719AF8 /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3C1691E77100719AF8 /* Icon-Small.png */; }; - 53524B441691E77100719AF8 /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3D1691E77100719AF8 /* Icon-Small@2x.png */; }; - 53524B451691E77100719AF8 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3E1691E77100719AF8 /* Icon.png */; }; - 53524B461691E77100719AF8 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3F1691E77100719AF8 /* Icon@2x.png */; }; 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 538A7987157E567F0007B8A5 /* InfoPlist.strings */; }; 538A798B157E567F0007B8A5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798A157E567F0007B8A5 /* main.m */; }; 538A798F157E567F0007B8A5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */; }; @@ -35,10 +31,6 @@ 53524B391691E77100719AF8 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 53524B3A1691E77100719AF8 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 53524B3B1691E77100719AF8 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; - 53524B3C1691E77100719AF8 /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small.png"; sourceTree = ""; }; - 53524B3D1691E77100719AF8 /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@2x.png"; sourceTree = ""; }; - 53524B3E1691E77100719AF8 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; - 53524B3F1691E77100719AF8 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 538A7978157E567F0007B8A5 /* WorldFacts.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WorldFacts.app; sourceTree = BUILT_PRODUCTS_DIR; }; 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WorldFacts-Info.plist"; sourceTree = ""; }; 538A798A157E567F0007B8A5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -74,10 +66,6 @@ 53524B391691E77100719AF8 /* Default-568h@2x.png */, 53524B3A1691E77100719AF8 /* Default.png */, 53524B3B1691E77100719AF8 /* Default@2x.png */, - 53524B3C1691E77100719AF8 /* Icon-Small.png */, - 53524B3D1691E77100719AF8 /* Icon-Small@2x.png */, - 53524B3E1691E77100719AF8 /* Icon.png */, - 53524B3F1691E77100719AF8 /* Icon@2x.png */, ); name = Resources; path = ..; @@ -217,10 +205,6 @@ 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */, 53524B411691E77100719AF8 /* Default.png in Resources */, 53524B421691E77100719AF8 /* Default@2x.png in Resources */, - 53524B431691E77100719AF8 /* Icon-Small.png in Resources */, - 53524B441691E77100719AF8 /* Icon-Small@2x.png in Resources */, - 53524B451691E77100719AF8 /* Icon.png in Resources */, - 53524B461691E77100719AF8 /* Icon@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json index 386c857..6ef7107 100644 --- a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,51 +1,63 @@ { "images" : [ { + "size" : "29x29", "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" + "filename" : "Icon-Small@2x.png", + "scale" : "2x" }, { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-80-1.png", + "scale" : "2x" }, { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-120.png", + "scale" : "2x" }, { + "size" : "60x60", "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" + "filename" : "Icon-180.png", + "scale" : "3x" }, { + "size" : "29x29", "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" + "filename" : "Icon-Small.png", + "scale" : "1x" }, { + "size" : "29x29", "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" + "filename" : "Icon-Small@2x.png", + "scale" : "2x" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-Small@2x.png", + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-80.png", "scale" : "2x" }, { - "size" : "29x29", + "size" : "76x76", "idiom" : "ipad", - "filename" : "Icon-Small.png", + "filename" : "Icon-76.png", "scale" : "1x" }, { - "size" : "29x29", + "size" : "76x76", "idiom" : "ipad", - "filename" : "Icon-Small@2x.png", + "filename" : "icon-152.png", "scale" : "2x" } ], diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-120.png b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-120.png new file mode 100644 index 0000000000000000000000000000000000000000..4220c9e09e80a94cba44e17b43f8562524ebe171 GIT binary patch literal 755 zcmVo;8N0M19hsMBltKnk|d^^by91 zQmRgO`}Po=F^QNejqBAU&YDP4GB9i;}53yZsu2^xjV`<#BH>*;0=F2M3ok#B6Am`2~{Q3>kq(Y=ZezRa}qCSD~ z;T)ehg_$di2<;Yi!0!D2-}P)p z$BWNr>oDtkTra;l`_2Us5fKp)5fRb9m*vaO$<52jFDQf}f1t>GD-J?SNvZKDD~E~- zldduZ1y$y^u)?{kji{+Dsf*M{zdm+D1de4jN~ozBDJ`uvGPJ?5cFE*+;9I8=Q8?Ar zE${W?haL&n!l_<~gz!^e%x?X0xKwN#1B37wGS)C08VTFPD7?lbJPwB@B+&`4Nm-}h z(6l6G;1!T{77m3ZF$b?!S?8UeI`JtRX%=iZHVAEtOEz2zbqQlFL)(h{VykOVw!UGk zO(@&imhO%py8OG+-P?z*mILWl9zxgAv2;&Pp)1)g-LrEj3#IOS0cCxAwi~{Lwku-= zpzT_^H&Ayg;ULuA+3r2m#UE_=5$ei~<%7B>319wI_!;V6UabpI#!9}WB%$oxq%1Pb lFvCPdL_|bHL`0O)J^+T$H5vQ)ZY%%*002ovPDHLkV1mnAaYXJFx4c4na_3Ia#FN&Hjim+R6 zxo%^fG=}QaChXTE?ARljER42iXvK(A`t=Z@Jc64riRjQL{{0J@EsLvBb;5vI`0y0% z+98)Hj_1uO;lMHP-yXw*R`KB+rbc|xpGDfTIh-+x!hu+_Uu@;cE771tq(XkZbzb!7 z7^Fjfu2*s1yELgxc*u@VpgM!2L4W`L3-aU}s!w;vi&5gjFt%uC%aly7S#Z~^J=d!~ z#fMb$<{F+ih5Gan(xF77K!5)H4E_5J%8^d3RCD6QFWtB`*seU)s6gb$Ey|EjpE!i) z%qg*5ZJ;@Xu2^xcRdc9Ic$_kbxo%{$2K%qT? z?b#x|c3zk&jT5_*{Qv+08A(JzRCodH($#KTK^%nf89R2EnVFfPO(7{WGcz+YbNkG_ z*gft=kE7mH+P^fvC-^iPh=_=Yh=_=Yh=_=Yh=_=Yh=@oaI(81%z>f6#($U>Xl1y#7 zbot;6!dKFKoQ{{Oy@jxCD`Sj;vj|uFpB6frWp8IH4KDr}X-sye>WDmW)h_jF0egxzIo#HCQ$)Q() zfK<{sj9AY@Jau^sook4dPSWW^I6CPaL%aq$Z3xE#om2wxTIrm6hhUtcGmk84=_C^f z#v+|_$l^SmI)vi_or}n#j7~nn@okkeiFoNDI?J%*2E82EQ9*4S2s;Mob;FJYI!!QSkxnHH`9h}xh7{2GYB72p0-)&7Oq4j^AtLhcYSv`@gcWO< zQL1P~D_YTt4v(TmL_|bHL_|bHL_|bHL_|bHL`3BO`VFn=I)57kYv}+0002ovPDHLk FV1m$>{FVR! literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-40.png b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..c43dfbd0d94bb57be8c8b39953457185223867d2 GIT binary patch literal 374 zcmV-+0g3*JP)KOFs7^_ir{`?Hgl}xs0XqYOEpgM!mpGCuiR;NgMrbc_%t~}?> zDevANoHB^}_YeL245>|boH2;}_z%K>S;2l<{P_;Zj!)OCKGC2=#DrGBeOlqbF{40# zrA2+ok5Bsb5Uy8owrFS1n@IQW6{A0ZpE!l($t%*KM5af3m?@6Ebza=JHo9nlJwV=T zDxS++TKr6T`)Dv($xJ4TeWX?AS#W`6xZZfE#cr20nyqy04!UmGgR-w+=!PSV?KP%u zIP>fF3I)OB2SJH(ik@PezLy4@d?<9oi|9Q?rJ;Xjx61$^NK U^|1+#Jpcdz07*qoM6N<$g1J4iWB>pF literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-76.png b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..1f423df8e58d903f77c3ef52cfe3593f65aabc44 GIT binary patch literal 594 zcmV-Y0PZu{-|#3;OjCy>?!eBa*98b(JKM&6rA-C6M;)7uc^n-MKZRK!2}U zaQN{PrA2+PTW_O3fc^Uo@7*8q;T-MSA-8E}_3Ibo#xCW_E8o2{-nulID~za1c*TZQ z;lMGQFN*2WCcu1K_wE(VmrABad%SgD%aly}_7IsYjL@A&%8*Z_Lw@${7PxC=?b#ym z;2y_|QPieD{P+*HXlLchEA!?Wnl6f-H-*xoL*m0Q`STK?J%Ze~Hn?qM+Oj#zl1|sF zKF^#-&Y4NFU~H>UcF~|j>((UV!Z58>bN&1b+_pEte_7C-MxZ)_r$~CkgI2IwZ<;NO zI&?@F00036Nkl z_}GxIVh5z8HZ2Dp`x4$zd5E|8OvyJRxi(yV)!bDm_QfU_YR gAr=Hd5CrC&7h#DKa>kg3UjP6A07*qoM6N<$f)JD>-~a#s literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-80-1.png b/WorldFacts/WorldFacts/Images.xcassets/AppIcon.appiconset/Icon-80-1.png new file mode 100644 index 0000000000000000000000000000000000000000..99143c11ab0fef61ac0a2664b3dabcd87926c072 GIT binary patch literal 595 zcmV-Z0<8UsP)OrC6L*%JO2F(`t=aqxizCef2&b-y>?!eBa-&)7uc^n&6rA+B$2OK zaQN{PrA2+PTW_O3fc^Uon=gv(+9B`VAMxQF_wE(9X=dKKG{AgY;lMG)hE?CaGwIPL z<;g3VD~za1c=hWSUcF~|j>((UV!Z58>bN&1b+_pEte_7C-MxZ)_r$~CkgI2IwZ<;NO z8gBFF00037NklWacX!vvbH`!-JK;tUE#t1kfZ%=$$XUvJ z=RD8zyz++Zv?ix^k`(3+bD=C$PU&ga6yaS}?^=hFBEGdddp!%$yHDEoj2u^@4_0@2;6+r}qr^Af+Muz=1}W z1=<=2n?O#Z%LGAitbqnjMRulv)S1lOr+^EYiC+Sru4EOrC6L*%JO2F(`t=aqxizCef2&b-y>?!eBa-&)7uc^n&6rA+B$2OK zaQN{PrA2+PTW_O3fc^Uon=gv(+9B`VAMxQF_wE(9X=dKKG{AgY;lMG)hE?CaGwIPL z<;g3VD~za1c=hWSUcF~|j>((UV!Z58>bN&1b+_pEte_7C-MxZ)_r$~CkgI2IwZ<;NO z8gBFF00037NklWacX!vvbH`!-JK;tUE#t1kfZ%=$$XUvJ z=RD8zyz++Zv?ix^k`(3+bD=C$PU&ga6yaS}?^=hFBEGdddp!%$yHDEoj2u^@4_0@2;6+r}qr^Af+Muz=1}W z1=<=2n?O#Z%LGAitbqnjMRulv)S1lOr+^EYiC+Sru4E0{{R3FC5Sl00057P)t-slp&J; z`vB6RJ(MDm{PhKvCXW2}1eGL^=Ex$KD2r)ulR`E{W#JBK-FQ+_f;EJAt7*fSD_cn=gsNfl}G8GyeJk;=w2G*%#KRIGQbr z?9>|S&>fj8jGZ)v_v;J7e^l(%8q1MK#fMJ0ZC~~14X|2l-@GfcVP}~viummct5I_L z@&@hK7~#Gt=gJ|%fK&715!b3VvR-MUL4D=MBk|r7oH2;nurlx5715nP!-7%Ko<62V zdh+2C|N8;GbXufCeBQY&$c;*%I)TH1Qs>Dbs!w#sicI3bD7I%~u2*iOKz-!JCH?pV zuUKuxhEK6vYMwWQ`tb+Ll18XYcBo8tl_QbLk4UXlaN@!z-L@{+tTol9Iix~-)TBDf zj!Ep+8LLoppgDrBSZ=LVaMGVXoHB;FZD71~Tf~D=_UR3mCyw8{E69sXoim2?DsW_HL)3}I$wW@cv2 zD`#CYOY}6PHbJ1T+v(+Vv#?< zjM_(A4_xkiUU9UeoqxSSEN(N9-cgD`?yf>+j3NdV49snVOU%%#EP@xP zV_-PO!FK;fAkf=KuN;w^r;|L0f8C{bcmfgILvJs_?4!3I5j#nzum@q9=~W?Od30VN z)b+SdR#Z#p7(%6zbOsQuQF_M_u7=JCqP0XPoj|w_I`7XQQfKKbAd40{$pj*`NasAV zxIm{J(Yi?I60)eIGlpngS?}~CTxy!mGHkg?uNk&f(YpmxrdsKgz?6a#diP+;eR>Zb z!jk%FdXHhrlNoy73t-5zE_#y8CdcTjuF}u7)XJTImeI zmNI(1uw{u(AB#;6BMQ} pg(*y7A|fIpA|fIpA|fIp@&~=9JG7|Q4gCNB002ovPDHLkV1mK@-$noc literal 0 HcmV?d00001 From a747ca05c2c0c1cd5529c9c25c0e7a4f1ff0f528 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Dec 2014 22:29:54 +0000 Subject: [PATCH 010/229] Update App Delegate to implement SplitViewController - add UITableViewCell class for country cell --- .../WorldFacts.xcodeproj/project.pbxproj | 6 + .../WorldFacts/Base.lproj/Main.storyboard | 4 +- WorldFacts/WorldFacts/CountryCell.h | 43 +++++++ WorldFacts/WorldFacts/CountryCell.m | 38 ++++++ WorldFacts/WorldFacts/UYLAppDelegate.h | 5 +- WorldFacts/WorldFacts/UYLAppDelegate.m | 116 ++++++++++-------- 6 files changed, 153 insertions(+), 59 deletions(-) create mode 100644 WorldFacts/WorldFacts/CountryCell.h create mode 100644 WorldFacts/WorldFacts/CountryCell.m diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index ac56dee..4194bef 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; 53E782701A365AE60075A619 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E782721A365AE60075A619 /* Main.storyboard */; }; + 53EDC9911A37AF03005CDB68 /* CountryCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDC9901A37AF03005CDB68 /* CountryCell.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -47,6 +48,8 @@ 53E7826C1A3658590075A619 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 53E782731A365AF30075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 53E782741A365B120075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 53EDC98F1A37AF03005CDB68 /* CountryCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountryCell.h; sourceTree = ""; }; + 53EDC9901A37AF03005CDB68 /* CountryCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountryCell.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -141,6 +144,8 @@ isa = PBXGroup; children = ( 53E782721A365AE60075A619 /* Main.storyboard */, + 53EDC98F1A37AF03005CDB68 /* CountryCell.h */, + 53EDC9901A37AF03005CDB68 /* CountryCell.m */, ); name = Views; sourceTree = ""; @@ -219,6 +224,7 @@ 538A798F157E567F0007B8A5 /* UYLAppDelegate.m in Sources */, 538A7992157E567F0007B8A5 /* WorldFacts.xcdatamodeld in Sources */, 538A79A4157E5A730007B8A5 /* UYLCountryTableViewController.m in Sources */, + 53EDC9911A37AF03005CDB68 /* CountryCell.m in Sources */, 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */, 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */, 532CADF5158D19D1002BEDC8 /* UYLCountryViewController.m in Sources */, diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index be554f3..75032b9 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/WorldFacts/WorldFacts/CountryCell.h b/WorldFacts/WorldFacts/CountryCell.h new file mode 100644 index 0000000..0c2df0b --- /dev/null +++ b/WorldFacts/WorldFacts/CountryCell.h @@ -0,0 +1,43 @@ +// +// CountryCellTableViewCell.h +// WorldFacts2 +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2014 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 + +@interface CountryCell : UITableViewCell + +@property (weak, nonatomic) IBOutlet UILabel *countryLabel; +@property (weak, nonatomic) IBOutlet UILabel *capitalLabel; +@property (weak, nonatomic) IBOutlet UILabel *populationLabel; + +@end diff --git a/WorldFacts/WorldFacts/CountryCell.m b/WorldFacts/WorldFacts/CountryCell.m new file mode 100644 index 0000000..c1f1a38 --- /dev/null +++ b/WorldFacts/WorldFacts/CountryCell.m @@ -0,0 +1,38 @@ +// +// CountryCellTableViewCell.m +// WorldFacts2 +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2014 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 "CountryCell.h" + +@implementation CountryCell +@end diff --git a/WorldFacts/WorldFacts/UYLAppDelegate.h b/WorldFacts/WorldFacts/UYLAppDelegate.h index 87acad6..ee88f0f 100644 --- a/WorldFacts/WorldFacts/UYLAppDelegate.h +++ b/WorldFacts/WorldFacts/UYLAppDelegate.h @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2014 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: @@ -40,7 +40,4 @@ @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; -- (void)saveContext; -- (NSURL *)applicationSupportDirectory; - @end diff --git a/WorldFacts/WorldFacts/UYLAppDelegate.m b/WorldFacts/WorldFacts/UYLAppDelegate.m index 28b1559..962380c 100644 --- a/WorldFacts/WorldFacts/UYLAppDelegate.m +++ b/WorldFacts/WorldFacts/UYLAppDelegate.m @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2014 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: @@ -32,14 +32,17 @@ #import "UYLAppDelegate.h" #import "UYLCountryTableViewController.h" +#import "UYLCountryViewController.h" #import "Country+Extensions.h" +@interface UYLAppDelegate () +@end + @implementation UYLAppDelegate -// @synthesize window = _window; -@synthesize managedObjectContext = __managedObjectContext; -@synthesize managedObjectModel = __managedObjectModel; -@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; +@synthesize managedObjectContext = _managedObjectContext; +@synthesize managedObjectModel = _managedObjectModel; +@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; #pragma mark - #pragma mark === UIApplicationDelegate Methods === @@ -47,35 +50,44 @@ @implementation UYLAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - - UIStoryboard *countryStoryboard = [UIStoryboard storyboardWithName:@"Country" bundle:nil]; - UINavigationController *navController = [countryStoryboard instantiateInitialViewController]; - UYLCountryTableViewController *countryViewController = (UYLCountryTableViewController *)navController.topViewController; - -// The following two lines are used to create the view controllers when not using storyboards -// UYLCountryTableViewController *countryViewController = [[UYLCountryTableViewController alloc] -// initWithNibName:@"UYLCountryTableViewController" -// bundle:nil]; -// UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:countryViewController]; + UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; + UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; + navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; + splitViewController.delegate = self; + splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; - countryViewController.managedObjectContext = self.managedObjectContext; + UINavigationController *masterNavigationController = splitViewController.viewControllers[0]; + UYLCountryTableViewController *controller = (UYLCountryTableViewController *)masterNavigationController.topViewController; + controller.managedObjectContext = self.managedObjectContext; [Country importDataToMoc:self.managedObjectContext]; - - self.window.rootViewController = navController; - self.window.backgroundColor = [UIColor whiteColor]; - [self.window makeKeyAndVisible]; + return YES; } -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - [self saveContext]; -} +#pragma mark - +#pragma mark === UISplitViewControllerDelegate === +#pragma mark - -- (void)applicationWillTerminate:(UIApplication *)application +// When transitioning to a collapsed interface if our secondary view controller is the detail view +// controller navigation hierarchy and it does not have a country to display (which is the case on +// initial launch) we discard and show the master view controller. + +- (BOOL)splitViewController:(UISplitViewController *)splitViewController +collapseSecondaryViewController:(UIViewController *)secondaryViewController + ontoPrimaryViewController:(UIViewController *)primaryViewController { - [self saveContext]; + if ([secondaryViewController isKindOfClass:[UINavigationController class]] + && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[UYLCountryViewController class]] + && ([(UYLCountryViewController *)[(UINavigationController *)secondaryViewController topViewController] country] == nil)) + { + // Return YES to indicate that we have handled the collapse by doing nothing + // the secondary controller will be discarded. + return YES; + } + else + { + return NO; + } } #pragma mark - @@ -84,60 +96,58 @@ - (void)applicationWillTerminate:(UIApplication *)application - (NSManagedObjectContext *)managedObjectContext { - if (__managedObjectContext != nil) { - return __managedObjectContext; + if (_managedObjectContext != nil) + { + return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; - if (coordinator != nil) { - __managedObjectContext = [[NSManagedObjectContext alloc] init]; - [__managedObjectContext setPersistentStoreCoordinator:coordinator]; + if (coordinator != nil) + { + _managedObjectContext = [[NSManagedObjectContext alloc] init]; + [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } - return __managedObjectContext; + return _managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { - if (__managedObjectModel != nil) { - return __managedObjectModel; + if (_managedObjectModel != nil) + { + return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"WorldFacts" withExtension:@"momd"]; - __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; - return __managedObjectModel; + _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; + return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { - if (__persistentStoreCoordinator != nil) { - return __persistentStoreCoordinator; + if (_persistentStoreCoordinator != nil) + { + return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationSupportDirectory] URLByAppendingPathComponent:@"WorldFacts.sqlite"]; NSError *error = nil; - __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; - if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { + _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; + if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType + configuration:nil + URL:storeURL + options:nil + error:&error]) + { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); } - return __persistentStoreCoordinator; + return _persistentStoreCoordinator; } #pragma mark - #pragma mark === Utility Methods === #pragma mark - -- (void)saveContext -{ - NSError *error = nil; - NSManagedObjectContext *managedObjectContext = self.managedObjectContext; - if (managedObjectContext != nil) { - if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { - NSLog(@"Unresolved error %@, %@", error, [error userInfo]); - } - } -} - - (NSURL *)applicationSupportDirectory { NSError *error = nil; From 08bf85147af2fc98dbc33f38f52acc781e27b853 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Dec 2014 22:56:29 +0000 Subject: [PATCH 011/229] Implement UISearchController --- .../WorldFacts/Base.lproj/Main.storyboard | 10 +- .../UYLCountryTableViewController.h | 4 +- .../UYLCountryTableViewController.m | 262 +++++++----------- .../WorldFacts/UYLCountryViewController.h | 4 +- .../WorldFacts/UYLCountryViewController.m | 70 +++-- 5 files changed, 161 insertions(+), 189 deletions(-) diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index 75032b9..82b98ec 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -20,10 +20,10 @@ - + - + @@ -180,8 +180,6 @@ - - @@ -219,7 +217,7 @@ - + @@ -269,7 +267,7 @@ - + diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.h b/WorldFacts/WorldFacts/UYLCountryTableViewController.h index 41bd1bc..3f6cfc2 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.h +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.h @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2014 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,7 +31,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UYLCountryTableViewController : UITableViewController diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.m b/WorldFacts/WorldFacts/UYLCountryTableViewController.m index 8ae325a..4ade167 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.m @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2014 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,17 +33,16 @@ #import "UYLCountryTableViewController.h" #import "UYLCountryViewController.h" +#import "CountryCell.h" #import "Country+Extensions.h" -@interface UYLCountryTableViewController () +@interface UYLCountryTableViewController () @property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; @property (strong, nonatomic) NSNumberFormatter *decimalFormatter; @property (strong, nonatomic) NSArray *filteredList; @property (strong, nonatomic) NSFetchRequest *searchFetchRequest; - -@property (strong, nonatomic) IBOutlet UITableViewCell *countryCell; -@property (strong, nonatomic) UINib *countryCellNib; +@property (strong, nonatomic) UISearchController *searchController; typedef NS_ENUM(NSInteger, UYLWorldFactsSearchScope) { @@ -55,14 +54,9 @@ typedef NS_ENUM(NSInteger, UYLWorldFactsSearchScope) @implementation UYLCountryTableViewController -static NSString *UYLNibCountryCellIdentifier = @"UYLNibCountryCellIdentifier"; static NSString *UYLCountryCellIdentifier = @"UYLCountryCellIdentifier"; static NSString *UYLSegueShowCountry = @"UYLSegueShowCountry"; -#define UYL_COUNTRYCELLTAG_NAME 100 -#define UYL_COUNTRYCELLTAG_CAPITAL 200 -#define UYL_COUNTRYCELLTAG_POP 300 - #pragma mark - #pragma mark === View Life Cycle Management === #pragma mark - @@ -72,64 +66,71 @@ - (void)viewDidLoad [super viewDidLoad]; self.title = NSLocalizedString(@"World", @"World"); - // When not using storyboards the following two lines load and register the NIB - // for the country cell. + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didChangePreferredContentSize:) + name:UIContentSizeCategoryDidChangeNotification object:nil]; + self.tableView.estimatedRowHeight = 64.0; + self.tableView.rowHeight = UITableViewAutomaticDimension; + + // No search results controller to display the search results in the current view + self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; + self.searchController.searchResultsUpdater = self; + self.searchController.dimsBackgroundDuringPresentation = NO; - // UINib *countryNib = [UINib nibWithNibName:@"CountryCell" bundle:nil]; - // [self.tableView registerNib:countryNib forCellReuseIdentifier:UYLCountryCellIdentifier]; + // Configure the search bar with scope buttons and add it to the table view header + self.searchController.searchBar.scopeButtonTitles = @[@"Country", @"Capital"]; + self.searchController.searchBar.delegate = self; + + self.tableView.tableHeaderView = self.searchController.searchBar; + + self.definesPresentationContext = YES; +} + +- (void)didChangePreferredContentSize:(NSNotification *)notification +{ + [self.tableView reloadData]; } -// viewDidUnload is deprecated in iOS 6 -//- (void)viewDidUnload -//{ -// [super viewDidUnload]; -// self.decimalFormatter = nil; -//} +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + self.decimalFormatter = nil; + self.searchFetchRequest = nil; +} -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +- (void)dealloc { - return YES; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:UIContentSizeCategoryDidChangeNotification + object:nil]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:UYLSegueShowCountry]) { + NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; Country *country = nil; - if (self.searchDisplayController.isActive) + if (self.searchController.isActive) { - NSIndexPath *indexPath = [self.searchDisplayController.searchResultsTableView indexPathForCell:sender]; country = [self.filteredList objectAtIndex:indexPath.row]; } else { - NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; country = [self.fetchedResultsController objectAtIndexPath:indexPath]; } - UYLCountryViewController *viewController = segue.destinationViewController; - viewController.country = country; + + UYLCountryViewController *controller = (UYLCountryViewController *)[[segue destinationViewController] topViewController]; + [controller setCountry:country]; + controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; + controller.navigationItem.leftItemsSupplementBackButton = YES; } } -- (void)didReceiveMemoryWarning -{ - self.searchFetchRequest = nil; - [super didReceiveMemoryWarning]; -} - #pragma mark - #pragma mark === Accessors === #pragma mark - -- (UINib *)countryCellNib -{ - if (!_countryCellNib) - { - _countryCellNib = [UINib nibWithNibName:@"CountryCell" bundle:nil]; - } - return _countryCellNib; -} - - (NSNumberFormatter *)decimalFormatter { if (!_decimalFormatter) @@ -164,121 +165,81 @@ - (NSFetchRequest *)searchFetchRequest - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - if (tableView == self.tableView) + if (self.searchController.active) { - return [[self.fetchedResultsController sections] count]; + return 1; } else { - return 1; + return [[self.fetchedResultsController sections] count]; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (tableView == self.tableView) + if (self.searchController.active) { - id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; - return [sectionInfo numberOfObjects]; + return [self.filteredList count]; } else { - return [self.filteredList count]; + id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; + return [sectionInfo numberOfObjects]; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - // Note that here we are not using the tableView parameter to retrieve a new table view cell. Instead - // we always use self.tableView. This is necessary as our custom table view cell defined in the - // storyboard and is not registered with the search results table view but only with the original - // table. + CountryCell *cell = [self.tableView dequeueReusableCellWithIdentifier:UYLCountryCellIdentifier forIndexPath:indexPath]; - UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:UYLCountryCellIdentifier]; - - // ******************************************************************************* - // If you are targetting iOS 5 there is a serious bug here with VoiceOver active!! - // ******************************************************************************* - - // A bug in iOS 5 causes the above call to not return with a new cell when VoiceOver is active. - // We therefore fallback to the old mechanism of manually loading the cell from the NIB file. - - // Unfortunately this has two side effects. Firstly we need to manually perform the segue - // when the row is selected. To ensure we only do that for the cells loaded manually we - // need to use a different reuseIdentifer. - - // More seriously since the reuse mechanism does not work when VoiceOver is active - // new cells are allocated each time the table is reloaded or scrolled and never reused. - - if (cell == nil) - { - // The following call should return cells for reuse but when VoiceOver is active - // it always returns nil - - cell = [self.tableView dequeueReusableCellWithIdentifier:UYLNibCountryCellIdentifier]; - - if (cell == nil) - { - [self.countryCellNib instantiateWithOwner:self options:nil]; - cell = self.countryCell; - self.countryCell = nil; - } - } - Country *country = nil; - if (tableView == self.tableView) + if (self.searchController.active) { - country = [self.fetchedResultsController objectAtIndexPath:indexPath]; + country = [self.filteredList objectAtIndex:indexPath.row]; } else { - country = [self.filteredList objectAtIndex:indexPath.row]; + country = [self.fetchedResultsController objectAtIndexPath:indexPath]; } - UILabel *nameLabel = (UILabel *)[cell viewWithTag:UYL_COUNTRYCELLTAG_NAME]; - nameLabel.text = country.name; - - UILabel *capLabel = (UILabel *)[cell viewWithTag:UYL_COUNTRYCELLTAG_CAPITAL]; - capLabel.text = country.capital; - - UILabel *popLabel = (UILabel *)[cell viewWithTag:UYL_COUNTRYCELLTAG_POP]; + cell.countryLabel.text = country.name; + cell.capitalLabel.text = country.capital; + NSString *population = [self.decimalFormatter stringFromNumber:country.population]; - popLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Pop: %@", @"Pop:"), population]; + cell.populationLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Pop: %@", @"Pop:"), population]; + + cell.countryLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + cell.capitalLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + cell.populationLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; return cell; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - if (tableView == self.tableView) + if (!self.searchController.active) { id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; return [sectionInfo name]; } - else - { - return nil; - } + return nil; } - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { - if (tableView == self.tableView) + if (!self.searchController.active) { NSMutableArray *index = [NSMutableArray arrayWithObject:UITableViewIndexSearch]; NSArray *initials = [self.fetchedResultsController sectionIndexTitles]; [index addObjectsFromArray:initials]; return index; } - else - { - return nil; - } + return nil; } - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { - if (tableView == self.tableView) + if (!self.searchController.active) { if (index > 0) { @@ -292,31 +253,12 @@ - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSS // The first entry in the index is for the search icon so we return section not found // and force the table to scroll to the top. - self.tableView.contentOffset = CGPointZero; + CGRect searchBarFrame = self.searchController.searchBar.frame; + [self.tableView scrollRectToVisible:searchBarFrame animated:NO]; return NSNotFound; } } - else - { - return 0; - } -} - -#pragma mark - -#pragma mark === UITableViewDelegate === -#pragma mark - - -// The following method is implemented as a workaround for the iOS 5 bug when dequeuing -// cells with VoiceOver active. When the cell is not loaded from the storyboard -// we need to manually perform the segue. - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; - if ([cell.reuseIdentifier isEqualToString:UYLNibCountryCellIdentifier]) - { - [self performSegueWithIdentifier:UYLSegueShowCountry sender:cell]; - } + return 0; } #pragma mark - @@ -330,26 +272,29 @@ - (NSFetchedResultsController *)fetchedResultsController return _fetchedResultsController; } - NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; - NSEntityDescription *entity = [NSEntityDescription entityForName:@"Country" inManagedObjectContext:self.managedObjectContext]; - [fetchRequest setEntity:entity]; - - NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; - NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; - [fetchRequest setSortDescriptors:sortDescriptors]; - - NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest - managedObjectContext:self.managedObjectContext - sectionNameKeyPath:@"sectionTitle" - cacheName:@"Country"]; - frc.delegate = self; - self.fetchedResultsController = frc; - - NSError *error = nil; - if (![self.fetchedResultsController performFetch:&error]) + if (self.managedObjectContext) { - NSLog(@"Unresolved error %@, %@", error, [error userInfo]); - } + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription entityForName:@"Country" inManagedObjectContext:self.managedObjectContext]; + [fetchRequest setEntity:entity]; + + NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; + NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; + [fetchRequest setSortDescriptors:sortDescriptors]; + + NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest + managedObjectContext:self.managedObjectContext + sectionNameKeyPath:@"sectionTitle" + cacheName:@"Country"]; + frc.delegate = self; + self.fetchedResultsController = frc; + + NSError *error = nil; + if (![self.fetchedResultsController performFetch:&error]) + { + NSLog(@"Unresolved error %@, %@", error, [error userInfo]); + } + } return _fetchedResultsController; } @@ -360,26 +305,23 @@ - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller } #pragma mark - -#pragma mark === UISearchDisplayDelegate === +#pragma mark === UISearchBarDelegate === #pragma mark - -- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString +- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope { - UYLWorldFactsSearchScope scopeKey = controller.searchBar.selectedScopeButtonIndex; - [self searchForText:searchString scope:scopeKey]; - return YES; + [self updateSearchResultsForSearchController:self.searchController]; } -- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption -{ - NSString *searchString = controller.searchBar.text; - [self searchForText:searchString scope:searchOption]; - return YES; -} +#pragma mark - +#pragma mark === UISearchResultsUpdating === +#pragma mark - -- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView +- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { - tableView.rowHeight = 64; + NSString *searchString = searchController.searchBar.text; + [self searchForText:searchString scope:searchController.searchBar.selectedScopeButtonIndex]; + [self.tableView reloadData]; } - (void)searchForText:(NSString *)searchText scope:(UYLWorldFactsSearchScope)scopeOption diff --git a/WorldFacts/WorldFacts/UYLCountryViewController.h b/WorldFacts/WorldFacts/UYLCountryViewController.h index f4f198d..e7dda9c 100644 --- a/WorldFacts/WorldFacts/UYLCountryViewController.h +++ b/WorldFacts/WorldFacts/UYLCountryViewController.h @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2014 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,7 +31,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; #import "Country.h" @interface UYLCountryViewController : UIViewController diff --git a/WorldFacts/WorldFacts/UYLCountryViewController.m b/WorldFacts/WorldFacts/UYLCountryViewController.m index 0a2afe5..f484fdc 100644 --- a/WorldFacts/WorldFacts/UYLCountryViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryViewController.m @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2014 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: @@ -43,18 +43,48 @@ @interface UYLCountryViewController () @property (nonatomic, weak) IBOutlet UILabel *population; @property (nonatomic, weak) IBOutlet UILabel *tld; +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *headlineCollection; +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *bodyCollection; + @end @implementation UYLCountryViewController -//@synthesize country=_country; -//@synthesize area=_area; -//@synthesize capital=_capital; -//@synthesize continent=_continent; -//@synthesize currency=_currency; -//@synthesize phone=_phone; -//@synthesize population=_population; -//@synthesize tld=_tld; +- (void)setCountry:(Country *)newCountry +{ + if (_country != newCountry) + { + _country = newCountry; + [self configureView]; + } +} + +- (void)configureView +{ + for (UILabel *label in self.headlineCollection) + { + label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + } + + for (UILabel *label in self.bodyCollection) + { + label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + } + + self.title = self.country.name; + + NSString *area = [NSNumberFormatter localizedStringFromNumber:self.country.area numberStyle:NSNumberFormatterDecimalStyle]; + self.area.text = [area length] ? area : @"None"; + + NSString *population = [NSNumberFormatter localizedStringFromNumber:self.country.population numberStyle:NSNumberFormatterDecimalStyle]; + self.population.text = [population length] ? population: @"None"; + + self.capital.text = [self.country.capital length] ? self.country.capital : @"None"; + self.continent.text = [self.country.continent length] ? self.country.continent : @"None"; + self.currency.text = [self.country.currency length] ? self.country.currency : @"None"; + self.phone.text = [self.country.phone length] ? self.country.phone : @"None"; + self.tld.text = [self.country.tld length] ? self.country.tld : @"None"; +} #pragma mark - #pragma mark === View Life Cycle Management === @@ -63,21 +93,23 @@ @implementation UYLCountryViewController - (void)viewDidLoad { [super viewDidLoad]; + [self configureView]; - self.title = self.country.name; - self.area.text = [NSNumberFormatter localizedStringFromNumber:self.country.area numberStyle:NSNumberFormatterDecimalStyle]; - self.population.text = [NSNumberFormatter localizedStringFromNumber:self.country.population numberStyle:NSNumberFormatterDecimalStyle]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didChangePreferredContentSize:) + name:UIContentSizeCategoryDidChangeNotification object:nil]; +} - self.capital.text = self.country.capital; - self.continent.text = self.country.continent; - self.currency.text = self.country.currency; - self.phone.text = self.country.phone; - self.tld.text = self.country.tld; +- (void)didChangePreferredContentSize:(NSNotification *)notification +{ + [self configureView]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +- (void)dealloc { - return YES; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:UIContentSizeCategoryDidChangeNotification + object:nil]; } @end From f5c14e8473224dcbc0fe407e7602faa3b85fa31a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Dec 2014 23:01:00 +0000 Subject: [PATCH 012/229] Remove old plist keys --- WorldFacts/WorldFacts/WorldFacts-Info.plist | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/WorldFacts/WorldFacts/WorldFacts-Info.plist b/WorldFacts/WorldFacts/WorldFacts-Info.plist index dedc3b1..0e95c6c 100644 --- a/WorldFacts/WorldFacts/WorldFacts-Info.plist +++ b/WorldFacts/WorldFacts/WorldFacts-Info.plist @@ -8,10 +8,6 @@ ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIcons - - CFBundleIcons~ipad - CFBundleIdentifier com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion @@ -30,12 +26,6 @@ UIMainStoryboardFile Main - UIMainStoryboardFile~ipad - Main - UIRequiredDeviceCapabilities - - armv7 - UISupportedInterfaceOrientations UIInterfaceOrientationPortrait From da6e020ffc2a7c02a5b94f0055dc17bad9fbe778 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 10 Dec 2014 21:47:12 +0000 Subject: [PATCH 013/229] Remove iOS 6 launch images --- .../WorldFacts.xcodeproj/project.pbxproj | 12 ------- .../LaunchImage.launchimage/Contents.json | 30 +++++++++--------- .../Default-568h@2x.png | Bin 6012 -> 0 bytes .../LaunchImage.launchimage/Default@2x.png | Bin 5485 -> 0 bytes 4 files changed, 15 insertions(+), 27 deletions(-) delete mode 100644 WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png delete mode 100644 WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default@2x.png diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 4194bef..7a9f477 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -9,9 +9,6 @@ /* Begin PBXBuildFile section */ 532CADEB158D1286002BEDC8 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 532CADEA158D1286002BEDC8 /* README */; }; 532CADF5158D19D1002BEDC8 /* UYLCountryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532CADF4158D19D1002BEDC8 /* UYLCountryViewController.m */; }; - 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B391691E77100719AF8 /* Default-568h@2x.png */; }; - 53524B411691E77100719AF8 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3A1691E77100719AF8 /* Default.png */; }; - 53524B421691E77100719AF8 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53524B3B1691E77100719AF8 /* Default@2x.png */; }; 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 538A7987157E567F0007B8A5 /* InfoPlist.strings */; }; 538A798B157E567F0007B8A5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798A157E567F0007B8A5 /* main.m */; }; 538A798F157E567F0007B8A5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */; }; @@ -29,9 +26,6 @@ 532CADEA158D1286002BEDC8 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; 532CADF3158D19D1002BEDC8 /* UYLCountryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryViewController.h; sourceTree = ""; }; 532CADF4158D19D1002BEDC8 /* UYLCountryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCountryViewController.m; sourceTree = ""; }; - 53524B391691E77100719AF8 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 53524B3A1691E77100719AF8 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 53524B3B1691E77100719AF8 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 538A7978157E567F0007B8A5 /* WorldFacts.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WorldFacts.app; sourceTree = BUILT_PRODUCTS_DIR; }; 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WorldFacts-Info.plist"; sourceTree = ""; }; 538A798A157E567F0007B8A5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -66,9 +60,6 @@ 53524B241691D45C00719AF8 /* Resources */ = { isa = PBXGroup; children = ( - 53524B391691E77100719AF8 /* Default-568h@2x.png */, - 53524B3A1691E77100719AF8 /* Default.png */, - 53524B3B1691E77100719AF8 /* Default@2x.png */, ); name = Resources; path = ..; @@ -207,9 +198,6 @@ 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, 53E782701A365AE60075A619 /* Main.storyboard in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, - 53524B401691E77100719AF8 /* Default-568h@2x.png in Resources */, - 53524B411691E77100719AF8 /* Default.png in Resources */, - 53524B421691E77100719AF8 /* Default@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json index ecd898a..6da7c45 100644 --- a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -2,45 +2,45 @@ "images" : [ { "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", + "idiom" : "iphone", "extent" : "full-screen", - "scale" : "1x" + "minimum-system-version" : "7.0", + "scale" : "2x" }, { "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", + "idiom" : "iphone", "extent" : "full-screen", + "minimum-system-version" : "7.0", + "subtype" : "retina4", "scale" : "2x" }, { - "orientation" : "landscape", + "orientation" : "portrait", "idiom" : "ipad", - "minimum-system-version" : "7.0", "extent" : "full-screen", + "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", - "minimum-system-version" : "7.0", "extent" : "full-screen", - "scale" : "2x" + "minimum-system-version" : "7.0", + "scale" : "1x" }, { "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default@2x.png", + "idiom" : "ipad", + "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", "minimum-system-version" : "7.0", - "subtype" : "retina4", "scale" : "2x" } ], diff --git a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png deleted file mode 100644 index 613355750ec785f2f9a21995536334afff835e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6012 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 diff --git a/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default@2x.png b/WorldFacts/WorldFacts/Images.xcassets/LaunchImage.launchimage/Default@2x.png deleted file mode 100644 index 0d5eccda2ee1cc7fe528d7ce77bbd63cc3a4fea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5485 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 Date: Wed, 10 Dec 2014 22:39:18 +0000 Subject: [PATCH 014/229] Add LaunchScreen NIB file --- WorldFacts/Default-568h@2x.png | Bin 6012 -> 0 bytes WorldFacts/Default.png | Bin 1853 -> 0 bytes WorldFacts/Default@2x.png | Bin 5485 -> 0 bytes .../WorldFacts.xcodeproj/project.pbxproj | 4 +++ WorldFacts/WorldFacts/LaunchScreen.xib | 29 ++++++++++++++++++ WorldFacts/WorldFacts/WorldFacts-Info.plist | 2 ++ 6 files changed, 35 insertions(+) delete mode 100644 WorldFacts/Default-568h@2x.png delete mode 100644 WorldFacts/Default.png delete mode 100644 WorldFacts/Default@2x.png create mode 100644 WorldFacts/WorldFacts/LaunchScreen.xib diff --git a/WorldFacts/Default-568h@2x.png b/WorldFacts/Default-568h@2x.png deleted file mode 100644 index 613355750ec785f2f9a21995536334afff835e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6012 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 diff --git a/WorldFacts/Default.png b/WorldFacts/Default.png deleted file mode 100644 index 0bb331c7aad39dd47719a4e26b21cf9ea3f3ae04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1853 zcmbVNYfzeJ8YMQn*-7KhZl^YFqUlZ=V`~=MG-KS^5ly-p<7(7qP1EScXyYXoKh#9U zD_)48DBcw#R}ln7(F%OQ8%kOmFI5x-BM9C=K~bZkR*kw}`hWlQnR(wI?>x_$^PF>L z-uwVRFYA+MPQqX?Yww#Lw_&hj*Pt`=r+1*2`P&{zFql)rIwX!2 zo<$!R9se$qR>A3xBXAV3xRl}}FT48~W}b5YpZ0*3f;VMB3U$BcmKHd@Pz z)G~ffwSZE`$*yh-!%*W3xK#cN>@z_=?RhR)lvd6s(4Rkg$|N$|6N`9NTuDY{YZ0@3 zU{sM<)HtksMXYU4E^U5VBP?Wy)wA<+rsYz0XFd%C@a(kmmZ}EHi1O7VEOXYlOkr|J zjXl^Jp-eTY)i2~c6UZji{W3)ftK$i=;YndbDXTLwrkvoT7DdotIF726uy)| z7eCCRlbd=;4U)%&-020QN;?ySXUE`K{i6znT01(SjwNtV`Sp`C^XQVM=%>t-vgYqF zG`U(^$(7)#U_60SRM!!Tp`weM3TxYOWYL_-OyR$%;B@H>i=i3R^zxRn`mWfw2y?T> zrRdx`Adj71(MqY~&YR2wW8(#MF%nldqMTG}r>l8AgJa4^*xGDT+u+!E7>1Td19Qnj za+5S7hk?ptm)Cbk<9v* z{yhN{`TG0%`ulTx94;P?x&z4e%*?&RPclsk1^`DpIIP{$b-OgkhP~CQwwZ$oZAOaJ z%m&~-nfFrD`{Xt#!u>~HGU*CD&TVnv#LGZ zJ96PYG~d+E0^r^Uo!G10A0Gp&q(VV-G&WW4=6}|eeD$U# z$n~5oS3x_2IPL1pL7Y>oN@HM#Dus4chMvYV`ClWUeA)e&c2~m-TuJok|tpL#< zUtiy?2hKJw&NdGmRf+ka=-2d*_d_hZ7So&F#X10v={fT1IkHE%FK_NcaQ_-0;&5d{ z_V(5!ACwWY%aeD;E%;8Lu(99T8q%(uq+q)^aCnzEK3Gr`Zip}q?|*eywcFIS38{fV zWUS96AUZOYo|>SdpMJ8&LB~i6p#9kF;bHb9dpOl6@haqf;o_Aq+XRV`QQ^kH zdI0W^XpTxUPF>doB^^&XzJ0>#Xe8F^Eu#nk02pnzNs>V|49dfOaolW;u2>~D{22EQ7NdwaG^#DxgfU3XzKo5AP}o;lEVdQH%B5Fu*S+?J$c1w@l~KolAR`}BRa1YtoL z!*4Eb2jqdGLZ@lh#x?!M@Q~IP3by|*sfzm$btamYr~AmxF5`Sq^e9*bQUQYjFf0yg zMnonj4gen*7|6&NShL?TB|)BgczC4Strz+2oR<(G#bvGy3F4KDP@=<%_M%5@wZ#%) zbHsGtn>Ro1?(SPc#${n@)y9X1r;kCO%kQk2kGE&8{WjZwB>HRMo!?!R+cPC^ajuOX hP3XS(4e|e9fB%D?smnr+5Lj<}ygmIq_+N$Q{10-(@2LO) diff --git a/WorldFacts/Default@2x.png b/WorldFacts/Default@2x.png deleted file mode 100644 index 0d5eccda2ee1cc7fe528d7ce77bbd63cc3a4fea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5485 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 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WorldFacts/WorldFacts/WorldFacts-Info.plist b/WorldFacts/WorldFacts/WorldFacts-Info.plist index 0e95c6c..bcfd52d 100644 --- a/WorldFacts/WorldFacts/WorldFacts-Info.plist +++ b/WorldFacts/WorldFacts/WorldFacts-Info.plist @@ -24,6 +24,8 @@ 2.0 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile Main UISupportedInterfaceOrientations From b8ca1468393c8c9a8d98469ce115eb37dac6d671 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 11 Dec 2014 23:20:35 +0000 Subject: [PATCH 015/229] Localise strings --- WorldFacts/WorldFacts.xcodeproj/project.pbxproj | 14 +++++++------- .../WorldFacts/UYLCountryTableViewController.m | 7 ++++--- WorldFacts/WorldFacts/en.lproj/Localizable.strings | 9 +++++++++ 3 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 WorldFacts/WorldFacts/en.lproj/Localizable.strings diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 17f8188..d82a038 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 532CADEB158D1286002BEDC8 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 532CADEA158D1286002BEDC8 /* README */; }; 532CADF5158D19D1002BEDC8 /* UYLCountryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532CADF4158D19D1002BEDC8 /* UYLCountryViewController.m */; }; - 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 538A7987157E567F0007B8A5 /* InfoPlist.strings */; }; 538A798B157E567F0007B8A5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798A157E567F0007B8A5 /* main.m */; }; 538A798F157E567F0007B8A5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A798E157E567F0007B8A5 /* UYLAppDelegate.m */; }; 538A7992157E567F0007B8A5 /* WorldFacts.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 538A7990157E567F0007B8A5 /* WorldFacts.xcdatamodeld */; }; @@ -18,6 +17,7 @@ 5391E1CD1A38F80700218F41 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5391E1CC1A38F80700218F41 /* LaunchScreen.xib */; }; 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */; }; 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; + 53B691731A3A5AE500DDFBE2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B691751A3A5AE500DDFBE2 /* Localizable.strings */; }; 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; 53E782701A365AE60075A619 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E782721A365AE60075A619 /* Main.storyboard */; }; 53EDC9911A37AF03005CDB68 /* CountryCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDC9901A37AF03005CDB68 /* CountryCell.m */; }; @@ -41,9 +41,9 @@ 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Country+Extensions.m"; sourceTree = ""; }; 53A87BEF157FAD42000DBAC9 /* Country.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Country.h; sourceTree = ""; }; 53A87BF0157FAD42000DBAC9 /* Country.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Country.m; sourceTree = ""; }; + 53B691741A3A5AE500DDFBE2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 53E7826C1A3658590075A619 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 53E782731A365AF30075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 53E782741A365B120075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; 53EDC98F1A37AF03005CDB68 /* CountryCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountryCell.h; sourceTree = ""; }; 53EDC9901A37AF03005CDB68 /* CountryCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountryCell.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -104,8 +104,8 @@ children = ( 538A79B1157E80D40007B8A5 /* countries.plist */, 538A7986157E567F0007B8A5 /* WorldFacts-Info.plist */, - 538A7987157E567F0007B8A5 /* InfoPlist.strings */, 538A798A157E567F0007B8A5 /* main.m */, + 53B691751A3A5AE500DDFBE2 /* Localizable.strings */, ); name = "Supporting Files"; sourceTree = ""; @@ -196,9 +196,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 538A7989157E567F0007B8A5 /* InfoPlist.strings in Resources */, 538A79B2157E80D40007B8A5 /* countries.plist in Resources */, 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, + 53B691731A3A5AE500DDFBE2 /* Localizable.strings in Resources */, 53E782701A365AE60075A619 /* Main.storyboard in Resources */, 5391E1CD1A38F80700218F41 /* LaunchScreen.xib in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, @@ -226,12 +226,12 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 538A7987157E567F0007B8A5 /* InfoPlist.strings */ = { + 53B691751A3A5AE500DDFBE2 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( - 53E782741A365B120075A619 /* Base */, + 53B691741A3A5AE500DDFBE2 /* en */, ); - name = InfoPlist.strings; + name = Localizable.strings; sourceTree = ""; }; 53E782721A365AE60075A619 /* Main.storyboard */ = { diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.m b/WorldFacts/WorldFacts/UYLCountryTableViewController.m index 4ade167..4b657d9 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.m @@ -64,7 +64,7 @@ @implementation UYLCountryTableViewController - (void)viewDidLoad { [super viewDidLoad]; - self.title = NSLocalizedString(@"World", @"World"); + self.title = NSLocalizedString(@"WorldTableViewTitle", @"World"); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangePreferredContentSize:) @@ -78,7 +78,8 @@ - (void)viewDidLoad self.searchController.dimsBackgroundDuringPresentation = NO; // Configure the search bar with scope buttons and add it to the table view header - self.searchController.searchBar.scopeButtonTitles = @[@"Country", @"Capital"]; + self.searchController.searchBar.scopeButtonTitles = @[NSLocalizedString(@"ScopeButtonCountry",@"Country"), + NSLocalizedString(@"ScopeButtonCapital",@"Capital")]; self.searchController.searchBar.delegate = self; self.tableView.tableHeaderView = self.searchController.searchBar; @@ -206,7 +207,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.capitalLabel.text = country.capital; NSString *population = [self.decimalFormatter stringFromNumber:country.population]; - cell.populationLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Pop: %@", @"Pop:"), population]; + cell.populationLabel.text = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"PopulationShortLabel", @"Pop:"), population]; cell.countryLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; cell.capitalLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; diff --git a/WorldFacts/WorldFacts/en.lproj/Localizable.strings b/WorldFacts/WorldFacts/en.lproj/Localizable.strings new file mode 100644 index 0000000..5c46c48 --- /dev/null +++ b/WorldFacts/WorldFacts/en.lproj/Localizable.strings @@ -0,0 +1,9 @@ +/* + Localizable.strings + WorldFacts +*/ + +"WorldTableViewTitle" = "World"; +"ScopeButtonCountry" = "Country"; +"ScopeButtonCapital" = "Capital"; +"PopulationShortLabel" = "Pop:"; \ No newline at end of file From 16f85106566c54157b684d16f7c5691259c55d10 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 11 Dec 2014 23:21:41 +0000 Subject: [PATCH 016/229] Remove resources folder --- WorldFacts/WorldFacts.xcodeproj/project.pbxproj | 9 --------- 1 file changed, 9 deletions(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index d82a038..34dacbb 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -59,14 +59,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 53524B241691D45C00719AF8 /* Resources */ = { - isa = PBXGroup; - children = ( - ); - name = Resources; - path = ..; - sourceTree = ""; - }; 538A796D157E567E0007B8A5 = { isa = PBXGroup; children = ( @@ -93,7 +85,6 @@ 538A799A157E56BF0007B8A5 /* Views */, 538A7998157E56A30007B8A5 /* Controllers */, 538A7985157E567F0007B8A5 /* Supporting Files */, - 53524B241691D45C00719AF8 /* Resources */, 53E7826C1A3658590075A619 /* Images.xcassets */, ); path = WorldFacts; From 9361f8a224ece89d2c4d64532c90444a3f1a3516 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 29 Dec 2014 19:46:29 +0000 Subject: [PATCH 017/229] Add launch screen storyboard --- .../WorldFacts.xcodeproj/project.pbxproj | 8 ++-- WorldFacts/WorldFacts/LaunchScreen.storyboard | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 WorldFacts/WorldFacts/LaunchScreen.storyboard diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 34dacbb..f002685 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -14,13 +14,13 @@ 538A7992157E567F0007B8A5 /* WorldFacts.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 538A7990157E567F0007B8A5 /* WorldFacts.xcdatamodeld */; }; 538A79A4157E5A730007B8A5 /* UYLCountryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A79A3157E5A730007B8A5 /* UYLCountryTableViewController.m */; }; 538A79B2157E80D40007B8A5 /* countries.plist in Resources */ = {isa = PBXBuildFile; fileRef = 538A79B1157E80D40007B8A5 /* countries.plist */; }; - 5391E1CD1A38F80700218F41 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5391E1CC1A38F80700218F41 /* LaunchScreen.xib */; }; 53A87BE7157FA30A000DBAC9 /* Country+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */; }; 53A87BF1157FAD42000DBAC9 /* Country.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A87BF0157FAD42000DBAC9 /* Country.m */; }; 53B691731A3A5AE500DDFBE2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B691751A3A5AE500DDFBE2 /* Localizable.strings */; }; 53E7826D1A3658590075A619 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E7826C1A3658590075A619 /* Images.xcassets */; }; 53E782701A365AE60075A619 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E782721A365AE60075A619 /* Main.storyboard */; }; 53EDC9911A37AF03005CDB68 /* CountryCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDC9901A37AF03005CDB68 /* CountryCell.m */; }; + 53EEC7E71A4B6254000EB901 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53EEC7E61A4B6254000EB901 /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -36,7 +36,6 @@ 538A79A2157E5A730007B8A5 /* UYLCountryTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryTableViewController.h; sourceTree = ""; }; 538A79A3157E5A730007B8A5 /* UYLCountryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCountryTableViewController.m; sourceTree = ""; }; 538A79B1157E80D40007B8A5 /* countries.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = countries.plist; sourceTree = ""; }; - 5391E1CC1A38F80700218F41 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; 53A87BE5157FA30A000DBAC9 /* Country+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Country+Extensions.h"; sourceTree = ""; }; 53A87BE6157FA30A000DBAC9 /* Country+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Country+Extensions.m"; sourceTree = ""; }; 53A87BEF157FAD42000DBAC9 /* Country.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Country.h; sourceTree = ""; }; @@ -46,6 +45,7 @@ 53E782731A365AF30075A619 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 53EDC98F1A37AF03005CDB68 /* CountryCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountryCell.h; sourceTree = ""; }; 53EDC9901A37AF03005CDB68 /* CountryCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountryCell.m; sourceTree = ""; }; + 53EEC7E61A4B6254000EB901 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -128,9 +128,9 @@ isa = PBXGroup; children = ( 53E782721A365AE60075A619 /* Main.storyboard */, + 53EEC7E61A4B6254000EB901 /* LaunchScreen.storyboard */, 53EDC98F1A37AF03005CDB68 /* CountryCell.h */, 53EDC9901A37AF03005CDB68 /* CountryCell.m */, - 5391E1CC1A38F80700218F41 /* LaunchScreen.xib */, ); name = Views; sourceTree = ""; @@ -191,7 +191,7 @@ 53E7826D1A3658590075A619 /* Images.xcassets in Resources */, 53B691731A3A5AE500DDFBE2 /* Localizable.strings in Resources */, 53E782701A365AE60075A619 /* Main.storyboard in Resources */, - 5391E1CD1A38F80700218F41 /* LaunchScreen.xib in Resources */, + 53EEC7E71A4B6254000EB901 /* LaunchScreen.storyboard in Resources */, 532CADEB158D1286002BEDC8 /* README in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/WorldFacts/WorldFacts/LaunchScreen.storyboard b/WorldFacts/WorldFacts/LaunchScreen.storyboard new file mode 100644 index 0000000..58daca0 --- /dev/null +++ b/WorldFacts/WorldFacts/LaunchScreen.storyboard @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 867f02109f6254c46d796b0557c1d3300d85fd31 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 10 Jan 2015 21:24:04 +0000 Subject: [PATCH 018/229] Resolve problem with initial line width The lineLabel UILabel has an explicit contentWidth set that was causing the line to be truncated on initial display. Removing the explicit width resolves the issue. --- SelfSize/SelfSize/Base.lproj/Main.storyboard | 6 +++--- SelfSize/SelfSize/UYLTableViewController.m | 6 ------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/SelfSize/SelfSize/Base.lproj/Main.storyboard b/SelfSize/SelfSize/Base.lproj/Main.storyboard index 70de00f..6bfa106 100644 --- a/SelfSize/SelfSize/Base.lproj/Main.storyboard +++ b/SelfSize/SelfSize/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -24,7 +24,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WorldFacts/WorldFactsBuilder/CountryTableViewController.h b/WorldFacts/WorldFactsBuilder/CountryTableViewController.h new file mode 100644 index 0000000..1b2c7a3 --- /dev/null +++ b/WorldFacts/WorldFactsBuilder/CountryTableViewController.h @@ -0,0 +1,39 @@ +// +// CountryTableViewController.h +// WorldFacts +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 + +@interface CountryTableViewController : NSViewController +@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; +@end diff --git a/WorldFacts/WorldFactsBuilder/CountryTableViewController.m b/WorldFacts/WorldFactsBuilder/CountryTableViewController.m new file mode 100644 index 0000000..4fc2a0b --- /dev/null +++ b/WorldFacts/WorldFactsBuilder/CountryTableViewController.m @@ -0,0 +1,55 @@ +// +// CountryTableViewController.m +// WorldFacts +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "CountryTableViewController.h" + +@interface CountryTableViewController () +@property (nonatomic, strong, readonly) NSArray *sortDescriptors; +@end + +@implementation CountryTableViewController + +@synthesize sortDescriptors = _sortDescriptors; + +- (NSArray *)sortDescriptors { + + if (_sortDescriptors == nil){ + NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; + _sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; + } + return _sortDescriptors; +} + + +@end diff --git a/WorldFacts/WorldFactsBuilder/CountryWindowController.h b/WorldFacts/WorldFactsBuilder/CountryWindowController.h new file mode 100644 index 0000000..0a42510 --- /dev/null +++ b/WorldFacts/WorldFactsBuilder/CountryWindowController.h @@ -0,0 +1,41 @@ +// +// CountryWindowController.h +// WorldFacts +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 + +@interface CountryWindowController : NSWindowController + +@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; + +@end diff --git a/WorldFacts/WorldFactsBuilder/CountryWindowController.m b/WorldFacts/WorldFactsBuilder/CountryWindowController.m new file mode 100644 index 0000000..d54b973 --- /dev/null +++ b/WorldFacts/WorldFactsBuilder/CountryWindowController.m @@ -0,0 +1,60 @@ +// +// CountryWindowController.m +// WorldFacts +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "CountryWindowController.h" +#import "CountryTableViewController.h" +#import "AppDelegate.h" +#import "Country+Extensions.h" + +@implementation CountryWindowController + +- (void)windowWillLoad { + [super windowWillLoad]; + AppDelegate *delegate = [[NSApplication sharedApplication] delegate]; + self.managedObjectContext = delegate.managedObjectContext; + [Country importDataToMoc:self.managedObjectContext]; +} + +- (void)windowDidLoad { + [super windowDidLoad]; + CountryTableViewController *countryTVC = (CountryTableViewController *)self.contentViewController; + countryTVC.managedObjectContext = self.managedObjectContext; +} + +- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window { + return self.managedObjectContext.undoManager; +} + + +@end diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/Contents.json b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..0a5a4d3 --- /dev/null +++ b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "WorldFacts16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "WorldFacts32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "WorldFacts32-1.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "WorldFacts64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "WorldFacts128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "WorldFacts256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "WorldFacts256-1.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "WorldFacts512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "WorldFacts512-1.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "WorldFacts1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts1024.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts1024.png new file mode 100644 index 0000000000000000000000000000000000000000..21c54d3602b15b0f220f9c3bd5b76e24040c1e8f GIT binary patch literal 3316 zcmeHJS5%YP8vR2A91)R=M#ca-gNQ=t5Sk3&5Tb%W5OG40ICMf61VJEx4$=kbB$Na( zBSQ;4AcUbALRCaU4ZRb3FE{gc*P6%sF!$k}m$Ua-Yp?yawayo5Vua*BbNLJa0Q`6F z=$Qh*DGodZoCb5QJ558S0Kk=GVrYg)`XTY;qa=Rl_j=51wB6EBk6=3Y@grX5-fc9v^COnZ9*g+7K2xKU1I4` z`xLV>bak>t_D>wTCriK9`^nJ(f7;Es-fRRx`L}m^K_8zzW{-*Otqb85B0u^*&Vs*M z9{iE`Qz%~XHLF3f810#_AIL~FTAze|`$LOas+pq^&MeU!sfG_%s;*C8p6$4~vvP5N z>wKnsWLq?9dl}M0&~J+}o$Holk6uZWik)FdjZ~{_FJ1cjyH3#~udejFO<|9Izwg&y zpiNMUcz-9L<@E!iHm)0wobSEf7;Mr0#yDL%ChzCqQL6I%=j&hJ>rybTdmI0%baJG> zF{<~orpFtPeN^g9yO*u@YN}Nx_f}Z_bE_1IH}4QZ>C&->`~2*YD}DJo)9uoW{nx5o z9KPh;9x7McS`glx7tXsKT;=Sr^iBNz-GI-epSv>dRMZ7)|q&GeTkJj z)$`X%N2gD5#>wJ|j3mQPu_o!5Dl7n;f!@{AHS-58kJtx_ehX+DpDmpvM_p4=YJJvW z_{5$3#KFPAH7z~&MO4J^9airXz~^r4DQXo5*0tsoVm)NWcKp)DqSH?-gg6ub&mLOw zKkNTL=e`+Idc-Jh*x%jos6SeHE1JD>IJTV4f6CBMGi7#Xh_Fyja^ zTUcSfO?51jWY;aT^?6NFi})nF=~`v0&4r6#a_iPuSLesxp#JuoATw4YHaIPiO`6w^ zdvfj<@74L5c(Eb1o49dozpCxi^YBiw(-{BDA#F1vd1Hj{X`Vh)OeUB3EU)~qYmKty zB&nO1OV~W0kR`L>C~!*tMNEUTrSot<@LROPBgbe$?-g2!=lCAeTgaFXBV3&?7eUM4 z>s`Z*wdX1KxS;$Jv7rF{p5bPoHsSf`2&5(4uNTITdW zVWG@fBrjK7=SaX#42d|mf{mk()Jkdyl)(IEdk(rH_1{*yw~tte5_r<&;h8eKdD_nk zLbh{jptIQ!ort|oSNK}VfVlOeO}jEA*Bq?Mf%G7yMND%l$+hpu6d+8MOP0~SQd=HZ zSE)jeoB@KJH+*hSYP&0Do|$*B4rsI;*25OlMFW?^T-Wabgvpm21_|`otYPLj1_Oi% z@^iE@o3~U>HZzmo{Y=gSd>UfIysiHEN*}D&ULPQgC&CsULk<=eS6~OrfJQKQ(|@T} zlCtE-HFtWb-;Qq685OkSV*`oJ{FhFI4fxRTZ0mjWvp_%;!%BmtUk+bqzJ_I7*5R#I zH-Ly;3E#L4iCvD`2D^VsjJAD~l9ho#B8ET)fs`CS%#8-QL$7kt5)Fg=mYkqugrwdO z$k?utfwk?)-?XO>JE^jcEh(%Dr_hUNWr@MFYS#>8V<5ZHFzPi95$A*WA^7Tg8{0rQ zb+o5jd2~4gX_pZkTyN+DM_WMJuwpGGpCz_jW~>$WFrDWk`9d> zPO)-jc4i!bDWp!Ya1D`i_yi#Aom)+EN(l8r%gf@r@Swui=FjB}_DKYsaT)8CQ*uGs z)DDNRDHx0Lb~KtIGx(jFJRe-I0FRdtA`)<)jXWB4%G*h3#h(Vh+m-ioGb-=+1QQl? zkG?UIHzzWnpigA|j}x z=|&HG*eeC4OjQGe&Xy1>Xdy+(z?{3ssLiqQ3ZlR&NrJ&qNS9%3%iFck-a){!@;EKb zfQX>N9UE({QL320loxVRyniqfNhEg~?E%``q>o=sFOcx(sGwp8 zdPWn;g_iBu%a2lJZNaE2A9#lG2wNobD{d6FA8f`ykbuCRi_QRb$9^KxQA#ZQG+No+ zu> z6N|*hv_@vmfg?(ewe9Ntu#e9_UlMA#6z>AkW;1v)^YtolHk)?go!^iZIMESi&g={s z;^_t7w>RTcQ-Y2Ne&vem(!YeLz(rGfH&D_!SZlaOrL+{c&;2g_5ayL+E}ncxk|sO; z9_a03y1ul7-aA~V0Hv2MpkIjdWs?2OX~FHsv#l~HX$%$~fHm(sv%6UDs<=)iUn~jI zg+JfIlP|7r4!Evw?~*UdAD6m%kIs=HtHJO+jHwx4TKfICWlpTNtq$QxD$zpcWXvI4 zh{{RIjmdg_7bS;58K-=#hc9sZ1f|(`8%0KezEE8ID#^m~`|Ps0Trkmr)(#sIQ~{^p zvk)ieAA*k+qO+`_D&Xs|jzqze3lG7g-9!(f3oVh;rSV>r3acI#Ai2PUPnI|l@dY1C z7(j~Rsi2b#i2|axjt8WpR&jv`Mo8t%(KIfEk%&O4v+`lp3NE~`?yz{0H*KyS=C35h zYn8<a*c6|M+?INR=dKnM6Qz~3GI|MJgQ0CzNe0-~>PsZb5X`Th#$F2YE!=r$(o E-z|v88~^|S literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts128.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts128.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf53c87929283dfb117bb0ac31b0ff178099f63 GIT binary patch literal 836 zcmV-K1H1f*P)C0004TP)t-slp&J; z{|b~Ml9?=v{{0L6`wf*Ok*iX5@7*8#`VE#Qkd`Eorbc_fd|UVK72v-zz?>lf6fKS zv^eY4B))fDv}9`DyEM|GLz*s%oH2;YluY*Q7v{_=w`pdhKY+%GQropS)1*Q8@e`RV zjnSV)&Y4NKYG(4}8?|O>vtet)f>*FyZq1fU(V#^7^bz;(6waDR|NaZ<(I%!xd;a_k zvtnxS;2p?~P{Ds$)~Y|AH-)4_exEpm>eD6r_YajLlD&3bwrFRVDviyTO8xu{-@Y@J zC6Mso9`WHE@7^D~abdP+X!YtCu2^xWNqWSERn@3KxNBvZkL;N;-%iHL}Zh=_=Yhzt!+-r2MA$H&j32=KDDyUry|gAb9jrweS*d~XIhDt7WW z>!y*L4O{sKrCH=;?*bQH>sa-@%q9H;$j5djc6^xu(E4CgFB2UT$iovRKDA)cv*+`4 zgUG?x6*T2`EOVD`!Rsx zMM^i_6tZ@d<`~j?=-QCAZ8YnVHbys%ti7X|McRA156IdGO%-XY>DC})m2tNZY5Qpo zAj}-iK}0!3*M%U(Ei}hZAjnC&QwVapL~~{WG0v80%43Leu9@yUVqEB_yNDPAb-GK4 zQN2vpT|kJbD|A;8WIXmihUq#hh%xkv=5-N4-q5{8ls=m4h*GH2^dQP8-3>&k(%fu8 zlv^~n5gf4jKMpv2#O#DflwGC7&#(X{`V^o51wceZL_|bHL_|dXX}_0!ZQ5T)TzW5nm@k}uAye|agfCb)!v2B5*8pGnQq?FOi& zqe(!+66d0FMP)Cz_Er$OMqGL|Kf^ynD+^%1L3c9|=U{P+*nsy~$@lJDIg zuv>4ubzlDd3$|!y-MBUT_7I{zf%NGZ%$7@~M19bmMygMD_U#tZp+v=pRQd7~`0x~` zNP5PJQkW@@nJbLny)&INhqGa8rbc|7G=|ENPREK;nk|d!(yK!Oj<{GfiPNJ(@!=fJmr9;Dh4A1W=gcYCtv%tvG0~tzt5S9N z@e|y(H?(7E%acvQf>*a`X3v{Q!hl)HkWR2%ZrQLqtyFWqd0gJQG{1XX_3IbVokzB3 zXywT(pE!iEU2WsVE~Q0%s7rXtl1`>ad*sM0_UsqZqeJiBAF^O<`t=Z_K!2x6dg;+7 z@!}kzJc8%WD4H&c?!~ep=YCJex0y^5YwzI)ncF48nm}&6rC4`wic` zGpS8?*Q-9rj!*2^Bh{%u)TThys6fp@Sk?dl11w2IK~#7F?7@Km0001hp#7;AsR951 z0000000000000000001({knK=FGjsC) zWsy{=uM}&>+0E_w*4q3|m2_MGM|1o&k%LNYUga=s^BGU1>LJ)=yPa7=pI84}Q}ABx3rEZrpMy;btC*qu>(x5^tM0Df zerKk4VUtdp_C7vnlyw?di6 zhA2G_Wu7RZ^kf*ioO+5<$@|b{tB2C&5_I{niiR@i^3g60mqV8;uB4$Kx=aLUXbwV^ z!Z;1fDX216ozWkGDvejsaCI1}q^_Z%CJ0?dXt-8e|8*hN?;l?ImeP0%$`ny59)mJ@ zO%!^*gEq|+7NXE*>U#=5K%D{#y9sC$T&K_mb&?bUVW{&Xg%0S`B2NJ56OnJg4D{)y zunm27M1NBZ`n<-p*P+l1)82qWZ!)b``v7lgA7IfRz#qULK%KtIv_IhU`FuW~&*#(P z&yZ;Y%KSxB+u!ZbfdBvi0DvHW>kTF-gail>AV7cs0RjXF5FkK+000000000000000 h0000000000SOMS8Z~;i{@izbf002ovPDHLkV1nqUvi<-7 literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts256.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts256.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4a51c1182b91996859f73f8962130910eb555b GIT binary patch literal 1427 zcmV;E1#J3>P)Cz_Er$OMqGL|Kf^ynD+^%1L3c9|=U{P+*nsy~$@lJDIg zuv>4ubzlDd3$|!y-MBUT_7I{zf%NGZ%$7@~M19bmMygMD_U#tZp+v=pRQd7~`0x~` zNP5PJQkW@@nJbLny)&INhqGa8rbc|7G=|ENPREK;nk|d!(yK!Oj<{GfiPNJ(@!=fJmr9;Dh4A1W=gcYCtv%tvG0~tzt5S9N z@e|y(H?(7E%acvQf>*a`X3v{Q!hl)HkWR2%ZrQLqtyFWqd0gJQG{1XX_3IbVokzB3 zXywT(pE!iEU2WsVE~Q0%s7rXtl1`>ad*sM0_UsqZqeJiBAF^O<`t=Z_K!2x6dg;+7 z@!}kzJc8%WD4H&c?!~ep=YCJex0y^5YwzI)ncF48nm}&6rC4`wic` zGpS8?*Q-9rj!*2^Bh{%u)TThys6fp@Sk?dl11w2IK~#7F?7@Km0001hp#7;AsR951 z0000000000000000001({knK=FGjsC) zWsy{=uM}&>+0E_w*4q3|m2_MGM|1o&k%LNYUga=s^BGU1>LJ)=yPa7=pI84}Q}ABx3rEZrpMy;btC*qu>(x5^tM0Df zerKk4VUtdp_C7vnlyw?di6 zhA2G_Wu7RZ^kf*ioO+5<$@|b{tB2C&5_I{niiR@i^3g60mqV8;uB4$Kx=aLUXbwV^ z!Z;1fDX216ozWkGDvejsaCI1}q^_Z%CJ0?dXt-8e|8*hN?;l?ImeP0%$`ny59)mJ@ zO%!^*gEq|+7NXE*>U#=5K%D{#y9sC$T&K_mb&?bUVW{&Xg%0S`B2NJ56OnJg4D{)y zunm27M1NBZ`n<-p*P+l1)82qWZ!)b``v7lgA7IfRz#qULK%KtIv_IhU`FuW~&*#(P z&yZ;Y%KSxB+u!ZbfdBvi0DvHW>kTF-gail>AV7cs0RjXF5FkK+000000000000000 h0000000000SOMS8Z~;i{@izbf002ovPDHLkV1nqUvi<-7 literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts32-1.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts32-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4208ba27b7d073516ba4f9dffc8d32657c80bb GIT binary patch literal 279 zcmV+y0qFjTP)a^#JO&jfBEe#7C`Rq;smN$@anSK(^J}T?o6HTA0I>>9x$Yu1^0HD9H@y#7WwjA z;>igeTBV}(kp;jYI?)?I6AKpEHGX+1@%EO|46R=3TQF0*=feZJPmiS+Shmn4qn+&c z|M!=Bg-->oa`Kbox-T!P(XgnvvDWt7Oix-^fG911h*lQNG3)@Q&hPI;hoS|e70##y dqZW)>004m!GN^Sx9u@!q002ovPDHLkV1gGfe|`V} literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts32.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts32.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4208ba27b7d073516ba4f9dffc8d32657c80bb GIT binary patch literal 279 zcmV+y0qFjTP)a^#JO&jfBEe#7C`Rq;smN$@anSK(^J}T?o6HTA0I>>9x$Yu1^0HD9H@y#7WwjA z;>igeTBV}(kp;jYI?)?I6AKpEHGX+1@%EO|46R=3TQF0*=feZJPmiS+Shmn4qn+&c z|M!=Bg-->oa`Kbox-T!P(XgnvvDWt7Oix-^fG911h*lQNG3)@Q&hPI;hoS|e70##y dqZW)>004m!GN^Sx9u@!q002ovPDHLkV1gGfe|`V} literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts512-1.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts512-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac8003856b9c364383565776c1cc603c5578509 GIT binary patch literal 2512 zcmb_ddo&XaAKoSuTNb@xikU^Ox#d=}xo&AA6y{PGHWl-VV&!fPuNjMS&0JsglFDVd ztT##)g{fBN9zumwuEXd17p7T5Bd7g8A&+o6_IZvuH-T@*7lL7z$5G=;l z1pol;NDyGR*ba46BD;3XE$7p2cDGcsbC6kV%f!E2uhe;mHU^WLDgIAmyq_nZ>tZ-{ z-#Xou;ru-1?BCbDS|iVME(O*TL++X-=cr{D8PgtLxY!==*?-q=?5W|xh>B<(vb`;} zDFQD|Dowr8{`l~CcQ(Euh&B=_}$+5=C@RF_T}Dz4BV_5FRT<}m-yZ;n*h z-4LzqEiq4??N{$BvS0oxKhdFIpr86O{mhTgilrwLUZ%OQPb7YyI9OtlRA@l2IUBLL z0qMy({p*YTrx$wsGMkP>_l7|7J^a-Q+Z)BlXfNolukW1tHi)==gt0UQdsmGbC`Swa zvRwTxS7}dO`lK}3soN59fgA08M=PV{cfXBg=uo5SmI(Z|64giwUYY-`&MU0Q=;qwO z;gJ^ODoo7aLyM1f$EUlswl<|(!u{S=p{uYl>%X9DKV++MSDQkD2Fk64^=89Qjuo4v z{G3rJw~lQh2XU|ZjJ6tyR%IStxb!9;GtzAQlMeAbAA+wg?$6gv|Jv(Od=g6R zX5ogKOkUh{`}0)vJ*TUllfG~OKw<@Ji*~yP{QArR2te%yln6Vv5+LL9q@54`-(dGo z{HKB7+Xo5YhR=6{h%nZxaay4>$Fjt3uQd-KJQs>=q^}#O^oApuwMt z0pn>sqSKm^YNi*xk3CNn2E`>LU8TN01eKibDSD~e91*KqUiZ$&wb#$Xxj12eEv@Ci z?{~N!5}I!5>V}|nCDoKa$$QGeH>!-7i32Axv)1^-%yxcV@|lo4peC}$QSo7*9W&7& z(p*i@2y%f3-KOl)AtmomrkWWJx?4;A-F8s3Vny{kQP1Jcy?2XFy;db55LsNB`J+KY zjJ{_JL+xufMvuHHC5aSpx3(ZMIx&=hi!VDH0)LoV))ONbVk{~Ed$`Ea9N^W+2yNe1 zJRT#o-TS=V9(n6h@Ka^qMzP9*patT#GTM-*w;cSVtYx3u@c`gPgCrJt=oeT>_1U+6 z){UFD>A?lFDz| ze2lo*l6wHf;-W$}6~sei9Il`0HXwN^E+Mn+_VRPXI>*i``=hw~u!!T$Ki*9Vt*rPWZN+MZwXV_%~}pZQ@Hp;pk)S|N^1;57)-8O5V&V=vZ;;9 zmAN6vlp&je2n9w*y=7)Hvj(&YdRNOQLZ-*@ZcKckMVwlh~&yc zm|dQ%Dz>&!_JaJVJ)%pQkZ*9wec%c-72eyoIH3vlirk}HfdNI&9)TQH1AQUivj=s> z5-Jg(QTD8YEGoCZPAh$PYxZJ9yjwp7mUS&B7e~Ka$ez+c^xHU!PiTx*j6+Mq8M!8y zL>Y9|z6^hYuZ@Uk0STmcYLLkeBBC_p0UUO>WQs~JDrEbqAhOA9wm7dskz`rA1k<&n z7kE2$NYh`r5V)BfUW2i*n$}~IIfKJ9ftet*K9grrL*+Mb2n*0|q2(38aF*a>la_6e z0i=yyq!T>a49(Mnji82*tbozj_%0EXrb#cj!lwYU$n0_4bKG>FbJCx0`we%3>aY=O zHxs_$o^aMD<3f8k`vHbd=%aj^imH}8`C|%)=Lwru)5`2KlnZAuF4F?&m?%|| zZH1o&2s8COn8fgs>_OI`hGIQej)9$4lPG!$Ddt_1hv-X{{|v#k|MAz-uMIVr)kd_=)o#!DImKx|_71{0~)O`dEJbd!w<3I^L|( zQG>Ay2e`Z%@EvFAQR3y|#ufZCQyv#D%n32mcwOJ1ax=nZjhY|I*|k7Cc=^R5e!8b@ zR)*rVg&D|kUBp{d_VYJ1I2tMgS0FRXc^r11DdqBld&pX=>&)^uBp(GMeMmEAo`WeTmd8l0%kOOBI<8~x ziE*T|=Kv!#rBZ+`kPd>1!=+IB|9uT>hqtY@zL5AYlVxTD literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts512.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts512.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac8003856b9c364383565776c1cc603c5578509 GIT binary patch literal 2512 zcmb_ddo&XaAKoSuTNb@xikU^Ox#d=}xo&AA6y{PGHWl-VV&!fPuNjMS&0JsglFDVd ztT##)g{fBN9zumwuEXd17p7T5Bd7g8A&+o6_IZvuH-T@*7lL7z$5G=;l z1pol;NDyGR*ba46BD;3XE$7p2cDGcsbC6kV%f!E2uhe;mHU^WLDgIAmyq_nZ>tZ-{ z-#Xou;ru-1?BCbDS|iVME(O*TL++X-=cr{D8PgtLxY!==*?-q=?5W|xh>B<(vb`;} zDFQD|Dowr8{`l~CcQ(Euh&B=_}$+5=C@RF_T}Dz4BV_5FRT<}m-yZ;n*h z-4LzqEiq4??N{$BvS0oxKhdFIpr86O{mhTgilrwLUZ%OQPb7YyI9OtlRA@l2IUBLL z0qMy({p*YTrx$wsGMkP>_l7|7J^a-Q+Z)BlXfNolukW1tHi)==gt0UQdsmGbC`Swa zvRwTxS7}dO`lK}3soN59fgA08M=PV{cfXBg=uo5SmI(Z|64giwUYY-`&MU0Q=;qwO z;gJ^ODoo7aLyM1f$EUlswl<|(!u{S=p{uYl>%X9DKV++MSDQkD2Fk64^=89Qjuo4v z{G3rJw~lQh2XU|ZjJ6tyR%IStxb!9;GtzAQlMeAbAA+wg?$6gv|Jv(Od=g6R zX5ogKOkUh{`}0)vJ*TUllfG~OKw<@Ji*~yP{QArR2te%yln6Vv5+LL9q@54`-(dGo z{HKB7+Xo5YhR=6{h%nZxaay4>$Fjt3uQd-KJQs>=q^}#O^oApuwMt z0pn>sqSKm^YNi*xk3CNn2E`>LU8TN01eKibDSD~e91*KqUiZ$&wb#$Xxj12eEv@Ci z?{~N!5}I!5>V}|nCDoKa$$QGeH>!-7i32Axv)1^-%yxcV@|lo4peC}$QSo7*9W&7& z(p*i@2y%f3-KOl)AtmomrkWWJx?4;A-F8s3Vny{kQP1Jcy?2XFy;db55LsNB`J+KY zjJ{_JL+xufMvuHHC5aSpx3(ZMIx&=hi!VDH0)LoV))ONbVk{~Ed$`Ea9N^W+2yNe1 zJRT#o-TS=V9(n6h@Ka^qMzP9*patT#GTM-*w;cSVtYx3u@c`gPgCrJt=oeT>_1U+6 z){UFD>A?lFDz| ze2lo*l6wHf;-W$}6~sei9Il`0HXwN^E+Mn+_VRPXI>*i``=hw~u!!T$Ki*9Vt*rPWZN+MZwXV_%~}pZQ@Hp;pk)S|N^1;57)-8O5V&V=vZ;;9 zmAN6vlp&je2n9w*y=7)Hvj(&YdRNOQLZ-*@ZcKckMVwlh~&yc zm|dQ%Dz>&!_JaJVJ)%pQkZ*9wec%c-72eyoIH3vlirk}HfdNI&9)TQH1AQUivj=s> z5-Jg(QTD8YEGoCZPAh$PYxZJ9yjwp7mUS&B7e~Ka$ez+c^xHU!PiTx*j6+Mq8M!8y zL>Y9|z6^hYuZ@Uk0STmcYLLkeBBC_p0UUO>WQs~JDrEbqAhOA9wm7dskz`rA1k<&n z7kE2$NYh`r5V)BfUW2i*n$}~IIfKJ9ftet*K9grrL*+Mb2n*0|q2(38aF*a>la_6e z0i=yyq!T>a49(Mnji82*tbozj_%0EXrb#cj!lwYU$n0_4bKG>FbJCx0`we%3>aY=O zHxs_$o^aMD<3f8k`vHbd=%aj^imH}8`C|%)=Lwru)5`2KlnZAuF4F?&m?%|| zZH1o&2s8COn8fgs>_OI`hGIQej)9$4lPG!$Ddt_1hv-X{{|v#k|MAz-uMIVr)kd_=)o#!DImKx|_71{0~)O`dEJbd!w<3I^L|( zQG>Ay2e`Z%@EvFAQR3y|#ufZCQyv#D%n32mcwOJ1ax=nZjhY|I*|k7Cc=^R5e!8b@ zR)*rVg&D|kUBp{d_VYJ1I2tMgS0FRXc^r11DdqBld&pX=>&)^uBp(GMeMmEAo`WeTmd8l0%kOOBI<8~x ziE*T|=Kv!#rBZ+`kPd>1!=+IB|9uT>hqtY@zL5AYlVxTD literal 0 HcmV?d00001 diff --git a/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts64.png b/WorldFacts/WorldFactsBuilder/Images.xcassets/AppIcon.appiconset/WorldFacts64.png new file mode 100644 index 0000000000000000000000000000000000000000..3545630090dc1b8c55ad85b8917953b1cbcccc78 GIT binary patch literal 496 zcmV4VK!3h>U7|jL;=?e|ok#1| zB*A`K{P++2`VHE#I{Wqz)u%z1Cy&gQOYPbso;HQ7Q*{6S3+&e;@82H%{0yKvgY)MZ z)~Y|8F^Q^9chjRn(4I#A{0ys5cKGoV`}YsgpGBxjdEK}*yK!NiG=|BLPQ`~*rbc|% ztUaz*aiv6km?@6( zNZGMF$BR+4WNM^Be(&8Mo30Y?0002TNklOXPoNt~Ugx3?3QyV}z9)jvEth=4VfcQ$Ga(fhZ#8&~e+k-G9zOpP!+`fQT z6s}-lQPD?Bu&n4;=3xFhyuZ1Hq6zPlJGg(4aF0-G`lts_$`3w^#tXcP#v8Pv@t&q1 m(rKSSu08P8p##PkW4-}ukPYKp;AFS}0000 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/WorldFacts/WorldFactsBuilder/main.m b/WorldFacts/WorldFactsBuilder/main.m new file mode 100644 index 0000000..fc0ab3e --- /dev/null +++ b/WorldFacts/WorldFactsBuilder/main.m @@ -0,0 +1,39 @@ +// +// main.m +// WorldFactsBuilder +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 + +int main(int argc, const char * argv[]) { + return NSApplicationMain(argc, argv); +} From 9f621b650b1d56d70095a974866bc7b593bc1eb4 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 26 Apr 2015 12:06:21 +0100 Subject: [PATCH 022/229] AlertController uses target action for text changes Originally used notification to detect changes to a text field of an alert. As suggested in the post comments it is much cleaner to just set a target action on the text field. Blog post and sample code updated accordingly. --- .../AlertController.xcodeproj/project.pbxproj | 4 ++++ .../AlertController/ViewController.m | 17 +++++------------ AlertController/README | 2 ++ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/AlertController/AlertController.xcodeproj/project.pbxproj b/AlertController/AlertController.xcodeproj/project.pbxproj index c2e5994..be08d10 100644 --- a/AlertController/AlertController.xcodeproj/project.pbxproj +++ b/AlertController/AlertController.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 5307C7DB19B6245B00CFD37F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5307C7DA19B6245B00CFD37F /* ViewController.m */; }; 5307C7DE19B6245B00CFD37F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5307C7DC19B6245B00CFD37F /* Main.storyboard */; }; 5307C7E019B6245B00CFD37F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5307C7DF19B6245B00CFD37F /* Images.xcassets */; }; + 53AF7FFA1AECFD9C00683F34 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 53AF7FF91AECFD9C00683F34 /* README */; }; 53D5575019B66F5D005EAFDF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53D5574E19B66F5D005EAFDF /* Localizable.strings */; }; /* End PBXBuildFile section */ @@ -25,6 +26,7 @@ 5307C7DA19B6245B00CFD37F /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 5307C7DD19B6245B00CFD37F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 5307C7DF19B6245B00CFD37F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 53AF7FF91AECFD9C00683F34 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; 53D5574F19B66F5D005EAFDF /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ @@ -42,6 +44,7 @@ 5307C7C619B6245B00CFD37F = { isa = PBXGroup; children = ( + 53AF7FF91AECFD9C00683F34 /* README */, 5307C7D119B6245B00CFD37F /* AlertController */, 5307C7D019B6245B00CFD37F /* Products */, ); @@ -136,6 +139,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 53AF7FFA1AECFD9C00683F34 /* README in Resources */, 5307C7DE19B6245B00CFD37F /* Main.storyboard in Resources */, 53D5575019B66F5D005EAFDF /* Localizable.strings in Resources */, 5307C7E019B6245B00CFD37F /* Images.xcassets in Resources */, diff --git a/AlertController/AlertController/ViewController.m b/AlertController/AlertController/ViewController.m index bd5dfe3..c344b36 100644 --- a/AlertController/AlertController/ViewController.m +++ b/AlertController/AlertController/ViewController.m @@ -128,10 +128,9 @@ - (IBAction)showTextAlertView:(UIButton *)sender [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.placeholder = NSLocalizedString(@"LoginPlaceholder", @"Login"); - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(alertTextFieldDidChange:) - name:UITextFieldTextDidChangeNotification - object:textField]; + [textField addTarget:self + action:@selector(alertTextFieldDidChange:) + forControlEvents:UIControlEventEditingChanged]; }]; [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) @@ -144,9 +143,6 @@ - (IBAction)showTextAlertView:(UIButton *)sender style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UITextFieldTextDidChangeNotification - object:nil]; NSLog(@"Cancel action"); }]; @@ -156,9 +152,6 @@ - (IBAction)showTextAlertView:(UIButton *)sender { UITextField *login = alertController.textFields.firstObject; UITextField *password = alertController.textFields.lastObject; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UITextFieldTextDidChangeNotification - object:nil]; NSLog(@"OK action"); NSLog(@"Login value: %@",login.text); @@ -218,10 +211,10 @@ - (IBAction)showActionSheet:(UIButton *)sender } #pragma mark - -#pragma mark === UITextFieldTextDidChangeNotification === +#pragma mark === UITextFieldTextDidChange Target Action === #pragma mark - -- (void)alertTextFieldDidChange:(NSNotification *)notification +- (void)alertTextFieldDidChange:(UITextField *)sender { UIAlertController *alertController = (UIAlertController *)self.presentedViewController; if (alertController) diff --git a/AlertController/README b/AlertController/README index 2c87d68..72a408d 100644 --- a/AlertController/README +++ b/AlertController/README @@ -1,5 +1,7 @@ ======================================================================= AlertController - Sample code for UIAlertController + +Version 1.1 26 April 2015 Use target-action for text field changes Version 1.0 05 September 2014 Initial version. ======================================================================= From 1bd06eccdd00252b2c3168a66e55216131ee4093 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 26 Apr 2015 12:12:56 +0100 Subject: [PATCH 023/229] Remove unused notification code --- AlertController/AlertController/ViewController.m | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/AlertController/AlertController/ViewController.m b/AlertController/AlertController/ViewController.m index c344b36..ca679f3 100644 --- a/AlertController/AlertController/ViewController.m +++ b/AlertController/AlertController/ViewController.m @@ -211,7 +211,7 @@ - (IBAction)showActionSheet:(UIButton *)sender } #pragma mark - -#pragma mark === UITextFieldTextDidChange Target Action === +#pragma mark === UITextField - UIControlEventEditingChanged === #pragma mark - - (void)alertTextFieldDidChange:(UITextField *)sender @@ -231,10 +231,6 @@ - (void)alertTextFieldDidChange:(UITextField *)sender - (void)didEnterBackground:(NSNotification *)notification { - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UITextFieldTextDidChangeNotification - object:nil]; - [self.presentedViewController dismissViewControllerAnimated:NO completion:nil]; } From db125ff715dd530667c974d7307845d420e33998 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 29 Apr 2015 21:41:46 +0100 Subject: [PATCH 024/229] Force UISearchBar to set its size --- WorldFacts/WorldFacts/UYLCountryTableViewController.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.m b/WorldFacts/WorldFacts/UYLCountryTableViewController.m index 4b657d9..fc0bd5a 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.m @@ -85,6 +85,14 @@ - (void)viewDidLoad self.tableView.tableHeaderView = self.searchController.searchBar; self.definesPresentationContext = YES; + + // The search bar does not seem to set its size automatically + // which causes it to have zero height when there is no scope + // bar. If you remove the scopeButtonTitles above and the + // search bar is no longer visible make sure you force the + // search bar to size itself (make sure you do this after + // you add it to the view hierarchy). + [self.searchController.searchBar sizeToFit]; } - (void)didChangePreferredContentSize:(NSNotification *)notification From 0930e332e567ce74a792c848923d18c65bab3a3d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 30 Apr 2015 21:44:41 +0100 Subject: [PATCH 025/229] Update Xcode build settings --- WorldFacts/WorldFacts.xcodeproj/project.pbxproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index ef79578..801835d 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -236,7 +236,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0630; TargetAttributes = { 531D960C1AB62FEF00913A78 = { CreatedOnToolsVersion = 6.2; @@ -414,6 +414,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -455,6 +456,7 @@ COPY_PHASE_STRIP = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; From 810f0fd44a17bca7c330d3bef80b7b0a5444e474 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 18 May 2015 22:27:07 +0100 Subject: [PATCH 026/229] Add AnimatedConstraints --- .../project.pbxproj | 300 ++++++++++++++++++ .../AnimatedConstraints/AppDelegate.h | 38 +++ .../AnimatedConstraints/AppDelegate.m | 37 +++ .../Base.lproj/Main.storyboard | 89 ++++++ .../AppIcon.appiconset/Contents.json | 80 +++++ .../AppIcon.appiconset/icon-180.png | Bin 0 -> 26707 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 859 bytes .../AppIcon.appiconset/icon-29@2x-1.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1362 bytes .../AppIcon.appiconset/icon-40@2x-1.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-60@2x-1.png | Bin 0 -> 18310 bytes .../AppIcon.appiconset/icon-60@2x.png | Bin 0 -> 18310 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4166 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17774 bytes .../AppIcon.appiconset/icon-87.png | Bin 0 -> 8299 bytes .../AnimatedConstraints/Info.plist | 47 +++ .../LaunchScreen.storyboard | 57 ++++ .../AnimatedConstraints/ViewController.h | 39 +++ .../AnimatedConstraints/ViewController.m | 112 +++++++ .../AnimatedConstraints/main.m | 16 + AnimatedConstraints/README | 10 + README | 5 +- 24 files changed, 828 insertions(+), 2 deletions(-) create mode 100644 AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj create mode 100644 AnimatedConstraints/AnimatedConstraints/AppDelegate.h create mode 100644 AnimatedConstraints/AnimatedConstraints/AppDelegate.m create mode 100644 AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-60@2x-1.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-60@2x.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-87.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Info.plist create mode 100644 AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard create mode 100644 AnimatedConstraints/AnimatedConstraints/ViewController.h create mode 100644 AnimatedConstraints/AnimatedConstraints/ViewController.m create mode 100644 AnimatedConstraints/AnimatedConstraints/main.m create mode 100644 AnimatedConstraints/README diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ff20624 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj @@ -0,0 +1,300 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 53D8FD6A1B08B9E100265E63 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D8FD691B08B9E100265E63 /* main.m */; }; + 53D8FD6D1B08B9E100265E63 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D8FD6C1B08B9E100265E63 /* AppDelegate.m */; }; + 53D8FD701B08B9E100265E63 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D8FD6F1B08B9E100265E63 /* ViewController.m */; }; + 53D8FD731B08B9E100265E63 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D8FD711B08B9E100265E63 /* Main.storyboard */; }; + 53D8FD751B08B9E100265E63 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53D8FD741B08B9E100265E63 /* Images.xcassets */; }; + 53D8FD931B08BF7000265E63 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D8FD921B08BF7000265E63 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5326FC411B0A8FF5003FF69D /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 53D8FD641B08B9E100265E63 /* AnimatedConstraints.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AnimatedConstraints.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53D8FD681B08B9E100265E63 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53D8FD691B08B9E100265E63 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 53D8FD6B1B08B9E100265E63 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 53D8FD6C1B08B9E100265E63 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 53D8FD6E1B08B9E100265E63 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 53D8FD6F1B08B9E100265E63 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 53D8FD721B08B9E100265E63 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53D8FD741B08B9E100265E63 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 53D8FD921B08BF7000265E63 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53D8FD611B08B9E100265E63 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53D8FD5B1B08B9E100265E63 = { + isa = PBXGroup; + children = ( + 5326FC411B0A8FF5003FF69D /* README */, + 53D8FD661B08B9E100265E63 /* AnimatedConstraints */, + 53D8FD651B08B9E100265E63 /* Products */, + ); + sourceTree = ""; + }; + 53D8FD651B08B9E100265E63 /* Products */ = { + isa = PBXGroup; + children = ( + 53D8FD641B08B9E100265E63 /* AnimatedConstraints.app */, + ); + name = Products; + sourceTree = ""; + }; + 53D8FD661B08B9E100265E63 /* AnimatedConstraints */ = { + isa = PBXGroup; + children = ( + 53D8FD6E1B08B9E100265E63 /* ViewController.h */, + 53D8FD6F1B08B9E100265E63 /* ViewController.m */, + 53D8FD711B08B9E100265E63 /* Main.storyboard */, + 53D8FD671B08B9E100265E63 /* Supporting Files */, + ); + path = AnimatedConstraints; + sourceTree = ""; + }; + 53D8FD671B08B9E100265E63 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 53D8FD741B08B9E100265E63 /* Images.xcassets */, + 53D8FD6B1B08B9E100265E63 /* AppDelegate.h */, + 53D8FD6C1B08B9E100265E63 /* AppDelegate.m */, + 53D8FD681B08B9E100265E63 /* Info.plist */, + 53D8FD691B08B9E100265E63 /* main.m */, + 53D8FD921B08BF7000265E63 /* LaunchScreen.storyboard */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53D8FD631B08B9E100265E63 /* AnimatedConstraints */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53D8FD871B08B9E200265E63 /* Build configuration list for PBXNativeTarget "AnimatedConstraints" */; + buildPhases = ( + 53D8FD601B08B9E100265E63 /* Sources */, + 53D8FD611B08B9E100265E63 /* Frameworks */, + 53D8FD621B08B9E100265E63 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AnimatedConstraints; + productName = AnimatedConstraints; + productReference = 53D8FD641B08B9E100265E63 /* AnimatedConstraints.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53D8FD5C1B08B9E100265E63 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53D8FD631B08B9E100265E63 = { + CreatedOnToolsVersion = 6.3.1; + }; + }; + }; + buildConfigurationList = 53D8FD5F1B08B9E100265E63 /* Build configuration list for PBXProject "AnimatedConstraints" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53D8FD5B1B08B9E100265E63; + productRefGroup = 53D8FD651B08B9E100265E63 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53D8FD631B08B9E100265E63 /* AnimatedConstraints */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53D8FD621B08B9E100265E63 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53D8FD931B08BF7000265E63 /* LaunchScreen.storyboard in Resources */, + 53D8FD731B08B9E100265E63 /* Main.storyboard in Resources */, + 53D8FD751B08B9E100265E63 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53D8FD601B08B9E100265E63 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53D8FD701B08B9E100265E63 /* ViewController.m in Sources */, + 53D8FD6D1B08B9E100265E63 /* AppDelegate.m in Sources */, + 53D8FD6A1B08B9E100265E63 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53D8FD711B08B9E100265E63 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53D8FD721B08B9E100265E63 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53D8FD851B08B9E200265E63 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53D8FD861B08B9E200265E63 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53D8FD881B08B9E200265E63 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = AnimatedConstraints/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 53D8FD891B08B9E200265E63 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = AnimatedConstraints/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53D8FD5F1B08B9E100265E63 /* Build configuration list for PBXProject "AnimatedConstraints" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53D8FD851B08B9E200265E63 /* Debug */, + 53D8FD861B08B9E200265E63 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53D8FD871B08B9E200265E63 /* Build configuration list for PBXNativeTarget "AnimatedConstraints" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53D8FD881B08B9E200265E63 /* Debug */, + 53D8FD891B08B9E200265E63 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53D8FD5C1B08B9E100265E63 /* Project object */; +} diff --git a/AnimatedConstraints/AnimatedConstraints/AppDelegate.h b/AnimatedConstraints/AnimatedConstraints/AppDelegate.h new file mode 100644 index 0000000..2ad4638 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/AppDelegate.h @@ -0,0 +1,38 @@ +// +// AppDelegate.h +// AnimatedConstraints +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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; + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end \ No newline at end of file diff --git a/AnimatedConstraints/AnimatedConstraints/AppDelegate.m b/AnimatedConstraints/AnimatedConstraints/AppDelegate.m new file mode 100644 index 0000000..79fa8dd --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/AppDelegate.m @@ -0,0 +1,37 @@ +// +// AppDelegate.m +// AnimatedConstraints +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "AppDelegate.h" + +@implementation AppDelegate +@end diff --git a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard new file mode 100644 index 0000000..037e0a7 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..27575b9 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-87.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@2x-1.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-180.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2fbe9cbcc2e6bd3044c35b2e102714eab2f3cc GIT binary patch literal 26707 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�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 literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..b257b07226846aca036ccff246e65d2e730a5e0f GIT binary patch literal 859 zcmV-h1ElIUx?40wvf6u*VjyPv;fd3Z* zK>ElefQ3kb^j=I=-=i9--XKT_UM7H&IPpD_B^d-s0`PEoVnYZXFGfW%HB#fMzX#}y ztcmlsYknV`SB8M(m$Ofb8uq`5j`DIYxIcz5jav_#MCJ#l5_U9|HJ10E$p0jc5!8X( zE(XC#xBE9NUTg9!$V0_kw^lMmN(!lzcK!TwMaOU^0F2pJb&jSV%K5@=F>w2+*5Lw* z4jHX<-P6*hx4EFID1Ey3bUQ?ngy80mmu43=y7jld<=uLJ!mEjt7vsi~jES%fqSk>j zeUfMOqqf8`d*Y}q!FL_98l7GVh$`F5^Hxur40e;@SGHlslw?njcOVA#90AcO*J_W7 zMRxUh>Gi%{@Q*6X9&4|7ggSD5o$@K5J+68j4*+ zpXogOU?_hn&~0nJbyc^-MY{li<5mZMRu&fEr1@yu`_18@g{j}49lN)3`8))*toVDT z)4|ai!#OZ9%sr1&)o`vgLA5)yJ8%p5yh!nHI&MIs~*#R6L?b zE&vcrvZ3jW*5TqyJ3HcI=1|E%T11aW*Ep~*HE!le&dWd|DTdGQ#*ibHiAQH-q0$#l z(HRs#BJ#<^VaoScG_08rh3Xq7S_!$4>$RrQ@v*oZ?es|ALeDpD?InvLS3qJ~0`vk4 l^Y0T)z+eOe#Gt)Jgg=K>VSjU{PzwM6002ovPDHLkV1n$|p@9GZ literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7759c83f4b10efb32e7c54af86c6cfd0adc14e64 GIT binary patch literal 2561 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 literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..515d2b6dedfd7a88dc9b5ca7c610af06da0cdfb8 GIT binary patch literal 18310 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 literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-76.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..89ca713eded73fcc52de2c21b8f379f65404db6b GIT binary patch literal 4166 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 QR{#J207*qoM6N<$g437vy#N3J literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdbed3bcd25858e35e136552a11675defee0c45 GIT binary patch literal 17774 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 literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-87.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-87.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6564ef2886a94f4322ca71e67ba34a2790ff20 GIT binary patch literal 8299 zcmZ`<1z42b)&-1Yx=T`0x=XrSL==!lIwd3|hHeq~(eJzW z`hU;8^E~go@7a5;v-aBOJu}Zlq^hzk4kkG!0s;b#yqvW9!&&FofsXX>d{?e4@^C_Q zQuvYsFyAk#xNbz!<-C1DFE2M#lcler~_r-SnY z8UaDnQ~2T1!4hT$@N}?ubQAUzqy3E#ez^V>=A;GuhQRE^Xm!D=04XO|O8_4SF9#Pb z2onGRh`K_ogw>^A{7rutiP74?V9vsvoE{z?93DUpCs%7uZXqEdPA(o!9v=1w1iPD; zBh1W`-O-KiuSxzjkF=$mg)7t<26b`-{F>Ly+{qm#Moark=--dO>V!e9{-fmR_P4DE zgPgxIoZK8-od1nx=?VQGv|pM3NrPDY+m*AstNm|J5DQLAdrJpPN0{3KkNdyMJ@oe9 z#Q#^MrH=~9E%0aTpLo6hCh%wQ55lk33#&ps zE$wxsp$`rH?LtsMl=HtP{z;T_vUhUTa5l5B{8iX*${(SBqJPWi{V$n65`PdO7Q$}s z=C+m=us>GoVatPZ8f%&6?Ul}P^OEZ|0tEQ8aJ?OU!hhIYgkORo^H}_A(-(*qFU;F5fef8I- z{T+SSwIIv~)qlMLfH1`;X5J$pP^`*JOK5r`j%4}N8d-YvU4rPpAfv}q1OZIj$X@{z z(iaL;759lMJLiy;DYLby7RjmtrWVrUnwsy%Nu*IrwX6bzmU|?GY4Z%fVH*ROv<@)P zq!q>+H?orAk>w;^M-NVYaxM*gsKv+0g7x5?GcC(Qr=Y`|&OHOWLqExY#VKp==eboY zdpM}KIk;w& zTOTq~rc2BV0o(X|R5sAlBksg`0YheDRb0=`|LUTFkg2s5wpVLojuy3Z@krM-FZnpW z!GR^v5UrCNxShDIS%jdeK5iBlU&i7~srgw!lgNs4nZpW@{Y=3;eA$(&0cn)CJ%^*2 zoyfE=5~owWL|5Pi3OOC&gzBpK$C-~d@kFnXe3F46OuWaP9U1wQ^F{TYFT<(MwloFi zLyRPlHbz1aD5$V>Oxftj63T%v1_mZ;nfxC3DXzIXGf?N_5sw0oWmxJ!@UuV;p#p>` z>5Oa2#;xyCxLwbEwwF{8{a|~#GfOX*X-Ln)dydJN?-9)&95T-V@b5O{?s<7uQP!W% z5~TGBdb^hge3SWLtXxy!nV}3v{T=xdhLD;q?={r8Wn(trM&&$oRlXh-;O$iT=C%3u zBQ6I*dAb=PH{NHl0?q-7#tZ-|opF34W_mMmL8;o7NA2+qVVkj)ReYQ@o4~VCEIZ|L z-<%^P$&7(x_|+h05mg?7&6p733J}b^lkI31X*$A2j79n}+?8rltU!PHED)7z=^JXE zDH>4sjJTIoVLkC39p-Uv<<1+TynK zhd@n%GX50c1@7ZQ!WbOSVfWG)6%BgwA2W7xEE%?Iln!iNuSEQ+{TUf-h=s{o8<``T zP%w-I#(7blpgCz}EgNYRhRy^VepdrqcjB@GOP9Vkj>@b= ze+q~D*@nAJFY6^kLmA^coYZ0LNs{U$W7>#E7~~tq0s2TlccR`@+Qqz9y;UQgT^voJ z9b{(anxHor*-evcfy`V{`w2keL?u=+9(!ZZbVFI_0JZZ`nMV9(@uqmttMly=KX+Sa z3AB9Oo7Nqd?=W*f`v)?sN1eL47$3MB%kR|%Y&xW1_JZ+HTbkZ zb#lu>*xr-*%k^?AZ|O=pkDiIBrS#y-@dq}$khq27(0GS@tF<1=Gb$05q9%${crGtI+q#!r5p_ueFRSs=Y>D=K?t%K0v9i z>tJ~($J!8r`h*p*L};!uIF^r1h11#FE(@%fAkJ{+>uvhnqIi<208S{|_mmK^CNDj; zPa6kE@OEmSHT1{%y|MS~kC1O48FsF_XDM7IPi^fH1uB!M2dQX-COp0}%v@oQCsR0o zh^xygg6^B9@Rq38NkxAsf4j)sJ%x-NKJ2?dQ8Zan7FUg4&GtBSzWc@b^UUvl$K7=5 zhtcnwkbKk7<0a~X&E41@ABm8YJ<)@m=Qc9OUrZuz&ZH2Dnv%C_u31q+&*4nu{+OnD zBbV&l@_1`fyQ@H2>s%oZNHQkb1NdEX}cUi6`1UG&F#Kd+xhvLzSKt&T|y zC+gI`;FDYtfh|b3z{WEODZln3G5V~B8q0>eb9fNym9Mizg_^&L zN{>dA5OW~!kJexaYc^gTs?d@U7RW~$;&5KJ5ZK%7vC;Wq@}`aBn`FNg93eEOXh23k z@ou%jqjPIM+s9q&%j)xk=eq$d!*tjAI&Kl_XgPx~itRd#kWT6gg#@$6NT|PMa6vOd zl)1&LSvJUr_Fp8BGkN#cLPKhma#~?Bmi(bis2Qr_dYqPlv74VJwrM^Fj={4|=Q|o7 z4=>~_^1U2r(Yb1tL=P6A%tlI?ac*9<7IGtJM5^7vV@ z@BOy)Oktv~$tp62ALYEsG>4@<5oY5E3GC>BgmnUS1XX<21ce*;CiG}ls$YqF_@K#U zCq`c8WyVho2@-upPmCEMhcL=?a$dyNIlolCuY9M)!7&(OmfuxwIYvD!>vPgZ3*a>o?kb~(_l;_%*A_eY4 zUxsm5_Ue_ZQo5({C~rTFc-#6P@8`aE`*vYukv3_wM$(7N&K-#IREZrYL)|3*O;Q5Y z$l!1VvvYDhvsx%ULnG9?TYf_FCC96m(<6yGLgky=D(`p~jgj&sFPb1+t6@DV409E6 zq*X%Ky;!C@J;2lI_DeyuV2nq_FBXKgP(rt|gr*zZ1Y4PVSbDC|*Yld|3TG+@v2fGW zIPupL%;Hrvn2kM}rL?oymru-I81q9`?ZtnHVYo)Wfv&e3flA>$HYw6fuTwEAwv*sD z_Mm5*uC!|=v|5-JDS{8X=~=y26n$=+H!OJfR!N$cm4xnab- z1ME*aiMjM=KcD*iIdvK29uY;XFq(zJOq!b6^;RNfk{Owr-+4nAHUhoA-%;hw}iigB=RTC;W zjJrP7c3GUL1TnI=hD;h5N& zq2fGAqpZnw=Oh^-6$Q(XC_@9XOos60^eaWY$)Q1&eyv|Je2LJ+3VDk3TsGy6Nmg)wvr@^}m^mNTwJDmMKKUr0H|q z`(}`@ACR===2?R4+09Z1Eft%NhRb3umhEQw0z5}DU;Fyvu?0Ovt*SNB~%&+{Thmes+@YS~!i?sRFa>$vtAQbz>bUFQCD zezwbP(~q29#j=R#X94pP9I~O*S;HD;E!(yYK5mz_aD8dl8k&qCEoOxtduh7TCQ>bO zzoKGvS14A5TyVV8;=d_YbCaXLvZG1E6!G0KdkoJUBp=&2t1rvrcNtu4%w;zMQ|mXh zqs<{fi%X$p!n&CE|8#xteNunFNQim-+WPBRkie2wuE>r_1Ng375zP0fcyd9)VzYlj zHMiuQX_0kevzWxVl`0*M2d?ufr~S>KNR6<|PSW!g$)8`-E1ts^$V+Em)oyc-(87i2 zPiajU*(JWeWwBY;h_cRcQJWj{;fn_@8|3KeL4lnAjG&j^Q5ZDFsESC51mHu`Yy7F^w$7J0Ow;phtp@}Lw-?27OTqBFLxr?W^gGC9W9?x;oQ$R%J zLOp#od}@nN@Q9UYDtu1?J>sD2`i+(jrOO9KN|Unvkgmq9BiFU93v8cKdTlWMZu^UbSTa|g;BLQU2?jKjbUQ98CFjFrjZVtNgg%1N#y=* z&HZRtmrG%p9U4Yj!{hB?0>PW9koI-2(JZ=`F3D~n!4!8_sZ=!U8l*yKg?E$jV-_>Y z<#jr|w06sB%b|-_2 zG_94&o>htmVMcG7z%Aj#p zH<$H_PHBdL{3ZF3U2>Xu&G}QXD6SE4@!L8GJv?VJ&$$kn7V1NZe4!71m)F0#7OVJD zmbkAJITKqx(e*opi|G^jCAiWUIisU}| zg47w#Z%e~^p`G$_D9+En(Ots&oCkMi9BUBG7I!$=^;@>y%q}A+hAWYyhp#*+PB5|t zxN3sx8K`Lh5JR3!fYk~*j;~cS6~FGo)s0iJ?Rz=I4=N*ZgLLb}$>Kaop=)6aIj&eP;MlP{ID_{8V}8L$s0P%Uhs`EKJ?leu7|%Y z*xP3`kGbI5$UrlYENNMc1GA5?1n2#ol03F~{#|c;&IfW04#po<)9gEKW4pl~oOB_ApYnByP8)h(s+K3;|u8mLEg(2xl+&N}i{m z>!=xPUY8B+u?N&bHT+3uO%#qi4DK{yFK+nu*H?N=Zu~lqDD-ZXO1c*!rJ}w%3dZam ze8Rh6WF}YQX>d@$)~8c+RB*iD05g0W%QK3jSFfP6Z(D9`l6U9sgvb@>AK?^dDwNjs zMA-KCDi4c0)%wjYzjiW4o;aAF!ZIg#gX|PTH}EvrAz7$Y#Ri+Z5vgpVtWI0@v7Ue2(_J6Z+TX#-lWO8^fwMUvLeEA(hcB?59s+p4^nlyI1XQ%Z=L* zF<80mRDK3^TE@B0q#hB`}CbQ6TUekGckebj~@S5Z3%7tg|Gt(y3u zvQu`vFtEvqu7Pyxdm)=~Dqzw9TP9&dq$h16*v+mzi`*OQFg>?;<_|l+zI5`Oe*MYI z<|JN#>OH@^N;sy3~!VJ3DMSFMQ;`{)IYCEX(!0_&rGxV9IE(30$n(W+S zdiK;9__bL3PA@fOz+Rfq-Q6rG;Ai4_I)$8|_WGX_Y7~d?S(;8-n$cG3A)h1Npp$JUIa~hz0hb{Tca<9C|x60&8N$?5#7A`u$dp z33Zh`Ff z$hnntGFiU(bV(Wl|kkaL=@#(|%O|+lqM?b329G1Bc1O0M}9nG{sWs1FYmLEd! za!7Hn77AR(yZAi{4meCo<`^a7lIe-o@yRB*cqv(;A;KW{x2Yctp5K*lQi=uuN9*ev zUT-R>Di-oQC1WNhjPRR;%u#2xZX8pL-f!%FHokdKd>`-$9}oQ0d*Q@IX;Q=rmFnbl zQKI-|@Y@9Mz5c>8`mHD?ED@4$@K<*UT$}hPX1j2HNW!Ie1a<#$RESYVW=U zXH?rt1X z4q)Vzr_<0(yGZaV7}urZL(IuTnlzzwyNp+9yOC1R4-eeo12iyj2+lOOXzFvx0-PRiSD5PI!oipWf`BBkS}{cOUC+?#UUo8x=K7#5Y8t{iL~9UjR) zy~ASP7?tKJSKg00_DSpE=LBp?DWA?WA@dix!eSx(1v3a*zKMg<8PT2TKw2*MviER4 zu9uV%o(^PqIZYQFKLKm^Kbhjb`<_vzbMee5@{Ei!eg3$M>u9M&P{y-^Pjs^$aKTW`EO#G~zZ9Snb&6RyuH*qu?#Sl6)7t6PWLAXb6+x@WKi; zwV{Fr>C?G+1pYwL!DhmvJ~X!%#qla|U^a_Z^M%_qSYag!;E9&b@qBJn-8~4ZQjZoD z5q=~?o?U28d#LJK-dl}Z@}~ars7|94=HQ;LT37|MV2T-NO(Jl^GA>#2VxF?UHOSW9 z{;;0~Sf`e(Lzn7$td>IXMS4yfhZXQx{l`3a-P~y(3Z06)<;=hi-v+R2K%YxR`` zdJ9X2`a<-06eNoo(Do{tORfuxVZmx&+`X@H^SB-(X%^ud`YWr-pSw1aXTrR`1U<=% z%N%hUW=34%R(vrinjf#2K>S;MeB>bM!#?sSeLUPao=@g$9`im;pEKqEfiT5ym!|&& z!QINYhqf+qiDj1g(-bOL+Xhf3c#%lF!ly^iS6_{Q&LFP_bfo=A2Izaa+e%)#)r3H( z+((RLG72M)j#^sl_#%%eMY&!G1cB#rM}tiGD=T&s6CZi+?dqBy0HCcgVQOP>_4u<& zG#iyw&L0?H`+ia?J5_ty4PVe3ddfn<(yockNUj@iB;~TR2nH3&coqStGX%=|j%R`L zcG(h&1|TAULjJYYqrFdN zFRcy*9xn_A(s`n5&We+7gNDNlI3Y!LBq%crkKL<5w3gt) ze)Eb8O2Gj*J%iV1t9?)?Ax_{1p;n3&;4{)O(3G|7wW0V$31u3^6mAWaGFL8IRe$wb z>u7wxxfpZDhVzEc9-V`*g(-~qRYSK0zMcMdptIMwPfW7tMx%7s5;OE8sd`aCuHhui0s Xn{9e`UXsGU{sAB_qbyx5X&U^013fmn literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Info.plist b/AnimatedConstraints/AnimatedConstraints/Info.plist new file mode 100644 index 0000000..8d07b46 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard b/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard new file mode 100644 index 0000000..76ed3d1 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AnimatedConstraints/AnimatedConstraints/ViewController.h b/AnimatedConstraints/AnimatedConstraints/ViewController.h new file mode 100644 index 0000000..3de3174 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/ViewController.h @@ -0,0 +1,39 @@ +// +// ViewController.h +// AnimatedConstraints +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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; + +@interface ViewController : UIViewController +@end + diff --git a/AnimatedConstraints/AnimatedConstraints/ViewController.m b/AnimatedConstraints/AnimatedConstraints/ViewController.m new file mode 100644 index 0000000..434226a --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/ViewController.m @@ -0,0 +1,112 @@ +// +// ViewController.m +// AnimatedConstraints +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "ViewController.h" + +@interface ViewController () + +@property (weak, nonatomic) IBOutlet UISwitch *modeSwitch; +@property (weak, nonatomic) IBOutlet UIView *yellowView; +@property (weak, nonatomic) IBOutlet UIView *blueView; + +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewSpacingContraint; +@property (strong, nonatomic) NSLayoutConstraint *yellowViewConstraint; +@property (strong, nonatomic) NSLayoutConstraint *blueViewConstraint; + +@end + +@implementation ViewController + +NSString *modeUserDefaultKey = @"modeUserDefaultKey"; + +- (void)viewDidLoad { + [super viewDidLoad]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + self.modeSwitch.on = [defaults boolForKey:modeUserDefaultKey]; + [self updateConstraintsForMode]; +} + +- (IBAction)enableMode:(UISwitch *)sender { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setBool:sender.isOn forKey:modeUserDefaultKey]; + [defaults synchronize]; + + [self.view layoutIfNeeded]; + [UIView animateWithDuration:1.0 animations:^{ + [self updateConstraintsForMode]; + [self.view layoutIfNeeded]; + }]; +} + +// "[yellowView]-|" +- (NSLayoutConstraint *)yellowViewConstraint { + if (!_yellowViewConstraint) { + _yellowViewConstraint = [NSLayoutConstraint constraintWithItem:self.yellowView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeTrailingMargin + multiplier:1.0 + constant:0.0]; + } + return _yellowViewConstraint; +} + +// "[blueView]-|" +- (NSLayoutConstraint *)blueViewConstraint { + if (!_blueViewConstraint) { + _blueViewConstraint = [NSLayoutConstraint constraintWithItem:self.blueView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeTrailingMargin + multiplier:1.0 + constant:0.0]; + } + return _blueViewConstraint; +} + +- (void)updateConstraintsForMode { + if (self.modeSwitch.isOn) { + self.viewSpacingContraint.constant = 8.0; + [self.view removeConstraint:self.yellowViewConstraint]; + [self.view addConstraint:self.blueViewConstraint]; + } else { + [self.view removeConstraint:self.blueViewConstraint]; + [self.view addConstraint:self.yellowViewConstraint]; + self.viewSpacingContraint.constant = self.view.frame.size.width; + } +} + +@end diff --git a/AnimatedConstraints/AnimatedConstraints/main.m b/AnimatedConstraints/AnimatedConstraints/main.m new file mode 100644 index 0000000..a80118c --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints/main.m @@ -0,0 +1,16 @@ +// +// main.m +// AnimatedConstraints +// +// Created by Keith Harrison on 17/05/2015. +// Copyright (c) 2015 Keith Harrison. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/AnimatedConstraints/README b/AnimatedConstraints/README new file mode 100644 index 0000000..130e86f --- /dev/null +++ b/AnimatedConstraints/README @@ -0,0 +1,10 @@ +======================================================================= +AnimatedConstraints + +Version 1.0 18 May 2015 Initial Version +======================================================================= + +An example on how to animate changes made to autolayout constraints. +For further details see the post: + +useyourloaf.com/blog/2015/05/18/animating-autolayout-constraints.html \ No newline at end of file diff --git a/README b/README index c8f0b7a..0d32383 100644 --- a/README +++ b/README @@ -3,14 +3,15 @@ See http://useyourloaf.com for details - This README last updated: 27 March 2015 + This README last updated: 18 May 2015 ======================================================================= + INDEX AirPrinter - Example of how to print from iOS AlertView - Demo iOS 5 changes to UIAlertView - AlertController - UIAlertController changes in iOS 8 + AlertController - UIAlertController changes in iOS 8 + AnimatedConstraints - Animating Autolayout changes Collection - Simple collection view with popovers DynamicText - Supporting dynamic text size changes Huckleberry - Auto layout table view cells with varying row heights From ac4d03d790ac85dca5327c35c287be1fa704e473 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 23 May 2015 22:40:24 +0100 Subject: [PATCH 027/229] Instead of adding/removing constraints change priorities Reworked this project to avoid adding and removing constraints and use a simpler and more efficient approach of changing the priorities of the yellow and blue view constraints. --- .../Base.lproj/Main.storyboard | 9 +++-- .../AnimatedConstraints/ViewController.m | 40 +++---------------- AnimatedConstraints/README | 2 + 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard index 037e0a7..cc0f143 100644 --- a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard +++ b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -44,7 +44,8 @@ - + + @@ -58,9 +59,11 @@ + + diff --git a/AnimatedConstraints/AnimatedConstraints/ViewController.m b/AnimatedConstraints/AnimatedConstraints/ViewController.m index 434226a..169bb74 100644 --- a/AnimatedConstraints/AnimatedConstraints/ViewController.m +++ b/AnimatedConstraints/AnimatedConstraints/ViewController.m @@ -41,8 +41,8 @@ @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *blueView; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewSpacingContraint; -@property (strong, nonatomic) NSLayoutConstraint *yellowViewConstraint; -@property (strong, nonatomic) NSLayoutConstraint *blueViewConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *blueViewConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *yellowViewConstraint; @end @@ -69,43 +69,15 @@ - (IBAction)enableMode:(UISwitch *)sender { }]; } -// "[yellowView]-|" -- (NSLayoutConstraint *)yellowViewConstraint { - if (!_yellowViewConstraint) { - _yellowViewConstraint = [NSLayoutConstraint constraintWithItem:self.yellowView - attribute:NSLayoutAttributeTrailing - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeTrailingMargin - multiplier:1.0 - constant:0.0]; - } - return _yellowViewConstraint; -} - -// "[blueView]-|" -- (NSLayoutConstraint *)blueViewConstraint { - if (!_blueViewConstraint) { - _blueViewConstraint = [NSLayoutConstraint constraintWithItem:self.blueView - attribute:NSLayoutAttributeTrailing - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeTrailingMargin - multiplier:1.0 - constant:0.0]; - } - return _blueViewConstraint; -} - - (void)updateConstraintsForMode { if (self.modeSwitch.isOn) { self.viewSpacingContraint.constant = 8.0; - [self.view removeConstraint:self.yellowViewConstraint]; - [self.view addConstraint:self.blueViewConstraint]; + self.yellowViewConstraint.priority = 750; + self.blueViewConstraint.priority = 751; } else { - [self.view removeConstraint:self.blueViewConstraint]; - [self.view addConstraint:self.yellowViewConstraint]; self.viewSpacingContraint.constant = self.view.frame.size.width; + self.blueViewConstraint.priority = 750; + self.yellowViewConstraint.priority = 751; } } diff --git a/AnimatedConstraints/README b/AnimatedConstraints/README index 130e86f..f23d42c 100644 --- a/AnimatedConstraints/README +++ b/AnimatedConstraints/README @@ -1,6 +1,8 @@ ======================================================================= AnimatedConstraints +Version 1.1 21 May 2015 Switch to changing priorities rather than + adding/removing constraints. Version 1.0 18 May 2015 Initial Version ======================================================================= From 4d2d464c02785d13edaaf3625a0cfd4ffb9af66f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 24 May 2015 00:04:53 +0100 Subject: [PATCH 028/229] Use UILayoutPriorityDefaultHigh constant --- .../AnimatedConstraints/Base.lproj/Main.storyboard | 3 +-- AnimatedConstraints/AnimatedConstraints/ViewController.m | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard index cc0f143..b93b4fa 100644 --- a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard +++ b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard @@ -45,7 +45,7 @@ - + @@ -63,7 +63,6 @@ - diff --git a/AnimatedConstraints/AnimatedConstraints/ViewController.m b/AnimatedConstraints/AnimatedConstraints/ViewController.m index 169bb74..f1eea66 100644 --- a/AnimatedConstraints/AnimatedConstraints/ViewController.m +++ b/AnimatedConstraints/AnimatedConstraints/ViewController.m @@ -42,7 +42,6 @@ @interface ViewController () @property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewSpacingContraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *blueViewConstraint; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *yellowViewConstraint; @end @@ -72,12 +71,10 @@ - (IBAction)enableMode:(UISwitch *)sender { - (void)updateConstraintsForMode { if (self.modeSwitch.isOn) { self.viewSpacingContraint.constant = 8.0; - self.yellowViewConstraint.priority = 750; - self.blueViewConstraint.priority = 751; + self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh+1; } else { self.viewSpacingContraint.constant = self.view.frame.size.width; - self.blueViewConstraint.priority = 750; - self.yellowViewConstraint.priority = 751; + self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh-1; } } From 72ece416ee2a6c4029746ca39d875b157efff5e6 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 25 May 2015 18:24:25 +0100 Subject: [PATCH 029/229] Increase width of master view --- WorldFacts/README | 6 ++++++ WorldFacts/WorldFacts/UYLAppDelegate.m | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/WorldFacts/README b/WorldFacts/README index 440d6e1..49b1df9 100644 --- a/WorldFacts/README +++ b/WorldFacts/README @@ -1,6 +1,7 @@ ======================================================================= WorldFacts +Version 3.1 25 May 2015 Increase width of split view master view Version 3.0 27 Mar 2015 Add OS X application to create core data Version 2.0 16 Feb 2014 Update for iOS 8 and UISearchController Version 1.5 20 Feb 2013 Move core data file to App Support dir @@ -49,6 +50,11 @@ interface to Core Data are covered in the following post: useyourloaf.com/blog/2015/03/25/creating-an-os-x-core-data-helper-app.html +To see details on how to increase the width of the master view of the split +view controller see the following post: + +useyourloaf.com/blog/2015/05/25/change-the-width-of-master-view-in-split-view-controller.html + The geographic data used in this App is from GeoNames and used under the Creative Commons Attributions License (see www.geonames.org). diff --git a/WorldFacts/WorldFacts/UYLAppDelegate.m b/WorldFacts/WorldFacts/UYLAppDelegate.m index 22c07ec..28b25ed 100644 --- a/WorldFacts/WorldFacts/UYLAppDelegate.m +++ b/WorldFacts/WorldFacts/UYLAppDelegate.m @@ -3,7 +3,7 @@ // WorldFacts // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012-2014 Keith Harrison. All rights reserved. +// Copyright (c) 2012-2015 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: @@ -56,6 +56,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( splitViewController.delegate = self; splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; + CGFloat minimumWidth = MIN(CGRectGetWidth(splitViewController.view.bounds),CGRectGetHeight(splitViewController.view.bounds)); + splitViewController.minimumPrimaryColumnWidth = minimumWidth / 2; + splitViewController.maximumPrimaryColumnWidth = minimumWidth; + UINavigationController *masterNavigationController = splitViewController.viewControllers[0]; UYLCountryTableViewController *controller = (UYLCountryTableViewController *)masterNavigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; From 80fdd2be7b5e7e129e4b26c891562eb9bb6f9b14 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Jun 2015 23:53:02 +0100 Subject: [PATCH 030/229] Added Designable --- .../Designable.xcodeproj/project.pbxproj | 328 ++++++++++++++++++ Designable/Designable/AppDelegate.h | 42 +++ Designable/Designable/AppDelegate.m | 43 +++ .../Designable/Base.lproj/LaunchScreen.xib | 18 + .../Designable/Base.lproj/Main.storyboard | 61 ++++ .../AppIcon.appiconset/Contents.json | 68 ++++ Designable/Designable/Info.plist | 47 +++ Designable/Designable/LevelView.h | 71 ++++ Designable/Designable/LevelView.m | 133 +++++++ Designable/Designable/LevelViewController.h | 38 ++ Designable/Designable/LevelViewController.m | 54 +++ Designable/Designable/main.m | 42 +++ Designable/README | 9 + README | 3 +- 14 files changed, 956 insertions(+), 1 deletion(-) create mode 100644 Designable/Designable.xcodeproj/project.pbxproj create mode 100644 Designable/Designable/AppDelegate.h create mode 100644 Designable/Designable/AppDelegate.m create mode 100644 Designable/Designable/Base.lproj/LaunchScreen.xib create mode 100644 Designable/Designable/Base.lproj/Main.storyboard create mode 100644 Designable/Designable/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Designable/Designable/Info.plist create mode 100644 Designable/Designable/LevelView.h create mode 100644 Designable/Designable/LevelView.m create mode 100644 Designable/Designable/LevelViewController.h create mode 100644 Designable/Designable/LevelViewController.m create mode 100644 Designable/Designable/main.m create mode 100644 Designable/README diff --git a/Designable/Designable.xcodeproj/project.pbxproj b/Designable/Designable.xcodeproj/project.pbxproj new file mode 100644 index 0000000..df1cee7 --- /dev/null +++ b/Designable/Designable.xcodeproj/project.pbxproj @@ -0,0 +1,328 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 53182E3C1B2460D1002D441F /* LevelViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53182E3B1B2460D1002D441F /* LevelViewController.m */; }; + 53182E6E1B24F75E002D441F /* LevelView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53182E6D1B24F75E002D441F /* LevelView.m */; }; + 538021F91B20EC3900434436 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 538021F81B20EC3900434436 /* main.m */; }; + 538021FC1B20EC3900434436 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 538021FB1B20EC3900434436 /* AppDelegate.m */; }; + 538022021B20EC3900434436 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538022001B20EC3900434436 /* Main.storyboard */; }; + 538022041B20EC3900434436 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 538022031B20EC3900434436 /* Images.xcassets */; }; + 538022071B20EC3900434436 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 538022051B20EC3900434436 /* LaunchScreen.xib */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 53182E611B24F39F002D441F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 53182E3A1B2460D1002D441F /* LevelViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelViewController.h; sourceTree = ""; }; + 53182E3B1B2460D1002D441F /* LevelViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LevelViewController.m; sourceTree = ""; }; + 53182E6C1B24F75E002D441F /* LevelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelView.h; sourceTree = ""; }; + 53182E6D1B24F75E002D441F /* LevelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LevelView.m; sourceTree = ""; }; + 5321CAA61B26506100CE5924 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 538021F31B20EC3900434436 /* Designable.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Designable.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 538021F71B20EC3900434436 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 538021F81B20EC3900434436 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 538021FA1B20EC3900434436 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 538021FB1B20EC3900434436 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 538022011B20EC3900434436 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 538022031B20EC3900434436 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 538022061B20EC3900434436 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 538021F01B20EC3900434436 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 538021EA1B20EC3900434436 = { + isa = PBXGroup; + children = ( + 5321CAA61B26506100CE5924 /* README */, + 538021F51B20EC3900434436 /* Designable */, + 538021F41B20EC3900434436 /* Products */, + ); + sourceTree = ""; + }; + 538021F41B20EC3900434436 /* Products */ = { + isa = PBXGroup; + children = ( + 538021F31B20EC3900434436 /* Designable.app */, + ); + name = Products; + sourceTree = ""; + }; + 538021F51B20EC3900434436 /* Designable */ = { + isa = PBXGroup; + children = ( + 53182E6C1B24F75E002D441F /* LevelView.h */, + 53182E6D1B24F75E002D441F /* LevelView.m */, + 538022001B20EC3900434436 /* Main.storyboard */, + 53182E3A1B2460D1002D441F /* LevelViewController.h */, + 53182E3B1B2460D1002D441F /* LevelViewController.m */, + 538021F61B20EC3900434436 /* Supporting Files */, + ); + path = Designable; + sourceTree = ""; + }; + 538021F61B20EC3900434436 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 538022031B20EC3900434436 /* Images.xcassets */, + 538022051B20EC3900434436 /* LaunchScreen.xib */, + 538021FA1B20EC3900434436 /* AppDelegate.h */, + 538021FB1B20EC3900434436 /* AppDelegate.m */, + 538021F71B20EC3900434436 /* Info.plist */, + 538021F81B20EC3900434436 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 538021F21B20EC3900434436 /* Designable */ = { + isa = PBXNativeTarget; + buildConfigurationList = 538022161B20EC3A00434436 /* Build configuration list for PBXNativeTarget "Designable" */; + buildPhases = ( + 538021EF1B20EC3900434436 /* Sources */, + 538021F01B20EC3900434436 /* Frameworks */, + 538021F11B20EC3900434436 /* Resources */, + 53182E611B24F39F002D441F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Designable; + productName = Designable; + productReference = 538021F31B20EC3900434436 /* Designable.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 538021EB1B20EC3900434436 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 538021F21B20EC3900434436 = { + CreatedOnToolsVersion = 6.3.2; + }; + }; + }; + buildConfigurationList = 538021EE1B20EC3900434436 /* Build configuration list for PBXProject "Designable" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 538021EA1B20EC3900434436; + productRefGroup = 538021F41B20EC3900434436 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 538021F21B20EC3900434436 /* Designable */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 538021F11B20EC3900434436 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 538022021B20EC3900434436 /* Main.storyboard in Resources */, + 538022071B20EC3900434436 /* LaunchScreen.xib in Resources */, + 538022041B20EC3900434436 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 538021EF1B20EC3900434436 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 538021FC1B20EC3900434436 /* AppDelegate.m in Sources */, + 53182E6E1B24F75E002D441F /* LevelView.m in Sources */, + 538021F91B20EC3900434436 /* main.m in Sources */, + 53182E3C1B2460D1002D441F /* LevelViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 538022001B20EC3900434436 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 538022011B20EC3900434436 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 538022051B20EC3900434436 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 538022061B20EC3900434436 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 538022141B20EC3A00434436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 538022151B20EC3A00434436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 538022171B20EC3A00434436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Designable/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 538022181B20EC3A00434436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Designable/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 538021EE1B20EC3900434436 /* Build configuration list for PBXProject "Designable" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 538022141B20EC3A00434436 /* Debug */, + 538022151B20EC3A00434436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 538022161B20EC3A00434436 /* Build configuration list for PBXNativeTarget "Designable" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 538022171B20EC3A00434436 /* Debug */, + 538022181B20EC3A00434436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 538021EB1B20EC3900434436 /* Project object */; +} diff --git a/Designable/Designable/AppDelegate.h b/Designable/Designable/AppDelegate.h new file mode 100644 index 0000000..2086adc --- /dev/null +++ b/Designable/Designable/AppDelegate.h @@ -0,0 +1,42 @@ +// +// AppDelegate.h +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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; + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end + diff --git a/Designable/Designable/AppDelegate.m b/Designable/Designable/AppDelegate.m new file mode 100644 index 0000000..31c5ab2 --- /dev/null +++ b/Designable/Designable/AppDelegate.m @@ -0,0 +1,43 @@ +// +// AppDelegate.m +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +@end diff --git a/Designable/Designable/Base.lproj/LaunchScreen.xib b/Designable/Designable/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..3f72a30 --- /dev/null +++ b/Designable/Designable/Base.lproj/LaunchScreen.xib @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Designable/Designable/Base.lproj/Main.storyboard b/Designable/Designable/Base.lproj/Main.storyboard new file mode 100644 index 0000000..80d939c --- /dev/null +++ b/Designable/Designable/Base.lproj/Main.storyboard @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Designable/Designable/Images.xcassets/AppIcon.appiconset/Contents.json b/Designable/Designable/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Designable/Designable/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Designable/Designable/Info.plist b/Designable/Designable/Info.plist new file mode 100644 index 0000000..8d07b46 --- /dev/null +++ b/Designable/Designable/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Designable/Designable/LevelView.h b/Designable/Designable/LevelView.h new file mode 100644 index 0000000..0f81b49 --- /dev/null +++ b/Designable/Designable/LevelView.h @@ -0,0 +1,71 @@ +// +// LevelView.h +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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; + +IB_DESIGNABLE +/** + A custom level view displayed as a horizontal colored bar which + changes color as the level drops below a configurable theshold. + Set the value of the level as a CGFloat between 0.0 and 1.0. + Customise the colors of the bar, the threshold, border width + and border color as required. + */ +@interface LevelView : UIView +/** + The current level value in the range 0.0 - 1.0. Defaults to 1.0. + */ +@property (nonatomic, assign) IBInspectable CGFloat value; +/** + The threshold value in the range 0.0 - 1.0 at which the bar color + changes between emptyColor and fullColor. Default is 0.3. + */ +@property (nonatomic, assign) IBInspectable CGFloat threshold; +/** + The border width for the frame surrounding the bar. Default is 2.0. + */ +@property (nonatomic, assign) IBInspectable CGFloat borderWidth; +/** + The color of the bar border. Default is black. + */ +@property (nonatomic, copy) IBInspectable UIColor *borderColor; +/** + The color of the bar when value >= threshold. Default is green. + */ +@property (nonatomic, copy) IBInspectable UIColor *fullColor; +/** + The color of the bar when value < threshold. Default is red. + */ +@property (nonatomic, copy) IBInspectable UIColor *emptyColor; +@end diff --git a/Designable/Designable/LevelView.m b/Designable/Designable/LevelView.m new file mode 100644 index 0000000..bb8ad25 --- /dev/null +++ b/Designable/Designable/LevelView.m @@ -0,0 +1,133 @@ +// +// LevelView.m +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "LevelView.h" + +@interface LevelView () +@property (nonatomic, strong) CAShapeLayer *barLayer; +@end + +@implementation LevelView + +- (void)setupDefaults { + self.value = 1.0f; + self.threshold = 0.3f; + self.borderWidth = 2.0f; + self.borderColor = [UIColor blackColor]; + self.fullColor = [UIColor greenColor]; + self.emptyColor = [UIColor redColor]; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupDefaults]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + if (self) { + [self setupDefaults]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + if (self.barLayer == nil) { + self.barLayer = [CAShapeLayer layer]; + [self.layer addSublayer:self.barLayer]; + } + [self updateLayerProperties]; +} + +- (void)setValue:(CGFloat)value { + if ((value >= 0.0) && (value <= 1.0)) { + _value = value; + [self updateLayerProperties]; + } +} + +- (void)setThreshold:(CGFloat)threshold { + if ((threshold >= 0.0) && (threshold <= 1.0)) { + _threshold = threshold; + [self updateLayerProperties]; + } +} + +- (void)setBorderWidth:(CGFloat)borderWidth { + if (borderWidth != _borderWidth) { + _borderWidth = borderWidth; + [self updateLayerProperties]; + } +} + +- (void)setBorderColor:(UIColor *)borderColor { + if (borderColor != _borderColor) { + _borderColor = borderColor; + [self updateLayerProperties]; + } +} + +- (void)setFullColor:(UIColor *)fullColor { + if (fullColor != _fullColor) { + _fullColor = fullColor; + [self updateLayerProperties]; + } +} + +- (void)setEmptyColor:(UIColor *)emptyColor { + if (emptyColor != _emptyColor) { + _emptyColor = emptyColor; + [self updateLayerProperties]; + } +} + +- (void)updateLayerProperties { + CGRect barRect = self.bounds; + barRect.size.width = self.bounds.size.width * self.value; + UIBezierPath *path = [UIBezierPath bezierPathWithRect:barRect]; + self.barLayer.path = path.CGPath; + self.barLayer.fillColor = (self.value >= self.threshold) ? self.fullColor.CGColor : self.emptyColor.CGColor; + self.layer.borderWidth = self.borderWidth; + self.layer.borderColor = self.borderColor.CGColor; + self.layer.cornerRadius = 5.0f; + self.layer.masksToBounds = YES; +} + +@end diff --git a/Designable/Designable/LevelViewController.h b/Designable/Designable/LevelViewController.h new file mode 100644 index 0000000..c316545 --- /dev/null +++ b/Designable/Designable/LevelViewController.h @@ -0,0 +1,38 @@ +// +// LevelViewController.h +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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; + +@interface LevelViewController : UIViewController + +@end diff --git a/Designable/Designable/LevelViewController.m b/Designable/Designable/LevelViewController.m new file mode 100644 index 0000000..5f6e87c --- /dev/null +++ b/Designable/Designable/LevelViewController.m @@ -0,0 +1,54 @@ +// +// LevelViewController.m +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "LevelViewController.h" +#import "LevelView.h" + +@interface LevelViewController () +@property (weak, nonatomic) IBOutlet UIStepper *stepper; +@property (weak, nonatomic) IBOutlet LevelView *levelView; +@end + +@implementation LevelViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.stepper.value = self.levelView.value; +} + +- (IBAction)changeValue:(UIStepper *)sender { + self.levelView.value = sender.value; +} + +@end diff --git a/Designable/Designable/main.m b/Designable/Designable/main.m new file mode 100644 index 0000000..7dd983c --- /dev/null +++ b/Designable/Designable/main.m @@ -0,0 +1,42 @@ +// +// main.m +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Designable/README b/Designable/README new file mode 100644 index 0000000..c8aee59 --- /dev/null +++ b/Designable/README @@ -0,0 +1,9 @@ +======================================================================= +Designable - live custom views in Interface Builder +Version 1.0 07 June 2015 Initial version. +======================================================================= + +Example of how to use IB_DESIGNABLE and IBInspectable to make custom +views live in Interface Builder. See following post for more details + +http://useyourloaf.com/blog/2015/06/09/ib-designable-custom-views-in-interface-builder.html diff --git a/README b/README index 0d32383..3206a8a 100644 --- a/README +++ b/README @@ -3,7 +3,7 @@ See http://useyourloaf.com for details - This README last updated: 18 May 2015 + This README last updated: 08 June 2015 ======================================================================= + INDEX @@ -13,6 +13,7 @@ AlertController - UIAlertController changes in iOS 8 AnimatedConstraints - Animating Autolayout changes Collection - Simple collection view with popovers + Designable - IBDESIGNABLE/IB_Inspectable custom views DynamicText - Supporting dynamic text size changes Huckleberry - Auto layout table view cells with varying row heights MasterSlide - Implementing a mail app style split view controller From 772a59afe515349819449dafb6508b2e9635a797 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 8 Jun 2015 23:58:13 +0100 Subject: [PATCH 031/229] Correct link --- Designable/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Designable/README b/Designable/README index c8aee59..ec61347 100644 --- a/Designable/README +++ b/Designable/README @@ -6,4 +6,4 @@ Version 1.0 07 June 2015 Initial version. Example of how to use IB_DESIGNABLE and IBInspectable to make custom views live in Interface Builder. See following post for more details -http://useyourloaf.com/blog/2015/06/09/ib-designable-custom-views-in-interface-builder.html +http://useyourloaf.com/blog/2015/06/08/ib-designable-custom-views-in-interface-builder.html From 0601b774da290c0b03616c2d44a45f70a6dbf54f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 10 Jun 2015 21:36:50 +0100 Subject: [PATCH 032/229] Add Swift target --- .../Designable.xcodeproj/project.pbxproj | 137 ++++++++++++++++++ Designable/Designable/LevelView.m | 8 +- Designable/DesignableSwift/AppDelegate.swift | 12 ++ .../Base.lproj/LaunchScreen.xib | 41 ++++++ .../Base.lproj/Main.storyboard | 61 ++++++++ .../AppIcon.appiconset/Contents.json | 68 +++++++++ Designable/DesignableSwift/Info.plist | 47 ++++++ Designable/DesignableSwift/LevelView.swift | 134 +++++++++++++++++ .../DesignableSwift/LevelViewController.swift | 49 +++++++ Designable/README | 2 + 10 files changed, 555 insertions(+), 4 deletions(-) create mode 100644 Designable/DesignableSwift/AppDelegate.swift create mode 100644 Designable/DesignableSwift/Base.lproj/LaunchScreen.xib create mode 100644 Designable/DesignableSwift/Base.lproj/Main.storyboard create mode 100644 Designable/DesignableSwift/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Designable/DesignableSwift/Info.plist create mode 100644 Designable/DesignableSwift/LevelView.swift create mode 100644 Designable/DesignableSwift/LevelViewController.swift diff --git a/Designable/Designable.xcodeproj/project.pbxproj b/Designable/Designable.xcodeproj/project.pbxproj index df1cee7..894c6f2 100644 --- a/Designable/Designable.xcodeproj/project.pbxproj +++ b/Designable/Designable.xcodeproj/project.pbxproj @@ -14,6 +14,12 @@ 538022021B20EC3900434436 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538022001B20EC3900434436 /* Main.storyboard */; }; 538022041B20EC3900434436 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 538022031B20EC3900434436 /* Images.xcassets */; }; 538022071B20EC3900434436 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 538022051B20EC3900434436 /* LaunchScreen.xib */; }; + 53C515ED1B2786EE0062905B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C515EC1B2786EE0062905B /* AppDelegate.swift */; }; + 53C515F21B2786EE0062905B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53C515F01B2786EE0062905B /* Main.storyboard */; }; + 53C515F41B2786EE0062905B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53C515F31B2786EE0062905B /* Images.xcassets */; }; + 53C515F71B2786EE0062905B /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 53C515F51B2786EE0062905B /* LaunchScreen.xib */; }; + 53C5160B1B2788110062905B /* LevelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C5160A1B2788110062905B /* LevelViewController.swift */; }; + 53C5160D1B2789A40062905B /* LevelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C5160C1B2789A40062905B /* LevelView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -43,6 +49,14 @@ 538022011B20EC3900434436 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 538022031B20EC3900434436 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 538022061B20EC3900434436 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 53C515E81B2786ED0062905B /* DesignableSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DesignableSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53C515EB1B2786EE0062905B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53C515EC1B2786EE0062905B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53C515F11B2786EE0062905B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53C515F31B2786EE0062905B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 53C515F61B2786EE0062905B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 53C5160A1B2788110062905B /* LevelViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LevelViewController.swift; sourceTree = ""; }; + 53C5160C1B2789A40062905B /* LevelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LevelView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,6 +67,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 53C515E51B2786ED0062905B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -61,6 +82,7 @@ children = ( 5321CAA61B26506100CE5924 /* README */, 538021F51B20EC3900434436 /* Designable */, + 53C515E91B2786EE0062905B /* DesignableSwift */, 538021F41B20EC3900434436 /* Products */, ); sourceTree = ""; @@ -69,6 +91,7 @@ isa = PBXGroup; children = ( 538021F31B20EC3900434436 /* Designable.app */, + 53C515E81B2786ED0062905B /* DesignableSwift.app */, ); name = Products; sourceTree = ""; @@ -99,6 +122,28 @@ name = "Supporting Files"; sourceTree = ""; }; + 53C515E91B2786EE0062905B /* DesignableSwift */ = { + isa = PBXGroup; + children = ( + 53C5160C1B2789A40062905B /* LevelView.swift */, + 53C5160A1B2788110062905B /* LevelViewController.swift */, + 53C515F01B2786EE0062905B /* Main.storyboard */, + 53C515EA1B2786EE0062905B /* Supporting Files */, + ); + path = DesignableSwift; + sourceTree = ""; + }; + 53C515EA1B2786EE0062905B /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 53C515F51B2786EE0062905B /* LaunchScreen.xib */, + 53C515F31B2786EE0062905B /* Images.xcassets */, + 53C515EC1B2786EE0062905B /* AppDelegate.swift */, + 53C515EB1B2786EE0062905B /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -120,18 +165,39 @@ productReference = 538021F31B20EC3900434436 /* Designable.app */; productType = "com.apple.product-type.application"; }; + 53C515E71B2786ED0062905B /* DesignableSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53C516081B2786EE0062905B /* Build configuration list for PBXNativeTarget "DesignableSwift" */; + buildPhases = ( + 53C515E41B2786ED0062905B /* Sources */, + 53C515E51B2786ED0062905B /* Frameworks */, + 53C515E61B2786ED0062905B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DesignableSwift; + productName = DesignableSwift; + productReference = 53C515E81B2786ED0062905B /* DesignableSwift.app */; + productType = "com.apple.product-type.application"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 538021EB1B20EC3900434436 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0630; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 538021F21B20EC3900434436 = { CreatedOnToolsVersion = 6.3.2; }; + 53C515E71B2786ED0062905B = { + CreatedOnToolsVersion = 6.3.2; + }; }; }; buildConfigurationList = 538021EE1B20EC3900434436 /* Build configuration list for PBXProject "Designable" */; @@ -148,6 +214,7 @@ projectRoot = ""; targets = ( 538021F21B20EC3900434436 /* Designable */, + 53C515E71B2786ED0062905B /* DesignableSwift */, ); }; /* End PBXProject section */ @@ -163,6 +230,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 53C515E61B2786ED0062905B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53C515F21B2786EE0062905B /* Main.storyboard in Resources */, + 53C515F71B2786EE0062905B /* LaunchScreen.xib in Resources */, + 53C515F41B2786EE0062905B /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -177,6 +254,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 53C515E41B2786ED0062905B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53C515ED1B2786EE0062905B /* AppDelegate.swift in Sources */, + 53C5160D1B2789A40062905B /* LevelView.swift in Sources */, + 53C5160B1B2788110062905B /* LevelViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ @@ -196,6 +283,22 @@ name = LaunchScreen.xib; sourceTree = ""; }; + 53C515F01B2786EE0062905B /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53C515F11B2786EE0062905B /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53C515F51B2786EE0062905B /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 53C515F61B2786EE0062905B /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -301,6 +404,31 @@ }; name = Release; }; + 53C516041B2786EE0062905B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = DesignableSwift/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 53C516051B2786EE0062905B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = DesignableSwift/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -322,6 +450,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 53C516081B2786EE0062905B /* Build configuration list for PBXNativeTarget "DesignableSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53C516041B2786EE0062905B /* Debug */, + 53C516051B2786EE0062905B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 538021EB1B20EC3900434436 /* Project object */; diff --git a/Designable/Designable/LevelView.m b/Designable/Designable/LevelView.m index bb8ad25..a00237c 100644 --- a/Designable/Designable/LevelView.m +++ b/Designable/Designable/LevelView.m @@ -41,6 +41,10 @@ @interface LevelView () @implementation LevelView - (void)setupDefaults { + if (self.barLayer == nil) { + self.barLayer = [CAShapeLayer layer]; + [self.layer addSublayer:self.barLayer]; + } self.value = 1.0f; self.threshold = 0.3f; self.borderWidth = 2.0f; @@ -69,10 +73,6 @@ - (instancetype)initWithCoder:(NSCoder *)coder - (void)layoutSubviews { [super layoutSubviews]; - if (self.barLayer == nil) { - self.barLayer = [CAShapeLayer layer]; - [self.layer addSublayer:self.barLayer]; - } [self updateLayerProperties]; } diff --git a/Designable/DesignableSwift/AppDelegate.swift b/Designable/DesignableSwift/AppDelegate.swift new file mode 100644 index 0000000..416ae9f --- /dev/null +++ b/Designable/DesignableSwift/AppDelegate.swift @@ -0,0 +1,12 @@ +// +// AppDelegate.swift +// DesignableSwift +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} + diff --git a/Designable/DesignableSwift/Base.lproj/LaunchScreen.xib b/Designable/DesignableSwift/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..d37a9b0 --- /dev/null +++ b/Designable/DesignableSwift/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Designable/DesignableSwift/Base.lproj/Main.storyboard b/Designable/DesignableSwift/Base.lproj/Main.storyboard new file mode 100644 index 0000000..1faad91 --- /dev/null +++ b/Designable/DesignableSwift/Base.lproj/Main.storyboard @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Designable/DesignableSwift/Images.xcassets/AppIcon.appiconset/Contents.json b/Designable/DesignableSwift/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Designable/DesignableSwift/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Designable/DesignableSwift/Info.plist b/Designable/DesignableSwift/Info.plist new file mode 100644 index 0000000..8d07b46 --- /dev/null +++ b/Designable/DesignableSwift/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Designable/DesignableSwift/LevelView.swift b/Designable/DesignableSwift/LevelView.swift new file mode 100644 index 0000000..0b58733 --- /dev/null +++ b/Designable/DesignableSwift/LevelView.swift @@ -0,0 +1,134 @@ +// +// LevelView.swift +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 custom level view displayed as a horizontal colored bar which +changes color as the level drops below a configurable theshold. +Set the value of the level as a CGFloat between 0.0 and 1.0. +Customise the colors of the bar, the threshold, border width +and border color as required. +*/ +@IBDesignable +class LevelView: UIView { + + /** + The current level value in the range 0.0 - 1.0. Defaults to 1.0. + */ + @IBInspectable var value: CGFloat = 1.0 { + didSet { + updateLayoutProperties() + } + } + + /** + The threshold value in the range 0.0 - 1.0 at which the bar color + changes between emptyColor and fullColor. Default is 0.3. + */ + @IBInspectable var threshold: CGFloat = 0.3 { + didSet { + updateLayoutProperties() + } + } + + /** + The border width for the frame surrounding the bar. Default is 2.0. + */ + @IBInspectable var borderWidth: CGFloat = 2.0 { + didSet { + updateLayoutProperties() + } + } + + /** + The color of the bar border. Default is black. + */ + @IBInspectable var borderColor = UIColor.blackColor() { + didSet { + updateLayoutProperties() + } + } + + /** + The color of the bar when value >= threshold. Default is green. + */ + @IBInspectable var fullColor = UIColor.greenColor() { + didSet { + updateLayoutProperties() + } + } + + /** + The color of the bar when value < threshold. Default is red. + */ + @IBInspectable var emtpyColor = UIColor.redColor() { + didSet { + updateLayoutProperties() + } + } + + private let barLayer = CAShapeLayer() + + func setup() { + layer.addSublayer(barLayer) + updateLayoutProperties() + } + + override init(frame: CGRect) { + super.init(frame: frame) + setup() + } + + required init(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setup() + } + + override func layoutSubviews() { + super.layoutSubviews() + updateLayoutProperties() + } + + func updateLayoutProperties() { + let barRect = CGRectMake(bounds.origin.x, bounds.origin.y, bounds.size.width * value, bounds.size.height) + let path = UIBezierPath(rect: barRect) + barLayer.path = path.CGPath + barLayer.fillColor = value >= threshold ? fullColor.CGColor : emtpyColor.CGColor + layer.borderWidth = borderWidth + layer.borderColor = borderColor.CGColor + layer.cornerRadius = 5.0 + layer.masksToBounds = true + } + +} diff --git a/Designable/DesignableSwift/LevelViewController.swift b/Designable/DesignableSwift/LevelViewController.swift new file mode 100644 index 0000000..78b1793 --- /dev/null +++ b/Designable/DesignableSwift/LevelViewController.swift @@ -0,0 +1,49 @@ +// +// LevelViewController.swift +// Designable +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 LevelViewController: UIViewController { + + @IBOutlet weak var levelView: LevelView! + @IBOutlet weak var stepper: UIStepper! + + override func viewDidLoad() { + super.viewDidLoad() + stepper.value = Double(levelView.value) + } + + @IBAction func valueChanged(sender: UIStepper) { + levelView.value = CGFloat(sender.value) + } +} diff --git a/Designable/README b/Designable/README index ec61347..5a17a58 100644 --- a/Designable/README +++ b/Designable/README @@ -1,5 +1,7 @@ ======================================================================= Designable - live custom views in Interface Builder + +Version 1.1 10 June 2015 Added Swift version Version 1.0 07 June 2015 Initial version. ======================================================================= From f39f874ab7a41efd659ca8d5cd43dd38e1c6b7ff Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Jun 2015 22:35:40 +0100 Subject: [PATCH 033/229] Add Stacks project --- README | 3 +- Stacks/README | 10 + Stacks/Stacks.xcodeproj/project.pbxproj | 511 ++++++++++++++++++ Stacks/Stacks/AppDelegate.swift | 39 ++ .../AppIcon.appiconset/Contents.json | 68 +++ Stacks/Stacks/Assets.xcassets/Contents.json | 6 + .../Heart.imageset/Contents.json | 23 + .../Heart.imageset/heart120.png | Bin 0 -> 2467 bytes .../Heart.imageset/heart240.png | Bin 0 -> 5334 bytes .../Heart.imageset/heart360.png | Bin 0 -> 9138 bytes .../Star.imageset/Contents.json | 23 + .../Assets.xcassets/Star.imageset/star120.png | Bin 0 -> 1992 bytes .../Assets.xcassets/Star.imageset/star240.png | Bin 0 -> 5111 bytes .../Assets.xcassets/Star.imageset/star360.png | Bin 0 -> 9242 bytes .../Stacks/Base.lproj/LaunchScreen.storyboard | 26 + Stacks/Stacks/Base.lproj/Main.storyboard | 73 +++ Stacks/Stacks/Info.plist | 47 ++ Stacks/Stacks/ViewController.swift | 59 ++ Stacks/StacksTests/Info.plist | 24 + Stacks/StacksTests/StacksTests.swift | 35 ++ Stacks/StacksUITests/Info.plist | 24 + Stacks/StacksUITests/StacksUITests.swift | 35 ++ 22 files changed, 1005 insertions(+), 1 deletion(-) create mode 100644 Stacks/README create mode 100644 Stacks/Stacks.xcodeproj/project.pbxproj create mode 100644 Stacks/Stacks/AppDelegate.swift create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/Heart.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/Heart.imageset/heart120.png create mode 100644 Stacks/Stacks/Assets.xcassets/Heart.imageset/heart240.png create mode 100644 Stacks/Stacks/Assets.xcassets/Heart.imageset/heart360.png create mode 100644 Stacks/Stacks/Assets.xcassets/Star.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/Star.imageset/star120.png create mode 100644 Stacks/Stacks/Assets.xcassets/Star.imageset/star240.png create mode 100644 Stacks/Stacks/Assets.xcassets/Star.imageset/star360.png create mode 100644 Stacks/Stacks/Base.lproj/LaunchScreen.storyboard create mode 100644 Stacks/Stacks/Base.lproj/Main.storyboard create mode 100644 Stacks/Stacks/Info.plist create mode 100644 Stacks/Stacks/ViewController.swift create mode 100644 Stacks/StacksTests/Info.plist create mode 100644 Stacks/StacksTests/StacksTests.swift create mode 100644 Stacks/StacksUITests/Info.plist create mode 100644 Stacks/StacksUITests/StacksUITests.swift diff --git a/README b/README index 3206a8a..dd45a08 100644 --- a/README +++ b/README @@ -3,7 +3,7 @@ See http://useyourloaf.com for details - This README last updated: 08 June 2015 + This README last updated: 22 June 2015 ======================================================================= + INDEX @@ -25,6 +25,7 @@ Restorer - State Preservation and Restoration SelfSize - iOS 8 Self Sizing Table View Cells (Huckleberry updated) SpeakEasy - Text to speech synthesis + Stacks - Using UIStackView StaticTable - Using a storyboard to implement static table views Stepper - Example use of UIStepper control Styles - Using UIAppearance proxy to style UIKit controls diff --git a/Stacks/README b/Stacks/README new file mode 100644 index 0000000..6caac29 --- /dev/null +++ b/Stacks/README @@ -0,0 +1,10 @@ +======================================================================= +Stacks - Using stack views (requires iOS 9) + +Version 1.0 22 June 2015 Initial version. +======================================================================= + +Example of how to use UIStackView to simplify layout of horizontal and +vertical arrangements of views. See the following post for details: + +http://useyourloaf.com/blog/2015/06/21/easier-autolayout-with-stackviews.html diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2e9c45b --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -0,0 +1,511 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; + 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13EF1B32184600FEEE79 /* ViewController.swift */; }; + 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F11B32184600FEEE79 /* Main.storyboard */; }; + 53DA13F51B32184600FEEE79 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F41B32184600FEEE79 /* Assets.xcassets */; }; + 53DA13F81B32184600FEEE79 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */; }; + 53DA14031B32184600FEEE79 /* StacksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA14021B32184600FEEE79 /* StacksTests.swift */; }; + 53DA140E1B32184600FEEE79 /* StacksUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA140D1B32184600FEEE79 /* StacksUITests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 53DA13FF1B32184600FEEE79 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 53DA13E21B32184500FEEE79 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 53DA13E91B32184600FEEE79; + remoteInfo = Stacks; + }; + 53DA140A1B32184600FEEE79 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 53DA13E21B32184500FEEE79 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 53DA13E91B32184600FEEE79; + remoteInfo = Stacks; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 53DA13F21B32184600FEEE79 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53DA13F41B32184600FEEE79 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53DA13F71B32184600FEEE79 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53DA13F91B32184600FEEE79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53DA13FE1B32184600FEEE79 /* StacksTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StacksTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 53DA14021B32184600FEEE79 /* StacksTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StacksTests.swift; sourceTree = ""; }; + 53DA14041B32184600FEEE79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53DA14091B32184600FEEE79 /* StacksUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StacksUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 53DA140D1B32184600FEEE79 /* StacksUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StacksUITests.swift; sourceTree = ""; }; + 53DA140F1B32184600FEEE79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53F4745D1B38B6C100560817 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53DA13E71B32184600FEEE79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53DA13FB1B32184600FEEE79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53DA14061B32184600FEEE79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53DA13E11B32184500FEEE79 = { + isa = PBXGroup; + children = ( + 53F4745D1B38B6C100560817 /* README */, + 53DA13EC1B32184600FEEE79 /* Stacks */, + 53DA14011B32184600FEEE79 /* StacksTests */, + 53DA140C1B32184600FEEE79 /* StacksUITests */, + 53DA13EB1B32184600FEEE79 /* Products */, + ); + sourceTree = ""; + }; + 53DA13EB1B32184600FEEE79 /* Products */ = { + isa = PBXGroup; + children = ( + 53DA13EA1B32184600FEEE79 /* Stacks.app */, + 53DA13FE1B32184600FEEE79 /* StacksTests.xctest */, + 53DA14091B32184600FEEE79 /* StacksUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 53DA13EC1B32184600FEEE79 /* Stacks */ = { + isa = PBXGroup; + children = ( + 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */, + 53DA13EF1B32184600FEEE79 /* ViewController.swift */, + 53DA13F11B32184600FEEE79 /* Main.storyboard */, + 53DA13F41B32184600FEEE79 /* Assets.xcassets */, + 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */, + 53DA13F91B32184600FEEE79 /* Info.plist */, + ); + path = Stacks; + sourceTree = ""; + }; + 53DA14011B32184600FEEE79 /* StacksTests */ = { + isa = PBXGroup; + children = ( + 53DA14021B32184600FEEE79 /* StacksTests.swift */, + 53DA14041B32184600FEEE79 /* Info.plist */, + ); + path = StacksTests; + sourceTree = ""; + }; + 53DA140C1B32184600FEEE79 /* StacksUITests */ = { + isa = PBXGroup; + children = ( + 53DA140D1B32184600FEEE79 /* StacksUITests.swift */, + 53DA140F1B32184600FEEE79 /* Info.plist */, + ); + path = StacksUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53DA13E91B32184600FEEE79 /* Stacks */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53DA14121B32184600FEEE79 /* Build configuration list for PBXNativeTarget "Stacks" */; + buildPhases = ( + 53DA13E61B32184600FEEE79 /* Sources */, + 53DA13E71B32184600FEEE79 /* Frameworks */, + 53DA13E81B32184600FEEE79 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Stacks; + productName = Stacks; + productReference = 53DA13EA1B32184600FEEE79 /* Stacks.app */; + productType = "com.apple.product-type.application"; + }; + 53DA13FD1B32184600FEEE79 /* StacksTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53DA14151B32184600FEEE79 /* Build configuration list for PBXNativeTarget "StacksTests" */; + buildPhases = ( + 53DA13FA1B32184600FEEE79 /* Sources */, + 53DA13FB1B32184600FEEE79 /* Frameworks */, + 53DA13FC1B32184600FEEE79 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 53DA14001B32184600FEEE79 /* PBXTargetDependency */, + ); + name = StacksTests; + productName = StacksTests; + productReference = 53DA13FE1B32184600FEEE79 /* StacksTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 53DA14081B32184600FEEE79 /* StacksUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53DA14181B32184600FEEE79 /* Build configuration list for PBXNativeTarget "StacksUITests" */; + buildPhases = ( + 53DA14051B32184600FEEE79 /* Sources */, + 53DA14061B32184600FEEE79 /* Frameworks */, + 53DA14071B32184600FEEE79 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 53DA140B1B32184600FEEE79 /* PBXTargetDependency */, + ); + name = StacksUITests; + productName = StacksUITests; + productReference = 53DA14091B32184600FEEE79 /* StacksUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53DA13E21B32184500FEEE79 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53DA13E91B32184600FEEE79 = { + CreatedOnToolsVersion = 7.0; + }; + 53DA13FD1B32184600FEEE79 = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 53DA13E91B32184600FEEE79; + }; + 53DA14081B32184600FEEE79 = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 53DA13E91B32184600FEEE79; + }; + }; + }; + buildConfigurationList = 53DA13E51B32184500FEEE79 /* Build configuration list for PBXProject "Stacks" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53DA13E11B32184500FEEE79; + productRefGroup = 53DA13EB1B32184600FEEE79 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53DA13E91B32184600FEEE79 /* Stacks */, + 53DA13FD1B32184600FEEE79 /* StacksTests */, + 53DA14081B32184600FEEE79 /* StacksUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53DA13E81B32184600FEEE79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53DA13F81B32184600FEEE79 /* LaunchScreen.storyboard in Resources */, + 53DA13F51B32184600FEEE79 /* Assets.xcassets in Resources */, + 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53DA13FC1B32184600FEEE79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53DA14071B32184600FEEE79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53DA13E61B32184600FEEE79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */, + 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53DA13FA1B32184600FEEE79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53DA14031B32184600FEEE79 /* StacksTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53DA14051B32184600FEEE79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53DA140E1B32184600FEEE79 /* StacksUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 53DA14001B32184600FEEE79 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 53DA13E91B32184600FEEE79 /* Stacks */; + targetProxy = 53DA13FF1B32184600FEEE79 /* PBXContainerItemProxy */; + }; + 53DA140B1B32184600FEEE79 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 53DA13E91B32184600FEEE79 /* Stacks */; + targetProxy = 53DA140A1B32184600FEEE79 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 53DA13F11B32184600FEEE79 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53DA13F21B32184600FEEE79 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53DA13F71B32184600FEEE79 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53DA14101B32184600FEEE79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53DA14111B32184600FEEE79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53DA14131B32184600FEEE79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Stacks/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 53DA14141B32184600FEEE79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Stacks/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 53DA14161B32184600FEEE79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = StacksTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StacksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stacks.app/Stacks"; + }; + name = Debug; + }; + 53DA14171B32184600FEEE79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = StacksTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StacksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stacks.app/Stacks"; + }; + name = Release; + }; + 53DA14191B32184600FEEE79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = StacksUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StacksUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Stacks; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 53DA141A1B32184600FEEE79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = StacksUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StacksUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Stacks; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53DA13E51B32184500FEEE79 /* Build configuration list for PBXProject "Stacks" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53DA14101B32184600FEEE79 /* Debug */, + 53DA14111B32184600FEEE79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53DA14121B32184600FEEE79 /* Build configuration list for PBXNativeTarget "Stacks" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53DA14131B32184600FEEE79 /* Debug */, + 53DA14141B32184600FEEE79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53DA14151B32184600FEEE79 /* Build configuration list for PBXNativeTarget "StacksTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53DA14161B32184600FEEE79 /* Debug */, + 53DA14171B32184600FEEE79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53DA14181B32184600FEEE79 /* Build configuration list for PBXNativeTarget "StacksUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53DA14191B32184600FEEE79 /* Debug */, + 53DA141A1B32184600FEEE79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53DA13E21B32184500FEEE79 /* Project object */; +} diff --git a/Stacks/Stacks/AppDelegate.swift b/Stacks/Stacks/AppDelegate.swift new file mode 100644 index 0000000..c5c094e --- /dev/null +++ b/Stacks/Stacks/AppDelegate.swift @@ -0,0 +1,39 @@ +// +// AppDelegate.swift +// Stacks +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/Contents.json b/Stacks/Stacks/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/Heart.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/Heart.imageset/Contents.json new file mode 100644 index 0000000..fe5ada5 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/Heart.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "heart120.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "heart240.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "heart360.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/Heart.imageset/heart120.png b/Stacks/Stacks/Assets.xcassets/Heart.imageset/heart120.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd922e844692a4ef9fa7c0ee736746c69bc6a1c GIT binary patch literal 2467 zcmV;U30(GxP)?!`qJup;so_d`{^6W|Zz%lL z{IZJ^Do%~6JTkQM`0%oe6Z8MDEF)`wV&hfcl~D=p`T>oBLF3fo<3-VP>o)hYOnlKf z-~o52pC`yq3Y5kBS9hqtW8lMWGv25=I5790>l2&2qlJz4hz<}u;G)Pm^&0{$6JBuk zyWbPyyLG_#1Zuc?-(#8la`pZJSqa4)K=)K@fU(PKda5%yY%JW_yv@qPn0%R`QOfrJs7b zqyxQnfZnw1^Nh^B^t?3$8m=(0<$A@*QLaAsV|ZjcT^5WJKcs2Nr|EeIG1QLgV2es@ zzE*jBgsb;`-PXaYfV2NYc)jp~Vsx4S9cPb9sW{!V^fMUa_lMWrp*n^Oc;?eq&%#-9o z^fyu}&cxdyRR9eWgHLQ;^05dz`cX*WUwmukk9`QdXL8-e)>&`Kl*O@bUhqLu{bk%y zY0wyU<XzRN&AQ= zeG{faf(Zi|P~VL9*^5fnG0!B` zT@n*V%k$x?FHP<}F#Lw~-^Sa8)uYKxV~d3pV0s4~J6~Wun)a-u7aXDe&Zc$H7(O;W z0EIx%#JUO5bf9_78Oa17D6!q3@Yf5aAoGI8@Bu+EXo%%ja_vRym}gB`^uQh(+lVJq zs?H(+6Al`JK)vF`NE1$p7&6wFC{IxWG(1#V@o~rCM?7WlbwuH$>jkO$8 z8MXHSz@{MVy;pGCE*W*f5gcA~hnU5jv3nM~w2-GL3Yv_%^5{@0z%=H({#$YyN`pq( zJEi=TjrPtO-JG$f5>+I1K$B6I+?Xx}8b8>m-5Eh;esw_8(shalU&KRa<7Vph#JuY$9#zeG(3^k~kdmnTztqIJ-; zrwPqU?8Be*1nbN-qpcZ=WomW_>q2CW4r}Oe@!kzab!@<$3~9HWFy+uZf1ymPs#zwYroW)_#N4PS~e4ilnoA=SR)NXt7s`mS--qK z03L%Vn*uZyL(n+LHtK0lkW!R41tX#-zicAVWY=gsZX5NC6eOH7O5`}pPLxdtn(R6= zbFY0Q>{?*%hqjMY3^4HrZ-{lq9@uq{v!dtb4f0cloK& zNR%kUX3+mPH;#F>XZ&>tK;MN$Dfv4(4Ep=5v-czB^8|LcijPf~MUk`d1HVU^L4Pm4 z&OO+jp8cTg>iYn`4<*-^8T6f5=O4CAc&Q7l;gp>NAIbg4T3W_t&>g6U6dh}y(z)+p zU?R1Rcq%Jtdq-`VK@)3y!=~dkRa}NbReJXRPObYfXkzXCW>M>$ccg$0d@5zuTd5_- zyRwGOplPiDjpkbxd`PVCM7e3nC%BAG05a&Vv&Pq|8kc|m6Rbn2Em|;IOj3to2Howi z%QaqYSo^KaT28O4_Yahd7!10{zT{W8HI!I;LLmNS=f`=|>mH=cpds`b;Of2orEky; z?cSoOxdIYD22J8)U4CwS-k(OGiVkD&7c`H3xj6R hEDV}KGia9X$#(1u2=v7 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/Heart.imageset/heart240.png b/Stacks/Stacks/Assets.xcassets/Heart.imageset/heart240.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecead5250f4ac7d2b46614ea54fb100a2c1bf9b GIT binary patch literal 5334 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/Star.imageset/star360.png b/Stacks/Stacks/Assets.xcassets/Star.imageset/star360.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8514c87f181cbc21d0791c715d42fb7dc6e319 GIT binary patch literal 9242 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 Ilr<0kUo&qlegFUf literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard b/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..3add59b --- /dev/null +++ b/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard new file mode 100644 index 0000000..cc432a2 --- /dev/null +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/Stacks/Stacks/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Stacks/Stacks/ViewController.swift b/Stacks/Stacks/ViewController.swift new file mode 100644 index 0000000..2d1fa07 --- /dev/null +++ b/Stacks/Stacks/ViewController.swift @@ -0,0 +1,59 @@ +// +// ViewController.swift +// Stacks +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 ViewController: UIViewController { + + @IBOutlet weak var axisSwitch: UISwitch! + @IBOutlet weak var stackView: UIStackView! + + @IBAction func axisChange(sender: UISwitch) { + UIView.animateWithDuration(1.0) { + self.updateConstraintsForAxis() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + updateConstraintsForAxis() + } + + private func updateConstraintsForAxis() { + if (axisSwitch.on) { + stackView.axis = .Horizontal + } else { + stackView.axis = .Vertical + } + } +} \ No newline at end of file diff --git a/Stacks/StacksTests/Info.plist b/Stacks/StacksTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Stacks/StacksTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Stacks/StacksTests/StacksTests.swift b/Stacks/StacksTests/StacksTests.swift new file mode 100644 index 0000000..01917ad --- /dev/null +++ b/Stacks/StacksTests/StacksTests.swift @@ -0,0 +1,35 @@ +// +// StacksTests.swift +// StacksTests +// +// Created by Keith Harrison on 17/06/2015. +// Copyright © 2015 Keith Harrison. All rights reserved. +// + +import XCTest + +class StacksTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Stacks/StacksUITests/Info.plist b/Stacks/StacksUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Stacks/StacksUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Stacks/StacksUITests/StacksUITests.swift b/Stacks/StacksUITests/StacksUITests.swift new file mode 100644 index 0000000..59661fb --- /dev/null +++ b/Stacks/StacksUITests/StacksUITests.swift @@ -0,0 +1,35 @@ +// +// StacksUITests.swift +// StacksUITests +// +// Created by Keith Harrison on 17/06/2015. +// Copyright © 2015 Keith Harrison. All rights reserved. +// + +import Foundation +import XCTest + +class StacksUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} From 38337c41980e37806083491ad58fcbd3977ca699 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 6 Jul 2015 21:14:48 +0100 Subject: [PATCH 034/229] Adapting Stack Views Additional view controller added to Stacks project to show how a stack view can be made to automatically adapt to changing size classes. --- Stacks/README | 6 ++ Stacks/Stacks.xcodeproj/project.pbxproj | 6 ++ .../Stacks/Base.lproj/LaunchScreen.storyboard | 4 +- Stacks/Stacks/Base.lproj/Main.storyboard | 89 ++++++++++++++++++- Stacks/Stacks/Info.plist | 5 +- Stacks/Stacks/SizeClassViewController.swift | 63 +++++++++++++ 6 files changed, 165 insertions(+), 8 deletions(-) create mode 100644 Stacks/Stacks/SizeClassViewController.swift diff --git a/Stacks/README b/Stacks/README index 6caac29..c6678ad 100644 --- a/Stacks/README +++ b/Stacks/README @@ -1,6 +1,7 @@ ======================================================================= Stacks - Using stack views (requires iOS 9) +Version 1.1 06 July 2015 Adapting axis to view size classes Version 1.0 22 June 2015 Initial version. ======================================================================= @@ -8,3 +9,8 @@ Example of how to use UIStackView to simplify layout of horizontal and vertical arrangements of views. See the following post for details: http://useyourloaf.com/blog/2015/06/21/easier-autolayout-with-stackviews.html + +Also see this post for details on how to have the stack view automatically +adapt to size class changes: + +http://useyourloaf.com/blog/2015/07/06/adapting-stack-views-with-size-classes.html diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index 2e9c45b..c2d52c2 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13EF1B32184600FEEE79 /* ViewController.swift */; }; 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F11B32184600FEEE79 /* Main.storyboard */; }; @@ -34,6 +35,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -102,6 +104,7 @@ 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */, 53DA13EF1B32184600FEEE79 /* ViewController.swift */, 53DA13F11B32184600FEEE79 /* Main.storyboard */, + 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */, 53DA13F41B32184600FEEE79 /* Assets.xcassets */, 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */, 53DA13F91B32184600FEEE79 /* Info.plist */, @@ -259,6 +262,7 @@ files = ( 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */, 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */, + 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -404,6 +408,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -415,6 +420,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; diff --git a/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard b/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard index 3add59b..9811301 100644 --- a/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard +++ b/Stacks/Stacks/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index cc432a2..08c8377 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -1,13 +1,14 @@ - + - + + - + - + @@ -56,6 +57,7 @@ + @@ -63,6 +65,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index 40c6215..f98366c 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.1 CFBundleSignature ???? CFBundleVersion - 1 + 2 LSRequiresIPhoneOS UILaunchStoryboardName @@ -35,6 +35,7 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad diff --git a/Stacks/Stacks/SizeClassViewController.swift b/Stacks/Stacks/SizeClassViewController.swift new file mode 100644 index 0000000..4f2b0e0 --- /dev/null +++ b/Stacks/Stacks/SizeClassViewController.swift @@ -0,0 +1,63 @@ +// +// SizeClassViewController.swift +// Stacks +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 SizeClassViewController: UIViewController { + + @IBOutlet weak var stackView: UIStackView! + + override func viewDidLoad() { + super.viewDidLoad() + configureViewForSize(view.bounds.size) + } + +// The alignment axis of the stack view should be set correctly in the Storyboard +// for the given size classes. It should be horizontal except for when the view +// has a compact width and a regular height. That does not work when the +// device traits change due to rotation with beta 2 of iOS 9. +// As a workaround set the axis based on the size of the view. + + override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) + configureViewForSize(size) + } + + private func configureViewForSize(size: CGSize) { + if size.width > size.height { + stackView.axis = .Horizontal + } else { + stackView.axis = .Vertical + } + } +} From 52ee05ece7d4d93ae216ef44a82e9f6d9591e7fe Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 21 Jul 2015 21:23:03 +0100 Subject: [PATCH 035/229] Adapting stack view now works with iOS 9 beta 4 Commented out workaround to bug in early iOS 9 betas to change stack view axis when view size changes. This is no longer necessary as the stack view now correctly adapts to size class changes. Left the code commented as it provides an example of how to react to size changes. --- Stacks/Stacks/SizeClassViewController.swift | 46 +++++++++++---------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/Stacks/Stacks/SizeClassViewController.swift b/Stacks/Stacks/SizeClassViewController.swift index 4f2b0e0..50204ec 100644 --- a/Stacks/Stacks/SizeClassViewController.swift +++ b/Stacks/Stacks/SizeClassViewController.swift @@ -37,27 +37,31 @@ class SizeClassViewController: UIViewController { @IBOutlet weak var stackView: UIStackView! - override func viewDidLoad() { - super.viewDidLoad() - configureViewForSize(view.bounds.size) - } - -// The alignment axis of the stack view should be set correctly in the Storyboard -// for the given size classes. It should be horizontal except for when the view -// has a compact width and a regular height. That does not work when the -// device traits change due to rotation with beta 2 of iOS 9. -// As a workaround set the axis based on the size of the view. + // The alignment axis of the stack view should be set correctly in the Storyboard + // for the given size classes. It should be horizontal except for when the view + // has a compact width and a regular height. This did not work in early iOS 9 + // beta releases. It was fixed in iOS 9 beta 4. + + // The following code was a workaround to the bug that was fixed in iOS 9 beta 4. + // Uncomment if you want to change the stack view axis when the view changes + // size (you can then remove the size class constraints from the stack view in + // the Storyboard). + +// override func viewDidLoad() { +// super.viewDidLoad() +// configureViewForSize(view.bounds.size) +// } - override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) - configureViewForSize(size) - } +// override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { +// super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) +// configureViewForSize(size) +// } - private func configureViewForSize(size: CGSize) { - if size.width > size.height { - stackView.axis = .Horizontal - } else { - stackView.axis = .Vertical - } - } +// private func configureViewForSize(size: CGSize) { +// if size.width > size.height { +// stackView.axis = .Horizontal +// } else { +// stackView.axis = .Vertical +// } +// } } From 98e71d0159e3a9c1cac689a64ee57d0bfc670ee1 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Sep 2015 19:58:32 +0100 Subject: [PATCH 036/229] update to Xcode 7 settings --- .../TwitterSearch.xcodeproj/project.pbxproj | 12 +++++++----- TwitterSearch/TwitterSearch/TwitterSearch-Info.plist | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj index a5ebc07..fe8f663 100644 --- a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj +++ b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj @@ -160,7 +160,7 @@ 53CB80F0139D70FF0030ADD7 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0700; }; buildConfigurationList = 53CB80F3139D70FF0030ADD7 /* Build configuration list for PBXProject "TwitterSearch" */; compatibilityVersion = "Xcode 3.2"; @@ -225,8 +225,8 @@ 53CB8118139D70FF0030ADD7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; @@ -234,7 +234,8 @@ GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -242,13 +243,12 @@ 53CB8119139D70FF0030ADD7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; }; @@ -266,6 +266,7 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -282,6 +283,7 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = app; diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist index 30d4e74..1e247e5 100644 --- a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist +++ b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist @@ -23,7 +23,7 @@ CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 84f4a10628249dbe3ec6d084d03276ba5a91baa3 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Sep 2015 21:06:05 +0100 Subject: [PATCH 037/229] Refresh for Xcode 7 Updated Xcode project settings for Xcode 7 Update Storyboard to use Autolayout and size classes Update to Asset catalogs and launch storyboard --- TwitterSearch/Default-568h@2x.png | Bin 6012 -> 0 bytes TwitterSearch/Default.png | Bin 1853 -> 0 bytes TwitterSearch/Default@2x.png | Bin 5485 -> 0 bytes TwitterSearch/Icon.png | Bin 5593 -> 0 bytes TwitterSearch/Icon@2x.png | Bin 7552 -> 0 bytes .../TwitterSearch.xcodeproj/project.pbxproj | 65 ++++++----- .../AppIcon.appiconset/Contents.json | 80 +++++++++++++ .../AppIcon.appiconset/Icon2-29.png | Bin 0 -> 365 bytes .../AppIcon.appiconset/Icon2-29@2x-1.png | Bin 0 -> 585 bytes .../AppIcon.appiconset/Icon2-29@2x.png | Bin 0 -> 585 bytes .../AppIcon.appiconset/Icon2-29@3x.png | Bin 0 -> 811 bytes .../AppIcon.appiconset/Icon2-40.png | Bin 0 -> 486 bytes .../AppIcon.appiconset/Icon2-40@2x-1.png | Bin 0 -> 812 bytes .../AppIcon.appiconset/Icon2-40@2x.png | Bin 0 -> 812 bytes .../AppIcon.appiconset/Icon2-76.png | Bin 0 -> 717 bytes .../AppIcon.appiconset/Icon2-76@2x.png | Bin 0 -> 1360 bytes .../AppIcon.appiconset/Icon@2x-1.png | Bin 0 -> 992 bytes .../AppIcon.appiconset/Icon@2x.png | Bin 0 -> 992 bytes .../AppIcon.appiconset/Icon@3x.png | Bin 0 -> 1370 bytes .../Images.xcassets/Contents.json | 6 + .../TwitterSearch/LaunchScreen.storyboard | 46 ++++++++ .../TwitterSearch/RootViewController.m | 8 +- .../TwitterSearch/SearchViewController.m | 17 +-- .../TwitterSearch/Storyboard.storyboard | 107 ++++++++---------- TwitterSearch/TwitterSearch/TweetCell.h | 40 +++++++ TwitterSearch/TwitterSearch/TweetCell.m | 40 +++++++ .../TwitterSearch/TwitterSearch-Info.plist | 33 +++--- .../TwitterSearch/TwitterSearch-Prefix.pch | 14 --- 28 files changed, 324 insertions(+), 132 deletions(-) delete mode 100644 TwitterSearch/Default-568h@2x.png delete mode 100644 TwitterSearch/Default.png delete mode 100644 TwitterSearch/Default@2x.png delete mode 100644 TwitterSearch/Icon.png delete mode 100644 TwitterSearch/Icon@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/Contents.json create mode 100644 TwitterSearch/TwitterSearch/LaunchScreen.storyboard create mode 100644 TwitterSearch/TwitterSearch/TweetCell.h create mode 100644 TwitterSearch/TwitterSearch/TweetCell.m delete mode 100644 TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch diff --git a/TwitterSearch/Default-568h@2x.png b/TwitterSearch/Default-568h@2x.png deleted file mode 100644 index 613355750ec785f2f9a21995536334afff835e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6012 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 diff --git a/TwitterSearch/Default.png b/TwitterSearch/Default.png deleted file mode 100644 index 0bb331c7aad39dd47719a4e26b21cf9ea3f3ae04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1853 zcmbVNYfzeJ8YMQn*-7KhZl^YFqUlZ=V`~=MG-KS^5ly-p<7(7qP1EScXyYXoKh#9U zD_)48DBcw#R}ln7(F%OQ8%kOmFI5x-BM9C=K~bZkR*kw}`hWlQnR(wI?>x_$^PF>L z-uwVRFYA+MPQqX?Yww#Lw_&hj*Pt`=r+1*2`P&{zFql)rIwX!2 zo<$!R9se$qR>A3xBXAV3xRl}}FT48~W}b5YpZ0*3f;VMB3U$BcmKHd@Pz z)G~ffwSZE`$*yh-!%*W3xK#cN>@z_=?RhR)lvd6s(4Rkg$|N$|6N`9NTuDY{YZ0@3 zU{sM<)HtksMXYU4E^U5VBP?Wy)wA<+rsYz0XFd%C@a(kmmZ}EHi1O7VEOXYlOkr|J zjXl^Jp-eTY)i2~c6UZji{W3)ftK$i=;YndbDXTLwrkvoT7DdotIF726uy)| z7eCCRlbd=;4U)%&-020QN;?ySXUE`K{i6znT01(SjwNtV`Sp`C^XQVM=%>t-vgYqF zG`U(^$(7)#U_60SRM!!Tp`weM3TxYOWYL_-OyR$%;B@H>i=i3R^zxRn`mWfw2y?T> zrRdx`Adj71(MqY~&YR2wW8(#MF%nldqMTG}r>l8AgJa4^*xGDT+u+!E7>1Td19Qnj za+5S7hk?ptm)Cbk<9v* z{yhN{`TG0%`ulTx94;P?x&z4e%*?&RPclsk1^`DpIIP{$b-OgkhP~CQwwZ$oZAOaJ z%m&~-nfFrD`{Xt#!u>~HGU*CD&TVnv#LGZ zJ96PYG~d+E0^r^Uo!G10A0Gp&q(VV-G&WW4=6}|eeD$U# z$n~5oS3x_2IPL1pL7Y>oN@HM#Dus4chMvYV`ClWUeA)e&c2~m-TuJok|tpL#< zUtiy?2hKJw&NdGmRf+ka=-2d*_d_hZ7So&F#X10v={fT1IkHE%FK_NcaQ_-0;&5d{ z_V(5!ACwWY%aeD;E%;8Lu(99T8q%(uq+q)^aCnzEK3Gr`Zip}q?|*eywcFIS38{fV zWUS96AUZOYo|>SdpMJ8&LB~i6p#9kF;bHb9dpOl6@haqf;o_Aq+XRV`QQ^kH zdI0W^XpTxUPF>doB^^&XzJ0>#Xe8F^Eu#nk02pnzNs>V|49dfOaolW;u2>~D{22EQ7NdwaG^#DxgfU3XzKo5AP}o;lEVdQH%B5Fu*S+?J$c1w@l~KolAR`}BRa1YtoL z!*4Eb2jqdGLZ@lh#x?!M@Q~IP3by|*sfzm$btamYr~AmxF5`Sq^e9*bQUQYjFf0yg zMnonj4gen*7|6&NShL?TB|)BgczC4Strz+2oR<(G#bvGy3F4KDP@=<%_M%5@wZ#%) zbHsGtn>Ro1?(SPc#${n@)y9X1r;kCO%kQk2kGE&8{WjZwB>HRMo!?!R+cPC^ajuOX hP3XS(4e|e9fB%D?smnr+5Lj<}ygmIq_+N$Q{10-(@2LO) diff --git a/TwitterSearch/Default@2x.png b/TwitterSearch/Default@2x.png deleted file mode 100644 index 0d5eccda2ee1cc7fe528d7ce77bbd63cc3a4fea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5485 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 DfR5qu diff --git a/TwitterSearch/Icon@2x.png b/TwitterSearch/Icon@2x.png deleted file mode 100644 index 8e3ed048641e01b64571a2fa52801247fe52aac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7552 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 gkNUp)B;p#dYbZ4r1sKHn`L~ve!Xx==SH~;_u diff --git a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj index fe8f663..50360bb 100644 --- a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj +++ b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj @@ -3,11 +3,14 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ 53432FE8176E71DF0015F986 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53432FE7176E71DF0015F986 /* Storyboard.storyboard */; }; + 536348091BA4AD6A005B59F3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 536348081BA4AD6A005B59F3 /* Images.xcassets */; settings = {ASSET_TAGS = (); }; }; + 5363480B1BA4B3C6005B59F3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5363480A1BA4B3C6005B59F3 /* LaunchScreen.storyboard */; settings = {ASSET_TAGS = (); }; }; + 5363480E1BA4BB37005B59F3 /* TweetCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 5363480D1BA4BB37005B59F3 /* TweetCell.m */; settings = {ASSET_TAGS = (); }; }; 53852EDA176B9A6900EC1107 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53852ED9176B9A6900EC1107 /* Social.framework */; }; 53852EDC176BA6DA00EC1107 /* Accounts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53852EDB176BA6DA00EC1107 /* Accounts.framework */; }; 53CB80FE139D70FF0030ADD7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53CB80FD139D70FF0030ADD7 /* UIKit.framework */; }; @@ -18,15 +21,14 @@ 53CB810E139D70FF0030ADD7 /* TwitterSearchAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CB810D139D70FF0030ADD7 /* TwitterSearchAppDelegate.m */; }; 53CB8114139D70FF0030ADD7 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CB8113139D70FF0030ADD7 /* RootViewController.m */; }; 53CB812B139D73810030ADD7 /* SearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CB812A139D73810030ADD7 /* SearchViewController.m */; }; - 53D3D83B1763BBA9001E5C7C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D83A1763BBA9001E5C7C /* Default-568h@2x.png */; }; - 53D3D83D1763C22C001E5C7C /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D83C1763C22C001E5C7C /* Icon.png */; }; - 53D3D83F1763C232001E5C7C /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D83E1763C232001E5C7C /* Icon@2x.png */; }; - 53D3D8411763C238001E5C7C /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D8401763C238001E5C7C /* Default.png */; }; - 53D3D8431763C23C001E5C7C /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D8421763C23C001E5C7C /* Default@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 53432FE7176E71DF0015F986 /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; + 536348081BA4AD6A005B59F3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5363480A1BA4B3C6005B59F3 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + 5363480C1BA4BB37005B59F3 /* TweetCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TweetCell.h; sourceTree = ""; }; + 5363480D1BA4BB37005B59F3 /* TweetCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TweetCell.m; sourceTree = ""; }; 53852ED9176B9A6900EC1107 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; 53852EDB176BA6DA00EC1107 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = System/Library/Frameworks/Accounts.framework; sourceTree = SDKROOT; }; 53CB80F9139D70FF0030ADD7 /* TwitterSearch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TwitterSearch.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -35,7 +37,6 @@ 53CB8101139D70FF0030ADD7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 53CB8105139D70FF0030ADD7 /* TwitterSearch-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TwitterSearch-Info.plist"; sourceTree = ""; }; 53CB8107139D70FF0030ADD7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 53CB8109139D70FF0030ADD7 /* TwitterSearch-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TwitterSearch-Prefix.pch"; sourceTree = ""; }; 53CB810A139D70FF0030ADD7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 53CB810C139D70FF0030ADD7 /* TwitterSearchAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TwitterSearchAppDelegate.h; sourceTree = ""; }; 53CB810D139D70FF0030ADD7 /* TwitterSearchAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TwitterSearchAppDelegate.m; sourceTree = ""; }; @@ -43,11 +44,6 @@ 53CB8113139D70FF0030ADD7 /* RootViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; 53CB8129139D73800030ADD7 /* SearchViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchViewController.h; sourceTree = ""; }; 53CB812A139D73810030ADD7 /* SearchViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchViewController.m; sourceTree = ""; }; - 53D3D83A1763BBA9001E5C7C /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; }; - 53D3D83C1763C22C001E5C7C /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../Icon.png; sourceTree = ""; }; - 53D3D83E1763C232001E5C7C /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../Icon@2x.png"; sourceTree = ""; }; - 53D3D8401763C238001E5C7C /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = ../Default.png; sourceTree = ""; }; - 53D3D8421763C23C001E5C7C /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -104,7 +100,10 @@ 53CB8113139D70FF0030ADD7 /* RootViewController.m */, 53CB8129139D73800030ADD7 /* SearchViewController.h */, 53CB812A139D73810030ADD7 /* SearchViewController.m */, + 5363480C1BA4BB37005B59F3 /* TweetCell.h */, + 5363480D1BA4BB37005B59F3 /* TweetCell.m */, 53CB815C139D75DB0030ADD7 /* Resources */, + 536348081BA4AD6A005B59F3 /* Images.xcassets */, 53CB8104139D70FF0030ADD7 /* Supporting Files */, ); path = TwitterSearch; @@ -115,7 +114,6 @@ children = ( 53CB8105139D70FF0030ADD7 /* TwitterSearch-Info.plist */, 53CB8106139D70FF0030ADD7 /* InfoPlist.strings */, - 53CB8109139D70FF0030ADD7 /* TwitterSearch-Prefix.pch */, 53CB810A139D70FF0030ADD7 /* main.m */, ); name = "Supporting Files"; @@ -124,12 +122,8 @@ 53CB815C139D75DB0030ADD7 /* Resources */ = { isa = PBXGroup; children = ( - 53D3D8421763C23C001E5C7C /* Default@2x.png */, - 53D3D8401763C238001E5C7C /* Default.png */, - 53D3D83E1763C232001E5C7C /* Icon@2x.png */, - 53D3D83C1763C22C001E5C7C /* Icon.png */, - 53D3D83A1763BBA9001E5C7C /* Default-568h@2x.png */, 53432FE7176E71DF0015F986 /* Storyboard.storyboard */, + 5363480A1BA4B3C6005B59F3 /* LaunchScreen.storyboard */, ); name = Resources; sourceTree = ""; @@ -161,9 +155,14 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 0700; + TargetAttributes = { + 53CB80F8139D70FF0030ADD7 = { + DevelopmentTeam = LCC2J94N44; + }; + }; }; buildConfigurationList = 53CB80F3139D70FF0030ADD7 /* Build configuration list for PBXProject "TwitterSearch" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( @@ -185,11 +184,8 @@ buildActionMask = 2147483647; files = ( 53CB8108139D70FF0030ADD7 /* InfoPlist.strings in Resources */, - 53D3D83B1763BBA9001E5C7C /* Default-568h@2x.png in Resources */, - 53D3D83D1763C22C001E5C7C /* Icon.png in Resources */, - 53D3D83F1763C232001E5C7C /* Icon@2x.png in Resources */, - 53D3D8411763C238001E5C7C /* Default.png in Resources */, - 53D3D8431763C23C001E5C7C /* Default@2x.png in Resources */, + 5363480B1BA4B3C6005B59F3 /* LaunchScreen.storyboard in Resources */, + 536348091BA4AD6A005B59F3 /* Images.xcassets in Resources */, 53432FE8176E71DF0015F986 /* Storyboard.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -204,6 +200,7 @@ 53CB810B139D70FF0030ADD7 /* main.m in Sources */, 53CB810E139D70FF0030ADD7 /* TwitterSearchAppDelegate.m in Sources */, 53CB8114139D70FF0030ADD7 /* RootViewController.m in Sources */, + 5363480E1BA4BB37005B59F3 /* TweetCell.m in Sources */, 53CB812B139D73810030ADD7 /* SearchViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -258,16 +255,20 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TwitterSearch/TwitterSearch-Prefix.pch"; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -276,15 +277,19 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TwitterSearch/TwitterSearch-Prefix.pch"; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = app; }; diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..8595f0a --- /dev/null +++ b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon2-29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon2-29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon2-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon@2x-1.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon2-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon2-29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon2-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon2-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon2-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon2-76@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5e803416f2d62ba420492964041342e944c1e7 GIT binary patch literal 365 zcmV-z0h0cSP)m{QZUX?+>PxzNK)%Ifm_j zzOn+1K2#q_5_L;=mcv(Xk@ENS1drRB4X-S=rn0%uPAUPz7g(4LE^|lg%~5j!?Y&pg%FrJU00000 LNkvXXu0mjf=#Zv% literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..532cc4fba46360ccae7099da9b042350d4197f7a GIT binary patch literal 585 zcmV-P0=E5$P)LqC6C#!GyeJk`tk;=QF6U?TFsV3l_ZdrBa!y$4cM(U-M22IKz*-R zZTRj9rA2$NT5O{~e*O3Z@!k{f+7|8C7|M=Gq(gk(xGkA0i>OO>_2>=b!zRs@M5ac0 zymVX3l1BUU2AM32(3?TwzA43pQ0dMdw`gLUFNwf=R`=@*<;El5yDRqU47h4x?baFa z-4(}*Ow^=0{PhL4XJh5ZBlF`Cnl6c+H-yrlJ>tP9`S1v#J%HS`Ft}`B+ORUqkVx05 zH_w_u&X+^7UummQbJ3nY>(d+Jz$mR%aQ*lK+_W&kepJw#K%hE-r$~6if>E$pY?>{K z!apQ$0002|NklS-1qQ($*U#W#t;Uk(Dx#mz5F_mX+H;AW+cPaX(x2C>v3#X57@}`WBu6 XHwzNK^Vmv800000NkvXXu0mjfot_sb literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..532cc4fba46360ccae7099da9b042350d4197f7a GIT binary patch literal 585 zcmV-P0=E5$P)LqC6C#!GyeJk`tk;=QF6U?TFsV3l_ZdrBa!y$4cM(U-M22IKz*-R zZTRj9rA2$NT5O{~e*O3Z@!k{f+7|8C7|M=Gq(gk(xGkA0i>OO>_2>=b!zRs@M5ac0 zymVX3l1BUU2AM32(3?TwzA43pQ0dMdw`gLUFNwf=R`=@*<;El5yDRqU47h4x?baFa z-4(}*Ow^=0{PhL4XJh5ZBlF`Cnl6c+H-yrlJ>tP9`S1v#J%HS`Ft}`B+ORUqkVx05 zH_w_u&X+^7UummQbJ3nY>(d+Jz$mR%aQ*lK+_W&kepJw#K%hE-r$~6if>E$pY?>{K z!apQ$0002|NklS-1qQ($*U#W#t;Uk(Dx#mz5F_mX+H;AW+cPaX(x2C>v3#X57@}`WBu6 XHwzNK^Vmv800000NkvXXu0mjfot_sb literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d828562470fa9574051a7fa215bc075d387c6cc9 GIT binary patch literal 811 zcmV+`1JwM9P) zuUKvB&>fg5jkIHC?A02%ZD7%!KAbX##)wV*_yWw7MaYaxpE!cmra7cTeC^j5)~Pt& zxh=M5W81PZ^yLrj))}5Ph3e59#Dq|qE{X5l761DIqCbD%yerb6J=CN+`}75sBaygj zVe8TxmL-qdvoX`6Ji2dQ?${T`h)%tATJ`4+u2^oEDvZsQM6_aNnJbI+=nb4PhrxbS z_UR3tH-xunV&%mo`0fdrD~!>dKhBp!w`pSX;S#lFWwT&t!+}z;TWigfMZbDi`tb+% z>CPUeM|uAF0+%O_@ZJ>5l18IHe&)#{zIIvk zt%da~PFZMb`Rnj&7tH_lSE&cj)a zDvNK$E>e}@DpsY~lEZhlEl_NStKr3Q)da<^-EcHOG1x>%kE#eq`za0}Y=mkUjt)^A zMp%hz9FC4s%pmL-)l)cXQDhKylIj%P*X(^WFW%v=;!ULj pAFTH>kc0uh*YEwid7kHa9|5%qB?}*Z_C){y002ovPDHLkV1mwNkLv&c literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png new file mode 100644 index 0000000000000000000000000000000000000000..60a35d268575817e77853e909832a2b4318ca0c4 GIT binary patch literal 486 zcmV@P)N_Utkjm(rqr9^wlk4f#;8T#@D`0fe&^aY+agx9Jz z`|}2>PIS|vJkXp#u2*ipc3GDvj@qv?@7fm8oj?Bh0^-3Z(3?Tkr8@HA5~fCa>(d+k z_yV9hf%D`L)~Pt0F^KHc8t>c{nJkN%E{W>U9p}j*^WzcSwl2tvOtoZX=*=I^lts>% zLfNk~$BIm}V`i*VasT@PTCk!Y0002JNkl^|Py6SINFHehRHE-k(fY`AW?M~0w)Gb80)DSwAR%sB2YApgjgWp_@ ztPkx#>oU;mujkJ%jI?kJlW@B*(?SO_;a5kixKALV1m)oTLg1`R zxDvSQ8@RnQyZZ<5Qf3!C!c$tAdx4n5S#fw3KJ%s|y~BqHenLV7zZ~aV?W82&O5xrP c;I{p@1pnL&fLS3QCIA2c07*qoM6N<$f|=~;Q~&?~ literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..54bc03a6aff5161ebf4b7b9d1913ac685c073b33 GIT binary patch literal 812 zcmV+{1JnG8P)gg6X2yt3?A02%ZD7%!KAbX#vteib_yWw7MaYaxpE!cmra7cTeC^j5)~Pt& zxh=M5W81PZ^yLrj))}5Ph3e59#Dq|qE{X5l761DIqCbD%yerb6J=CN+`}75sBaygj zVe8TxmL-qdvoX`6Ji2dQ?${T`h)%tATJ`4+u2^oEDvZsQM6_aNnJbI+=nb4PhrxbS z_UR3tH-xunV&%mo`0fdrD~!>dKhBp!w`pSX;S#lFWwT&t!+}z;TWigfMZbDi`tb+% z>CPUeM|uAF0+%O_@ZJ>5l18IHe&)#{zIIvkNq(zV<&6dwr$(~^NR{kJa2kE_xF0PZdjIO zITVjgtlYDA#kK>JP;e-?J|Pw3Gpo?24M|yIY+Vt3@Xtw;O({6GWvjH{%fq4V)pvIe zZeHt_ih)Hqvr$S8J}d&5T5~iaC4;kY;)Il}UO?IDGs}f$;K1AS+`30l=c3T`Wtf`~ z3ZkCts?Z3GxyHHN5yBF?N>A^GvC-xODJ?(j+YeJ=4kJ@&FfTL&Q-`@bf<{rHQJ6Z$ z-ElM;7D~a?N$&D!bV}$YOignaK%=ul=U^!0p$lmAp1n&@lVl3q64nkM6&S z3C)F|BmR`VXMQMoF7yIgyzIS#7FUA7D6~upy@r+mdv6w?Wf_C-pd8Ho!NCvNA3nkQ qb7XuaU(|w9;|l;w1xCbc0?10000gg6X2yt3?A02%ZD7%!KAbX#vteib_yWw7MaYaxpE!cmra7cTeC^j5)~Pt& zxh=M5W81PZ^yLrj))}5Ph3e59#Dq|qE{X5l761DIqCbD%yerb6J=CN+`}75sBaygj zVe8TxmL-qdvoX`6Ji2dQ?${T`h)%tATJ`4+u2^oEDvZsQM6_aNnJbI+=nb4PhrxbS z_UR3tH-xunV&%mo`0fdrD~!>dKhBp!w`pSX;S#lFWwT&t!+}z;TWigfMZbDi`tb+% z>CPUeM|uAF0+%O_@ZJ>5l18IHe&)#{zIIvkNq(zV<&6dwr$(~^NR{kJa2kE_xF0PZdjIO zITVjgtlYDA#kK>JP;e-?J|Pw3Gpo?24M|yIY+Vt3@Xtw;O({6GWvjH{%fq4V)pvIe zZeHt_ih)Hqvr$S8J}d&5T5~iaC4;kY;)Il}UO?IDGs}f$;K1AS+`30l=c3T`Wtf`~ z3ZkCts?Z3GxyHHN5yBF?N>A^GvC-xODJ?(j+YeJ=4kJ@&FfTL&Q-`@bf<{rHQJ6Z$ z-ElM;7D~a?N$&D!bV}$YOignaK%=ul=U^!0p$lmAp1n&@lVl3q64nkM6&S z3C)F|BmR`VXMQMoF7yIgyzIS#7FUA7D6~upy@r+mdv6w?Wf_C-pd8Ho!NCvNA3nkQ qb7XuaU(|w9;|l;w1xCbc0?10000@&?0!QqrG3lp>L>RdAXuit5lEo;QTsvN7ewB%e5f@ZJ={e^k+( zKb0eqvR-NV?+KYKi`vJIXVYOss*sV3RVrKmH1(zp|*sL|}*BGQie6Cn- z^5PMqKY#Jw6R=xrnJbH*ID`4{2-&YQ(x5%fltumc1LMOcp*w-ln?T&PFuHGE$BIn! zKYrf1Ev-~=l_ZecvoZYk1h86c zsZDkJ^aZh8YSyVZoim2qv@okua^}b)(3?T-*%#-_ApG|O)1o~0>kG4BXrexU;=(8I z+7_cgeTXO8>i_@&M@d9MRCodH(u2}nK@bGs?rYnOZJWPi+s^wxK(^y^Q`&Q;QrfSK z@xWLR1i|)Zt6Do)-FNl`5=!MZ^S5#lNsJqe*jqS%d#riU1|@1bmaj34@g8RZ#b*hHy4$8RH2I`Fo1fa)uSzZ{`V;B7x8dc4Yz&WAR9 zmFXOxBjO9?D?HuK&^d{yQ3e-1HtZ@3gSs zDxKjR7D~%>8ZeQktiZx*hR)hL3~XGZT!(=hpDE=Ol1ts9bnhU!{#{D;9+JENfb#GW zk}GVYJb4NOX-al03{<*wGE-Q1LCL|wOUf&lcugt7#2Y$qVWRzx&U=`sQ<^Zbg)+5F z_7NsN?GTUe4+^_~D8Rrj{!j|ZLbCrP2!h}n&_x|c;KSfJ00000NkvXXu0mjf{%2i4 literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4d62012833e2b0dd7a7f4f9411cbd7cd00d098 GIT binary patch literal 1360 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TwitterSearch/TwitterSearch/RootViewController.m b/TwitterSearch/TwitterSearch/RootViewController.m index 552e74b..9df71dd 100644 --- a/TwitterSearch/TwitterSearch/RootViewController.m +++ b/TwitterSearch/TwitterSearch/RootViewController.m @@ -1,7 +1,7 @@ // // RootViewController.m // Created by Keith Harrison on 06-June-2011 http://useyourloaf.com -// Copyright (c) 2011 Keith Harrison. All rights reserved. +// Copyright (c) 2011-2015 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,12 +33,6 @@ @implementation RootViewController - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - #pragma mark - #pragma mark === Text field delegate methods === #pragma mark - diff --git a/TwitterSearch/TwitterSearch/SearchViewController.m b/TwitterSearch/TwitterSearch/SearchViewController.m index d28744e..c4811ae 100644 --- a/TwitterSearch/TwitterSearch/SearchViewController.m +++ b/TwitterSearch/TwitterSearch/SearchViewController.m @@ -1,7 +1,7 @@ // // SearchViewController.m // Created by Keith Harrison on 06-June-2011 http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2015 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: @@ -29,6 +29,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import "SearchViewController.h" +#import "TweetCell.h" #import #import @@ -94,6 +95,9 @@ - (void)viewDidLoad { [super viewDidLoad]; + self.tableView.estimatedRowHeight = 84; + self.tableView.rowHeight = UITableViewAutomaticDimension; + // Add the target action to the refresh control as it seems not to take // effect when set in the storyboard. @@ -114,11 +118,6 @@ - (void)dealloc [self cancelConnection]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - #pragma mark - #pragma mark === UITableViewDataSource Delegates === #pragma mark - @@ -144,12 +143,14 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LoadCellIdentifier]; cell.textLabel.text = [self searchMessageForState:self.searchState]; + cell.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; return cell; } - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ResultCellIdentifier]; + TweetCell *cell = [tableView dequeueReusableCellWithIdentifier:ResultCellIdentifier]; NSDictionary *tweet = (self.results)[indexPath.row]; - cell.textLabel.text = tweet[@"text"]; + cell.tweetMessage.text = tweet[@"text"]; + cell.tweetMessage.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; return cell; } diff --git a/TwitterSearch/TwitterSearch/Storyboard.storyboard b/TwitterSearch/TwitterSearch/Storyboard.storyboard index e972cdd..e6f596e 100644 --- a/TwitterSearch/TwitterSearch/Storyboard.storyboard +++ b/TwitterSearch/TwitterSearch/Storyboard.storyboard @@ -1,7 +1,9 @@ - + - + + + @@ -17,21 +19,23 @@ - + - + + + + + - + - - - - + + @@ -40,62 +44,70 @@ - - - + + + - + - + - - + + - + - - + + - - - + - - + + - - + + - - - + + + + + + + + + + @@ -121,26 +133,7 @@ - + - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/TwitterSearch/TwitterSearch/TweetCell.h b/TwitterSearch/TwitterSearch/TweetCell.h new file mode 100644 index 0000000..58da243 --- /dev/null +++ b/TwitterSearch/TwitterSearch/TweetCell.h @@ -0,0 +1,40 @@ +// +// TweetCell.h +// TwitterSearch +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 + +@interface TweetCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UILabel *tweetMessage; + +@end diff --git a/TwitterSearch/TwitterSearch/TweetCell.m b/TwitterSearch/TwitterSearch/TweetCell.m new file mode 100644 index 0000000..d13b327 --- /dev/null +++ b/TwitterSearch/TwitterSearch/TweetCell.m @@ -0,0 +1,40 @@ +// +// TweetCell.m +// TwitterSearch +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 "TweetCell.h" + +@implementation TweetCell + + +@end diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist index 1e247e5..daddcd6 100644 --- a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist +++ b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist @@ -8,20 +8,6 @@ ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - - Icon.png - Icon@2x.png - - - CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -31,15 +17,30 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 2.0 CFBundleSignature ???? CFBundleVersion - 1.0 + 2.0 + LSApplicationCategoryType + LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile Storyboard + NSAppTransportSecurity + + NSExceptionDomains + + api.twitter.com + + NSThirdPartyExceptionAllowsInsecureHTTPLoads + + + + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch b/TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch deleted file mode 100644 index 3347aac..0000000 --- a/TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'TwitterSearch' target in the 'TwitterSearch' project -// - -#import - -#ifndef __IPHONE_3_0 -#warning "This project uses features only available in iPhone SDK 3.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif From b4457915e6762b387480f10fabbca7173f82fbc8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Sep 2015 21:11:37 +0100 Subject: [PATCH 038/229] Remove refeshControl workaround --- TwitterSearch/TwitterSearch/SearchViewController.m | 6 ------ 1 file changed, 6 deletions(-) diff --git a/TwitterSearch/TwitterSearch/SearchViewController.m b/TwitterSearch/TwitterSearch/SearchViewController.m index c4811ae..d3f5f61 100644 --- a/TwitterSearch/TwitterSearch/SearchViewController.m +++ b/TwitterSearch/TwitterSearch/SearchViewController.m @@ -97,12 +97,6 @@ - (void)viewDidLoad self.tableView.estimatedRowHeight = 84; self.tableView.rowHeight = UITableViewAutomaticDimension; - - // Add the target action to the refresh control as it seems not to take - // effect when set in the storyboard. - - [self.refreshControl addTarget:self action:@selector(refreshSearchResults) forControlEvents:UIControlEventValueChanged]; - self.title = self.query; [self loadQuery]; } From 241a67d029b671dfa60f8d8af7bfb3798ef3784c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Sep 2015 17:32:50 +0100 Subject: [PATCH 039/229] Remove old icon files --- TwitterSearch/Icon-Small.png | Bin 4596 -> 0 bytes TwitterSearch/Icon-Small@2x.png | Bin 5606 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TwitterSearch/Icon-Small.png delete mode 100644 TwitterSearch/Icon-Small@2x.png diff --git a/TwitterSearch/Icon-Small.png b/TwitterSearch/Icon-Small.png deleted file mode 100644 index 154885ac90f98dfdf41de6f59afea7e182334576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4596 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 diff --git a/TwitterSearch/Icon-Small@2x.png b/TwitterSearch/Icon-Small@2x.png deleted file mode 100644 index 72974991c4b2ef6837430ca1f1e86393e8c2fd18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5606 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 PpJxpf9p&m9<{|$BZDioO From 6f1293c73e581b4a56132c43d8d79abad3e46473 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 27 Sep 2015 18:57:16 +0100 Subject: [PATCH 040/229] Add example of hiding a view on compact size class --- Stacks/README | 11 +++- Stacks/Stacks.xcodeproj/project.pbxproj | 6 +++ Stacks/Stacks/Base.lproj/Main.storyboard | 65 ++++++++++++++++++++---- Stacks/Stacks/HiddenViewController.swift | 56 ++++++++++++++++++++ 4 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 Stacks/Stacks/HiddenViewController.swift diff --git a/Stacks/README b/Stacks/README index c6678ad..bb82643 100644 --- a/Stacks/README +++ b/Stacks/README @@ -1,6 +1,7 @@ ======================================================================= Stacks - Using stack views (requires iOS 9) +Version 1.2 27 Sep 2015 Hide a view for compact height Version 1.1 06 July 2015 Adapting axis to view size classes Version 1.0 22 June 2015 Initial version. ======================================================================= @@ -8,9 +9,15 @@ Version 1.0 22 June 2015 Initial version. Example of how to use UIStackView to simplify layout of horizontal and vertical arrangements of views. See the following post for details: -http://useyourloaf.com/blog/2015/06/21/easier-autolayout-with-stackviews.html +http://useyourloaf.com/blog/easier-autolayout-with-stackviews.html Also see this post for details on how to have the stack view automatically adapt to size class changes: -http://useyourloaf.com/blog/2015/07/06/adapting-stack-views-with-size-classes.html +http://useyourloaf.com/blog/adapting-stack-views-with-size-classes.html + +The third view controller - HiddenViewController is an example of how to +use size classes to hide a view contained in a stack view. See this post +for details: + +http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html \ No newline at end of file diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index c2d52c2..611f92e 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; + 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13EF1B32184600FEEE79 /* ViewController.swift */; }; 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F11B32184600FEEE79 /* Main.storyboard */; }; @@ -36,6 +38,7 @@ /* Begin PBXFileReference section */ 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; + 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HiddenViewController.swift; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -105,6 +108,7 @@ 53DA13EF1B32184600FEEE79 /* ViewController.swift */, 53DA13F11B32184600FEEE79 /* Main.storyboard */, 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */, + 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */, 53DA13F41B32184600FEEE79 /* Assets.xcassets */, 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */, 53DA13F91B32184600FEEE79 /* Info.plist */, @@ -260,6 +264,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */, 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */, 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */, @@ -278,6 +283,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, 53DA140E1B32184600FEEE79 /* StacksUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index 08c8377..800d60a 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -1,10 +1,52 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20,16 +62,16 @@ - + - - + - + - + @@ -82,7 +124,7 @@ - + @@ -94,7 +136,7 @@ - + @@ -125,7 +167,7 @@ - + @@ -140,6 +182,7 @@ + diff --git a/Stacks/Stacks/HiddenViewController.swift b/Stacks/Stacks/HiddenViewController.swift new file mode 100644 index 0000000..c79f8c1 --- /dev/null +++ b/Stacks/Stacks/HiddenViewController.swift @@ -0,0 +1,56 @@ +// +// HiddenViewController.swift +// Stacks +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 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 HiddenViewController: UIViewController { + + @IBOutlet weak var extraHeart: UIImageView! + + override func viewDidLoad() { + super.viewDidLoad() + configureView(traitCollection.verticalSizeClass) + } + + override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { + super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator) + configureView(newCollection.verticalSizeClass) + } + + private func configureView(verticalSizeClass: UIUserInterfaceSizeClass) { + guard extraHeart != nil else { + return + } + extraHeart.hidden = (verticalSizeClass == .Compact) + } +} \ No newline at end of file From 81e0967e337f2116341786c2470f5c80dbab1399 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 5 Oct 2015 20:38:53 +0100 Subject: [PATCH 041/229] Add Quick Actions --- Stacks/Stacks.xcodeproj/project.pbxproj | 17 +++++ Stacks/Stacks/AppDelegate.swift | 61 ++++++++++++++++++ .../AppIcon.appiconset/Contents.json | 36 +++++++---- .../AppIcon.appiconset/icon-120.png | Bin 0 -> 15475 bytes .../AppIcon.appiconset/icon-121.png | Bin 0 -> 15475 bytes .../AppIcon.appiconset/icon-180.png | Bin 0 -> 26707 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 859 bytes .../AppIcon.appiconset/icon-29@2x-1.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 8936 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1362 bytes .../AppIcon.appiconset/icon-40@2x-1.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4166 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17774 bytes .../ShortcutIcons/Contents.json | 6 ++ .../EyeTemplate.imageset/Contents.json | 23 +++++++ .../EyeTemplate.imageset/Eye105.png | Bin 0 -> 2959 bytes .../EyeTemplate.imageset/Eye35.png | Bin 0 -> 1620 bytes .../EyeTemplate.imageset/Eye70.png | Bin 0 -> 2384 bytes .../HeartTemplate.imageset/Contents.json | 26 ++++++++ .../HeartTemplate.imageset/Heart105.png | Bin 0 -> 3289 bytes .../HeartTemplate.imageset/Heart35.png | Bin 0 -> 1792 bytes .../HeartTemplate.imageset/Heart70.png | Bin 0 -> 2686 bytes .../StarTemplate.imageset/Contents.json | 23 +++++++ .../StarTemplate.imageset/Star105.png | Bin 0 -> 3161 bytes .../StarTemplate.imageset/Star35.png | Bin 0 -> 1743 bytes .../StarTemplate.imageset/Star70.png | Bin 0 -> 2554 bytes Stacks/Stacks/Base.lproj/InfoPlist.strings | 15 +++++ Stacks/Stacks/Base.lproj/Main.storyboard | 20 +++++- Stacks/Stacks/Info.plist | 48 ++++++++++++++ 31 files changed, 262 insertions(+), 13 deletions(-) create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-120.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-121.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye105.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye35.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye70.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart105.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart35.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart70.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star105.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star35.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star70.png create mode 100644 Stacks/Stacks/Base.lproj/InfoPlist.strings diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index 611f92e..2f707eb 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -10,6 +10,8 @@ 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 53B55B951BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; + 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13EF1B32184600FEEE79 /* ViewController.swift */; }; 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F11B32184600FEEE79 /* Main.storyboard */; }; @@ -39,6 +41,7 @@ /* Begin PBXFileReference section */ 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HiddenViewController.swift; sourceTree = ""; }; + 53B55B971BC1B89A0071291E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -112,6 +115,7 @@ 53DA13F41B32184600FEEE79 /* Assets.xcassets */, 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */, 53DA13F91B32184600FEEE79 /* Info.plist */, + 53B55B981BC1B89A0071291E /* InfoPlist.strings */, ); path = Stacks; sourceTree = ""; @@ -201,6 +205,7 @@ TargetAttributes = { 53DA13E91B32184600FEEE79 = { CreatedOnToolsVersion = 7.0; + DevelopmentTeam = LCC2J94N44; }; 53DA13FD1B32184600FEEE79 = { CreatedOnToolsVersion = 7.0; @@ -238,6 +243,7 @@ buildActionMask = 2147483647; files = ( 53DA13F81B32184600FEEE79 /* LaunchScreen.storyboard in Resources */, + 53B55B951BC1B89A0071291E /* InfoPlist.strings in Resources */, 53DA13F51B32184600FEEE79 /* Assets.xcassets in Resources */, 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */, ); @@ -254,6 +260,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -304,6 +311,14 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 53B55B981BC1B89A0071291E /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 53B55B971BC1B89A0071291E /* Base */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; 53DA13F11B32184600FEEE79 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -410,6 +425,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = Stacks/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; @@ -422,6 +438,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = Stacks/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; diff --git a/Stacks/Stacks/AppDelegate.swift b/Stacks/Stacks/AppDelegate.swift index c5c094e..f9d2779 100644 --- a/Stacks/Stacks/AppDelegate.swift +++ b/Stacks/Stacks/AppDelegate.swift @@ -35,5 +35,66 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { + + enum ShortcutIdentifier: String { + case OpenFavorites + case OpenFeatured + case OpenTopRated + + init?(fullIdentifier: String) { + guard let shortIdentifier = fullIdentifier.componentsSeparatedByString(".").last else { + return nil + } + self.init(rawValue: shortIdentifier) + } + } + var window: UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { + + if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { + + handleShortcut(shortcutItem) + return false + } + + return true + } + + func application(application: UIApplication, + performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, + completionHandler: (Bool) -> Void) { + + completionHandler(handleShortcut(shortcutItem)) + } + + private func handleShortcut(shortcutItem: UIApplicationShortcutItem) -> Bool { + + let shortcutType = shortcutItem.type + guard let shortcutIdentifier = ShortcutIdentifier(fullIdentifier: shortcutType) else { + return false + } + + return selectTabBarItemForIdentifier(shortcutIdentifier) + } + + private func selectTabBarItemForIdentifier(identifier: ShortcutIdentifier) -> Bool { + + guard let tabBarController = self.window?.rootViewController as? UITabBarController else { + return false + } + + switch (identifier) { + case .OpenFavorites: + tabBarController.selectedIndex = 0 + return true + case .OpenFeatured: + tabBarController.selectedIndex = 1 + return true + case .OpenTopRated: + tabBarController.selectedIndex = 2 + return true + } + } } \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..056c0aa 100644 --- a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,63 +1,75 @@ { "images" : [ { - "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-121.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", "scale" : "3x" }, { - "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-40.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" } ], diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-120.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-120.png new file mode 100644 index 0000000000000000000000000000000000000000..fac94480410962319ee58c23920cd66b3b57c528 GIT binary patch literal 15475 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-121.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-121.png new file mode 100644 index 0000000000000000000000000000000000000000..fac94480410962319ee58c23920cd66b3b57c528 GIT binary patch literal 15475 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-180.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2fbe9cbcc2e6bd3044c35b2e102714eab2f3cc GIT binary patch literal 26707 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�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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..b257b07226846aca036ccff246e65d2e730a5e0f GIT binary patch literal 859 zcmV-h1ElIUx?40wvf6u*VjyPv;fd3Z* zK>ElefQ3kb^j=I=-=i9--XKT_UM7H&IPpD_B^d-s0`PEoVnYZXFGfW%HB#fMzX#}y ztcmlsYknV`SB8M(m$Ofb8uq`5j`DIYxIcz5jav_#MCJ#l5_U9|HJ10E$p0jc5!8X( zE(XC#xBE9NUTg9!$V0_kw^lMmN(!lzcK!TwMaOU^0F2pJb&jSV%K5@=F>w2+*5Lw* z4jHX<-P6*hx4EFID1Ey3bUQ?ngy80mmu43=y7jld<=uLJ!mEjt7vsi~jES%fqSk>j zeUfMOqqf8`d*Y}q!FL_98l7GVh$`F5^Hxur40e;@SGHlslw?njcOVA#90AcO*J_W7 zMRxUh>Gi%{@Q*6X9&4|7ggSD5o$@K5J+68j4*+ zpXogOU?_hn&~0nJbyc^-MY{li<5mZMRu&fEr1@yu`_18@g{j}49lN)3`8))*toVDT z)4|ai!#OZ9%sr1&)o`vgLA5)yJ8%p5yh!nHI&MIs~*#R6L?b zE&vcrvZ3jW*5TqyJ3HcI=1|E%T11aW*Ep~*HE!le&dWd|DTdGQ#*ibHiAQH-q0$#l z(HRs#BJ#<^VaoScG_08rh3Xq7S_!$4>$RrQ@v*oZ?es|ALeDpD?InvLS3qJ~0`vk4 l^Y0T)z+eOe#Gt)Jgg=K>VSjU{PzwM6002ovPDHLkV1n$|p@9GZ literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7759c83f4b10efb32e7c54af86c6cfd0adc14e64 GIT binary patch literal 2561 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≪6(Ll6b5uSudavx;mk7v<_tj<^EJdT+0`yK?hs_>}&Z0^XfVmom*C2P zuM0WD!21z7w%6!NNol;(Qj{iiAK7oCNifV#+J5QYlG*ONR=X1Lr)VoGirNS$1Grn> z;pCB|UKUGmQhD+uOonO9Nk(o>yJB0hz?b>L0{usMC~6gRDpTT`(Hsl=>C>VzQ?kp= z@%V3uvM+_ntW4kEMFyzPcO~}tf68<{^i{|kaXO911k9xJ(@?@6$QO!OXc0H!@0dZP zr$TD%Hjt@wOi;}TCi|s9@)jkW1|+anJV-Cam|>H?mWH5n=f^YPpD^yBQF9X}2VvRJ zMeIX!!o0YH-*~y^UF7he?e!U!Ry8d=?9V+^r!O{67dhMl>Fi!}P&FNpm&wCsz1@PA zQ&D$|SSpYXg(OLkaCqr>z6&{hVd)*Bw-n2w;jo1t&IjKNdXtYT~X607VCi#7*LNz zTqq9Blo=(}wpJZePfkQTMgZrG6K|7a47H8!&(pQifHsq|z4P^qqL6nuFiS7ldgmP->dSP*;$)k#C5Q6FW4yzf zHaVeSbZXQ!LA`fQ-B-kP^ymc^?q$eji*Q9EBi!O6vQ!ch0Ek-eM96UQXdRF5rV6Id z*3#?dVKIJ!Rkz``SkK@R8T8Gt{3$|hy4uUF?0hy_PA;gQ%{bUBaakj@o_gepC9Eol zskt&v+|lTOa>PeB>K;dd+;H7LIw_DsrB1#C8<(4JP8Icy%H_U}b6ZuJE_r4#qEXlG z`L9eks$-ss$Lp$a`Lcr}Wyijx;E%9GbxEOxg^tc};!GEX01ItkqC{dMT_VRTHefWW zg$QMT!$g=##tQ@FCR-0>Zw0Esqw}rq$<>8$r*WbJCYGV$wrm*GvExK<44?0EIT_7< zK3B8~Jm7`-ygeKh?(mF-onxU+AzFIbywoDLSxfB+lWJkX6LFf}YM)mD-TN+*$?dfh zi?MQ^_}a3=dZCI^dlW4b_Enm+fv*|AEEIF_v5+bZCNr0;n%41QBJQud^v~nGI$R9X zA^7T~N>jK;=J>)kNo@5T=u|h=E$Joq%1OR*i_2(2o+^=vYotXyQb-(E^y)CBFf#2$ zxKhoC0^Xzs5=w4F|Dtz7tBSfwo~Isnk;HL=#&dfnwh)4e^&2fmMr%DIZ+;17yKi$W z2rpZ5b1he*lxDGgfY;xrqsSeNiWV0l-}Nj@7v;@Q#=9pUW3Upg53YUUh^4_(B@?;Z zkxwV$_RoOW$-L;#WW>0le7~!p#AiZCOA*3WHl^Tye?k(czH1R5K0n^^z4NC8|GEW| z#vTqD2}PLEOul{&vof(xy$)P8v>GJ{#vZ9e_9s*YzT5X&lyR)?FwB1zKAhFbHGxc0=wOugOh9f%_m-ezS=@8!R2N5vnRAuYv2F zP?VgJ3Uu47{mrL?y0YN4%Z5h z{8j9i85!dev6spvRDbRd3fHF#yj?O$Osb5LtV*CK)CZsGb-8V`+tTcdbO4LBLBnPj zt3N<`x3_n+2DL*c``DHPqebnG*gTm)Eh1z;DghKeN&~8ZS(k?r&arqaH-uExPdCTm ztIZ45$6tr(19r?v-0rI0o-LZq*E?7`kesfrt6I}^%fmZ;yzW?O@P-%Lvjk)$V*rea zlgMikXE@!`?$>2l1^j-!{0fmGFMBPGNRa(K*ht7+vlqi3_3I~BU8uCVn+L>XG4gt8 zO0F80&4FSELq9&TRc5}5+NS#(ui4B;vR_ZN4?>TKituEmxxW&|M7$O|2GjIfV8gpi zn%bJ$#v`bEIBtkSbPsaa+u7?6r1Ny9QiB%3Y>K^wUu7!o%$qCeyEz6_8Sc<2WM7Crsyx^uDG6K5IjA ze-fS#%3MtY@x|seFgYmnE}Ggc1Hq=}1pOEINb2Po zJAT%}=69L1hpDr!2d~5S*Z5T^b9$l(HtMAEpHOjh=v84ua1bi!oCa#fa&H!4+F1|E zUT`>lP;rZ!(jiItwI}rwnyc}nQK<8F?3dqO`>#ft_=3hL5;K1I9sPNd&rGm=EEJD8 z=?cN!Er5A62_y95z9EMGb!prT&Xqvb@djt9k>VT={r0_C)RdF!e%thrFCACKB7E0J zkGdhNHhWY=#g4(g$)3!yswo|T;1EG2>`kjltY+Vy6|^L%)y=!3pMv=E@U9PeJ!6%$ zoGsgF>sAZ2pZLD@K6l`BPldnF-Zv4x{a`J5aR&-Bjr1wW4}4~fV`On=YxA~uH_7h5YF;g2s#yiyjMyp*`F}E)?^>4Q{TY$_w2Pdoz^iC; zl~{AZFQ=@zz4xeTokcNNT1K=kkjQ(AMdwsH$}ud1rQ8@L%L|RGx97C6lVHxi*oWK; zr*v98End#B5N3B!q7EQ%bDj~)6rERxF@=07zo@5Dy^b{ij~ z@97QZjP>3vyT9dIe#Ce-qFR1+-MAFQQw^3>O2i@_UY8!TF%=>Ir-{$$OHV@}Qm-2X zvO5`n1r9F9qY8#*?fTr%uAM6dhK~|)*w<{NXgb1dE@Br|F$7xTQb*y|4xz%v(JSdw z%4%t-WE9_;T$YvN0Cq^JEc)J;(<{yX7+xJB!VY)C5k>|U?~%~DE_qC8p%NCq|-| zcME%^Ww;HWt% zK;?)kfV@`38F8>(u+Rax!s3I67)W#n>5uPIDX$U*t=RW6)bYj$(}auCFmsk$X1>gS ziT&XwT$Ql_0HVy7XkDEx&~HKjQji$jhY(|9_yI zwbIF$#MXOkQ-f8mJjx2;dz1Q=S=xki-~4sCJ8Au{*abJ_0u6Dh)_Zw~rAMWKf`qfZ z>}_wtYI{tb|OUk&d1=g))8uzHw zQ`3KU`_p^o%C9Xmg(~ApvKkfU-&wx(8Tpz(5*@Cs zLPbB3t{f*1HhsHiLIJ`18Pe&khDI8V%phI4T`%OWSSOW|?hS&lC0axVIyYXb=y2{7 zGy8B>1Q*37Z*)DPzuupo56GPs^CTQF-o6qLe%uK%@o(pOpMkKrpcV%hPK0C?Kz207 zkD3ezHMy4$9-29-k*;6%qa{!%+0n>Lt;ZkbOd&dVu}i$q%FuNo+VKSDw|dUS&22xy zb;M=+&LqfD2GILgtWZxWq2!m%mpYBZ?20~4=nqB&ccnO0oHr9M$8AV=^Yr@B#}wt@ zqAxTnY8rp9bA)F^mcT0RKJ}*lqA-Rp1RkK@&%Wy%+lN9IY*rxc$!6YtOI~|f+#q4& zt;*r>{AFT6h2(>`@yQzXcE}~mE_Y)v_)SS?Mc@V?m%+Q%J$B$#X)d(%>ua0VG3o5< z(F^-!-0Sp*eyzBUli5BHO&ZR1*Kv%+g74kE(Zgx>S$Z9*(P^58+r%QLv$Rze>)_xU zR|zEc+xbn6lK0UWS?FU?stHZ69FiY}EVR1hrDAkvaH@CK2p9IMsNC-47+S9pD+c|0 z&`lSza~?X}4Ss~0Ri|^CnGL6%OSLQeJxCDvon~wO+Kf`s|Jgn7PojQHdeVuSDtM^g zw2BTbXFW>(K*6)m*g7mOrySro%@DOyEfPE+szcB9T4#Tx^lsza&Gf?sY@!!JDVyAG z#!l!L;~KC}ZJ3_G?fnU0%+F>1;R)z+%^w>M(-dQMc<@%sXX^wHllkX#6yVhFQAw{) zRl2pq{p-Wlnga(cGH+As%gO^Qu6{I1A{(sRkE9fDEym9m%$jC_8nfjssKZ|opfzjV zGmNa%B@0mRU?qTn;CcT%S-P^|d7OyvFA-9XwkC!2otjyEFXT|hACG}NUw<&>cJ6Pr zuRG7XlIgYkxu@HEnokj7M-Id!voaSE1xqayR**NZig`1m?T**CHB4QJ=dOHS(}pxYmR z;j?F62xY$$4x)vunuN`&s%xUJq5zSLR^TS(#5mqq$0l@`+pb!j?mX|3o!O5I@wa~O z&qC?i)JQr8=t7j`2QY?=*=+aftvYWWtVkQT#uoff+TGvqtnwPT(3@aIMGSU3VktRh z;{h|RQAmakogPH{b@n;+-}p&VFzb$sL)m8aP3|e8H2GVse`!o&v?QC^0~}EwKa%-u zrZHMxjmch$1+R7WHZt~*I@xgTiMnUkyPS6}u;6^MK$+4UfBOW95o?7wD7MkZYL~(#Qp*&KUPJ0ezUlz*EXSq>W2GA^jwl^u zO+zRMsh)b1&M%V}vuRa|0VDx3mkTsp#Bdgf3Etpn7BB8yV+%bNFa0 zMrXmG&h1;3ubvlcXSu7q0w8L_aIrwd@|r~S-QB#aD9O5NMhFHV8JhJW7Xrbf$ORw2^L{A7yTQw+fHPLc-8%i@C+m2ALOmB zq*yZ=DgtO&ET`tEEWzEWUr=MFC!LhT=;bT}02}(;!$AlN%ik|Q$Euc{L2Vfacnif+ zWgn4|B0#O92|qVzJJ?WaGh`-ys2IpaiI3%6NYT^?T12A(?Ij|{U>cG_(yk>0!mn^L&H-}W;MiY~R9G-;az)1b2jP)qbt?%n?tT~@g|tw6*fFX5 zpnT&`-=`!UggFM6?ly1{qkaOB3(AblEhZ;b)zF464;+KO7WQip*P_t>R11s$G zJJJ=AgRr=j2gcrHAj>hqCVR%>s3633V-(iznhqp`Lv$UF6)15V_-`0KZ6MS`BorIn z;MXV^$deu5GdD>hsXmqCYtFr>%DM4qz}_YQI@;~VNh0DRmI@;qBSw39&o=6&(Mkn{ zuWAzRMN5`6YLXE8DUesZkT*R)S+*y8Z=q>|9KkOkZi8P{2STDdKYUxjG7y&%&jE&o zOZeHyXA7lP&0q<=7x8iloGk2>h+IiB&vasU;?ia1ONYJcvnGf^8bC4#|3>)1VLH|E z2Q^t4fBKB0*h(8t5-jFPgVv&?!E`}?1RpNrdwzHp99kF=ieWwz4)wHe$hu?2B|IyF z`uRlyTtARuEj8^+^n#78qm@z9a)$*91XQs0L048t-b# z{LDAWO>w}$oz^hlrQ+?h2~I#zLlNKAwKxf#L{xi9l`%$hEKFF?`>owABWHp)b+e(u zp_(ID0+)as`1H`tIy6&_jKFdOKep?s5VQ~l7u3ai8FWn_G+LdAV9m}7BHv6oGa_d| z5MYpVZF%UOJL8m45VP-oe&z{rkX{gY(gyuQ*7vuLjjrvqqky3L^%>#H%o=j%ek+ z$;j+sF7Q{!`GdOw6dlvoVNHv`rAb)K;*&TZ$D;b<;qu#y z7}<}qfH5?yFL8#EK`fLEP9enJR#FVuHl|?#uTlcm1yl$5J;H>-u)obp7e_Tha6MKw z&Yeao$UY5<@S`+@d+K||Pll0&bG)sq8|w6Kc6j0#7 zi0A5-<{wBAhly*3pdBln+APaPl{WM1rc3IYDV2RTHpq>3qpPi}8Mkz1`Pgu=V=88M z4^wxZ*xNE#55Ln5F*Dia-lNeyzUz zqq?v!?AK)CYwW8oY8|s=3>CYTLuG|?DYp&ox6>2wIa3w(qHBv0caV6tqLfFv*yn0n*TxA7s-=R!(Q5`edsQR%?ZQsFtf-Y}FTM z1A#58Wv;EYF@q^#+U7Eii&R)j?cVoZARyqr_i{S-J@0#;$M^8wd!wGod!KWj=RCjj z{5k)GnNS=1|A{jW48#wE_@CJWX4{f;n9<*3fFr;hBy|}o0`e$=6beZRW`7V?0y6mUxw4ZZ1)n$fntF(h zp4(PvKO{u6`T>_>1P0u#N{krX-qtue={ehSqOx$@iZuUN96KPtVKzNob>ZEIPXmQjb`y0^(11lztPm)S8QyhN=cDs$Uw-gR zzGsf&It^mJ0Jy0zr$2lB2Aha3VAu$B-<6_<_U#UZGNC3yg?z?B;%b`-va@l{Q*_igi{ii(HvoxT#$NFxdm2L|H)1HSq zcKP)i7ma#DR^&u;=L5yRD~UJL90~4n8~MlNvQ6!Kei`#E0yRf7jz4y^wq%6*MBxSS z<4ML}oye_g-}~Fd%72BLond_1)YVWrOdy@7s{r1~l2*{j_{vS~PhR^gU2H8Q_VJF+ zN6P$3H>7x|n@GwTVUQmV`|8_U{+wE#5;Zd;*45a(ZSBPrdJtbuJKX)n#ozi(!|SK& zQv%<+dZc&H`)+qanraPLOua3tJ^oNWOM`~OVim;Pu6!IBxsDMFWsY$Fl-{}u&v*jU zOILZOLJF+DsbuIi zU-qK0a^Gn2il8M%9qL~k zxME>L^qP(1F&R!hWZjPj?4ebSwe2#DqmD|z6BALFhdM=h*-K8C1v1b~EGAReGWYBV{t z@^#j_G6wATu>(VygiGdu3f!*}`1aLd1Xol-(fk>o&Sc)eu5SMMflCxT03LzDNvVnj&ml(r%0KC z7v!8$U;*m2kT(NbLxuVF9t>sdyZ(OxP#RVvbEfw{Zx#IkYHdYPBNOnwklDcLm^%VJ zsiNq%CmiD@_yeQ6$<-KA$IikReytbbpC)bQfi!MGX|BvjHfa?H$8PB)JFRzdq?r)g z%XNPP&87jwp(G}6v9E+>>iPIVSgo{^dp&;0aF}kjqTBFw)H*nltjppDNezquJ`muh z0&wVJ>x+$11CWADUE$f8=Z zu>%aRl3#?sk%w|yrw(tzG>LYgBxBWx^yU6KG`5%)t0q6<){I$m3@>q_SkaOrD<(G2 zI=aL_va7>iOTB6`H*ioLjj2C#B80TK*i!Wdsx1|~{zl#>5X^cRIOV0L2XGEyA*F&v z9`i;$A74Du+T{P4B#~^dkapl>t$5`uQPaBf;?i@ZA30GKhR@~DsHwpsi3u^sL4)c3 zqs}Y+nOQ(cl_-sDG9t8{0Fja)K9$6h&S}y!&5kw?v%g}z{HhqeO;helX0Q{$)*?Q9 zUW7k|FmmO}*;Ii{yn!BG*P2DDEh3PB6^hR9zsy?;a8=dSUi*TW@CZo=3I5JY?-)l#s7OvO>L>No>ft6)J;tdCffpi#6U(}=HX5CL0- zkeh^8c;rIv?!7nXn{RD)P&yODrIXyl@gB~4ed}9mFLxznw%;e>^C5;LZLLF#@8jZl zqkZ6PFYf}^#1wu&=reMd#BX78Ax92<96~b)N$U_p7{nr-0#B~1Or5^!>{p7)tYNXo zW1zXh3wl#yH!GzD>N!=|sPCel+nB<$lmj)Q!>7Drbc)r!LGXaxl5tXN!R zvM;)>xv8XkryVe{wM=Jv9W+4=s|O#7zY$Ml%s68>{o~ zNUPHx9lopncu_L7aNW#H$`ct9lxr1R{;Rl&8e&-J|IEuo^+x+^?q%KK6PdllOCw;B zmIl;BPj?d50AX3l9{!;Fy`}l$O8cb9*OM2wYZVa%Qx4w2tB6_@b27VxwNUuH2tjWJ z4^Q)&3|_!_Xi7n?3>hwAv9Z3ewXun`2KA5SZT4f=ZL4c7p3J`V!zn#K0}B9MQH9FV za8QcxfU>AD(kl8Ia)#qK72b2g8M9m z618f)V9;||V?$!pgatr}4|-^t_(HGwBg(g)C_gAmt}eOi^o;_-O+M}gXX8{?B;eM1 zzK9mvtv5RJ>#J{5O&7q`YJx77Ic`-lqE+X zZx%1@-SvA+-1$6BSzSVeE2bEG4oeo#=#D8ok$>VO2;vd#2=mG38oI|3%MqbSdF2TO z^GC^%NxxG!zc%tE)f{{DPY=0uGC?5!l+k5o^a@`i7dcNVKK=kJ7PqU2ewq><+cDe{(vgq%JS}}kc88j{71C>S5+Bl%>n&zh+TZjH=P@9yiL&$?z$xZ9Dw%aF^y0sA*KIwa zqBgGEH*noC5d^}XoQ&E=D-6o1=$5uq&>@PN`dR{zn1sSN8e$;|8Zg6HR4QZM+K@GD z$#CfTGm<`8n_s^6h2-NJtVVLt8BGmMBzyxCm%|wjsrbXl>lNA8EE{?-+CqLda$%Q$ zzgo1oZL0&I)NBjX(1RUb%){eUUqxI(Q2-`je7F3|+>tL0ZHR{CXCUWieqU0wDCPKw zb?d5e=CF!)B#6iL=#SBR>j5W!gH{={9lo4(Q~P-_d`t=do0-n z8ZT>XJfz2R-ot4svOUl}8c+&6YvHG7-}uT^R*sp@XLhW7tN1VJZT6#>1pS&dMg=j+ z3E5+PxY$UDJ%gs;Kxx%okw?uh?=i9D*T+QXoQ&|w;%8zgZHTu`^lSPa$zdd1>~vRN zIpbZg96zx(|MnFFeu=15}Q z|B5{Fj|-=j_LrYZy0+iGYRrNzDZBhbf3-m2#wCa(xODYMGJh%u^)$WIXX9$OpmFt%-z-+qj9k;U#zX19y?b*YQ$!*e)yAVXcm$I5xUxXXTHz{{Z{QVb0l+%P z$7Bk$god#C@YP1YJ{0r)Oso0hARNwz_qNG=`1jI$a{W1Lo*MX~PDpOLiMRa6Hb5W8 z<5(LgJxo zCKHkBA>2UG*vF9{8fAa42jy9?%Q3IK=fpRLOY=!;(%z~&?@Lf*J*uN}Ml9W+Qy4nw zLfTlC2J6KsH&=p(hcp_xCunYxm?{8OJ(Ho&V?f_q(fPhN1Yici=q zGm)x+On>ewFz1^*(C1Q;J2KCjd;gZ*snV=6_wuFV&wo#`eeFilBWDkW>K~eh=0Mc| zy#eP21fdUvgOtN2kXf-@kR9qO^p=#EL#LBj9B@MTs}7CwyisPP_+ zOXIm4htIAn`2W|&N^{GJZFc@=%H8_!)~CnHk*K*SH^_2JwGyD!567Btr#^|*eW30! zfs6_rV*SI_4}W<1k&PO^?wz&%@sBRq9Z8lWkZpI|nwGpzw>Q}Jg>Q{Ij`D=t$2K0) z7wgSIO+SrZPQ#L>VDyQE4+#u9c=4?z8_t#=lvC5T&Aw#WkkiXWZ1vuh8D&>3`1qoR zADjD@jh$7Hxsjd~1(XC$&6?cJ3AKrA4p#NH2J{)rwU{hqct-SS?DqTchx; zMVgyWD^Jc_@PK$S{Ffijx_EI`YBf3xbT!-{$7*=gF8sW3`a2`O+too_x$M+WUMre| zeASy40sdG5v|fzUnT>cnSXH2QQqYIEoAn4><_C|*@t`H27ZkrdNt6_Hsd%X0!u-r{ zNc~_WfTCtX)+W%QK62cnYp;Cp{XumK&wi0o{mrCF!vBGZoj#I`Z%GWtFMx4Shx2uP zRg@a0(;)&kalsB-z+dFT3{h+Fy$KVP%#j^!0S(~|4% zD_lDMycI25H0a$p7I8NZtpa^gU%2C|>XW9H7MElDm+iPiR@?Mw&xQAU@e9V<+doI;wjaibT+|fK=g}R8s^^6%~PqF^kof#*m z)R0=^#h{&@tg)R}KdoNz=P4M*u3Pq`XSS<#bwGu5GRJxh&`I~0!eVDI%oy$Xg~;;o9ipEcg|?Nb25NBgp&t$G1k2oJgjA(+<$>pIM&8G!{(cb7qJi zYX6cA44IX4Bh@3{~kmewUiBDjH{DXarK>61YL;;}%>9)%pOxm~Yy%Wr2k%S`N zuyc`IEkCpr0PV7L{P@2Q-g_M{o4`(?pWSOr-6~PIrLGP7!TV5-Y{kPT0^4@e`#22*mY=7@}aMY_UxYk_%=5LB2q=sZp~Wue2EtZ3!pk zH+J)$Qw?3`x1A$INN^Wcas*qdT7u4ieJ#G3FS0F+QeIpp5?(U^7D(@8<_rg|2O|=@ zL0BjJ6*YysWLDFJA>)B!j`V=Q`||XHga%rMoEx2|6Dd+M?N^LmpRvgn*^Z(fzW@Cq z83t1u^02wJ3}4P3?lMY{7 z1|(#V;~D&lcx@)9M$QS<7&4{k{3p};FTOv*(Wk$OcyJ+}r9{L0{zbzf7)4BF@nJog*E zrGm#^^R;M$emfzLcAXzwhYbP_mGuYNx0jHseR3b+;%;%yRXB9M60u%7S8`1aLd1Xol-(fk>o&Sc)eu5SMMflCxT03LzDNvVnj&ml(r%0KC z7v!8$U;*m2kT(NbLxuVF9t>sdyZ(OxP#RVvbEfw{Zx#IkYHdYPBNOnwklDcLm^%VJ zsiNq%CmiD@_yeQ6$<-KA$IikReytbbpC)bQfi!MGX|BvjHfa?H$8PB)JFRzdq?r)g z%XNPP&87jwp(G}6v9E+>>iPIVSgo{^dp&;0aF}kjqTBFw)H*nltjppDNezquJ`muh z0&wVJ>x+$11CWADUE$f8=Z zu>%aRl3#?sk%w|yrw(tzG>LYgBxBWx^yU6KG`5%)t0q6<){I$m3@>q_SkaOrD<(G2 zI=aL_va7>iOTB6`H*ioLjj2C#B80TK*i!Wdsx1|~{zl#>5X^cRIOV0L2XGEyA*F&v z9`i;$A74Du+T{P4B#~^dkapl>t$5`uQPaBf;?i@ZA30GKhR@~DsHwpsi3u^sL4)c3 zqs}Y+nOQ(cl_-sDG9t8{0Fja)K9$6h&S}y!&5kw?v%g}z{HhqeO;helX0Q{$)*?Q9 zUW7k|FmmO}*;Ii{yn!BG*P2DDEh3PB6^hR9zsy?;a8=dSUi*TW@CZo=3I5JY?-)l#s7OvO>L>No>ft6)J;tdCffpi#6U(}=HX5CL0- zkeh^8c;rIv?!7nXn{RD)P&yODrIXyl@gB~4ed}9mFLxznw%;e>^C5;LZLLF#@8jZl zqkZ6PFYf}^#1wu&=reMd#BX78Ax92<96~b)N$U_p7{nr-0#B~1Or5^!>{p7)tYNXo zW1zXh3wl#yH!GzD>N!=|sPCel+nB<$lmj)Q!>7Drbc)r!LGXaxl5tXN!R zvM;)>xv8XkryVe{wM=Jv9W+4=s|O#7zY$Ml%s68>{o~ zNUPHx9lopncu_L7aNW#H$`ct9lxr1R{;Rl&8e&-J|IEuo^+x+^?q%KK6PdllOCw;B zmIl;BPj?d50AX3l9{!;Fy`}l$O8cb9*OM2wYZVa%Qx4w2tB6_@b27VxwNUuH2tjWJ z4^Q)&3|_!_Xi7n?3>hwAv9Z3ewXun`2KA5SZT4f=ZL4c7p3J`V!zn#K0}B9MQH9FV za8QcxfU>AD(kl8Ia)#qK72b2g8M9m z618f)V9;||V?$!pgatr}4|-^t_(HGwBg(g)C_gAmt}eOi^o;_-O+M}gXX8{?B;eM1 zzK9mvtv5RJ>#J{5O&7q`YJx77Ic`-lqE+X zZx%1@-SvA+-1$6BSzSVeE2bEG4oeo#=#D8ok$>VO2;vd#2=mG38oI|3%MqbSdF2TO z^GC^%NxxG!zc%tE)f{{DPY=0uGC?5!l+k5o^a@`i7dcNVKK=kJ7PqU2ewq><+cDe{(vgq%JS}}kc88j{71C>S5+Bl%>n&zh+TZjH=P@9yiL&$?z$xZ9Dw%aF^y0sA*KIwa zqBgGEH*noC5d^}XoQ&E=D-6o1=$5uq&>@PN`dR{zn1sSN8e$;|8Zg6HR4QZM+K@GD z$#CfTGm<`8n_s^6h2-NJtVVLt8BGmMBzyxCm%|wjsrbXl>lNA8EE{?-+CqLda$%Q$ zzgo1oZL0&I)NBjX(1RUb%){eUUqxI(Q2-`je7F3|+>tL0ZHR{CXCUWieqU0wDCPKw zb?d5e=CF!)B#6iL=#SBR>j5W!gH{={9lo4(Q~P-_d`t=do0-n z8ZT>XJfz2R-ot4svOUl}8c+&6YvHG7-}uT^R*sp@XLhW7tN1VJZT6#>1pS&dMg=j+ z3E5+PxY$UDJ%gs;Kxx%okw?uh?=i9D*T+QXoQ&|w;%8zgZHTu`^lSPa$zdd1>~vRN zIpbZg96zx(|MnFFeu=15}Q z|B5{Fj|-=j_LrYZy0+iGYRrNzDZBhbf3-m2#wCa(xODYMGJh%u^)$WIXX9$OpmFt%-z-+qj9k;U#zX19y?b*YQ$!*e)yAVXcm$I5xUxXXTHz{{Z{QVb0l+%P z$7Bk$god#C@YP1YJ{0r)Oso0hARNwz_qNG=`1jI$a{W1Lo*MX~PDpOLiMRa6Hb5W8 z<5(LgJxo zCKHkBA>2UG*vF9{8fAa42jy9?%Q3IK=fpRLOY=!;(%z~&?@Lf*J*uN}Ml9W+Qy4nw zLfTlC2J6KsH&=p(hcp_xCunYxm?{8OJ(Ho&V?f_q(fPhN1Yici=q zGm)x+On>ewFz1^*(C1Q;J2KCjd;gZ*snV=6_wuFV&wo#`eeFilBWDkW>K~eh=0Mc| zy#eP21fdUvgOtN2kXf-@kR9qO^p=#EL#LBj9B@MTs}7CwyisPP_+ zOXIm4htIAn`2W|&N^{GJZFc@=%H8_!)~CnHk*K*SH^_2JwGyD!567Btr#^|*eW30! zfs6_rV*SI_4}W<1k&PO^?wz&%@sBRq9Z8lWkZpI|nwGpzw>Q}Jg>Q{Ij`D=t$2K0) z7wgSIO+SrZPQ#L>VDyQE4+#u9c=4?z8_t#=lvC5T&Aw#WkkiXWZ1vuh8D&>3`1qoR zADjD@jh$7Hxsjd~1(XC$&6?cJ3AKrA4p#NH2J{)rwU{hqct-SS?DqTchx; zMVgyWD^Jc_@PK$S{Ffijx_EI`YBf3xbT!-{$7*=gF8sW3`a2`O+too_x$M+WUMre| zeASy40sdG5v|fzUnT>cnSXH2QQqYIEoAn4><_C|*@t`H27ZkrdNt6_Hsd%X0!u-r{ zNc~_WfTCtX)+W%QK62cnYp;Cp{XumK&wi0o{mrCF!vBGZoj#I`Z%GWtFMx4Shx2uP zRg@a0(;)&kalsB-z+dFT3{h+Fy$KVP%#j^!0S(~|4% zD_lDMycI25H0a$p7I8NZtpa^gU%2C|>XW9H7MElDm+iPiR@?Mw&xQAU@e9V<+doI;wjaibT+|fK=g}R8s^^6%~PqF^kof#*m z)R0=^#h{&@tg)R}KdoNz=P4M*u3Pq`XSS<#bwGu5GRJxh&`I~0!eVDI%oy$Xg~;;o9ipEcg|?Nb25NBgp&t$G1k2oJgjA(+<$>pIM&8G!{(cb7qJi zYX6cA44IX4Bh@3{~kmewUiBDjH{DXarK>61YL;;}%>9)%pOxm~Yy%Wr2k%S`N zuyc`IEkCpr0PV7L{P@2Q-g_M{o4`(?pWSOr-6~PIrLGP7!TV5-Y{kPT0^4@e`#22*mY=7@}aMY_UxYk_%=5LB2q=sZp~Wue2EtZ3!pk zH+J)$Qw?3`x1A$INN^Wcas*qdT7u4ieJ#G3FS0F+QeIpp5?(U^7D(@8<_rg|2O|=@ zL0BjJ6*YysWLDFJA>)B!j`V=Q`||XHga%rMoEx2|6Dd+M?N^LmpRvgn*^Z(fzW@Cq z83t1u^02wJ3}4P3?lMY{7 z1|(#V;~D&lcx@)9M$QS<7&4{k{3p};FTOv*(Wk$OcyJ+}r9{L0{zbzf7)4BF@nJog*E zrGm#^^R;M$emfzLcAXzwhYbP_mGuYNx0jHseR3b+;%;%yRXB9M60u%7S8}6G8mc)E8oj=~=+Q_jN>owJqg{n|6f#x>O^M7M@sV#WxgUJl?+L zy1;X*ZMa#st);EQ`L~)z>97Xg2A(qy12G+~h3KJX?Ew)UJ4kkkHOJ-W@%j~5{CAV? zk9x0v+p&6#L05#EU=@N6r$qcpfu|z4Mz1QoiJf_N@@=)GizYJ2lPL82R`lRcY zPKMBHp1yt3J3ce<0A@6314WGSa- zf&Mv~otvHUe)E6-_y705SN)EwHIW-nc6jNbGjJ;SD+FW}F9f0vhL}?(#ioDQ!@{H& zL_i0*2+o$LCajDN(Ch>myD*gyBZ6a%NwVzg*RDyUyIYg741+D-;9-s(cok;#*OzD-F_eUI_+SdhT z;XEod4O3>k@GlgI6A&(-k{|{Nuh+8>p26g$R1B!{J0?z3O$ANmCm{;;pS34CPu=#2 zq9`5WuYNmiYlMnNnaPiX0kML|V&>#!E;HE}u`ubn0N-O~AjWTMRUv(b^LfnFr`{`` zba~>8@ikBFpKxD^6z+22OL;{9slUQ7&QjdCK#K zC+Em4u^T;@HOLqR9;8mH2&n}6$)*tnXWJ<@+dp}0zjkiapkSxnhjKm<&|$d*ky8;* z((8UhppI$~s5E68i3Q+M!hxdV3nzYXq^umPG-RWa&TSsQOUg=ec)(9wpCC)%?;NNA zsF^Puoq=CiAt*3s(haf@iNc%-IAr9;fR)d({+yQgZI=)n(T>0TX_BK-Sm~yr_b4kU z4YJ3Ol`VkgRnU{OkT<~rE+%bDJOF2QlG(tYt7zV1d1gRUl@OM7|EZOu3ps1xzX_0d z7{cGG`Y8uU;sie7vZibX*WOeDBlN*Z&5{{Qs3jF*YGKYf+Xw&gXip`yMXG++&)416 z{3<}8XqSbAA;JTwehDluhAkr3c&00wq^D1|6L9*dgj;QInY$Qf$bskUOR-Ez)$5?rE$jyy`@$hXlkO1%B5kpN%n}Up-qM z=km13cXio#vWIeW=8V4n>!Am_I4hE!9%pnlB2A(aI7p%dr(;rpVrCfJ>nnSimr9_$ z*NDuN%9on@U8 zs-hwTSP0UBie|?`tO1A6Ou9~0P}Nzi$L(AY`f4N2RK~l?TDUxp(;ofbK}eO}Cd#ch zRRr#huS#;1B{|B2u)DUbNOE{u#$2byqsGZIpxYUe~7CRn%#+a6mOMrpM%D zBLaC%YNU86gP=5gXaB$je;slM5w?%3EX-bePuyi_Iusw3CK!nEdUbscc(|028f8Lm zDbL?G_%{b1yCVqiYF1S^X-$WOs(N_rJ2{baue_eF+0+pia`T+>l)UNn`tD&%|2E(@ zBW%<3NxHJNxXTgT;{>UE0{Hf>b1BV%>Hd(M+QfTEzQZ4V#&EEobv zIG+r_IJ4q2mkM=$HDk-f{Nf&AM;H_3+ct6Szz!w0*Du3Dzl!<<)JIXZU`$TrMA}er z+Rj+;bAWSvUgq{Q-NJ~laYSAIgf&Atou$JHtoraP^GZ@At56Mkasq!v4&V?<#<7XV z)%c^H{w%xTUtPk2u#sB(rwQxRJG(HzbHvCEFY8?jCf2ye3DQxx-@HO-hJG3md)w*m zWAi431!S+*7Z1O<%+?lT#DbCne#>oGjOpq+mj7(0EjMYogKpn{%q<%HR^iC7fNT<3 zTQPgCs>%ySQUk!GTrRBFEf=$TS@#TA@g%JDU}|?zXAgjo$)wxAoGw-vxcFb&t^?Dfl+SFpCr2q{z@l-GbMRTLG02Me{Jtt7@q-0Q_$<5EHy@4OgqhP;2u8Rq z1%6SFgLc_O?T=4Tk*g7{$y>Mu4F=k?1ChTx({0qJuY?igLwA=HOw--o%c8H_7?KvC?~Q2IP*6_fk6*GyCMTpNs@!e1Z26 z1Ub~2GHu@A37k~$oGbC zdbQu4&}(GQ?E$pTh1HvcB#F8o2a!k`_-Ox)G7DD;vSXD?*W%i}zf=irk9Yq2yJ?%d zJ1?60uZh|~#D_2n)+_XPe0opzBGrf* z8zj5Q)f|GUK7|b61GW-3QC;BFChApq9#0Z~IGUQX^Eq2*t$g92yr1?gQq=&eLbF&g z8Kx;}{ewy>oNpFR$UBu{On~}2moLtEMgCtQ2m_4~ID?A3Q!0XVeFPWAT?VWGc?}$a zE|G$n^}uU8C#^V=&gwF&|F#(^e~F3oL8d`}NVipyV3YsIg~VCAGru~Y%s5MDOmW6s z)u3<;y;5KU}|LNQeSDpxBD7tqa zL8TxfA|k?v@BdD2U!mJbtuu$y>>}77QkVT;n&c)onVWiz8HVI@Z2Bl6Kl6C7#uwN@ z?m`pZuyL|01MI~V#|K*#0XrNyxo4`tf70eu=x>-?a6>6Y@NIj;v}M8s13wbi0!@e` zxvB7x5(ZTYc-da0N0mRB78xddRfv zj7(}K=hX34fb@#ij0MU4!;{~Egmy9bx6S2BDAOz2g!5305EJ*~RrUg<%33DN07VO~q0gcf~yPoie9J=5RFcx&8VS8j39IP&=V$nq&z)V~R|`%T#^WKU;OFgDGvZY78r{!7vByMVwc$wGl5G-ytL1KyOZpfK!B QR{#J207*qoM6N<$g437vy#N3J literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdbed3bcd25858e35e136552a11675defee0c45 GIT binary patch literal 17774 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json new file mode 100644 index 0000000..7c0a4bb --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Eye35.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Eye70.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Eye105.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye105.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye105.png new file mode 100644 index 0000000000000000000000000000000000000000..52d59ef33dd13baea4129abee213291e5346bc3e GIT binary patch literal 2959 zcmb`Jc|4TcAIE1bDO-s!BGVAUtg;Oz`;sMOk7CToXf`ubhN#BY6_uhzsiBQ5sqB+9 z${0$vkh&?A%2rCQ#GSe`)XmSY{=3ifdY|$6!Afk!>y}rjuqW(J( znf^U1VSaFC7!{6$A>hA)7=(zQ;r$OK^86OVGYP-JM4owUt{C$%S_&(QcBkM75wZ4R z3_J#fKpI1l2q?nX2ZcZ*5olv$OZXzq&kW~iI~qQWL819jC`61Wfr%%QL|w2EOnA?; z3l$4sQ6A{cGy+~&U{M({NK5$t*%s^VC?qNkPp6CY!qDdQ3vG+_-gr8NxJxv=FPXr= zpuQuE%!{eOpMH$#4`!ipF%a-8V4-mVAX*6YT%`i+2_!suE*B(1n9VOei%B~QkwV)- z4GYJM3O0uAi9v1FVe8*qN?$H5ZIitIv5$}5hDp6%yAwz4H+Q+R zj^+)dXTs}!HW5r)wwvs3?OM0Rdsirw3PYy zl0EuncRDYHE^&NOrbv`X7#MesPZzj`!fKRi265JdP{7s((2ARgwX^Jx0{t4v8XPXv z@RJ{F%?e1>?MaKYFW?WwGAj)`&)rbV6%$l04HWFPlV8sA9(#;;#%kkABn-HbnGPOC zE{CiW6LPs)Mi(J!T!Qy1eaxN)UtvT*eJn!jS?#uC3V5`deI>`i|9w^{yzpeY@?u#fRz*7=cbkP z?w<2d<24hXssk#e_Z|7z!b>)2ysyRl0_?u`1=`e;TTy3eBgwI~<*mVvv5xs&G1Z7O zik45F7!Mnh?>Kf|&aXe9&}`TgNP2c1r6Cpd>XCTAx8zyZg6jdbic(RZ>?((*syt2Xy8kXP*+~`!KI!jdFI-enV&W|Q%93bE!*E%uq*!P#}j=86~m)x{ra|? z5OCGbGf77T#@J-+ea9*!O|yw_t=AOM3=Mfp6$K;LU zM^uNo)AY<~H_eT>F?~;Tj-z7&`0O>z&Q~Ezu=w@zhTmct6RWhekiEW&2L+PhabtRi zTESUb+)dNkGdE?LCwIq3CRJhoPT8x=RJIIewOx963a_<&0%QOm;7-8%9}RH&01kbd zc`lKxy;x!d(53u`WEv>&GcZm0~*4}GZJZGftJ>i@~ z(P+1BaOi;2j(yvvvp;FKLrRg@EA%JwWRoVW??yFw9T2CaXm|MeRd-MIW^M{5iu*}L zMfYWXip#ncUC8g)_aKYh;`i!<&P=M>fteR$pa;Z;o;Ahp9x9gY9;KIe*S~P8PbW6~ zHJ#7TWYo`;@Rg$%aY-jWhpT4y@~}^Tu$QTNJ*hTPDRUv zYI3~x0ka|MR+qwBJhP$bWOG~&5t><};3N)v*aEKbOcE4GTX7FOdz7Xay+tj@Q73^r zV=~Ml2Lf|oa?{n=-iIyzC51XY5xkWuFE27sIT>-R;}wii?$Q-nA*yW2eAU0^cBhwI z(K@B#lgMbVpd9Cj8G*JB7uJMb=~rC@DiPrf0>${3kq{VZ1EpJs{uq zFsc_6$fJ&(O!BZYs_Nf$OHG}yTM;?U~goy*M|nPa{^>_$D)*Qd5+50*!5IRu55U$Ne( zpq&!Pzaa?QzWO%p2F;yOl+)8kj3^AEIwaJa=F>&qiy<5c!{8F_4AVo@fSr6w^YwT)6iP*ifcSTC~>5g(|2nn>a{(ZC5{Nq`{wgde`zb8r+qw z$sY01>GBg3#9$d`Yg?{;-O?G7aw}I;oX;XV9Wy~JiF|%aEW&T?D1_Y@A;$#iy~$Kj z;HVAl1NK(e=Ad8a1!rfaH*f7^Q^%O6g!t*To z8tFl`*nm^Q?@m0Fx4hACK9nu>u26iW`oxNER;O%Ugf)LzUa55M*FUXu3)Opg3ClPJ r{B4I}ZTpP|WX;6?i>5+f{2O3wJ@$^m7ug%4zhoB&5BsaOp^5(hf5^tU literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye35.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye35.png new file mode 100644 index 0000000000000000000000000000000000000000..fae96ef56e3028f0f361019a06ee5e770b435a8f GIT binary patch literal 1620 zcmeAS@N?(olHy`uVBq!ia0vp^${@_a1|;QfZjJ;}jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z81_tI8nIRD+5xzcF$@#f@i7EL>sd^Q;1whpd3^o;3KxS@gNuokUZcbjY zRfVk*ScMgk4HDK@QUEI{$+lIB@C{IK&M!(;Fx4~BGf=YQQczH^DN0GR3UYCSY6tRc zl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN)rhQQ2mNi9w; z$}A|!%+FH*nVXoDUs__Tqy(}E4xsMLEr45;R}A$P(0}?Bi3R$GdItK~G?iqgA)JSz z3nYV6TWUon4s9SAh&FIwK-_2p3{flJ{FKbJN|(fvR68RBLsMNt16>2t5F-OCLjx;Q zQyYCWH3%PqbvqZOCYIzEh2-bw*ac)(q~_#;xC+L4KnT%`tO7|h$RAezMVYC<00sr4 zouQ3Bh8Vhf=ltA)qSWGIkb0og!0M63(A5W}7U$=bf{YK%%Pg@of@(n%M%NXIkhe33 z=|L7m*ARhC1F|5J22ey;fkP_7B{MfQ59}9Xpl7g3plfu_&&e+eE=WvH1%($_3z87J zYOpntxU4~vfNHeS2c>1Cv<=BPU{PSsvEu^9C@dG+afQs86~e&4vR?$}ZP9!G3l^6WfiJ(1^zGAEe42x`cRN6W_pCpS+-P4-4;(6f5s#>I-Jx zcGS5n*S7lt({snGJ9(Qw2=Y1n+n*@&YJtYm&VO8G0+P4Plhb@2nse4We6(L6%@rgc z7#XnW{RKun)5JH7yqhjPywLTQ`37h2CA-HTKF^xh*0ek$zMvxR_&3WZ%iCXu+BL*v zF6KF?KjFSiOpEf;1)Kp5r>q(DmKx+W|EW7<{Uhz)>2Dk{S;tpgSDmk4z_~|iv3p;Y zZEW0ng^KJy_dZ0+etKD-8vDQ9}kQ@FP}_haT{_nm1AxITr=>iBSX$>h&&XLM%m zESom>0^i$q!{ohrg?Vp_T~;$~cVLfad&9ai>x`4~6rZ1U=U*gTVGq0G#dgc~r`DgP z%kyVuUtoydkaj`$FIP#SnwQpu5QUWoR<1l?-x0nmbxHPvI#5yX>FVdQ&MBb@0CQVS A(EtDd literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye70.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye70.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8cc99af388b6bae6b5e357202c28179aadb214 GIT binary patch literal 2384 zcmZ{m2{@bC8pmTNxK*L{5mA&*^2HtzArh*sC1ML5tw@86Y?2_9F5LENOLeL>ia~GG z^0=tdbek4cTDxgtnW|FLsot2@9o=RI*CgoFb@lt6^PO|v_y0TRyze>ZdA^gxz+Kv4 zV=xE=(%$VyAjxW9c~MuDeUlK=f0tDXJkl<2P{V-fzhxZ_j$b4X1k!}aivp;))DQ$x zs-cIH`Q!k9G?mRnP!6(VX$S$6BU6Jw7y(+=WYYK)sDQ~}@z4Sf*op!zYs<|547wuW zCwjoh0YoUC&80z|5l#ps3=4)rp&0JLI5dgiyN1hp9|xpWSn&SpX7<5FVT$$SqOOg_gd?3p9gt{yB-+^p18mTIig1O-b7>Sln;XhzGq6OufW~0TyHH1j z>|JHoE7rmCIM6{{I!%^fc^a|y7~ubG8})cLlf$L)cyhh-ntr`)qnajQILH z1IxcO1MyW6fNMmXK1by%h0UsCv3CFQw>J^iA4BR}CkJ;ld1@U6-%v2)s07|iLX9N< z@_bClK&3Y8{;f?(VA$@HA!=j1)SeiTKxQk9Vmk$;M_VDy3aa?_f9W(n!d#8kgoGTd zAAQC#@Z>G3G~6@isO?w16K?6%I6jNiJmK|-zhs@D*tuh0iFe#Ci{C4)d^IKbzL1fQ zLnb2~G{3IaZnt+8SYo(K4&$zhMoht7pC#T9s00xA52|VRh~O8-pLy)iEWvLxXtSBI%{vA*H zOr`laVI)L7=x27%Uf4dd;gzitvG?~J3G^^{8$LJeS)~;&r&=h*Tg;945ypqyq-ZNkv>X)ZaJgAu6$6FXQ^fH#hYr z+anv}a_ahDTNajX{o;4~e0?iopmng*ER7M=Q5TwLJY(^88+=g}7gaZNYO0coRh>+> zjsg>D9e-6+*3xFuK9TrdgMH7Vhj%sn zK1wfrFS1;84&tRUQ|y&Zz449ZdFm)BJ#3(utm|`NnJdyJsB1{az#TAQ)i~h`o7b6F zUPTMbhEXxx65Njsku9A?@rMU*j`=B&oJ>^$Ni#gHR9FawBV`oIJ z{yctIbNgE}WgK6U-Pb##I$h~x%eq}oC6DYsSraiS6gbJIcdUms`p1%g!7F#{S8Wh%I)-?=D~Nk0~Ig0iihi`ogZa z)%#0&nNnlwo;a!1<=?VPSOUeDI5I92t1P_qyehNHbx6ad+k5e3xU0KaOTcbXb>s{r zCwguw%CN+HOc>J{9O*iw_zr0p%g_p}o6@U1)i}8I0&%3u$aj)^&b8uJc(WSC(yzv~ z0_+6w*domodL1gt$9XiFkvh*!9g4y5O~eo8&0c literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json new file mode 100644 index 0000000..e78fc26 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Heart35.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Heart70.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Heart105.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart105.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart105.png new file mode 100644 index 0000000000000000000000000000000000000000..66653a66c8088e8c57717d5b67b86c94a055965a GIT binary patch literal 3289 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 b-5a(8-P_)N*rUYa`o*QnI_2 zTegstZARL0MV7K8OP1oDk#1gZ{r{iyKj%Ep?|aU9o^#IU^N%$())fF9009610ew9T zmR0Mp3oke8>j!-s&8l`$u)11+l5UAfR)>$QXF~x1`1iBRE56bv$akl`Jah= zDO*vo;)Bs}WSAlp4*MBICAj}s-v3Z+&o41NjqnSM?fHgnCga;0)mRxt7?Iov?!g!w z6^~MaE2=;g;Sjirxe^?q2uB=OR)g)({D^Rq*7nEas3d=L63GW;N}%C=i0m#{8OnOU zvD+2fV0Ih`6Mq7pm0)%nQHpA?|FiAXYm{c4)~jskx7&8=v3Lr}CxAV?g)f1M zQrbdxn0Hb(Kl~`w@62}NPQdzSz;@#{fV~lj%}iNi2t>T^W-O|3HP}xbJ3(!d56S-w z8Rv>;=W7$$X4ATGzg?V7E9>T;-hJ*W(VoP6`1q9pXaIG zm$;%Uo_{9Y@X0|8zof!m?C7XOjf~^$`^vMcOUTBd&+GRxhde@aX2(}hIcvcUJ@a8X zv!!`?#*3h*3Z|v#dJYSxNFb%#S?bFo_t)kI!fM*^i2{yH;NkPQTq#rXfTsAeh!4Oi z(yH12qm-Ujh5FtEphwg}^r`ZwsumKbRAh{^;xhlJR{O|1{70lI9asL_%a^&LmkfYr zH-OcVW$UtXD{GpnSHu=uKiPlWBQNr1=+LSvBjO;h_S(S$m$Zu896sDgbl!_+6pgzk zn3g`jOJ0|_vr2{sWza2lNvUyi%mCS1Kqs*AT<%QRjBrL0cW-0Gxk1|*_1_kFKg?Oo zCAgV{O92k#Y3A&qz-FFCzRy0EKGxHOw9yKEn(cDRj;9wX>{&%aCRT->15Yye4p&Eo zrlMc8{sl$~c*+Ln#Cy)}*~c)g`brtl3N_$}PnXZ(LG|wOl;TWSZ8`=_Ww=u1OzD1w zq6X>FUD+kDRz){N`lN7`*c*_>GsJ$!YlScS1BQJ=4+xarYtR_(85+1gO1IDE931bg z<@PwKZTrdivUee{J|pWaR~UaSW1tTcvR5xPyX}Us?vhE8mwihQtUX9qMG(7A7(Lo+ zNz>5R5Mk;Fm6!0sxW+2^P*a(I_Vw((^+oLd1s9P5eX?*FdiqYR)&4+{g4lY28>I>@ z2s19#6KzE;e>}X3GBvK7LLSQc!;%GN8cy)H2R+I*NGdi6Q7N>r zJ?)Y<{wFTwX~lo|UR>3QF}tHAR)2rhDykVbl9QAxJa)Uxz(O|Y_LJEU@_r`dID`x% zus*FY*=fu_;#0R>(Rqd4N+e*4;>aEhf$rFJET}>f0yLlP0+vs7BOC6s= zAjV;cx{VI8I@IN4P#;6KC|^LKv$b|^#cWXdJGcww;T@yv+!cXRHxip%e&)f3zo`@zMu^MNIQUq}?{QfxWT z;rDvAa8|C^#!ujyW+@D%3RLLKC$#6f-0)M!x-tW=B-dNnzY+gig>=&(By5n&QbIEF z_slyN7ZM#}^y96bQ~H9+pS%S_5tB+DufT-s_OS((vKvZwdz$~v#9P-qm_Q)UkmeFT z_^k+8XL=8xiHHWpEJai9q%L*DL_emHBI8YT)8yU>$B$(k>aGhH%Omw(Lk9^)Cki=~ zb|B>?4@Znd^`_9MgPNRQjPmM%*0_ZS)*=Y*()G{5T~$f)hOz;xwt9JD_h*r781c%3<&?!Cr{3N&a)1ETZxLmJEsPyMH8y)0(uK*w- zyvPXeQ{-lviKlkC@vH5hFRRn9you|H+;==ej|!&Z4`L z)BGEIR-%`1ToqG~)i+u=602*_mZ5ZxgQF3KL(OOX7E%{?L3ej)kN_JK5W2%NQ7uuY zn^Wd@Yk-CgV&U);5@8cFMG?PGa3BO6v~Gs4^vgLHAGbW}Fbm8|Ih-6I{;^H4lyOXe z>UF?m3DOkT2XZ2KJi@Q>BsR~tI}7(VTV=f$F0{&Zj11vIcyq1un12#;qvsI^**}H) Mr;ITrTFz1b1#*ROQ~&?~ literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json new file mode 100644 index 0000000..ca5da25 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Star35.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Star70.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Star105.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star105.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star105.png new file mode 100644 index 0000000000000000000000000000000000000000..54fe294913a62871b484657c613ce25caf747497 GIT binary patch literal 3161 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star70.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star70.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd119bbbdffe15fc4392c12fbb9cac0a982f74e GIT binary patch literal 2554 zcmZ{m3p~^N8^@QD&a^nfk!WkmI%1p4l3^O#O0Hp;9kMak&1RQ2A%BEJS{IyL%O$0i zbtu$vtFSstkYA_+04%Qv z_wwcXx;UeQm<%{2m`SC<1q_y44FK2((DFwHjZ1+D81yI(T3`!ZP@v_{3Nr!S2s1Mixx$1K6UC(nOrkgjAA@|3gQIbR*x@X0I5P^Oh)ba|d0bm4RFUZ4&!>Gd zSpO!9;(V$~ULQh0VIfT6NW|A5Zg|L-?fnm>@O%@a3BtdDDLfysg=T!*qm8_yXcuO1 zct{M6!lhx%kftaTQ=|zJR1Xo zFzHOTCyNq9Q}k;AS!7zOUPwdwR+>eQPoND#@h&fVw?7Wff>k~_7@+(_KTjbBxMKH@ z@ZxU&xHe#HCybwW@&om(S>?Edoal+|+U{vmE#PnDzhMSJbk8H!4--4GWrrA|=*yy^&8eve z_tNjWm~1;Y*|B>5&Y;)G7UEplv-KLac`czYe%+&$W+db@{^o~|2 zr)BE!Qo2v&v^=cV_femX?mPc@KZ)anZFp3j06%c7#SYlL+Tx}~s?WSRE@R3icU>-} zs-?+zW!+<=+#K^1pGMiF#*6iYwO0D`8e5-e#4x`f(rngJ`*|9_6Z0B9wdrdI7|0rrulJrYeXm8NVa(=519tTQxs0k|)T-6Z<2uC#$xd~g_ z@gr#?2{NAFN3#Y4)O0)hx43%O-p3)NpuWGi;)`zFszL2k>F?+ThGg^VpB23EOOBWnYFd<3 z5(|r8g43I<#w?37^e_m&j;`-y>#{7pwoVqV%s$p4#W{4s9NRpAq9LvWdFXe90)}L`n~Jtn}tN-9NyW?1bLP-^%Vkty!H@!gR(C zyq9QN80N&BQ0h}17I`Haj2yiqB{;#ZC1-2Z?i_GA&ex;YW+cCcsg_@X7?r1qPV4F(pjUS5M zErSmA#PvQQHwuiIW8URC-}x`K{6@@1 z>)?7Uo$YokvT;|`#j#C&e%C{2{_10`1FcV~WQe71n0o%ULzShf^Q768+&x)6z04W? nXVxA3;#WI{5}THn@rL(y7@bv@mj36V;t!c4-W4ad4@~+81iv+& literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Base.lproj/InfoPlist.strings b/Stacks/Stacks/Base.lproj/InfoPlist.strings new file mode 100644 index 0000000..5c672cd --- /dev/null +++ b/Stacks/Stacks/Base.lproj/InfoPlist.strings @@ -0,0 +1,15 @@ +/* + InfoPlist.strings + Stacks + + Created by Keith Harrison on 04/10/2015. + Copyright © 2015 Keith Harrison. All rights reserved. +*/ +shortcutTitleFavorites = "Favorites"; +shortcutSubtitleFavorites = "What you like"; + +shortcutTitleFeatured = "Featured"; +shortcutSubtitleFeatured = "What we like"; + +shortcutTitleTopRated = "Top Rated"; +shortcutSubtitleTopRated = "What others like"; diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index 800d60a..423d72d 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -22,16 +22,21 @@ + + + + + @@ -67,32 +72,40 @@ + + + + + + + @@ -126,6 +139,7 @@ + @@ -138,6 +152,7 @@ + @@ -149,9 +164,11 @@ + + @@ -177,6 +194,7 @@ + diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index f98366c..4abafdd 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -44,5 +44,53 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIApplicationShortcutItems + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFavorites + UIApplicationShortcutItemTitle + shortcutTitleFavorites + UIApplicationShortcutItemSubtitle + shortcutSubtitleFavorites + UIApplicationShortcutItemIconFile + StarTemplate + UIApplicationShortcutItemUserInfo + + version + 2 + + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFeatured + UIApplicationShortcutItemTitle + shortcutTitleFeatured + UIApplicationShortcutItemSubtitle + shortcutSubtitleFeatured + UIApplicationShortcutItemIconFile + EyeTemplate + UIApplicationShortcutItemUserInfo + + version + 2 + + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenTopRated + UIApplicationShortcutItemTitle + shortcutTitleTopRated + UIApplicationShortcutItemSubtitle + shortcutSubtitleTopRated + UIApplicationShortcutItemIconFile + HeartTemplate + UIApplicationShortcutItemUserInfo + + version + 2 + + + From 40587f7624b7e9218ebce33d0216064ffe998a8f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 5 Oct 2015 22:51:14 +0100 Subject: [PATCH 042/229] Update Stacks README --- Stacks/README | 8 +++- Stacks/Stacks/Info.plist | 90 ++++++++++++++++++++-------------------- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/Stacks/README b/Stacks/README index bb82643..d4bb551 100644 --- a/Stacks/README +++ b/Stacks/README @@ -1,6 +1,7 @@ ======================================================================= Stacks - Using stack views (requires iOS 9) +Version 1.3 05 Oct 2015 Add static quick actions Version 1.2 27 Sep 2015 Hide a view for compact height Version 1.1 06 July 2015 Adapting axis to view size classes Version 1.0 22 June 2015 Initial version. @@ -20,4 +21,9 @@ The third view controller - HiddenViewController is an example of how to use size classes to hide a view contained in a stack view. See this post for details: -http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html \ No newline at end of file +http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html + +Quick actions allow the user to launch the app directly to one of the three tabs. +See this post for details: + +http://useyourloaf.com/blog/adding-3d-touch-quick-actions.html \ No newline at end of file diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index 4abafdd..52811b9 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -15,82 +15,82 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1 + 1.3 CFBundleSignature ???? CFBundleVersion - 2 + 3 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIApplicationShortcutItems - UIApplicationShortcutItemType - $(PRODUCT_BUNDLE_IDENTIFIER).OpenFavorites - UIApplicationShortcutItemTitle - shortcutTitleFavorites - UIApplicationShortcutItemSubtitle - shortcutSubtitleFavorites UIApplicationShortcutItemIconFile StarTemplate + UIApplicationShortcutItemSubtitle + shortcutSubtitleFavorites + UIApplicationShortcutItemTitle + shortcutTitleFavorites + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFavorites UIApplicationShortcutItemUserInfo version - 2 + 3 - UIApplicationShortcutItemType - $(PRODUCT_BUNDLE_IDENTIFIER).OpenFeatured - UIApplicationShortcutItemTitle - shortcutTitleFeatured - UIApplicationShortcutItemSubtitle - shortcutSubtitleFeatured UIApplicationShortcutItemIconFile EyeTemplate + UIApplicationShortcutItemSubtitle + shortcutSubtitleFeatured + UIApplicationShortcutItemTitle + shortcutTitleFeatured + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFeatured UIApplicationShortcutItemUserInfo version - 2 + 3 - UIApplicationShortcutItemType - $(PRODUCT_BUNDLE_IDENTIFIER).OpenTopRated - UIApplicationShortcutItemTitle - shortcutTitleTopRated - UIApplicationShortcutItemSubtitle - shortcutSubtitleTopRated UIApplicationShortcutItemIconFile HeartTemplate + UIApplicationShortcutItemSubtitle + shortcutSubtitleTopRated + UIApplicationShortcutItemTitle + shortcutTitleTopRated + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenTopRated UIApplicationShortcutItemUserInfo version - 2 + 3 + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + From 4e4cc854b1d093bc8ab2ad54577cd24b3122d13a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 8 Oct 2015 20:45:03 +0100 Subject: [PATCH 043/229] Refactor of country cell interface --- .../WorldFacts/Base.lproj/Main.storyboard | 64 +++++++++++++------ WorldFacts/WorldFacts/CountryCell.h | 6 +- WorldFacts/WorldFacts/CountryCell.m | 31 +++++++++ .../UYLCountryTableViewController.m | 11 +--- 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index 82b98ec..f48669d 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -11,6 +12,7 @@ + @@ -33,90 +35,105 @@ + @@ -221,34 +238,39 @@ + - + - + + @@ -262,6 +284,7 @@ + @@ -289,6 +312,7 @@ + diff --git a/WorldFacts/WorldFacts/CountryCell.h b/WorldFacts/WorldFacts/CountryCell.h index 0c2df0b..d79ed4c 100644 --- a/WorldFacts/WorldFacts/CountryCell.h +++ b/WorldFacts/WorldFacts/CountryCell.h @@ -36,8 +36,8 @@ @interface CountryCell : UITableViewCell -@property (weak, nonatomic) IBOutlet UILabel *countryLabel; -@property (weak, nonatomic) IBOutlet UILabel *capitalLabel; -@property (weak, nonatomic) IBOutlet UILabel *populationLabel; +@property (copy, nonatomic) NSString *name; +@property (copy, nonatomic) NSString *capital; +@property (copy, nonatomic) NSString *population; @end diff --git a/WorldFacts/WorldFacts/CountryCell.m b/WorldFacts/WorldFacts/CountryCell.m index c1f1a38..5d452b1 100644 --- a/WorldFacts/WorldFacts/CountryCell.m +++ b/WorldFacts/WorldFacts/CountryCell.m @@ -34,5 +34,36 @@ #import "CountryCell.h" +@interface CountryCell () +@property (weak, nonatomic) IBOutlet UILabel *countryLabel; +@property (weak, nonatomic) IBOutlet UILabel *capitalLabel; +@property (weak, nonatomic) IBOutlet UILabel *populationLabel; +@end + @implementation CountryCell + +- (void)setName:(NSString *)name { + if (_name != name) { + _name = [name copy]; + _countryLabel.text =_name; + _countryLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + } +} + +- (void)setCapital:(NSString *)capital { + if (_capital != capital) { + _capital = [capital copy]; + _capitalLabel.text =_capital; + _capitalLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + } +} + +- (void)setPopulation:(NSString *)population { + if (_population != population) { + _population = [population copy]; + _populationLabel.text =_capital; + _populationLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + } +} + @end diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.m b/WorldFacts/WorldFacts/UYLCountryTableViewController.m index fc0bd5a..cb9f3dc 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.m @@ -211,16 +211,11 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N country = [self.fetchedResultsController objectAtIndexPath:indexPath]; } - cell.countryLabel.text = country.name; - cell.capitalLabel.text = country.capital; + cell.name = country.name; + cell.capital = country.capital; NSString *population = [self.decimalFormatter stringFromNumber:country.population]; - cell.populationLabel.text = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"PopulationShortLabel", @"Pop:"), population]; - - cell.countryLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; - cell.capitalLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; - cell.populationLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; - + cell.population = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"PopulationShortLabel", @"Pop:"), population]; return cell; } From 01a507ea81ebebd792a6ac344525433723b06b8f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 10 Oct 2015 15:58:29 +0100 Subject: [PATCH 044/229] Add peek and pop --- .../WorldFacts/Base.lproj/Main.storyboard | 34 ++++---- WorldFacts/WorldFacts/CountryCell.m | 2 +- .../UYLCountryTableViewController.m | 80 +++++++++++++++---- 3 files changed, 82 insertions(+), 34 deletions(-) diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index f48669d..231a79f 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -35,98 +35,98 @@ + + + + + + + + + + + + + + + @@ -120,7 +141,7 @@ - + @@ -240,6 +261,25 @@ + + + + + + + + + + + + + + + + + + + @@ -256,6 +296,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/AutoLayout/AutoLayout/LayoutAnchorController.swift b/AutoLayout/AutoLayout/LayoutAnchorController.swift new file mode 100644 index 0000000..9ad2bea --- /dev/null +++ b/AutoLayout/AutoLayout/LayoutAnchorController.swift @@ -0,0 +1,118 @@ +// +// LayoutAnchorController.swift +// AutoLayout +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 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 LayoutAnchorController: UIViewController { + + let stackView = UIStackView() + + override func viewDidLoad() { + super.viewDidLoad() + setupViews() + } + + func setupViews() { + + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.distribution = .EqualSpacing + view.addSubview(stackView) + + stackView.addImageViewForImage("Heart") + stackView.addImageViewForImage("Star") + stackView.addImageViewForImage("Heart") + +// Constraints to pin the stack view to the leading and trailing +// margins of the superview and below the top layout guide. + +// The code below shows three different ways to achieve this: + +// 1. Using the NSLayoutConstraint class method to create +// each individual constraint. The most verbose of the +// three approaches. +// +// NSLayoutConstraint(item: stackView, +// attribute: .Leading, +// relatedBy: .Equal, +// toItem: view, +// attribute: .LeadingMargin, +// multiplier: 1, +// constant: 0).active = true +// +// NSLayoutConstraint(item: stackView, +// attribute: .Trailing, +// relatedBy: .Equal, +// toItem: view, +// attribute: .TrailingMargin, +// multiplier: 1, +// constant: 0).active = true +// +// NSLayoutConstraint(item: stackView, +// attribute: .Top, +// relatedBy: .Equal, +// toItem: topLayoutGuide, +// attribute: .Bottom, +// multiplier: 1, +// constant: 8.0).active = true + +// 2. Using the Visual Format Language to add both constraints +// in one go. Shorter but still not very readable. + +// let views: [String: AnyObject] = +// ["stackView" : stackView, +// "topLayoutGuide" : topLayoutGuide] +// +// let h = NSLayoutConstraint.constraintsWithVisualFormat( +// "|-[stackView]-|", +// options: [], +// metrics: nil, +// views: views) +// NSLayoutConstraint.activateConstraints(h) +// +// let v = NSLayoutConstraint.constraintsWithVisualFormat( +// "V:|[topLayoutGuide]-[stackView]", +// options: [], +// metrics: nil, +// views: views) +// NSLayoutConstraint.activateConstraints(v) + +// 3. Using layout anchors - by far the easiest method but requires +// iOS 9. + + let margins = view.layoutMarginsGuide + + stackView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true + stackView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true + stackView.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor, constant: 8.0).active = true + } +} diff --git a/AutoLayout/README b/AutoLayout/README index 7261693..fd2a564 100644 --- a/AutoLayout/README +++ b/AutoLayout/README @@ -1,15 +1,17 @@ -AutoLayout -========== +### AutoLayout +Version 1.2 22 Feb 2016 Example of using layout anchors Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. Version 1.0 15 Jan 2016 Initial Version -Example of how to use center constraints to proportionally -space views along horizontal or vertical axis. +Auto Layout examples using Interface Builder and in code. -Solution is implemented with Interface Builder, in code and -with a stack view. ++ Proportional spacing using Interface Builder ++ Proportional spacing using code ++ Proportional spacing using a stack view ++ Layout Anchors -See this post for further details: +See the following posts further details: -http://useyourloaf.com/blog/proportional-spacing-with-auto-layout.html \ No newline at end of file ++ [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) ++ [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) \ No newline at end of file From 450b19388d095a6ae769f18da489678b1e293e1b Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Feb 2016 11:41:18 +0000 Subject: [PATCH 063/229] use markdown for README --- AutoLayout/AutoLayout.xcodeproj/project.pbxproj | 4 ++-- AutoLayout/{README => README.md} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename AutoLayout/{README => README.md} (100%) diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index 5f6ff42..e081145 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -34,7 +34,7 @@ 53EDF4091C5D64C0009F91EA /* UIStackView+addView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStackView+addView.swift"; sourceTree = ""; }; 53EDF40B1C5D6641009F91EA /* UIViewController+addView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+addView.swift"; sourceTree = ""; }; 53EDF40E1C5D66AA009F91EA /* UIViewController+Constraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Constraint.swift"; sourceTree = ""; }; - 53EDF4101C5D77A7009F91EA /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 53EDF4101C5D77A7009F91EA /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,7 +51,7 @@ 53D6A5E41C53BF5200A81A14 = { isa = PBXGroup; children = ( - 53EDF4101C5D77A7009F91EA /* README */, + 53EDF4101C5D77A7009F91EA /* README.md */, 53D6A5EF1C53BF5200A81A14 /* AutoLayout */, 53D6A5EE1C53BF5200A81A14 /* Products */, ); diff --git a/AutoLayout/README b/AutoLayout/README.md similarity index 100% rename from AutoLayout/README rename to AutoLayout/README.md From 98ef21bc50729e3c8b49280470976e32f4b0ff74 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Feb 2016 11:44:06 +0000 Subject: [PATCH 064/229] markdown formatting --- AutoLayout/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/AutoLayout/README.md b/AutoLayout/README.md index fd2a564..6b2680b 100644 --- a/AutoLayout/README.md +++ b/AutoLayout/README.md @@ -1,9 +1,5 @@ ### AutoLayout -Version 1.2 22 Feb 2016 Example of using layout anchors -Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. -Version 1.0 15 Jan 2016 Initial Version - Auto Layout examples using Interface Builder and in code. + Proportional spacing using Interface Builder @@ -14,4 +10,10 @@ Auto Layout examples using Interface Builder and in code. See the following posts further details: + [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) -+ [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) \ No newline at end of file ++ [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) + +#### Version History + ++ Version 1.2 22 Feb 2016 Example of using layout anchors ++ Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. ++ Version 1.0 15 Jan 2016 Initial Version \ No newline at end of file From 7cbc84b7f08618ee6c8eafe515eef63e19630612 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 27 Feb 2016 20:27:29 +0000 Subject: [PATCH 065/229] Add Layout Guide example --- .../AutoLayout.xcodeproj/project.pbxproj | 6 + .../Assets.xcassets/Buttons/Contents.json | 6 + .../greenButton.imageset/Contents.json | 23 +++ .../Buttons/greenButton.imageset/green.pdf | Bin 0 -> 12238 bytes .../Buttons/redButton.imageset/Contents.json | 23 +++ .../Buttons/redButton.imageset/red.pdf | Bin 0 -> 12248 bytes .../AutoLayout/Base.lproj/Main.storyboard | 70 +++++++++- .../AutoLayout/LayoutGuideController.swift | 131 ++++++++++++++++++ AutoLayout/README.md | 3 + 9 files changed, 256 insertions(+), 6 deletions(-) create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/green.pdf create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/redButton.imageset/Contents.json create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/redButton.imageset/red.pdf create mode 100644 AutoLayout/AutoLayout/LayoutGuideController.swift diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index e081145..464d35e 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5329F1151C79008300A35954 /* LayoutAnchorController.swift */; }; + 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */; }; 5362E7F81C53F1B200DAA88B /* CenterAlignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */; }; 53D6A5F11C53BF5200A81A14 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */; }; 53D6A5F31C53BF5200A81A14 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */; }; @@ -22,6 +23,7 @@ /* Begin PBXFileReference section */ 5329F1151C79008300A35954 /* LayoutAnchorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutAnchorController.swift; sourceTree = ""; }; + 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutGuideController.swift; sourceTree = ""; }; 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CenterAlignViewController.swift; sourceTree = ""; tabWidth = 4; }; 53D6A5ED1C53BF5200A81A14 /* AutoLayout.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoLayout.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -55,7 +57,9 @@ 53D6A5EF1C53BF5200A81A14 /* AutoLayout */, 53D6A5EE1C53BF5200A81A14 /* Products */, ); + indentWidth = 4; sourceTree = ""; + tabWidth = 4; }; 53D6A5EE1C53BF5200A81A14 /* Products */ = { isa = PBXGroup; @@ -73,6 +77,7 @@ 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */, 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */, 5329F1151C79008300A35954 /* LayoutAnchorController.swift */, + 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */, 53EDF4071C5D5C78009F91EA /* StackViewController.swift */, 53D6A5F61C53BF5200A81A14 /* Main.storyboard */, 53D6A5F91C53BF5200A81A14 /* Assets.xcassets */, @@ -166,6 +171,7 @@ 53EDF40F1C5D66AA009F91EA /* UIViewController+Constraint.swift in Sources */, 53EDF40A1C5D64C1009F91EA /* UIStackView+addView.swift in Sources */, 53D6A5F31C53BF5200A81A14 /* MasterViewController.swift in Sources */, + 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */, 53EDF4081C5D5C78009F91EA /* StackViewController.swift in Sources */, 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */, 53EDF40C1C5D6641009F91EA /* UIViewController+addView.swift in Sources */, diff --git a/AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json new file mode 100644 index 0000000..30dee8d --- /dev/null +++ b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "green.pdf", + "resizing" : { + "mode" : "3-part-horizontal", + "center" : { + "mode" : "stretch", + "width" : 1 + }, + "cap-insets" : { + "right" : 20, + "left" : 20 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/green.pdf b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/green.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b3fa12c24fd4dd1bf4fdc3bbfbe0807c05b03373 GIT binary patch literal 12238 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ð5<+&o`K4sm0qB5^p38KoN&T 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 LEGVd=tqT4hi~a(0 literal 0 HcmV?d00001 diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index 072a09c..c689bb2 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -19,7 +19,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -129,6 +129,27 @@ + + + + + + + + + + + + + + + @@ -137,11 +158,11 @@ - + - + @@ -278,7 +299,7 @@ - + @@ -312,7 +333,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AutoLayout/AutoLayout/LayoutGuideController.swift b/AutoLayout/AutoLayout/LayoutGuideController.swift new file mode 100644 index 0000000..28ce349 --- /dev/null +++ b/AutoLayout/AutoLayout/LayoutGuideController.swift @@ -0,0 +1,131 @@ +// +// LayoutGuideController.swift +// AutoLayout +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 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 LayoutGuideController: UIViewController { + + // Use layout guides as an alternative to spacer views + // The two buttons will be placed between the view margins + // with equal spacing between the buttons and the margins + // so that the width of the three guides is equal. + + // = |+++++++++++************+++++++++++************+++++++++++| = + // = |+ leading +* no *+ middle +* yes *+ trailing+| = + // = |+ guide +* button *+ guide +* button *+ guide +| = + // = |+++++++++++************+++++++++++************+++++++++++| = + + let leadingGuide = UILayoutGuide() + let noButton = UIButton(type: .Custom) + let middleGuide = UILayoutGuide() + let yesButton = UIButton(type: .Custom) + let trailingGuide = UILayoutGuide() + + override func viewDidLoad() { + super.viewDidLoad() + setupViews() + setupConstraints() + } + + private func setupViews() { + + // Configure the buttons and add them to the superview + + noButton.translatesAutoresizingMaskIntoConstraints = false + noButton.setTitle("No", forState: .Normal) + let redImage = UIImage(named: "redButton") + noButton.setBackgroundImage(redImage, forState: .Normal) + noButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + noButton.addTarget(self, action: "noThanks:", forControlEvents: .TouchUpInside) + + yesButton.translatesAutoresizingMaskIntoConstraints = false + yesButton.setTitle("Yes please!", forState: .Normal) + let greenImage = UIImage(named: "greenButton") + yesButton.setBackgroundImage(greenImage, forState: .Normal) + yesButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + yesButton.addTarget(self, action: "yesPlease:", forControlEvents: .TouchUpInside) + + view.addSubview(noButton) + view.addSubview(yesButton) + + // Add the layout guides to the view + // Note that the guides are not part of the + // view hierarchy + + view.addLayoutGuide(leadingGuide) + view.addLayoutGuide(middleGuide) + view.addLayoutGuide(trailingGuide) + } + + private func setupConstraints() { + + // The views are spaced relative to the margings of + // the superview. To space the views relative to the + // edges of the super view replace "margings" with + // "view" in the constraints below + + let margins = view.layoutMarginsGuide + + // leading to trailing constraints + // working from left to right + + margins.leadingAnchor.constraintEqualToAnchor(leadingGuide.leadingAnchor).active = true + leadingGuide.trailingAnchor.constraintEqualToAnchor(noButton.leadingAnchor).active = true + noButton.trailingAnchor.constraintEqualToAnchor(middleGuide.leadingAnchor).active = true + middleGuide.trailingAnchor.constraintEqualToAnchor(yesButton.leadingAnchor).active = true + yesButton.trailingAnchor.constraintEqualToAnchor(trailingGuide.leadingAnchor).active = true + trailingGuide.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true + + // The buttons should have the same width + noButton.widthAnchor.constraintEqualToAnchor(yesButton.widthAnchor).active = true + + // The guides should have the same width + leadingGuide.widthAnchor.constraintEqualToAnchor(middleGuide.widthAnchor).active = true + leadingGuide.widthAnchor.constraintEqualToAnchor(trailingGuide.widthAnchor).active = true + + // Center everything vertically in the super view + leadingGuide.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + middleGuide.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + trailingGuide.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + noButton.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + yesButton.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + } + + func noThanks(sender: UIButton) { + print("No thanks!") + } + + func yesPlease(sender: UIButton) { + print("Yes please!") + } +} diff --git a/AutoLayout/README.md b/AutoLayout/README.md index 6b2680b..453c261 100644 --- a/AutoLayout/README.md +++ b/AutoLayout/README.md @@ -6,14 +6,17 @@ Auto Layout examples using Interface Builder and in code. + Proportional spacing using code + Proportional spacing using a stack view + Layout Anchors ++ Layout Guides as spacer views See the following posts further details: + [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) + [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) ++ [Pain Free Constraints with Layout Anchors](http://useyourloaf.com/blog/pain-free-constraints-with-layout-anchors/) #### Version History ++ Version 1.3 27 Feb 2016 Using layout guides to space views + Version 1.2 22 Feb 2016 Example of using layout anchors + Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. + Version 1.0 15 Jan 2016 Initial Version \ No newline at end of file From 41cc7f5937d6549ea78e5a1d61245c375455eb67 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 7 Mar 2016 20:48:39 +0000 Subject: [PATCH 066/229] Add Buttons project --- Buttons/Buttons.xcodeproj/project.pbxproj | 294 ++++++++++++++++++ Buttons/Buttons/AppDelegate.swift | 41 +++ .../AppIcon.appiconset/Contents.json | 73 +++++ .../Button Images - No Slicing/Contents.json | 6 + .../unslicedBorder.imageset/Contents.json | 12 + .../unslicedBorder.imageset/border.pdf | Bin 0 -> 4065 bytes .../unslicedFill.imageset/Contents.json | 12 + .../unslicedFill.imageset/filled.pdf | Bin 0 -> 4099 bytes .../Button Templates - Sliced/Contents.json | 6 + .../Contents.json | 29 ++ .../slicedBorderTemplate.imageset/border.pdf | Bin 0 -> 4065 bytes .../slicedFillTemplate.imageset/Contents.json | 29 ++ .../slicedFillTemplate.imageset/filled.pdf | Bin 0 -> 4099 bytes Buttons/Buttons/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 27 ++ Buttons/Buttons/Base.lproj/Main.storyboard | 75 +++++ Buttons/Buttons/Info.plist | 47 +++ Buttons/Buttons/ViewController.swift | 68 ++++ 18 files changed, 725 insertions(+) create mode 100644 Buttons/Buttons.xcodeproj/project.pbxproj create mode 100644 Buttons/Buttons/AppDelegate.swift create mode 100644 Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/border.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/filled.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/border.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/filled.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Contents.json create mode 100644 Buttons/Buttons/Base.lproj/LaunchScreen.storyboard create mode 100644 Buttons/Buttons/Base.lproj/Main.storyboard create mode 100644 Buttons/Buttons/Info.plist create mode 100644 Buttons/Buttons/ViewController.swift diff --git a/Buttons/Buttons.xcodeproj/project.pbxproj b/Buttons/Buttons.xcodeproj/project.pbxproj new file mode 100644 index 0000000..468cb69 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.pbxproj @@ -0,0 +1,294 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 5323B0B81C88D97300B183DD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5323B0B71C88D97300B183DD /* AppDelegate.swift */; }; + 5323B0BA1C88D97300B183DD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5323B0B91C88D97300B183DD /* ViewController.swift */; }; + 5323B0BD1C88D97300B183DD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5323B0BB1C88D97300B183DD /* Main.storyboard */; }; + 5323B0BF1C88D97300B183DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5323B0BE1C88D97300B183DD /* Assets.xcassets */; }; + 5323B0C21C88D97300B183DD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5323B0C01C88D97300B183DD /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5323B0B41C88D97300B183DD /* Buttons.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Buttons.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5323B0B71C88D97300B183DD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5323B0B91C88D97300B183DD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 5323B0BC1C88D97300B183DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5323B0BE1C88D97300B183DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5323B0C11C88D97300B183DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5323B0C31C88D97300B183DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5323B0B11C88D97300B183DD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5323B0AB1C88D97300B183DD = { + isa = PBXGroup; + children = ( + 5323B0B61C88D97300B183DD /* Buttons */, + 5323B0B51C88D97300B183DD /* Products */, + ); + sourceTree = ""; + }; + 5323B0B51C88D97300B183DD /* Products */ = { + isa = PBXGroup; + children = ( + 5323B0B41C88D97300B183DD /* Buttons.app */, + ); + name = Products; + sourceTree = ""; + }; + 5323B0B61C88D97300B183DD /* Buttons */ = { + isa = PBXGroup; + children = ( + 5323B0B71C88D97300B183DD /* AppDelegate.swift */, + 5323B0B91C88D97300B183DD /* ViewController.swift */, + 5323B0BB1C88D97300B183DD /* Main.storyboard */, + 5323B0BE1C88D97300B183DD /* Assets.xcassets */, + 5323B0C01C88D97300B183DD /* LaunchScreen.storyboard */, + 5323B0C31C88D97300B183DD /* Info.plist */, + ); + path = Buttons; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5323B0B31C88D97300B183DD /* Buttons */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5323B0C61C88D97300B183DD /* Build configuration list for PBXNativeTarget "Buttons" */; + buildPhases = ( + 5323B0B01C88D97300B183DD /* Sources */, + 5323B0B11C88D97300B183DD /* Frameworks */, + 5323B0B21C88D97300B183DD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Buttons; + productName = Buttons; + productReference = 5323B0B41C88D97300B183DD /* Buttons.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5323B0AC1C88D97300B183DD /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 5323B0B31C88D97300B183DD = { + CreatedOnToolsVersion = 7.2.1; + }; + }; + }; + buildConfigurationList = 5323B0AF1C88D97300B183DD /* Build configuration list for PBXProject "Buttons" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5323B0AB1C88D97300B183DD; + productRefGroup = 5323B0B51C88D97300B183DD /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5323B0B31C88D97300B183DD /* Buttons */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5323B0B21C88D97300B183DD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5323B0C21C88D97300B183DD /* LaunchScreen.storyboard in Resources */, + 5323B0BF1C88D97300B183DD /* Assets.xcassets in Resources */, + 5323B0BD1C88D97300B183DD /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5323B0B01C88D97300B183DD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5323B0BA1C88D97300B183DD /* ViewController.swift in Sources */, + 5323B0B81C88D97300B183DD /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5323B0BB1C88D97300B183DD /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5323B0BC1C88D97300B183DD /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5323B0C01C88D97300B183DD /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5323B0C11C88D97300B183DD /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5323B0C41C88D97300B183DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5323B0C51C88D97300B183DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5323B0C71C88D97300B183DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Buttons/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Buttons; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 5323B0C81C88D97300B183DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Buttons/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Buttons; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5323B0AF1C88D97300B183DD /* Build configuration list for PBXProject "Buttons" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5323B0C41C88D97300B183DD /* Debug */, + 5323B0C51C88D97300B183DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5323B0C61C88D97300B183DD /* Build configuration list for PBXNativeTarget "Buttons" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5323B0C71C88D97300B183DD /* Debug */, + 5323B0C81C88D97300B183DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5323B0AC1C88D97300B183DD /* Project object */; +} diff --git a/Buttons/Buttons/AppDelegate.swift b/Buttons/Buttons/AppDelegate.swift new file mode 100644 index 0000000..8bee4c3 --- /dev/null +++ b/Buttons/Buttons/AppDelegate.swift @@ -0,0 +1,41 @@ +// +// AppDelegate.swift +// Buttons +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 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 + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? +} + diff --git a/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json b/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..eeea76c --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,73 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json new file mode 100644 index 0000000..70fd5a2 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "border.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/border.pdf b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/border.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b798decfeace0654604e327922b1ae9b1d0c7a3 GIT binary patch literal 4065 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json new file mode 100644 index 0000000..3168b55 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "filled.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/filled.pdf b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/filled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bec308024007717309b0677d016f60129eb61f7c GIT binary patch literal 4099 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json new file mode 100644 index 0000000..132fee5 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "border.pdf", + "resizing" : { + "mode" : "9-part", + "center" : { + "mode" : "stretch", + "width" : 1, + "height" : 1 + }, + "cap-insets" : { + "bottom" : 10, + "top" : 10, + "right" : 10, + "left" : 10 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/border.pdf b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/border.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b798decfeace0654604e327922b1ae9b1d0c7a3 GIT binary patch literal 4065 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json new file mode 100644 index 0000000..b2cf9b2 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "filled.pdf", + "resizing" : { + "mode" : "9-part", + "center" : { + "mode" : "stretch", + "width" : 1, + "height" : 1 + }, + "cap-insets" : { + "bottom" : 10, + "top" : 10, + "right" : 10, + "left" : 10 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/filled.pdf b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/filled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bec308024007717309b0677d016f60129eb61f7c GIT binary patch literal 4099 zcmai1cRZEv`!`PEkWsQyo_vgyah7o^`*0FvrEHyrV;ymfNJhrTN>)Z8DKn!e!XYCg zT=lAV>2nS9Ste$}_%>-BwJ&+B>a`+Z;ceO>o;U4Oja;sz*f8K^8AEZ#V}Fglg9 zc;|Iv6Bq$N020;#eDWk9r$=zHBijS=G{^{$(r^yOZ4r z7-z6IV`8j2X9K_inyaptyCWbJpS}@P&6xM%urg|`w#!NgD9;Bo3Geo$Oh0OoEg#P` z;$-`JA|e@;SU%C{u`kWGwvuCsF$o+ZvTVac_#G9p|K7+x^J1^@Fx zv=KcI^vl!#P^1!lkv@d|mZEc)T?v4k0mg3o>qc-P1MnZ|G9tK>Jlt>ucR=9>phMfrJ#(r;({EGBZ>O71KzOgVLWL0xFo1msWzPa=+B zgx2`qbxynKbUvJ1yso z9jj_hPLdeO6f$cUtVX0qRT&JViVtN)fif+V#Xs6*U11?m&grBwjIJE%>|DLA#{l6? zv3WTzk?9l;)8ZAJ4PRhlU`=R5R=aUVt|9Hy8N9RYMj}ArI@oNU-eltFM2qeEe5vso z7J4k9;mpv#-g?xfGLGvI{(xfAO)W-oGv^fh*qK7%nHjU5G5fXJzQIFRjW?BBd^Swx zC8nwA>QU)tgHF>AyxFcqr7#I5nZumy+PSB0DmG`%5<2M7Ci5BUoyNU{iCO>^Y6 z_po8`3qcxG=&-bqlo>StVHR^y^z8DM*vz499pLfVH^k~vIc$O-hWp; z{|4VZt`v9OM|pb@(PA<|KBGTZna>bu*Z!9$^@mt4|gU<-Xi#iIsYI{jGYnjab(KeAWF(zNn zgw)O3otE#Muipi6kZ`~_^f_#F%N9gabEsbF)HEB!*2uT8&n1=NJ{9W@UmHFve~uSQ z6{-;u6fzM?LNv(>rn;oIrjDkLBbv+X&DkG=%ty_~A6r8bQ)XYDvlTCmL}nHi&E&{* zsNCx>P%gyfmYUjSoh@zOXB8)Fp{QPNS#Ip5p|2}vDrZw{IG3qnm{FKuH->*uqPo{=_| znUWSUlQP?7>Rk4@WWC{CW2&PS&aXMtVHj81p4~t8xG+y<(6e^N??kFqNk3oJ*(&NX z=d$RA#0Hc_Im|nZ!nyL6?0KXr*sq&sYGSCOeLiZKMbcODVW&>cV47LGRQsOxEOrk5 zFZ^9H0&X3bhAM>JVrB8NQ8wPLnO!FD6Nk;G)?c3KjUM-GbZ+c_tK7F)v2lz`mn#+> z*_@CQKQ2UNxBfS&_(JT3;_|o^?3}|~j>>VBaFuA4eKnpn1%7g?m`$cl&-MPr-Y?_p zy&L)8yhjpEg@%R!D^v28>>#mw7h9SM@IAM@_A{uqMvJZqt9shY9(puCYef` zm5yjfnMVQH%6uXR_WO!?y5+6B>DLV#p8f!C!=}#c($PZ) zL=FyeZ-wux&l}Y%TC#cSH45sDuL|3U8*e%`9zAchO86EFN(z1y+<{7Jv81 z?7OSh5vzB^-ORQs`TBRgucxBKZi!zrV=r}hG+>7&WV|qZ$uqVzk~-qjcCdA^b>phM zt-P0qU5)4W&~J6}vyPmFAw5Nw@1LIavZ|{b`dTv;;|w^T>ig2B-4;zaFz6C7&}DeX zu%zaqed*j-lg3jG!y$@Hy9KAybEo}IGyS%ug%0nNM6El%V%t7Ne9{;H5H~ew=67MO z|K)P<4CVgv{SB{=o~&LU`X?(FO;fOD)_t#wK3WxyzFfGwP+oOmy5>B_;?hMfVhlc} z43_(da=O?7-JSFK-seD}nA9=KXW#Ofw0F(#dus=s{W}?>nV++$9O4zO_HS7+a4b}J zevbJt^q_${b@y{+t)0J(KWgUGd@L0mg1+BeALG$|qN`UiS201MK02=H;qawq(&opn zn!fuACJo?OPgg-ohmrH2npZ{U(m77{U5@a}pOoCpSbp-_Ji|X7)&7&+$-|4+bE&bOnCbU9RZYy!ESifNxHII5syG;8tx)4o`T8rxU zdARiaOIuV@=Ws}^)b}SVi5&$QSG_hUcG%X&FOD5kDXOOja%+(5Jl>k8Yq1#byw+p)ow;KhxS39J!dwPQl3);pZ|7xQ-i|G6}sBzw^KI24f6CF0#_bKzbG{n`g6w-TcVQ_0WY-^8+1n&965u*0s6*( zDFB7YLTLgEF!aEG$i-sE4Kc5ZY;-GfXMRPK%d+707sPsIH)*->OiP{&~q zr~(8Ip(PEW2vanNKqP7JFU#NWLL@s8fbC#uQiG-+@E$mtc-sz=258bW8<|9#{}e0R zb0WzFMHd6m9f3l^)92uy^Itjeb|ct=Aple!4EetYP>`30%LBH+PYf;(rxld`04_Ti z1Wxz&CkBVf(=z%e27$n6$^0)2hNOk{Ul;;PlV^Woa2S-Poc_ch2&KRMLXm&j!Qt?~ z{KDZ%e`5&9Uw4Be6llHlr(ZY%`CEKsHw@8<;I^%-jfpetBQ_` zEs55yKgK9p!=6Ookpy{|Emi>wQ&fN|!r)j1TO~U|?}^Eq!h9e*ggm)s_GN literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Contents.json b/Buttons/Buttons/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard b/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..90d6157 --- /dev/null +++ b/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Buttons/Buttons/Base.lproj/Main.storyboard b/Buttons/Buttons/Base.lproj/Main.storyboard new file mode 100644 index 0000000..15ac78d --- /dev/null +++ b/Buttons/Buttons/Base.lproj/Main.storyboard @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Buttons/Buttons/Info.plist b/Buttons/Buttons/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/Buttons/Buttons/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Buttons/Buttons/ViewController.swift b/Buttons/Buttons/ViewController.swift new file mode 100644 index 0000000..c3b7cc9 --- /dev/null +++ b/Buttons/Buttons/ViewController.swift @@ -0,0 +1,68 @@ +// +// ViewController.swift +// Buttons +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 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 ViewController: UIViewController { + + @IBOutlet weak var stackView: UIStackView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Create a custom button and set title label style + + let orangeButton = UIButton(type: .Custom) + orangeButton.setTitle("Orange", forState: .Normal) + orangeButton.setTitleColor(.orangeColor(), forState: .Normal) + orangeButton.setTitleColor(.whiteColor(), forState: .Highlighted) + orangeButton.titleLabel?.font = UIFont.systemFontOfSize(14) + orangeButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 8, 8) + + // Get the pre-sliced template images direct from the + // asset catalog for the default and hightlighted states + + let slicedBorderTemplate = UIImage(named: "slicedBorderTemplate") + let slicedFillTemplate = UIImage(named: "slicedFillTemplate") + + orangeButton.setBackgroundImage(slicedBorderTemplate, forState: .Normal) + orangeButton.setBackgroundImage(slicedFillTemplate, forState: .Highlighted) + + // The tintColor controls the colour used by the template images + // Defaults to inherited value + + orangeButton.tintColor = .orangeColor() + + stackView.addArrangedSubview(orangeButton) + } +} \ No newline at end of file From f5e2ca073399c0f04eba8525b9920b6802229c2d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Mar 2016 21:44:15 +0000 Subject: [PATCH 067/229] Add scrolling stack view --- Stacks/README | 29 ---- Stacks/README.md | 47 ++++++ Stacks/Stacks.xcodeproj/project.pbxproj | 12 +- .../AppIcon.appiconset/Contents.json | 6 + .../AppIcon.appiconset/icon-167.png | Bin 0 -> 11276 bytes Stacks/Stacks/Base.lproj/Main.storyboard | 153 +++++++++++++++--- Stacks/Stacks/Info.plist | 4 +- .../Stacks/ScrollingStackViewController.swift | 45 ++++++ 8 files changed, 236 insertions(+), 60 deletions(-) delete mode 100644 Stacks/README create mode 100644 Stacks/README.md create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 Stacks/Stacks/ScrollingStackViewController.swift diff --git a/Stacks/README b/Stacks/README deleted file mode 100644 index d4bb551..0000000 --- a/Stacks/README +++ /dev/null @@ -1,29 +0,0 @@ -======================================================================= -Stacks - Using stack views (requires iOS 9) - -Version 1.3 05 Oct 2015 Add static quick actions -Version 1.2 27 Sep 2015 Hide a view for compact height -Version 1.1 06 July 2015 Adapting axis to view size classes -Version 1.0 22 June 2015 Initial version. -======================================================================= - -Example of how to use UIStackView to simplify layout of horizontal and -vertical arrangements of views. See the following post for details: - -http://useyourloaf.com/blog/easier-autolayout-with-stackviews.html - -Also see this post for details on how to have the stack view automatically -adapt to size class changes: - -http://useyourloaf.com/blog/adapting-stack-views-with-size-classes.html - -The third view controller - HiddenViewController is an example of how to -use size classes to hide a view contained in a stack view. See this post -for details: - -http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html - -Quick actions allow the user to launch the app directly to one of the three tabs. -See this post for details: - -http://useyourloaf.com/blog/adding-3d-touch-quick-actions.html \ No newline at end of file diff --git a/Stacks/README.md b/Stacks/README.md new file mode 100644 index 0000000..1386fb1 --- /dev/null +++ b/Stacks/README.md @@ -0,0 +1,47 @@ +### Stacks + +Examples of using and sometime abusing stack views (requires iOS 9) + +#### Basic Stack View Usage + +Example of how to use UIStackView to simplify layout of horizontal and +vertical arrangements of views. See the following post for details: + ++ [Easier Auto Layout with Stack Views](http://useyourloaf.com/blog/easier-autolayout-with-stackviews/) + +#### Using Stack Views with Size Classes + +Also see this post for details on how to have the stack view automatically +adapt to size class changes: + ++ [Adapting Stack Views with Size Classes](http://useyourloaf.com/blog/adapting-stack-views-with-size-classes/) + +#### Hiding Views in a Stack View + +The third view controller - HiddenViewController is an example of how to +use size classes to hide a view contained in a stack view. See this post +for details: + ++ [Using Size Classes to Hide Stack View Contents](http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents/) + +#### 3D Touch Quick Actions + +Quick actions allow the user to launch the app directly to one of the three tabs. +See this post for details: + ++ [Adding 3D Touch Quick Actions](http://useyourloaf.com/blog/adding-3d-touch-quick-actions/) + +#### Scrolling Stack View + +The ScrollingStackViewController provides an example of how to embed a +stack view in a scroll view. See this post for details: + ++ [Scroll Stack Views](http://useyourloaf.com/blog/scrolling-stack-views/) + +#### Version History + ++ Version 1.4 12 Mar 2016 Add a scrolling stack view ++ Version 1.3 05 Oct 2015 Add static quick actions ++ Version 1.2 27 Sep 2015 Hide a view for compact height ++ Version 1.1 06 July 2015 Adapting axis to view size classes ++ Version 1.0 22 June 2015 Initial version. diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index 2f707eb..fadae18 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; - 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; - 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; }; + 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; }; 53B55B951BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; @@ -19,6 +19,7 @@ 53DA13F81B32184600FEEE79 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */; }; 53DA14031B32184600FEEE79 /* StacksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA14021B32184600FEEE79 /* StacksTests.swift */; }; 53DA140E1B32184600FEEE79 /* StacksUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA140D1B32184600FEEE79 /* StacksUITests.swift */; }; + 53E9DC1B1C90E0FB00C9A89C /* ScrollingStackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,6 +43,7 @@ 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HiddenViewController.swift; sourceTree = ""; }; 53B55B971BC1B89A0071291E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 53BB4E981C94C22D0019483F /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -55,7 +57,7 @@ 53DA14091B32184600FEEE79 /* StacksUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StacksUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA140D1B32184600FEEE79 /* StacksUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StacksUITests.swift; sourceTree = ""; }; 53DA140F1B32184600FEEE79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 53F4745D1B38B6C100560817 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollingStackViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -86,7 +88,7 @@ 53DA13E11B32184500FEEE79 = { isa = PBXGroup; children = ( - 53F4745D1B38B6C100560817 /* README */, + 53BB4E981C94C22D0019483F /* README.md */, 53DA13EC1B32184600FEEE79 /* Stacks */, 53DA14011B32184600FEEE79 /* StacksTests */, 53DA140C1B32184600FEEE79 /* StacksUITests */, @@ -110,6 +112,7 @@ 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */, 53DA13EF1B32184600FEEE79 /* ViewController.swift */, 53DA13F11B32184600FEEE79 /* Main.storyboard */, + 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */, 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */, 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */, 53DA13F41B32184600FEEE79 /* Assets.xcassets */, @@ -271,6 +274,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 53E9DC1B1C90E0FB00C9A89C /* ScrollingStackViewController.swift in Sources */, 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */, 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */, diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json index 056c0aa..adeb159 100644 --- a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -71,6 +71,12 @@ "idiom" : "ipad", "filename" : "icon-76@2x.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", + "scale" : "2x" } ], "info" : { diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-167.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5ec66a8746d77c19afa4db06b0e9e27145e92d GIT binary patch literal 11276 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 - + - + - + @@ -22,28 +22,23 @@ - - - - - - + @@ -72,47 +67,39 @@ - - - - - - - - + @@ -122,6 +109,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -139,7 +245,6 @@ - @@ -152,7 +257,6 @@ - @@ -164,11 +268,9 @@ - - @@ -177,14 +279,14 @@ - + - + @@ -194,13 +296,13 @@ - + @@ -209,6 +311,7 @@ + diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index 52811b9..1f7589c 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3 + 1.4 CFBundleSignature ???? CFBundleVersion - 3 + 4 LSRequiresIPhoneOS UIApplicationShortcutItems diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift new file mode 100644 index 0000000..f8c5fcd --- /dev/null +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -0,0 +1,45 @@ +// +// ScrollingStackViewController.swift +// Stacks +// +// Created by Keith Harrison on 09/03/2016. +// Copyright © 2016 Keith Harrison. All rights reserved. +// + +import UIKit + +class ScrollingStackViewController: UIViewController { + + @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var stackView: UIStackView! + + @IBAction func singleTap(sender: UITapGestureRecognizer) { + let heartImage = UIImage(named: "Heart") + let heartImageView = UIImageView(image: heartImage) + self.stackView.addArrangedSubview(heartImageView) + self.scrollToEnd(heartImageView) + } + + @IBAction func twoFingerTap(sender: UITapGestureRecognizer) { + let starImage = UIImage(named: "Star") + let starImageView = UIImageView(image: starImage) + self.stackView.addArrangedSubview(starImageView) + self.scrollToEnd(starImageView) + } + + @IBAction func threeFingerTap(sender: UITapGestureRecognizer) { + let views = stackView.arrangedSubviews + for entry in views { + stackView.removeArrangedSubview(entry) + entry.removeFromSuperview() + } + } + + private func scrollToEnd(addedView: UIView) { + let contentViewHeight = scrollView.contentSize.height + addedView.bounds.height + stackView.spacing + let offsetY = contentViewHeight - scrollView.bounds.height + if (offsetY > 0) { + scrollView.setContentOffset(CGPoint(x: scrollView.contentOffset.x, y: offsetY), animated: true) + } + } +} From 4d3691707660c6f3d1ce8354d9d6b52c95d1a5cc Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Mar 2016 22:25:54 +0000 Subject: [PATCH 068/229] Removed surplus self --- Stacks/Stacks/ScrollingStackViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift index f8c5fcd..a460be1 100644 --- a/Stacks/Stacks/ScrollingStackViewController.swift +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -16,15 +16,15 @@ class ScrollingStackViewController: UIViewController { @IBAction func singleTap(sender: UITapGestureRecognizer) { let heartImage = UIImage(named: "Heart") let heartImageView = UIImageView(image: heartImage) - self.stackView.addArrangedSubview(heartImageView) - self.scrollToEnd(heartImageView) + stackView.addArrangedSubview(heartImageView) + scrollToEnd(heartImageView) } @IBAction func twoFingerTap(sender: UITapGestureRecognizer) { let starImage = UIImage(named: "Star") let starImageView = UIImageView(image: starImage) - self.stackView.addArrangedSubview(starImageView) - self.scrollToEnd(starImageView) + stackView.addArrangedSubview(starImageView) + scrollToEnd(starImageView) } @IBAction func threeFingerTap(sender: UITapGestureRecognizer) { From 56d8a1d503965b7629b6c105ec13328b324616a7 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Mar 2016 22:27:38 +0000 Subject: [PATCH 069/229] Update copyright --- .../Stacks/ScrollingStackViewController.swift | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift index a460be1..554b609 100644 --- a/Stacks/Stacks/ScrollingStackViewController.swift +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -2,9 +2,34 @@ // ScrollingStackViewController.swift // Stacks // -// Created by Keith Harrison on 09/03/2016. -// Copyright © 2016 Keith Harrison. All rights reserved. +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 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 From 3433bf705747394fe7ea036fcf9cad74732f4fa0 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 13 Mar 2016 20:49:06 +0000 Subject: [PATCH 070/229] Use a content stack view --- Stacks/Stacks/Base.lproj/Main.storyboard | 135 ++++++++++++----------- 1 file changed, 69 insertions(+), 66 deletions(-) diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index 969631f..d119908 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -121,81 +121,84 @@ - - - - - - - - - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + - - - - - - + + + + From 38dc9208231920d8a1f6b436b788a83563a60976 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Mar 2016 11:29:54 +0000 Subject: [PATCH 071/229] Adopt Swift 2.2 selector syntax --- AutoLayout/AutoLayout/LayoutGuideController.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AutoLayout/AutoLayout/LayoutGuideController.swift b/AutoLayout/AutoLayout/LayoutGuideController.swift index 28ce349..caaee87 100644 --- a/AutoLayout/AutoLayout/LayoutGuideController.swift +++ b/AutoLayout/AutoLayout/LayoutGuideController.swift @@ -66,14 +66,16 @@ class LayoutGuideController: UIViewController { let redImage = UIImage(named: "redButton") noButton.setBackgroundImage(redImage, forState: .Normal) noButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) - noButton.addTarget(self, action: "noThanks:", forControlEvents: .TouchUpInside) + let noThanksAction = #selector(LayoutGuideController.noThanks(_:)) + noButton.addTarget(self, action: noThanksAction, forControlEvents: .TouchUpInside) yesButton.translatesAutoresizingMaskIntoConstraints = false yesButton.setTitle("Yes please!", forState: .Normal) let greenImage = UIImage(named: "greenButton") yesButton.setBackgroundImage(greenImage, forState: .Normal) yesButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) - yesButton.addTarget(self, action: "yesPlease:", forControlEvents: .TouchUpInside) + let yesPleaseAction = #selector(LayoutGuideController.yesPlease(_:)) + yesButton.addTarget(self, action: yesPleaseAction, forControlEvents: .TouchUpInside) view.addSubview(noButton) view.addSubview(yesButton) From 14d4ad26732034cecd565861652159125309fe42 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Mar 2016 11:52:12 +0000 Subject: [PATCH 072/229] Updated by Xcode 7.3 --- AutoLayout/AutoLayout/Base.lproj/Main.storyboard | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index c689bb2..88f4933 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + From 94fa50dc8bb59c0ec1b497d1cf95ef205571e4d4 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Mar 2016 13:47:37 +0000 Subject: [PATCH 073/229] Layout Guides --- AutoLayout/AutoLayout/Base.lproj/Main.storyboard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index 88f4933..f7a2421 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -136,7 +136,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -178,7 +221,7 @@ - + @@ -226,7 +269,7 @@ - + @@ -245,7 +288,7 @@ - + @@ -264,7 +307,7 @@ - + @@ -280,7 +323,7 @@ - + @@ -299,7 +342,7 @@ - + @@ -315,7 +358,7 @@ - + @@ -333,7 +376,7 @@ - + @@ -352,7 +395,7 @@ - + @@ -370,11 +413,141 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AutoLayout/AutoLayout/Info.plist b/AutoLayout/AutoLayout/Info.plist index fd1ab7c..3c0e24f 100644 --- a/AutoLayout/AutoLayout/Info.plist +++ b/AutoLayout/AutoLayout/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.4 CFBundleSignature ???? CFBundleVersion - 1 + 4 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/AutoLayout/README.md b/AutoLayout/README.md index 453c261..af9336a 100644 --- a/AutoLayout/README.md +++ b/AutoLayout/README.md @@ -7,15 +7,19 @@ Auto Layout examples using Interface Builder and in code. + Proportional spacing using a stack view + Layout Anchors + Layout Guides as spacer views ++ Adaptive constraints using Interface Builder and code See the following posts further details: + [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) + [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) + [Pain Free Constraints with Layout Anchors](http://useyourloaf.com/blog/pain-free-constraints-with-layout-anchors/) ++ [Goodbye Spacer Views Hello Layout Guides](http://useyourloaf.com/blog/goodbye-spacer-views-hello-layout-guides/) ++ [Adapting AutoLayout Without Interface Builder](http://useyourloaf.com/blog/adapting-auto-layout-without-interface-builder/) #### Version History ++ Version 1.4 28 Mar 2016 Adapting constraints to size classes + Version 1.3 27 Feb 2016 Using layout guides to space views + Version 1.2 22 Feb 2016 Example of using layout anchors + Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. From 4d65e6ffe0163328cedbc85915591b57e51b523e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 4 Apr 2016 21:51:25 +0100 Subject: [PATCH 075/229] Add contentMode playground --- .../Bottom.xcplaygroundpage/Contents.swift | 15 +++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Center.xcplaygroundpage/Contents.swift | 15 +++++++++ .../timeline.xctimeline | 21 ++++++++++++ .../Left.xcplaygroundpage/Contents.swift | 14 ++++++++ .../Left.xcplaygroundpage/timeline.xctimeline | 11 +++++++ .../Redraw.xcplaygroundpage/Contents.swift | 18 +++++++++++ .../timeline.xctimeline | 21 ++++++++++++ .../Right.xcplaygroundpage/Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 30 ++++++++++++++++++ .../timeline.xctimeline | 16 ++++++++++ .../Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 17 ++++++++++ .../timeline.xctimeline | 11 +++++++ .../Pages/Top.xcplaygroundpage/Contents.swift | 15 +++++++++ .../Top.xcplaygroundpage/timeline.xctimeline | 11 +++++++ .../TopLeft.xcplaygroundpage/Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../TopRight.xcplaygroundpage/Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 29 +++++++++++++++++ .../Resources/star100.png | Bin 0 -> 1306 bytes .../Sources/CircleView.swift | 22 +++++++++++++ .../Sources/StarView.swift | 21 ++++++++++++ .../contents.xcplayground | 19 +++++++++++ .../contents.xcworkspacedata | 7 ++++ 32 files changed, 474 insertions(+) create mode 100644 Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Resources/star100.png create mode 100644 Playgrounds/ContentMode.playground/Sources/CircleView.swift create mode 100644 Playgrounds/ContentMode.playground/Sources/StarView.swift create mode 100644 Playgrounds/ContentMode.playground/contents.xcplayground create mode 100644 Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata diff --git a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..24abc4e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift @@ -0,0 +1,15 @@ +import UIKit +import XCPlayground +/*: + ### Bottom + + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Bottom +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..f4e4340 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..1bb2c89 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Bottom Left + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .BottomLeft +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..750a3a3 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..f3442e5 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Bottom Right + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .BottomRight +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..e2347be --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..a7cbc6e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift @@ -0,0 +1,15 @@ +import UIKit +import XCPlayground +/*: + ### Center + + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Center +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..5e04c90 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..4844811 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Left + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Left +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..da653f9 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..8486cfd --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift @@ -0,0 +1,18 @@ +import UIKit +import XCPlayground +/*: + ### Redraw + + Use this mode when you have a custom view that implements drawRect. + + When the bounds of the view change the view will be redrawn by + calling drawRect. + */ +let myView = CircleView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.backgroundColor = .whiteColor() +myView.contentMode = .Redraw +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) \ No newline at end of file diff --git a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..c8b56ae --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..e87045f --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Right + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Right +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..52f2979 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..8788d5e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift @@ -0,0 +1,30 @@ +import UIKit +import XCPlayground +/*: + ### Scale Aspect Fill + `ScaleAspectFill` scales the content to totally fill the view maintaining the aspect ratio. This can result in the content being larger than the bounds of the view. + + */ +let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) +containerView.backgroundColor = .redColor() + +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +containerView.addSubview(myView) +myView.center = CGPoint(x: 200, y: 200) + +myView.starImageView.contentMode = .ScaleAspectFill +/*: + #### clipToBounds + You will most likely want to have the superview set to clip subviews + to bounds to prevent the scaled view from being visible outside the + super view. + + Try changing the following setting to see the difference. + */ +myView.clipsToBounds = true + +containerView +XCPlaygroundPage.currentPage.liveView = containerView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..ec83354 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..daae1d1 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Scale Aspect Fit + + `ScaleAspectFit` scales the content to fit the view but maintains the aspect ratio. Any part of the view bounds that is not filled with content is transparent. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .ScaleAspectFit +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..61b3e15 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..5e6608e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift @@ -0,0 +1,17 @@ +import UIKit +import XCPlayground +/*: + ### Scale To Fill + + This is the default mode. + + The image is stretched in both dimensions to fill the frame. The + aspect ratio of the image is not maintained. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .ScaleToFill +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..07c1389 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..e96706e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift @@ -0,0 +1,15 @@ +import UIKit +import XCPlayground +/*: + ### Top + + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Top +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..0e86698 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..5fdbfd4 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Top Left + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .TopLeft +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..bfa3c3c --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..330506c --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Top Right + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .TopRight +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..5490561 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..04412dc --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift @@ -0,0 +1,29 @@ +/*: + ### UIView contentMode Quick Guide + +The `contentMode` property of UIView allows you to control how to layout a view when the view's bounds change. The system will not, by default, redraw a view each time the bounds change. That would be wasteful. Instead, depending on the content mode, it can scale, stretch or pin the contents to a fixed position. + + There are thirteen different content modes but it is easiest to think of three main groups based on the effect: + + #### Scaling the View (with or without maintaining the aspect ratio) + ++ [Scale To Fill](ScaleToFill) ++ [Scale Aspect Fit](ScaleAspectFit) ++ [Scale Aspect Fill](ScaleAspectFill) + + #### Redrawing the View + ++ [Redraw](Redraw) + + #### Positioning the View + ++ [Center](Center) ++ [Top](Top) ++ [Bottom](Bottom) ++ [Left](Left) ++ [Right](Right) ++ [TopLeft](TopLeft) ++ [TopRight](TopRight) ++ [BottomLeft](BottomLeft) ++ [BottomRight](BottomRight) +*/ diff --git a/Playgrounds/ContentMode.playground/Resources/star100.png b/Playgrounds/ContentMode.playground/Resources/star100.png new file mode 100644 index 0000000000000000000000000000000000000000..4965255dc5c56ab3d62c08ab371db50421bcb727 GIT binary patch literal 1306 zcmV+#1?BpQP)LRY? zN?hBWG1ke`=_CWu_^ahjSlgj4*UZrACj!y=r{qyp+oUYk&-U#B&FCrt(fXz2R8rcf zDb~{U?gGl`Eu!OBPTH#`)z!%8FP`IDOxms_)z|dx1I6evo8w+d+OZ+k+VkxM!{;@a z;$TJDwI9{n^6dq`=Q)((WJ1`u9n{_N?FPK(JQdUBrsPv<-H$ES%?r}-5!2~4*Tq@f zpnl(b>FW;O>KeM|K9%BQao&hc*{mwo(FoD=4$|#;-+-OtT*BuzD=U;$OYyJL2mWvE@gN;cIH$kh$hR-Rc|B=_ak^ONiibW!;qt z((<(CL~GrSujNUq+B3Y*u6N{ z!gt<+=j#yU>=Q88%H!)5E!NK9>lj+xpCZ-SRNJN3>L4D~+)vu78`R$?)zpmPY`5k? zj^Sz()aO6gyW{H=Y21+()8v!kWkJ}vzUDfX;$p$)H%8gCaNdbX*|NpxGjiUCMA^2? z=qpUxtqjudc;12N>kr51FxKiJh2V7V>?_vL@a+dS*TkgbRYTaf#OE~5=qXd$rl{mlR@w@5Sq2yTn&#c)100N## zL_t(|0qxj>dNeoy1<+gF+P3-Iwr$(0ZQEJnm3-mirOOnTeZ~Lkwd*(hAmHY~Tet7ry+>7R!|y+MxOHO;9LPU?>d|BB zvHi)@XU|{2){B?a>J{ucS4e$QyqMims^M1tB$5S6c@`$EfOfJ%lw-O=B1&oTiGVW=J_ec`dDw z^gNZ4+Oi<6IGa))-++SlwUpr70VSQAD6Fd+ih8zFP;@VpU7(;osOzU7AE+CkpyyC` zkAeoFY>1*BLD?`xjX>Ebg}nwFcJQ1d<|d;leh)wJW%hp+C@j*C#zL0e z6%DlX88OLO~Yiti7`v4*m8!=llT$e{x3Z{ysR>^9N^a@`Su&oE8#=5%a6fB!?8Uoa%y#ERwS=H})$2?F+@vwNYd Qm;e9(07*qoM6N<$f-6757XSbN literal 0 HcmV?d00001 diff --git a/Playgrounds/ContentMode.playground/Sources/CircleView.swift b/Playgrounds/ContentMode.playground/Sources/CircleView.swift new file mode 100644 index 0000000..9ca1165 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Sources/CircleView.swift @@ -0,0 +1,22 @@ +import UIKit + +public class CircleView: UIView { + + var lineWidth: CGFloat = 5 { + didSet { setNeedsDisplay() } + } + + var color: UIColor = .redColor() { + didSet { setNeedsDisplay() } + } + + public override func drawRect(rect: CGRect) { + + let circleCenter = convertPoint(center, fromView: superview) + let circleRadius = min(bounds.size.width,bounds.size.height)/2 * 0.80 + let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true) + circlePath.lineWidth = lineWidth + color.set() + circlePath.stroke() + } +} diff --git a/Playgrounds/ContentMode.playground/Sources/StarView.swift b/Playgrounds/ContentMode.playground/Sources/StarView.swift new file mode 100644 index 0000000..d1bc0fe --- /dev/null +++ b/Playgrounds/ContentMode.playground/Sources/StarView.swift @@ -0,0 +1,21 @@ +import UIKit + +public class StarView: UIView { + + public let starImageView: UIImageView + + public override init(frame: CGRect) { + let starImage = UIImage(named: "star100") + starImageView = UIImageView(image: starImage) + + super.init(frame: frame) + addSubview(starImageView) + backgroundColor = .greenColor() + starImageView.frame = bounds + } + + public required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + diff --git a/Playgrounds/ContentMode.playground/contents.xcplayground b/Playgrounds/ContentMode.playground/contents.xcplayground new file mode 100644 index 0000000..e759d69 --- /dev/null +++ b/Playgrounds/ContentMode.playground/contents.xcplayground @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata b/Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5cbf448 --- /dev/null +++ b/Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + From 4b6942f45f69c3fb18ba8408239f92f449b4e595 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 4 Apr 2016 21:58:00 +0100 Subject: [PATCH 076/229] Zip playground files --- Playgrounds/ContentMode.zip | Bin 0 -> 36587 bytes Playgrounds/String.zip | Bin 0 -> 11986 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Playgrounds/ContentMode.zip create mode 100644 Playgrounds/String.zip diff --git a/Playgrounds/ContentMode.zip b/Playgrounds/ContentMode.zip new file mode 100644 index 0000000000000000000000000000000000000000..464fa32bdb5ba5d172567b7e5da8e828571f64de GIT binary patch literal 36587 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 literal 0 HcmV?d00001 diff --git a/Playgrounds/String.zip b/Playgrounds/String.zip new file mode 100644 index 0000000000000000000000000000000000000000..64cb3fcb5cb958a2e6a3d24431bc195f015fc6b2 GIT binary patch literal 11986 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 Date: Mon, 11 Apr 2016 16:53:21 +0100 Subject: [PATCH 077/229] Add example of right-to-left language --- .../AutoLayout.xcodeproj/project.pbxproj | 8 ++ .../AutoLayout/Base.lproj/Main.storyboard | 120 +++++++++++++++--- AutoLayout/AutoLayout/Info.plist | 4 +- AutoLayout/AutoLayout/RTLViewController.swift | 69 ++++++++++ .../AutoLayout/ar.lproj/LaunchScreen.strings | 3 + AutoLayout/AutoLayout/ar.lproj/Main.strings | 78 ++++++++++++ AutoLayout/README.md | 3 + 7 files changed, 266 insertions(+), 19 deletions(-) create mode 100644 AutoLayout/AutoLayout/RTLViewController.swift create mode 100644 AutoLayout/AutoLayout/ar.lproj/LaunchScreen.strings create mode 100644 AutoLayout/AutoLayout/ar.lproj/Main.strings diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index e4e68bd..c2d60e9 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 5319D0191CA6E8C1009E4AFA /* AdaptiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5319D0181CA6E8C1009E4AFA /* AdaptiveViewController.swift */; }; 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5329F1151C79008300A35954 /* LayoutAnchorController.swift */; }; 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */; }; + 535078741CBAD4D400700816 /* RTLViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535078731CBAD4D400700816 /* RTLViewController.swift */; }; 5362E7F81C53F1B200DAA88B /* CenterAlignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */; }; 53D6A5F11C53BF5200A81A14 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */; }; 53D6A5F31C53BF5200A81A14 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */; }; @@ -26,6 +27,9 @@ 5319D0181CA6E8C1009E4AFA /* AdaptiveViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveViewController.swift; sourceTree = ""; }; 5329F1151C79008300A35954 /* LayoutAnchorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutAnchorController.swift; sourceTree = ""; }; 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutGuideController.swift; sourceTree = ""; }; + 535078731CBAD4D400700816 /* RTLViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTLViewController.swift; sourceTree = ""; }; + 535078751CBADA0C00700816 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Main.strings; sourceTree = ""; }; + 535078761CBADA0C00700816 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/LaunchScreen.strings; sourceTree = ""; }; 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CenterAlignViewController.swift; sourceTree = ""; tabWidth = 4; }; 53D6A5ED1C53BF5200A81A14 /* AutoLayout.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoLayout.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -78,6 +82,7 @@ 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */, 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */, 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */, + 535078731CBAD4D400700816 /* RTLViewController.swift */, 5329F1151C79008300A35954 /* LayoutAnchorController.swift */, 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */, 53EDF4071C5D5C78009F91EA /* StackViewController.swift */, @@ -177,6 +182,7 @@ 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */, 5319D0191CA6E8C1009E4AFA /* AdaptiveViewController.swift in Sources */, 53EDF4081C5D5C78009F91EA /* StackViewController.swift in Sources */, + 535078741CBAD4D400700816 /* RTLViewController.swift in Sources */, 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */, 53EDF40C1C5D6641009F91EA /* UIViewController+addView.swift in Sources */, 5362E7F81C53F1B200DAA88B /* CenterAlignViewController.swift in Sources */, @@ -191,6 +197,7 @@ isa = PBXVariantGroup; children = ( 53D6A5F71C53BF5200A81A14 /* Base */, + 535078751CBADA0C00700816 /* ar */, ); name = Main.storyboard; sourceTree = ""; @@ -199,6 +206,7 @@ isa = PBXVariantGroup; children = ( 53D6A5FC1C53BF5200A81A14 /* Base */, + 535078761CBADA0C00700816 /* ar */, ); name = LaunchScreen.storyboard; sourceTree = ""; diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index 456e2a2..64d65bb 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -53,7 +53,7 @@ -