From 065e460c45a376ebc14a3a78cd5756daca54ec93 Mon Sep 17 00:00:00 2001 From: Caio Dias Date: Thu, 16 Jun 2016 16:02:04 -0400 Subject: [PATCH 001/142] Use clickable link I changed your post link text to clickable link. --- AnimatedConstraints/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AnimatedConstraints/README b/AnimatedConstraints/README index f23d42c..e00a98d 100644 --- a/AnimatedConstraints/README +++ b/AnimatedConstraints/README @@ -9,4 +9,4 @@ 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 +[http://useyourloaf.com/blog/animating-autolayout-constraints/](http://useyourloaf.com/blog/animating-autolayout-constraints/) From 0da5d9099acc534221359657e8a86ddc97db9ca5 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 24 Nov 2016 21:27:37 +0000 Subject: [PATCH 002/142] Asset catalog touched by Xcode 8 --- .../AppIcon.appiconset/Contents.json | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/AutoLayout/AutoLayout/Assets.xcassets/AppIcon.appiconset/Contents.json b/AutoLayout/AutoLayout/Assets.xcassets/AppIcon.appiconset/Contents.json index eeea76c..1d060ed 100644 --- a/AutoLayout/AutoLayout/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/AutoLayout/AutoLayout/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", From dcd9761a84605a8620e534e323ad535d0cbd1715 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Nov 2016 22:34:09 +0000 Subject: [PATCH 003/142] Updated Refresh for Xcode 8 This project dated back to iOS 6 so I gave it a bit of a spring clean to remove some old cruft and refactor the view controller code to have a separate data source. The workaround for the storyboard bug that meant the UIRefreshControl action was never called is also no longer needed. --- Refresh/README.md | 48 +------- Refresh/Refresh.xcodeproj/project.pbxproj | 92 +++++++++------ .../Base.lproj/LaunchScreen.storyboard | 50 +++++++++ .../MainStoryboard.storyboard | 86 +++++++------- Refresh/Refresh/DeckDataSource.h | 39 +++++++ Refresh/Refresh/DeckDataSource.m | 96 ++++++++++++++++ Refresh/Refresh/Default-568h@2x.png | Bin 18594 -> 0 bytes Refresh/Refresh/Default.png | Bin 6540 -> 0 bytes Refresh/Refresh/Default@2x.png | Bin 16107 -> 0 bytes .../AppIcon.appiconset/Contents.json | 48 ++++++++ Refresh/Refresh/Refresh-Info.plist | 8 +- Refresh/Refresh/Refresh-Prefix.pch | 14 --- Refresh/Refresh/UYLTableViewController.m | 105 +++++------------- Refresh/Refresh/en.lproj/InfoPlist.strings | 2 - 14 files changed, 377 insertions(+), 211 deletions(-) create mode 100644 Refresh/Refresh/Base.lproj/LaunchScreen.storyboard rename Refresh/Refresh/{en.lproj => Base.lproj}/MainStoryboard.storyboard (51%) create mode 100644 Refresh/Refresh/DeckDataSource.h create mode 100644 Refresh/Refresh/DeckDataSource.m delete mode 100644 Refresh/Refresh/Default-568h@2x.png delete mode 100644 Refresh/Refresh/Default.png delete mode 100644 Refresh/Refresh/Default@2x.png create mode 100644 Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Refresh/Refresh/Refresh-Prefix.pch delete mode 100644 Refresh/Refresh/en.lproj/InfoPlist.strings diff --git a/Refresh/README.md b/Refresh/README.md index cacfa6c..270b6b7 100644 --- a/Refresh/README.md +++ b/Refresh/README.md @@ -1,53 +1,17 @@ ## Refresh - Pull-to-refresh control for a table view controller + Version 1.1 25 Nov 2016 Update for Xcode 8 and general clean-up. Version 1.0 18 June 2013 Initial Version ### Summary This Xcode project demonstrates how to implement the pull-to-refresh -control for table views by adding a UIRefreshControl to the table -view controller. +control for table views by adding a UIRefreshControl to a table +view controller using Interface Builder. -This example project was created with Xcode 4.6.2 and tested on iOS 6.1. - -### Known Bug - -It seems that there is a bug, ([rdar://14178445](http://openradar.appspot.com/14178445)) -that prevents the target-action method from being called when the -UIRefreshControl is added to the table view controller in a storyboard. -As a manual workaround you can add the action to the refresh control in the -viewDidLoad method of the table view controller. +This project uses Objective-C and has been updated for compatibility +with Xcode 8.1. For further details see the following post: -[useyourloaf.com/blog/2013/06/18/uirefreshcontrol-fun-and-games.html](http://useyourloaf.com/blog/2013/06/18/uirefreshcontrol-fun-and-games.html) - -### Small Print - -Created by Keith Harrison http://useyourloaf.com -Copyright (c) 2013 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: - -Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -Neither the name of Keith Harrison nor the names of its contributors -may be used to endorse or promote products derived from this software -without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ [UIRefreshControl Fun and Games](http://useyourloaf.com/blog/uirefreshcontrol-fun-and-games/) diff --git a/Refresh/Refresh.xcodeproj/project.pbxproj b/Refresh/Refresh.xcodeproj/project.pbxproj index 6b0fea0..7f7b858 100644 --- a/Refresh/Refresh.xcodeproj/project.pbxproj +++ b/Refresh/Refresh.xcodeproj/project.pbxproj @@ -3,22 +3,20 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 48; objects = { /* Begin PBXBuildFile section */ 530A6031176F8FBF004F85D9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 530A6030176F8FBF004F85D9 /* UIKit.framework */; }; 530A6033176F8FBF004F85D9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 530A6032176F8FBF004F85D9 /* Foundation.framework */; }; 530A6035176F8FBF004F85D9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 530A6034176F8FBF004F85D9 /* CoreGraphics.framework */; }; - 530A603B176F8FBF004F85D9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 530A6039176F8FBF004F85D9 /* InfoPlist.strings */; }; 530A603D176F8FBF004F85D9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 530A603C176F8FBF004F85D9 /* main.m */; }; 530A6041176F8FBF004F85D9 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 530A6040176F8FBF004F85D9 /* UYLAppDelegate.m */; }; - 530A6043176F8FBF004F85D9 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 530A6042176F8FBF004F85D9 /* Default.png */; }; - 530A6045176F8FBF004F85D9 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 530A6044176F8FBF004F85D9 /* Default@2x.png */; }; - 530A6047176F8FBF004F85D9 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 530A6046176F8FBF004F85D9 /* Default-568h@2x.png */; }; 530A604A176F8FBF004F85D9 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 530A6048176F8FBF004F85D9 /* MainStoryboard.storyboard */; }; 530A6058176F9081004F85D9 /* UYLTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 530A6057176F9081004F85D9 /* UYLTableViewController.m */; }; - 5332463F177104D400BED81A /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 5332463E177104D400BED81A /* README.md */; }; + 53F2D5A21DE8A0CA001851C9 /* DeckDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53F2D5A11DE8A0CA001851C9 /* DeckDataSource.m */; }; + 53F2D5A91DE8D815001851C9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53F2D5AB1DE8D815001851C9 /* LaunchScreen.storyboard */; }; + 53F2D5AD1DE8D86D001851C9 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53F2D5AC1DE8D86D001851C9 /* Images.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -27,18 +25,17 @@ 530A6032176F8FBF004F85D9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 530A6034176F8FBF004F85D9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 530A6038176F8FBF004F85D9 /* Refresh-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Refresh-Info.plist"; sourceTree = ""; }; - 530A603A176F8FBF004F85D9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 530A603C176F8FBF004F85D9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 530A603E176F8FBF004F85D9 /* Refresh-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Refresh-Prefix.pch"; sourceTree = ""; }; 530A603F176F8FBF004F85D9 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 530A6040176F8FBF004F85D9 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; - 530A6042176F8FBF004F85D9 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 530A6044176F8FBF004F85D9 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; - 530A6046176F8FBF004F85D9 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 530A6049176F8FBF004F85D9 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 530A6056176F9081004F85D9 /* UYLTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTableViewController.h; sourceTree = ""; }; 530A6057176F9081004F85D9 /* UYLTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTableViewController.m; sourceTree = ""; }; 5332463E177104D400BED81A /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = ""; }; + 53F2D5A01DE8A0CA001851C9 /* DeckDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeckDataSource.h; sourceTree = ""; }; + 53F2D5A11DE8A0CA001851C9 /* DeckDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeckDataSource.m; sourceTree = ""; }; + 53F2D5A61DE8D715001851C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; + 53F2D5AA1DE8D815001851C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53F2D5AC1DE8D86D001851C9 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -90,7 +87,11 @@ 530A6057176F9081004F85D9 /* UYLTableViewController.m */, 530A603F176F8FBF004F85D9 /* UYLAppDelegate.h */, 530A6040176F8FBF004F85D9 /* UYLAppDelegate.m */, + 53F2D5A01DE8A0CA001851C9 /* DeckDataSource.h */, + 53F2D5A11DE8A0CA001851C9 /* DeckDataSource.m */, 530A6048176F8FBF004F85D9 /* MainStoryboard.storyboard */, + 53F2D5AB1DE8D815001851C9 /* LaunchScreen.storyboard */, + 53F2D5AC1DE8D86D001851C9 /* Images.xcassets */, 530A6037176F8FBF004F85D9 /* Supporting Files */, ); path = Refresh; @@ -100,12 +101,7 @@ isa = PBXGroup; children = ( 530A6038176F8FBF004F85D9 /* Refresh-Info.plist */, - 530A6039176F8FBF004F85D9 /* InfoPlist.strings */, 530A603C176F8FBF004F85D9 /* main.m */, - 530A603E176F8FBF004F85D9 /* Refresh-Prefix.pch */, - 530A6042176F8FBF004F85D9 /* Default.png */, - 530A6044176F8FBF004F85D9 /* Default@2x.png */, - 530A6046176F8FBF004F85D9 /* Default-568h@2x.png */, ); name = "Supporting Files"; sourceTree = ""; @@ -137,15 +133,16 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 530A6028176F8FBF004F85D9 /* Build configuration list for PBXProject "Refresh" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 8.0"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 530A6024176F8FBF004F85D9; productRefGroup = 530A602E176F8FBF004F85D9 /* Products */; @@ -162,12 +159,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 530A603B176F8FBF004F85D9 /* InfoPlist.strings in Resources */, - 530A6043176F8FBF004F85D9 /* Default.png in Resources */, - 530A6045176F8FBF004F85D9 /* Default@2x.png in Resources */, - 530A6047176F8FBF004F85D9 /* Default-568h@2x.png in Resources */, + 53F2D5A91DE8D815001851C9 /* LaunchScreen.storyboard in Resources */, + 53F2D5AD1DE8D86D001851C9 /* Images.xcassets in Resources */, 530A604A176F8FBF004F85D9 /* MainStoryboard.storyboard in Resources */, - 5332463F177104D400BED81A /* README.md in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -179,6 +173,7 @@ buildActionMask = 2147483647; files = ( 530A603D176F8FBF004F85D9 /* main.m in Sources */, + 53F2D5A21DE8A0CA001851C9 /* DeckDataSource.m in Sources */, 530A6041176F8FBF004F85D9 /* UYLAppDelegate.m in Sources */, 530A6058176F9081004F85D9 /* UYLTableViewController.m in Sources */, ); @@ -187,20 +182,20 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 530A6039176F8FBF004F85D9 /* InfoPlist.strings */ = { + 530A6048176F8FBF004F85D9 /* MainStoryboard.storyboard */ = { isa = PBXVariantGroup; children = ( - 530A603A176F8FBF004F85D9 /* en */, + 53F2D5A61DE8D715001851C9 /* Base */, ); - name = InfoPlist.strings; + name = MainStoryboard.storyboard; sourceTree = ""; }; - 530A6048176F8FBF004F85D9 /* MainStoryboard.storyboard */ = { + 53F2D5AB1DE8D815001851C9 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 530A6049176F8FBF004F85D9 /* en */, + 53F2D5AA1DE8D815001851C9 /* Base */, ); - name = MainStoryboard.storyboard; + name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ @@ -213,25 +208,35 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -244,18 +249,27 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -265,9 +279,12 @@ 530A6051176F8FBF004F85D9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Refresh/Refresh-Prefix.pch"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; INFOPLIST_FILE = "Refresh/Refresh-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -276,9 +293,12 @@ 530A6052176F8FBF004F85D9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Refresh/Refresh-Prefix.pch"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; INFOPLIST_FILE = "Refresh/Refresh-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Refresh/Refresh/Base.lproj/LaunchScreen.storyboard b/Refresh/Refresh/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..b3f8cb1 --- /dev/null +++ b/Refresh/Refresh/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Refresh/Refresh/en.lproj/MainStoryboard.storyboard b/Refresh/Refresh/Base.lproj/MainStoryboard.storyboard similarity index 51% rename from Refresh/Refresh/en.lproj/MainStoryboard.storyboard rename to Refresh/Refresh/Base.lproj/MainStoryboard.storyboard index 2c7ad58..c26048a 100644 --- a/Refresh/Refresh/en.lproj/MainStoryboard.storyboard +++ b/Refresh/Refresh/Base.lproj/MainStoryboard.storyboard @@ -1,76 +1,84 @@ - - + + + + + - - - + + + - + - - + + - + - + - - + + - - - + - - - - - + + - - + + - + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + - \ No newline at end of file + diff --git a/Refresh/Refresh/DeckDataSource.h b/Refresh/Refresh/DeckDataSource.h new file mode 100644 index 0000000..bb86685 --- /dev/null +++ b/Refresh/Refresh/DeckDataSource.h @@ -0,0 +1,39 @@ +// +// DeckDataSource.h +// Refresh +// +// 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 + +@interface DeckDataSource : NSObject +- (void)shuffle; +@end diff --git a/Refresh/Refresh/DeckDataSource.m b/Refresh/Refresh/DeckDataSource.m new file mode 100644 index 0000000..7c0eb32 --- /dev/null +++ b/Refresh/Refresh/DeckDataSource.m @@ -0,0 +1,96 @@ +// +// DeckDataSource.m +// Refresh +// +// 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 "DeckDataSource.h" + +@interface DeckDataSource () +@property (nonatomic, strong) NSMutableArray *deck; +@end + +@implementation DeckDataSource + +static const NSUInteger UYL_MAXOBJECTS = 52; + +#pragma mark - +#pragma mark Custom Accessors +#pragma mark - + +- (NSMutableArray *)deck +{ + if (_deck == nil) + { + _deck = [[NSMutableArray alloc] initWithCapacity:UYL_MAXOBJECTS]; + for (NSInteger index = 0; index < UYL_MAXOBJECTS; index++) + { + [_deck insertObject:@(index+1) atIndex:index]; + } + } + return _deck; +} + +#pragma mark - +#pragma mark Public Interface +#pragma mark - + +- (void)shuffle +{ + NSUInteger count = self.deck.count; + + if (count > 1) + { + for (NSUInteger i = count - 1; i > 0; --i) + { + [self.deck exchangeObjectAtIndex:i + withObjectAtIndex:arc4random_uniform((int32_t)(i + 1))]; + } + } +} + +#pragma mark - +#pragma mark UITableViewDataSource +#pragma mark - + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return self.deck.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *CellIdentifier = @"BasicCell"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; + cell.textLabel.text = [NSString stringWithFormat:@"%@", self.deck[indexPath.row]]; + return cell; +} + +@end diff --git a/Refresh/Refresh/Default-568h@2x.png b/Refresh/Refresh/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/Refresh/Refresh/Default.png b/Refresh/Refresh/Default.png deleted file mode 100644 index 4c8ca6f693f96d511e9113c0eb59eec552354e42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6540 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2OMlbkt;o0To@QwR5G2N13aCb6#|O#(=u~X z85k@CTSM>X-wqM6>&y>YB4)1;;ojbLbbV-W^iFB1wa3^zCog^LCAReC4K0-?R_2{6 zrP*)4+_uWUy3w5N52M3PW_}MFMP9a~>YLvVZ1D_k*IMQ2QT^fwzoOb(*3gH$%aYWC zkHmcab=va2<#X%jakpJ;<1@F;k__#bwtC&%^D0v(FBh9K&$sK+<}2RJS609D)17$w ztdQP8(eLM8Ka}m_IQ@3wyMKP)l=oM4-?`YS_*P?4V_ORLPxsj&7Ju#kH;>6^Kp?T7~ zl+q?{UOOqV==?+d{=)5s|M~T1mwtH@+Z^$G&eEO9JNP^AX@3jZ*J*!!>lc|1-W%fA z@AOQpXZ_Lt>rxFXrGp*zLPiW@uo_c7C{As>j zWeX)wi+LTp_)@KYZCX{j;H?|1yXT4DnlS(Fr8gyP5|uaX_gLvaW0ScZdnG7o+u{T6 zFI-%d{ls*WuCDa5UJ@|RXv&ejZe}*BMkiWY51&pnRPw(hlykSzvj6e%mYz-GdvzBD zF10?szF_~!jS=?2HyQuPCvARXAe}C}WP|yQ*>5~~=*Nxq8+HHW1~FMDRCP^TcacKuk$ z(U#REVv)D!PhJ*ecH-ELFUrfyV&*)Z)>UCOuS?yd^L@Afk>ihynYPc{^CRwu+JHX+#$@YsC4c|l0tGigsn@jy) zXD($Ouk>H+V(Mr6NQT0S9BFM~V6nkj;1OBOz`zY;a|<&v%$g$sEJPk;hD4M^`1)8S z=jZArrsOB3>Q&?x097+E*i={nnYpPYi3%0DIeEoa6}C!X6;?ntNLXJ<0j#7X+g2&U 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 diff --git a/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json b/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..b8236c6 --- /dev/null +++ b/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,48 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Refresh/Refresh/Refresh-Info.plist b/Refresh/Refresh/Refresh-Info.plist index faa11bb..b202fa6 100644 --- a/Refresh/Refresh/Refresh-Info.plist +++ b/Refresh/Refresh/Refresh-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -17,13 +17,15 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.1 CFBundleSignature ???? CFBundleVersion - 1.0 + 2 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile MainStoryboard UIRequiredDeviceCapabilities diff --git a/Refresh/Refresh/Refresh-Prefix.pch b/Refresh/Refresh/Refresh-Prefix.pch deleted file mode 100644 index 3a4d89f..0000000 --- a/Refresh/Refresh/Refresh-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'Refresh' target in the 'Refresh' project -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Refresh/Refresh/UYLTableViewController.m b/Refresh/Refresh/UYLTableViewController.m index 1837bda..52bffda 100644 --- a/Refresh/Refresh/UYLTableViewController.m +++ b/Refresh/Refresh/UYLTableViewController.m @@ -2,100 +2,55 @@ // UYLTableViewController.m // Refresh // -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // -// 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. +// 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. // -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. +// 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 HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. #import "UYLTableViewController.h" +#import "DeckDataSource.h" @interface UYLTableViewController () -@property (nonatomic,strong) NSMutableArray *deck; +@property (nonatomic,strong) DeckDataSource *deckDataSource; @end -#define UYL_MAXOBJECTS 52 - @implementation UYLTableViewController - (void)viewDidLoad { [super viewDidLoad]; - - // ************************************************************************ - // With the UIRefreshControl added to the Storyboard the action is never - // received unless we manually set the target-action here. - // - // To reproduce the bug comment the following line. - // ************************************************************************ - - [self.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return [self.deck count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - static NSString *CellIdentifier = @"BasicCell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; - cell.textLabel.text = [NSString stringWithFormat:@"%@", [self.deck objectAtIndex:indexPath.row]]; - return cell; + self.deckDataSource = [DeckDataSource new]; + self.tableView.dataSource = self.deckDataSource; } -- (IBAction)refresh:(id)sender -{ - [self shuffle]; +- (IBAction)refresh:(UIRefreshControl *)sender { + [self.deckDataSource shuffle]; [self.tableView reloadData]; - [self.refreshControl endRefreshing]; -} - -- (void)shuffle -{ - NSInteger count = [self.deck count]; - for (NSInteger i = 0; i < count; i++) - { - NSInteger position = random() % (count - i) + i; - [self.deck exchangeObjectAtIndex:i withObjectAtIndex:position]; - } -} - -- (NSMutableArray *)deck -{ - if (_deck == nil) - { - _deck = [[NSMutableArray alloc] initWithCapacity:UYL_MAXOBJECTS]; - for (NSInteger index = 0; index < UYL_MAXOBJECTS; index++) - { - [_deck insertObject:[NSNumber numberWithInteger:index+1] atIndex:index]; - } - } - return _deck; + [sender endRefreshing]; } @end diff --git a/Refresh/Refresh/en.lproj/InfoPlist.strings b/Refresh/Refresh/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/Refresh/Refresh/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - From 73ec64f23c7bd4458d71ddc9bde03581274902cf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 27 Nov 2016 19:51:47 +0000 Subject: [PATCH 004/142] Added RefreshScroll project --- RefreshScroll/README.md | 9 + .../RefreshScroll.xcodeproj/project.pbxproj | 316 ++++++++++++++++++ .../RefreshScroll/AdaptiveScrollView.swift | 69 ++++ RefreshScroll/RefreshScroll/AppDelegate.swift | 39 +++ .../AppIcon.appiconset/Contents.json | 93 ++++++ .../Blue/BlueSignUp.imageset/BlueSignUp.pdf | Bin 0 -> 23383 bytes .../Blue/BlueSignUp.imageset/Contents.json | 12 + .../BlueSignUp-Selected.pdf | Bin 0 -> 23435 bytes .../BlueSignUpSelected.imageset/Contents.json | 12 + .../Assets.xcassets/Blue/Contents.json | 6 + .../Assets.xcassets/Contents.json | 6 + .../Assets.xcassets/Orange/Contents.json | 6 + .../OrangeSignUp.imageset/Contents.json | 12 + .../OrangeSignUp.imageset/OrangeSignUp.pdf | Bin 0 -> 26198 bytes .../Contents.json | 12 + .../OrangeSignUp-Selected.pdf | Bin 0 -> 26250 bytes .../Base.lproj/LaunchScreen.storyboard | 50 +++ .../RefreshScroll/Base.lproj/Main.storyboard | 125 +++++++ RefreshScroll/RefreshScroll/Info.plist | 46 +++ .../RefreshScroll/SignUpViewController.swift | 70 ++++ 20 files changed, 883 insertions(+) create mode 100644 RefreshScroll/README.md create mode 100644 RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj create mode 100644 RefreshScroll/RefreshScroll/AdaptiveScrollView.swift create mode 100644 RefreshScroll/RefreshScroll/AppDelegate.swift create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/BlueSignUp.pdf create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUpSelected.imageset/BlueSignUp-Selected.pdf create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUpSelected.imageset/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Blue/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Orange/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUp.imageset/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUp.imageset/OrangeSignUp.pdf create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/Contents.json create mode 100644 RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/OrangeSignUp-Selected.pdf create mode 100644 RefreshScroll/RefreshScroll/Base.lproj/LaunchScreen.storyboard create mode 100644 RefreshScroll/RefreshScroll/Base.lproj/Main.storyboard create mode 100644 RefreshScroll/RefreshScroll/Info.plist create mode 100644 RefreshScroll/RefreshScroll/SignUpViewController.swift diff --git a/RefreshScroll/README.md b/RefreshScroll/README.md new file mode 100644 index 0000000..6984663 --- /dev/null +++ b/RefreshScroll/README.md @@ -0,0 +1,9 @@ +An example of adding a refresh control to a scroll view. This uses +the new in iOS 10 refreshControl property of UIScrollView. For +further details see the following post: + ++ [Refresh Control Changes in iOS 10](http://useyourloaf.com/blog/refresh-control-changes-in-ios-10/) + +### Version History + + Version 1.0 27-Nov-2016 Initial Version (Xcode 8, iOS 10) \ No newline at end of file diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1218e37 --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj @@ -0,0 +1,316 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 53C353961DEB6CA700E33073 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C353951DEB6CA700E33073 /* AppDelegate.swift */; }; + 53C3539D1DEB6CA700E33073 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53C3539C1DEB6CA700E33073 /* Assets.xcassets */; }; + 53C353A01DEB6CA700E33073 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53C3539E1DEB6CA700E33073 /* LaunchScreen.storyboard */; }; + 53C353A91DEB6D2200E33073 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53C353AB1DEB6D2200E33073 /* Main.storyboard */; }; + 53C353AE1DEB6DB100E33073 /* AdaptiveScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C353AC1DEB6DB100E33073 /* AdaptiveScrollView.swift */; }; + 53C353AF1DEB6DB100E33073 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C353AD1DEB6DB100E33073 /* SignUpViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53C353921DEB6CA700E33073 /* RefreshScroll.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RefreshScroll.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53C353951DEB6CA700E33073 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53C3539C1DEB6CA700E33073 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53C3539F1DEB6CA700E33073 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53C353A11DEB6CA700E33073 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53C353AA1DEB6D2200E33073 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53C353AC1DEB6DB100E33073 /* AdaptiveScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveScrollView.swift; sourceTree = ""; }; + 53C353AD1DEB6DB100E33073 /* SignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; + 53C353B21DEB707100E33073 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53C3538F1DEB6CA700E33073 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53C353891DEB6CA700E33073 = { + isa = PBXGroup; + children = ( + 53C353B21DEB707100E33073 /* README.md */, + 53C353941DEB6CA700E33073 /* RefreshScroll */, + 53C353931DEB6CA700E33073 /* Products */, + ); + sourceTree = ""; + }; + 53C353931DEB6CA700E33073 /* Products */ = { + isa = PBXGroup; + children = ( + 53C353921DEB6CA700E33073 /* RefreshScroll.app */, + ); + name = Products; + sourceTree = ""; + }; + 53C353941DEB6CA700E33073 /* RefreshScroll */ = { + isa = PBXGroup; + children = ( + 53C353AD1DEB6DB100E33073 /* SignUpViewController.swift */, + 53C353951DEB6CA700E33073 /* AppDelegate.swift */, + 53C353AC1DEB6DB100E33073 /* AdaptiveScrollView.swift */, + 53C3539C1DEB6CA700E33073 /* Assets.xcassets */, + 53C3539E1DEB6CA700E33073 /* LaunchScreen.storyboard */, + 53C353AB1DEB6D2200E33073 /* Main.storyboard */, + 53C353A11DEB6CA700E33073 /* Info.plist */, + ); + path = RefreshScroll; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53C353911DEB6CA700E33073 /* RefreshScroll */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53C353A41DEB6CA700E33073 /* Build configuration list for PBXNativeTarget "RefreshScroll" */; + buildPhases = ( + 53C3538E1DEB6CA700E33073 /* Sources */, + 53C3538F1DEB6CA700E33073 /* Frameworks */, + 53C353901DEB6CA700E33073 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RefreshScroll; + productName = RefreshScroll; + productReference = 53C353921DEB6CA700E33073 /* RefreshScroll.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53C3538A1DEB6CA700E33073 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0810; + LastUpgradeCheck = 0810; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53C353911DEB6CA700E33073 = { + CreatedOnToolsVersion = 8.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 53C3538D1DEB6CA700E33073 /* Build configuration list for PBXProject "RefreshScroll" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53C353891DEB6CA700E33073; + productRefGroup = 53C353931DEB6CA700E33073 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53C353911DEB6CA700E33073 /* RefreshScroll */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53C353901DEB6CA700E33073 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53C353A91DEB6D2200E33073 /* Main.storyboard in Resources */, + 53C353A01DEB6CA700E33073 /* LaunchScreen.storyboard in Resources */, + 53C3539D1DEB6CA700E33073 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53C3538E1DEB6CA700E33073 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53C353AF1DEB6DB100E33073 /* SignUpViewController.swift in Sources */, + 53C353961DEB6CA700E33073 /* AppDelegate.swift in Sources */, + 53C353AE1DEB6DB100E33073 /* AdaptiveScrollView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53C3539E1DEB6CA700E33073 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53C3539F1DEB6CA700E33073 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 53C353AB1DEB6D2200E33073 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53C353AA1DEB6D2200E33073 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53C353A21DEB6CA700E33073 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + 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 = 10.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53C353A31DEB6CA700E33073 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + 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 = 10.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53C353A51DEB6CA700E33073 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RefreshScroll/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RefreshScroll; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 53C353A61DEB6CA700E33073 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RefreshScroll/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RefreshScroll; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53C3538D1DEB6CA700E33073 /* Build configuration list for PBXProject "RefreshScroll" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53C353A21DEB6CA700E33073 /* Debug */, + 53C353A31DEB6CA700E33073 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53C353A41DEB6CA700E33073 /* Build configuration list for PBXNativeTarget "RefreshScroll" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53C353A51DEB6CA700E33073 /* Debug */, + 53C353A61DEB6CA700E33073 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53C3538A1DEB6CA700E33073 /* Project object */; +} diff --git a/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift b/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift new file mode 100644 index 0000000..2230c68 --- /dev/null +++ b/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift @@ -0,0 +1,69 @@ +// +// AdaptiveScrollView.swift +// +// 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 AdaptiveScrollView: UIScrollView { + + private func setup() { + let defaultCenter = NotificationCenter.default + defaultCenter.addObserver(self, + selector: #selector(AdaptiveScrollView.keyboardDidChangeFrame(_:)), + name: NSNotification.Name.UIKeyboardDidChangeFrame, + object: nil) + } + + override init(frame: CGRect) { + super.init(frame: frame) + setup() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setup() + } + + func keyboardDidChangeFrame(_ notification:Notification) { + guard let keyboardFrame = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue else { + return + } + + let keyboardSize = keyboardFrame.cgRectValue.size + let contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0) + adjustContentInsets(contentInsets) + } + + private func adjustContentInsets(_ contentInsets: UIEdgeInsets) { + contentInset = contentInsets + scrollIndicatorInsets = contentInsets + } +} diff --git a/RefreshScroll/RefreshScroll/AppDelegate.swift b/RefreshScroll/RefreshScroll/AppDelegate.swift new file mode 100644 index 0000000..39d6c65 --- /dev/null +++ b/RefreshScroll/RefreshScroll/AppDelegate.swift @@ -0,0 +1,39 @@ +// +// AppDelegate.swift +// RefreshScroll +// +// 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/RefreshScroll/RefreshScroll/Assets.xcassets/AppIcon.appiconset/Contents.json b/RefreshScroll/RefreshScroll/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/RefreshScroll/RefreshScroll/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/BlueSignUp.pdf b/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/BlueSignUp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..66e58de4a47cb4a60405d3b26c59e630655e8b64 GIT binary patch literal 23383 zcmeIabzB_Hwl<1;aF;N+!wl}Ofdtp!PH>k%aCf&5Tmu1udvFbe-~j>zcMEQJAjy6u z``ok7x#xV}{bMuyX1Z5bS5-f2b=9h;Ruz?kxFi#ZnGK1mYxQV#yYM*cQ&$fXI{*l< zHGF}@&ktacGqEvqG6!&gMM?k`Nee3{69@3Gm4TCqxQUUiu?av>5XsTW!NkBC$qn*j zy6gyLuf4?C3BwCI<^s+AU{`V~d`>H$pq@`12OandgpguSur~wmT1FaTRp;5nAURt= zh!suy$%zC6_REQy*V%W;x52lAdUu!U-j_`aH{bP0TX);8*E*-YPtwbUZaSyDZ*L22 z+wO|*wlZfkTQ5$__gilUX83Y_rAb=;6-w(IA(RU^N;o(oP`I>&}$0_LcJi`|F|QXs$8t1^G#q zHAlvCRwvZc*_OSNq9bn7%;fsLH8j%Q3@?!8>4`?23F%}N(LAZ8vG-UAlxq#^aJ2jD zsu2t0FH}NOw;#~*&yeG|owi4MU984<3<6K*PzApubD)FU))CYP+5+GwVgoM1IR^(bPs&Ht_Pv)zxEqua2=Ii8rm9aA!@f-Q%16<9G}p z)NRj;vrmW7LTjU|G0lBUdgo-jidq`@q~<*$QLMvJ_Jn5Ty|qKtI{e~`OmHtc7Y$s6 zs*-#sS?nWh75!lF(q#3* zVwLalrb8xCO%o0Ya&qsDL#_*4@?Djpn7N_R86iab_f0kMvr&rKY9S#tH;h)QmjRT=EP(z6K<|+db?Xt|hr-n6bvWePA1Tm7gjr}BjMvFM3ZY)28yZd6Ri&PDa1 z@9zHkd1Dav&|{@JSwT`^?t*V^F*#S1m9Mnh8QVgz(=7}(5Y^#TVaDYVt6mL<8M!eI z@$&oEhG%e8v`! zbFc(;>F$Y=06XL)bj;%*@SXKA3+AQk$lOREw_=$@v#0s68mpDQddOi<&N5&iMTZd1UAnv4>%)rT56ftbe{~)ha{nM@uY2{OICL zX}8(dXq`|AQE1H|>$oxuLB~$pT4{30^LV<;O}C+0)X0L9oFh?cTi5qaPj`%W&4i!*ZVPRn2{eRX=Hb<7{tzh2PGuaL#1 z`@zp}q#GN$>+1G{#5i3*Z?>A(qQ+yQQ(qH2mx@K7+%EZ!M58zi@>14K(R~l#B{WFD zL4bDs;+x*;_N&*}n|PSirciGzbLWnOSlKY1_dc11Fxnx16{-rD<1~;BNSk!_!z1FK z9g%5we-Xqttse+`Qz=MJ{J~QWGv&sxmj)WmDOw`gMvK($O{CAxae>EFZJH%g<~up?h()xHP9g+rX{zW zIogajzr-i=xzeCPvWfLd?Xhys&oZVXS0=A&(!*N;tbN7DD&?+{{?`AUTM7lcDd=J> zAkSaG*Ri}J`evDWu<;06kv9k;6|;4^w9D)Y50iur3&~s~_ywAI@O+94)LF2-oi0JA z2Qs77QT%JnXh=T1&!Hj4k+n1Dk3Ox;K;vs4rT7DgEY2unF7b(i%RbvK9O@+TP0NmQ z9uk5Oo0e<4wBSLRS!F8by6=53$!!&#*s>WX^NmVw~WV0ncSWRRg2Q8ui zFoxlAjdf+U5i<3oQOs7vQ`>uwkY|X>NA|{Gm`G%3H~WxIZMFz?g>st=g01`5IXnP1 z#+-(cHjx3F6M%s6h3m)wifp@sMjMro>NxhqNY;qdgCghX+|MPyTM(-(bpsd$g%Z!) zYk0+~ykYd@yRC@!qAgKFHT2HjF*b@aQ6`@sS@2Fk#Q3f$u? z2vI(cfX(*+b2JjCSak$}U>MYa0lCc%tVmi6H69U4kxPC^NjfF^G+B~R|h6^GiB{1qrbv>t0vcD`&6dlUV zO)v6MOx59(GzLn^M!Tpw9xXYHd1$9bd^0 z2`f1T4C7WH_jD5LVS}ME%%SNwRC4I$@r!?LA(&0s14UihqK9RcYDl*qVt%9BL)`TA(S#=;p@~k<6XnHh8pd3AE)Cx$35nEKY+9(7YoCA*Vk+( z%By&gkAs_SjihvAE2H1A5Xt@pS3A~1m&XzoMAqk)!q8+(`I;N8X@JNdw^p-?jfB`x z!Qc%-78+T*YMJZ-k|nkR79q4SGWHe9`?kXUEQn?C2PkTB)Ia}ws%cT=;QKgMg<5bMT%B7(DT8L0%13p z<|;ivr<)`UJao$k5X8Y%q7a2o_H)_ZBSZN%)m`*?yk3$ja#BoIS;G}Cy!z0T&_Z!n z-vX!+LO+4(M*)b_uDnQzH&Wtz^bRg(nP`(4hV(_5l$afwr%;Elxd3J%mU{t$5);Il zrQ{kCNRGBM7^!sOh*6tSHP=@hV}>B$CGt0UP`QE5+iX_l%J`f@dwkVuq+wCoLe4mP zxjL0m0*CkUr#3*s6@60$fEp(i^%1k?fZ1(KW95 zQKB;aRT%AVxVhG9Hjws_mw50~#o{eh;FV||0dQWj+tvW33CzMkkBso~t02oGTgO(O0oXDW!5@?G}8*6?K^1L2m zp31KRVPBGX=#4~~*$Sv?EI4RNn9BU9E_&MHJTV%mHn>@AR(nk6k)}pn85%70QMQe- zP2S9k`8l-tS=|_5sZn?rSSb)8h6B`1AWfG7gFMroNaL9&qR7)|3t)u%5O);KaE3jh zrtt%mQNK^hrFJM_1#pb2^3W-vDi*yq)b^qOV6}O^<|4o=x`*seLqoe-?^6$o>9K7L z=N0#r;h{H_dyCXrr&1{$bNM_i2Woth@CpuH{|N@%1dXYsY(|

a!3f++LU?T+zkD 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 literal 0 HcmV?d00001 diff --git a/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/Contents.json b/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/Contents.json new file mode 100644 index 0000000..d89ef4f --- /dev/null +++ b/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUp.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "BlueSignUp.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUpSelected.imageset/BlueSignUp-Selected.pdf b/RefreshScroll/RefreshScroll/Assets.xcassets/Blue/BlueSignUpSelected.imageset/BlueSignUp-Selected.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad882158edeaec3c1c0057e65e01d268d359081b GIT binary patch literal 23435 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 literal 0 HcmV?d00001 diff --git a/RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/Contents.json b/RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/Contents.json new file mode 100644 index 0000000..9856c1b --- /dev/null +++ b/RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "OrangeSignUp-Selected.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/OrangeSignUp-Selected.pdf b/RefreshScroll/RefreshScroll/Assets.xcassets/Orange/OrangeSignUpSelected.imageset/OrangeSignUp-Selected.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b18f2d9ad8796d2f203f8d8ee081db3c9d3afe20 GIT binary patch literal 26250 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 literal 0 HcmV?d00001 diff --git a/RefreshScroll/RefreshScroll/Base.lproj/LaunchScreen.storyboard b/RefreshScroll/RefreshScroll/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..d278eb3 --- /dev/null +++ b/RefreshScroll/RefreshScroll/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RefreshScroll/RefreshScroll/Base.lproj/Main.storyboard b/RefreshScroll/RefreshScroll/Base.lproj/Main.storyboard new file mode 100644 index 0000000..10ee5f7 --- /dev/null +++ b/RefreshScroll/RefreshScroll/Base.lproj/Main.storyboard @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RefreshScroll/RefreshScroll/Info.plist b/RefreshScroll/RefreshScroll/Info.plist new file mode 100644 index 0000000..3e33804 --- /dev/null +++ b/RefreshScroll/RefreshScroll/Info.plist @@ -0,0 +1,46 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/RefreshScroll/RefreshScroll/SignUpViewController.swift b/RefreshScroll/RefreshScroll/SignUpViewController.swift new file mode 100644 index 0000000..339ca23 --- /dev/null +++ b/RefreshScroll/RefreshScroll/SignUpViewController.swift @@ -0,0 +1,70 @@ +// +// SignUpViewController.swift +// +// 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 SignUpViewController: UIViewController { + + @IBOutlet private weak var scrollView: AdaptiveScrollView! + @IBOutlet private weak var orangeLabel: UILabel! + @IBOutlet private weak var orangeButton: UIButton! + + private var orangeAvailable = true { + didSet { + orangeLabel.isHidden = !orangeAvailable + orangeButton.isHidden = !orangeAvailable + } + } + + override func viewDidLoad() { + super.viewDidLoad() + + if #available(iOS 10.0, *) { + scrollView.refreshControl = createRefreshControl() + } + } + + private func createRefreshControl() -> UIRefreshControl { + let refreshControl = UIRefreshControl() + let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh") + refreshControl.attributedTitle = NSAttributedString(string: title) + refreshControl.addTarget(self, + action: #selector(refreshOptions(sender:)), + for: .valueChanged) + return refreshControl + } + + @objc private func refreshOptions(sender: UIRefreshControl) { + orangeAvailable = !orangeAvailable + sender.endRefreshing() + } +} From ea543784e1af8a9c2b3a4ef81b6b1d07667e5e18 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 28 Nov 2016 20:07:37 +0000 Subject: [PATCH 005/142] Implement in viewDidLoad for brevity --- .../RefreshScroll.xcodeproj/project.pbxproj | 16 +++++++ .../Base.lproj/UIRefreshControl.strings | 30 +++++++++++++ .../RefreshScroll/SignUpViewController.swift | 18 +++----- .../RefreshScroll/UIRefreshControl+UYL.swift | 45 +++++++++++++++++++ 4 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 RefreshScroll/RefreshScroll/Base.lproj/UIRefreshControl.strings create mode 100644 RefreshScroll/RefreshScroll/UIRefreshControl+UYL.swift diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj index 1218e37..7b5e766 100644 --- a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 53C353A91DEB6D2200E33073 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53C353AB1DEB6D2200E33073 /* Main.storyboard */; }; 53C353AE1DEB6DB100E33073 /* AdaptiveScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C353AC1DEB6DB100E33073 /* AdaptiveScrollView.swift */; }; 53C353AF1DEB6DB100E33073 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C353AD1DEB6DB100E33073 /* SignUpViewController.swift */; }; + 53C353B51DEB735B00E33073 /* UIRefreshControl+UYL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C353B41DEB735B00E33073 /* UIRefreshControl+UYL.swift */; }; + 53C353B81DEB767F00E33073 /* UIRefreshControl.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53C353BA1DEB767F00E33073 /* UIRefreshControl.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -25,6 +27,8 @@ 53C353AC1DEB6DB100E33073 /* AdaptiveScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveScrollView.swift; sourceTree = ""; }; 53C353AD1DEB6DB100E33073 /* SignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; 53C353B21DEB707100E33073 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53C353B41DEB735B00E33073 /* UIRefreshControl+UYL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIRefreshControl+UYL.swift"; sourceTree = ""; }; + 53C353B91DEB767F00E33073 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/UIRefreshControl.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -61,6 +65,8 @@ 53C353AD1DEB6DB100E33073 /* SignUpViewController.swift */, 53C353951DEB6CA700E33073 /* AppDelegate.swift */, 53C353AC1DEB6DB100E33073 /* AdaptiveScrollView.swift */, + 53C353B41DEB735B00E33073 /* UIRefreshControl+UYL.swift */, + 53C353BA1DEB767F00E33073 /* UIRefreshControl.strings */, 53C3539C1DEB6CA700E33073 /* Assets.xcassets */, 53C3539E1DEB6CA700E33073 /* LaunchScreen.storyboard */, 53C353AB1DEB6D2200E33073 /* Main.storyboard */, @@ -131,6 +137,7 @@ files = ( 53C353A91DEB6D2200E33073 /* Main.storyboard in Resources */, 53C353A01DEB6CA700E33073 /* LaunchScreen.storyboard in Resources */, + 53C353B81DEB767F00E33073 /* UIRefreshControl.strings in Resources */, 53C3539D1DEB6CA700E33073 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -142,6 +149,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 53C353B51DEB735B00E33073 /* UIRefreshControl+UYL.swift in Sources */, 53C353AF1DEB6DB100E33073 /* SignUpViewController.swift in Sources */, 53C353961DEB6CA700E33073 /* AppDelegate.swift in Sources */, 53C353AE1DEB6DB100E33073 /* AdaptiveScrollView.swift in Sources */, @@ -167,6 +175,14 @@ name = Main.storyboard; sourceTree = ""; }; + 53C353BA1DEB767F00E33073 /* UIRefreshControl.strings */ = { + isa = PBXVariantGroup; + children = ( + 53C353B91DEB767F00E33073 /* Base */, + ); + name = UIRefreshControl.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/RefreshScroll/RefreshScroll/Base.lproj/UIRefreshControl.strings b/RefreshScroll/RefreshScroll/Base.lproj/UIRefreshControl.strings new file mode 100644 index 0000000..2f4efdf --- /dev/null +++ b/RefreshScroll/RefreshScroll/Base.lproj/UIRefreshControl.strings @@ -0,0 +1,30 @@ +// 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. + +"PullToRefresh" = "Pull to refresh"; diff --git a/RefreshScroll/RefreshScroll/SignUpViewController.swift b/RefreshScroll/RefreshScroll/SignUpViewController.swift index 339ca23..65c2af1 100644 --- a/RefreshScroll/RefreshScroll/SignUpViewController.swift +++ b/RefreshScroll/RefreshScroll/SignUpViewController.swift @@ -49,20 +49,16 @@ class SignUpViewController: UIViewController { super.viewDidLoad() if #available(iOS 10.0, *) { - scrollView.refreshControl = createRefreshControl() + let refreshControl = UIRefreshControl() + let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh") + refreshControl.attributedTitle = NSAttributedString(string: title) + refreshControl.addTarget(self, + action: #selector(refreshOptions(sender:)), + for: .valueChanged) + scrollView.refreshControl = refreshControl } } - private func createRefreshControl() -> UIRefreshControl { - let refreshControl = UIRefreshControl() - let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh") - refreshControl.attributedTitle = NSAttributedString(string: title) - refreshControl.addTarget(self, - action: #selector(refreshOptions(sender:)), - for: .valueChanged) - return refreshControl - } - @objc private func refreshOptions(sender: UIRefreshControl) { orangeAvailable = !orangeAvailable sender.endRefreshing() diff --git a/RefreshScroll/RefreshScroll/UIRefreshControl+UYL.swift b/RefreshScroll/RefreshScroll/UIRefreshControl+UYL.swift new file mode 100644 index 0000000..349b600 --- /dev/null +++ b/RefreshScroll/RefreshScroll/UIRefreshControl+UYL.swift @@ -0,0 +1,45 @@ +// +// UIRefreshControl+UYL.swift +// +// 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 + +extension UIRefreshControl { + + // Example class factory method with preset title + class func uylDefault(target: Any?, action: Selector) -> UIRefreshControl { + let refreshControl = UIRefreshControl() + let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh") + refreshControl.attributedTitle = NSAttributedString(string: title) + refreshControl.addTarget(target, action: action, for: .valueChanged) + return refreshControl + } +} From d2c4c83404261c743ba9fe6b8284ae515e239836 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 3 Dec 2016 21:42:24 +0000 Subject: [PATCH 006/142] Update Buttons to Xcode 8 and Swift 3 --- Buttons/Buttons.xcodeproj/project.pbxproj | 10 +++++- .../AppIcon.appiconset/Contents.json | 20 +++++++++++ .../Base.lproj/LaunchScreen.storyboard | 14 +++++--- Buttons/Buttons/Base.lproj/Main.storyboard | 34 +++++++++++-------- Buttons/Buttons/ViewController.swift | 18 +++++----- 5 files changed, 66 insertions(+), 30 deletions(-) diff --git a/Buttons/Buttons.xcodeproj/project.pbxproj b/Buttons/Buttons.xcodeproj/project.pbxproj index 468cb69..e1199ac 100644 --- a/Buttons/Buttons.xcodeproj/project.pbxproj +++ b/Buttons/Buttons.xcodeproj/project.pbxproj @@ -91,11 +91,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 5323B0B31C88D97300B183DD = { CreatedOnToolsVersion = 7.2.1; + LastSwiftMigration = 0810; }; }; }; @@ -175,8 +176,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -220,8 +223,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -240,6 +245,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -253,6 +259,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Buttons; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -264,6 +271,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Buttons; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json b/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json index eeea76c..1d060ed 100644 --- a/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", diff --git a/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard b/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard index 90d6157..548dc01 100644 --- a/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard +++ b/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,12 @@ - - + + + + + - + + @@ -14,9 +18,9 @@ - + - + diff --git a/Buttons/Buttons/Base.lproj/Main.storyboard b/Buttons/Buttons/Base.lproj/Main.storyboard index 15ac78d..f5830ed 100644 --- a/Buttons/Buttons/Base.lproj/Main.storyboard +++ b/Buttons/Buttons/Base.lproj/Main.storyboard @@ -1,9 +1,13 @@ - - + + + + + - + + @@ -15,34 +19,34 @@ - + - + @@ -51,7 +55,7 @@ - + @@ -71,5 +75,5 @@ - + diff --git a/Buttons/Buttons/ViewController.swift b/Buttons/Buttons/ViewController.swift index c3b7cc9..bf55080 100644 --- a/Buttons/Buttons/ViewController.swift +++ b/Buttons/Buttons/ViewController.swift @@ -42,11 +42,11 @@ class ViewController: UIViewController { // 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) + let orangeButton = UIButton(type: .custom) + orangeButton.setTitle("Orange", for: UIControlState()) + orangeButton.setTitleColor(.orange, for: UIControlState()) + orangeButton.setTitleColor(.white, for: .highlighted) + orangeButton.titleLabel?.font = UIFont.systemFont(ofSize: 14) orangeButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 8, 8) // Get the pre-sliced template images direct from the @@ -55,14 +55,14 @@ class ViewController: UIViewController { let slicedBorderTemplate = UIImage(named: "slicedBorderTemplate") let slicedFillTemplate = UIImage(named: "slicedFillTemplate") - orangeButton.setBackgroundImage(slicedBorderTemplate, forState: .Normal) - orangeButton.setBackgroundImage(slicedFillTemplate, forState: .Highlighted) + orangeButton.setBackgroundImage(slicedBorderTemplate, for: UIControlState()) + orangeButton.setBackgroundImage(slicedFillTemplate, for: .highlighted) // The tintColor controls the colour used by the template images // Defaults to inherited value - orangeButton.tintColor = .orangeColor() + orangeButton.tintColor = .orange stackView.addArrangedSubview(orangeButton) } -} \ No newline at end of file +} From 7c28c12cc7b42b8c67900ceafe564881d57ff99a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 19 Dec 2016 20:12:19 +0000 Subject: [PATCH 007/142] RemindMe latest Xcode project settings --- RemindMe/RemindMe.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/RemindMe/RemindMe.xcodeproj/project.pbxproj b/RemindMe/RemindMe.xcodeproj/project.pbxproj index b3bbd79..745043b 100755 --- a/RemindMe/RemindMe.xcodeproj/project.pbxproj +++ b/RemindMe/RemindMe.xcodeproj/project.pbxproj @@ -119,7 +119,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 1D6058900D05DD3D006BFB54 = { @@ -242,7 +242,9 @@ CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -272,7 +274,9 @@ CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; From e8a4fe7a257a93f9d85eb572cd1072087f03e689 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 28 Dec 2016 10:33:15 +0000 Subject: [PATCH 008/142] WorldFacts update to recommended settings --- WorldFacts/WorldFacts.xcodeproj/project.pbxproj | 11 ++++++++++- WorldFacts/WorldFacts/WorldFacts-Info.plist | 2 +- WorldFacts/WorldFactsBuilder/Info.plist | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 801835d..e702d71 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -236,7 +236,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0630; + LastUpgradeCheck = 0820; TargetAttributes = { 531D960C1AB62FEF00913A78 = { CreatedOnToolsVersion = 6.2; @@ -366,6 +366,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -388,6 +389,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -404,14 +406,17 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -447,8 +452,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -480,6 +487,7 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; @@ -493,6 +501,7 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; diff --git a/WorldFacts/WorldFacts/WorldFacts-Info.plist b/WorldFacts/WorldFacts/WorldFacts-Info.plist index 721523f..ed2248e 100644 --- a/WorldFacts/WorldFacts/WorldFacts-Info.plist +++ b/WorldFacts/WorldFacts/WorldFacts-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/WorldFacts/WorldFactsBuilder/Info.plist b/WorldFacts/WorldFactsBuilder/Info.plist index cdc67a1..cb0cc0d 100644 --- a/WorldFacts/WorldFactsBuilder/Info.plist +++ b/WorldFacts/WorldFactsBuilder/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile CFBundleIdentifier - com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 0912d908f4483a5d30b4bdee6783644fe9f320c1 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 27 Feb 2017 16:26:21 +0000 Subject: [PATCH 009/142] Added Container View Project --- .../Container.xcodeproj/project.pbxproj | 523 ++++++++++++++++++ .../Container-SB/Container/AppDelegate.swift | 39 ++ .../AppIcon.appiconset/Contents.json | 93 ++++ .../Base.lproj/LaunchScreen.storyboard | 27 + .../Container/Base.lproj/Main.storyboard | 175 ++++++ .../Container/ConfigurableCell.swift | 38 ++ Container/Container-SB/Container/Info.plist | 45 ++ .../Container-SB/Container/Location.swift | 96 ++++ .../Container-SB/Container/LocationCell.swift | 56 ++ .../Container/LocationDataSource.swift | 88 +++ .../LocationTableViewController.swift | 63 +++ .../Container/MapViewController.swift | 92 +++ .../Container/MapViewDelegate.swift | 56 ++ .../Container/MasterViewController.swift | 63 +++ .../Container/ReusableIdentifier.swift | 43 ++ .../Container-SB/Container/locations.plist | 247 +++++++++ .../Container-SB/ContainerTests/Info.plist | 22 + .../ContainerTests/LocationTests.swift | 105 ++++ Container/Container-SB/README.md | 6 + .../Container.xcodeproj/project.pbxproj | 523 ++++++++++++++++++ .../Container/AppDelegate.swift | 39 ++ .../AppIcon.appiconset/Contents.json | 93 ++++ .../Base.lproj/LaunchScreen.storyboard | 27 + .../Container/Base.lproj/Main.storyboard | 149 +++++ .../Container/ConfigurableCell.swift | 38 ++ Container/Container-code/Container/Info.plist | 45 ++ .../Container-code/Container/Location.swift | 96 ++++ .../Container/LocationCell.swift | 56 ++ .../Container/LocationDataSource.swift | 88 +++ .../LocationTableViewController.swift | 63 +++ .../Container/MapViewController.swift | 92 +++ .../Container/MapViewDelegate.swift | 56 ++ .../Container/MasterViewController.swift | 110 ++++ .../Container/ReusableIdentifier.swift | 43 ++ .../Container-code/Container/locations.plist | 247 +++++++++ .../Container-code/ContainerTests/Info.plist | 22 + .../ContainerTests/LocationTests.swift | 105 ++++ Container/Container-code/README.md | 6 + Container/README.md | 14 + 39 files changed, 3789 insertions(+) create mode 100644 Container/Container-SB/Container.xcodeproj/project.pbxproj create mode 100644 Container/Container-SB/Container/AppDelegate.swift create mode 100644 Container/Container-SB/Container/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Container/Container-SB/Container/Base.lproj/LaunchScreen.storyboard create mode 100644 Container/Container-SB/Container/Base.lproj/Main.storyboard create mode 100644 Container/Container-SB/Container/ConfigurableCell.swift create mode 100644 Container/Container-SB/Container/Info.plist create mode 100644 Container/Container-SB/Container/Location.swift create mode 100644 Container/Container-SB/Container/LocationCell.swift create mode 100644 Container/Container-SB/Container/LocationDataSource.swift create mode 100644 Container/Container-SB/Container/LocationTableViewController.swift create mode 100644 Container/Container-SB/Container/MapViewController.swift create mode 100644 Container/Container-SB/Container/MapViewDelegate.swift create mode 100644 Container/Container-SB/Container/MasterViewController.swift create mode 100644 Container/Container-SB/Container/ReusableIdentifier.swift create mode 100644 Container/Container-SB/Container/locations.plist create mode 100644 Container/Container-SB/ContainerTests/Info.plist create mode 100644 Container/Container-SB/ContainerTests/LocationTests.swift create mode 100644 Container/Container-SB/README.md create mode 100644 Container/Container-code/Container.xcodeproj/project.pbxproj create mode 100644 Container/Container-code/Container/AppDelegate.swift create mode 100644 Container/Container-code/Container/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Container/Container-code/Container/Base.lproj/LaunchScreen.storyboard create mode 100644 Container/Container-code/Container/Base.lproj/Main.storyboard create mode 100644 Container/Container-code/Container/ConfigurableCell.swift create mode 100644 Container/Container-code/Container/Info.plist create mode 100644 Container/Container-code/Container/Location.swift create mode 100644 Container/Container-code/Container/LocationCell.swift create mode 100644 Container/Container-code/Container/LocationDataSource.swift create mode 100644 Container/Container-code/Container/LocationTableViewController.swift create mode 100644 Container/Container-code/Container/MapViewController.swift create mode 100644 Container/Container-code/Container/MapViewDelegate.swift create mode 100644 Container/Container-code/Container/MasterViewController.swift create mode 100644 Container/Container-code/Container/ReusableIdentifier.swift create mode 100644 Container/Container-code/Container/locations.plist create mode 100644 Container/Container-code/ContainerTests/Info.plist create mode 100644 Container/Container-code/ContainerTests/LocationTests.swift create mode 100644 Container/Container-code/README.md create mode 100644 Container/README.md diff --git a/Container/Container-SB/Container.xcodeproj/project.pbxproj b/Container/Container-SB/Container.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d74b533 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.pbxproj @@ -0,0 +1,523 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 534452FA1E61BA1F00649AF9 /* LocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534452F91E61BA1F00649AF9 /* LocationTests.swift */; }; + 534452FE1E61DF6200649AF9 /* locations.plist in Resources */ = {isa = PBXBuildFile; fileRef = 534452FD1E61DF6100649AF9 /* locations.plist */; }; + 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534453061E621BDE00649AF9 /* MapViewDelegate.swift */; }; + 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B24B1E608B79001744C8 /* AppDelegate.swift */; }; + 5367B2511E608B79001744C8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5367B24F1E608B79001744C8 /* Main.storyboard */; }; + 5367B2531E608B79001744C8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5367B2521E608B79001744C8 /* Assets.xcassets */; }; + 5367B2561E608B79001744C8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5367B2541E608B79001744C8 /* LaunchScreen.storyboard */; }; + 5367B25E1E608BE4001744C8 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B25D1E608BE4001744C8 /* MasterViewController.swift */; }; + 5367B2601E60A129001744C8 /* LocationTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B25F1E60A129001744C8 /* LocationTableViewController.swift */; }; + 5367B2621E60A140001744C8 /* LocationDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2611E60A140001744C8 /* LocationDataSource.swift */; }; + 5367B2641E60A1A9001744C8 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2631E60A1A9001744C8 /* MapViewController.swift */; }; + 5367B2691E60A3C3001744C8 /* LocationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2681E60A3C3001744C8 /* LocationCell.swift */; }; + 5367B26B1E60A5C6001744C8 /* ReusableIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B26A1E60A5C6001744C8 /* ReusableIdentifier.swift */; }; + 5367B26E1E60A641001744C8 /* ConfigurableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B26D1E60A641001744C8 /* ConfigurableCell.swift */; }; + 5367B2721E60A694001744C8 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2711E60A694001744C8 /* Location.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 534452F41E61B9E600649AF9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5367B2401E608B79001744C8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5367B2471E608B79001744C8; + remoteInfo = Container; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 534452EF1E61B9E600649AF9 /* ContainerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ContainerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 534452F31E61B9E600649AF9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 534452F91E61BA1F00649AF9 /* LocationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationTests.swift; sourceTree = ""; }; + 534452FD1E61DF6100649AF9 /* locations.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = locations.plist; sourceTree = ""; }; + 534452FF1E6216A100649AF9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; + 534453061E621BDE00649AF9 /* MapViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewDelegate.swift; sourceTree = ""; }; + 5367B2481E608B79001744C8 /* Container.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Container.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5367B24B1E608B79001744C8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5367B2501E608B79001744C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5367B2521E608B79001744C8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5367B2551E608B79001744C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5367B2571E608B79001744C8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5367B25D1E608BE4001744C8 /* MasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; }; + 5367B25F1E60A129001744C8 /* LocationTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationTableViewController.swift; sourceTree = ""; }; + 5367B2611E60A140001744C8 /* LocationDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationDataSource.swift; sourceTree = ""; }; + 5367B2631E60A1A9001744C8 /* MapViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = ""; }; + 5367B2661E60A29E001744C8 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + 5367B2681E60A3C3001744C8 /* LocationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationCell.swift; sourceTree = ""; }; + 5367B26A1E60A5C6001744C8 /* ReusableIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReusableIdentifier.swift; sourceTree = ""; }; + 5367B26D1E60A641001744C8 /* ConfigurableCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurableCell.swift; sourceTree = ""; }; + 5367B2711E60A694001744C8 /* Location.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 534452EC1E61B9E600649AF9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5367B2451E608B79001744C8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 534452F01E61B9E600649AF9 /* ContainerTests */ = { + isa = PBXGroup; + children = ( + 534452F91E61BA1F00649AF9 /* LocationTests.swift */, + 534452F31E61B9E600649AF9 /* Info.plist */, + ); + path = ContainerTests; + sourceTree = ""; + }; + 534453011E6217D600649AF9 /* Controllers */ = { + isa = PBXGroup; + children = ( + 5367B25D1E608BE4001744C8 /* MasterViewController.swift */, + 5367B2631E60A1A9001744C8 /* MapViewController.swift */, + 5367B25F1E60A129001744C8 /* LocationTableViewController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; + 534453021E6217E300649AF9 /* Delegates and DataSources */ = { + isa = PBXGroup; + children = ( + 5367B24B1E608B79001744C8 /* AppDelegate.swift */, + 5367B2611E60A140001744C8 /* LocationDataSource.swift */, + 534453061E621BDE00649AF9 /* MapViewDelegate.swift */, + ); + name = "Delegates and DataSources"; + sourceTree = ""; + }; + 534453031E6217F800649AF9 /* Model */ = { + isa = PBXGroup; + children = ( + 534452FD1E61DF6100649AF9 /* locations.plist */, + 5367B2711E60A694001744C8 /* Location.swift */, + ); + name = Model; + sourceTree = ""; + }; + 534453041E62181D00649AF9 /* Views */ = { + isa = PBXGroup; + children = ( + 5367B2681E60A3C3001744C8 /* LocationCell.swift */, + 5367B24F1E608B79001744C8 /* Main.storyboard */, + 5367B2521E608B79001744C8 /* Assets.xcassets */, + 5367B2541E608B79001744C8 /* LaunchScreen.storyboard */, + ); + name = Views; + sourceTree = ""; + }; + 534453051E62182900649AF9 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 5367B2571E608B79001744C8 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 5367B23F1E608B79001744C8 = { + isa = PBXGroup; + children = ( + 534452FF1E6216A100649AF9 /* README.md */, + 5367B24A1E608B79001744C8 /* Container */, + 534452F01E61B9E600649AF9 /* ContainerTests */, + 5367B2491E608B79001744C8 /* Products */, + 5367B2651E60A29E001744C8 /* Frameworks */, + ); + sourceTree = ""; + }; + 5367B2491E608B79001744C8 /* Products */ = { + isa = PBXGroup; + children = ( + 5367B2481E608B79001744C8 /* Container.app */, + 534452EF1E61B9E600649AF9 /* ContainerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 5367B24A1E608B79001744C8 /* Container */ = { + isa = PBXGroup; + children = ( + 5367B26C1E60A5F0001744C8 /* Protocols and Extensions */, + 534453031E6217F800649AF9 /* Model */, + 534453011E6217D600649AF9 /* Controllers */, + 534453021E6217E300649AF9 /* Delegates and DataSources */, + 534453041E62181D00649AF9 /* Views */, + 534453051E62182900649AF9 /* Supporting Files */, + ); + path = Container; + sourceTree = ""; + }; + 5367B2651E60A29E001744C8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5367B2661E60A29E001744C8 /* MapKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5367B26C1E60A5F0001744C8 /* Protocols and Extensions */ = { + isa = PBXGroup; + children = ( + 5367B26D1E60A641001744C8 /* ConfigurableCell.swift */, + 5367B26A1E60A5C6001744C8 /* ReusableIdentifier.swift */, + ); + name = "Protocols and Extensions"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 534452EE1E61B9E600649AF9 /* ContainerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 534452F61E61B9E600649AF9 /* Build configuration list for PBXNativeTarget "ContainerTests" */; + buildPhases = ( + 534452EB1E61B9E600649AF9 /* Sources */, + 534452EC1E61B9E600649AF9 /* Frameworks */, + 534452ED1E61B9E600649AF9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 534452F51E61B9E600649AF9 /* PBXTargetDependency */, + ); + name = ContainerTests; + productName = ContainerTests; + productReference = 534452EF1E61B9E600649AF9 /* ContainerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 5367B2471E608B79001744C8 /* Container */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5367B25A1E608B79001744C8 /* Build configuration list for PBXNativeTarget "Container" */; + buildPhases = ( + 5367B2441E608B79001744C8 /* Sources */, + 5367B2451E608B79001744C8 /* Frameworks */, + 5367B2461E608B79001744C8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Container; + productName = Container; + productReference = 5367B2481E608B79001744C8 /* Container.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5367B2401E608B79001744C8 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 534452EE1E61B9E600649AF9 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + TestTargetID = 5367B2471E608B79001744C8; + }; + 5367B2471E608B79001744C8 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 5367B2431E608B79001744C8 /* Build configuration list for PBXProject "Container" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5367B23F1E608B79001744C8; + productRefGroup = 5367B2491E608B79001744C8 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5367B2471E608B79001744C8 /* Container */, + 534452EE1E61B9E600649AF9 /* ContainerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 534452ED1E61B9E600649AF9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5367B2461E608B79001744C8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5367B2561E608B79001744C8 /* LaunchScreen.storyboard in Resources */, + 534452FE1E61DF6200649AF9 /* locations.plist in Resources */, + 5367B2531E608B79001744C8 /* Assets.xcassets in Resources */, + 5367B2511E608B79001744C8 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 534452EB1E61B9E600649AF9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 534452FA1E61BA1F00649AF9 /* LocationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5367B2441E608B79001744C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5367B26B1E60A5C6001744C8 /* ReusableIdentifier.swift in Sources */, + 5367B2691E60A3C3001744C8 /* LocationCell.swift in Sources */, + 5367B26E1E60A641001744C8 /* ConfigurableCell.swift in Sources */, + 5367B25E1E608BE4001744C8 /* MasterViewController.swift in Sources */, + 5367B2721E60A694001744C8 /* Location.swift in Sources */, + 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */, + 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */, + 5367B2601E60A129001744C8 /* LocationTableViewController.swift in Sources */, + 5367B2641E60A1A9001744C8 /* MapViewController.swift in Sources */, + 5367B2621E60A140001744C8 /* LocationDataSource.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 534452F51E61B9E600649AF9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5367B2471E608B79001744C8 /* Container */; + targetProxy = 534452F41E61B9E600649AF9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 5367B24F1E608B79001744C8 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5367B2501E608B79001744C8 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5367B2541E608B79001744C8 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5367B2551E608B79001744C8 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 534452F71E61B9E600649AF9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ContainerTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ContainerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Container.app/Container"; + }; + name = Debug; + }; + 534452F81E61B9E600649AF9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ContainerTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ContainerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Container.app/Container"; + }; + name = Release; + }; + 5367B2581E608B79001744C8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5367B2591E608B79001744C8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5367B25B1E608B79001744C8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Container/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Container; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 5367B25C1E608B79001744C8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Container/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Container; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 534452F61E61B9E600649AF9 /* Build configuration list for PBXNativeTarget "ContainerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 534452F71E61B9E600649AF9 /* Debug */, + 534452F81E61B9E600649AF9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5367B2431E608B79001744C8 /* Build configuration list for PBXProject "Container" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5367B2581E608B79001744C8 /* Debug */, + 5367B2591E608B79001744C8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5367B25A1E608B79001744C8 /* Build configuration list for PBXNativeTarget "Container" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5367B25B1E608B79001744C8 /* Debug */, + 5367B25C1E608B79001744C8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5367B2401E608B79001744C8 /* Project object */; +} diff --git a/Container/Container-SB/Container/AppDelegate.swift b/Container/Container-SB/Container/AppDelegate.swift new file mode 100644 index 0000000..1e60a63 --- /dev/null +++ b/Container/Container-SB/Container/AppDelegate.swift @@ -0,0 +1,39 @@ +// +// AppDelegate.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/Container/Container-SB/Container/Assets.xcassets/AppIcon.appiconset/Contents.json b/Container/Container-SB/Container/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/Container/Container-SB/Container/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/Container/Container-SB/Container/Base.lproj/LaunchScreen.storyboard b/Container/Container-SB/Container/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/Container/Container-SB/Container/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Container/Container-SB/Container/Base.lproj/Main.storyboard b/Container/Container-SB/Container/Base.lproj/Main.storyboard new file mode 100644 index 0000000..3aac46b --- /dev/null +++ b/Container/Container-SB/Container/Base.lproj/Main.storyboard @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Container/Container-SB/Container/ConfigurableCell.swift b/Container/Container-SB/Container/ConfigurableCell.swift new file mode 100644 index 0000000..eced6d5 --- /dev/null +++ b/Container/Container-SB/Container/ConfigurableCell.swift @@ -0,0 +1,38 @@ +// +// ConfigurableCell.swift +// +// 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 Foundation + +protocol ConfigurableCell { + associatedtype Object + func configure(object: Object) +} diff --git a/Container/Container-SB/Container/Info.plist b/Container/Container-SB/Container/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/Container/Container-SB/Container/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Container/Container-SB/Container/Location.swift b/Container/Container-SB/Container/Location.swift new file mode 100644 index 0000000..d65003c --- /dev/null +++ b/Container/Container-SB/Container/Location.swift @@ -0,0 +1,96 @@ +// +// Location.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import CoreLocation + +/// A structure representing the location of a point on +/// the map. + +struct Location { + + /// The name of the location. + + let name: String + + /// The latitude of the location in degrees. + + let latitude: CLLocationDegrees + + /// The longitude of the location in degrees. + + let longitude: CLLocationDegrees + + /// A read-only `CLLocationCoordinate2D` value for the + /// geographic coordinate of the location. + + var coordinate: CLLocationCoordinate2D { + return CLLocationCoordinate2DMake(latitude, longitude) + } +} + +extension Location { + + /// A failable initializer that builds a `Location` from + /// a dictionary of String keys and values. The dictionary + /// must contain at least "name", "latitude" and "longitude" + /// items. + /// + /// The values must all be `String` and the `latitude` + /// and `longitude` must convert to a `CLLocationDegrees` + /// value (Double) and specify a valid coordinate. A valid + /// latitude is from -90 to +90 and a valid longitude is + /// from -180 to +180. + /// + /// - Parameter dictionary: A dictionary containing the + /// details to initialize the location. + /// + /// - Returns: A `Location` structure or `nil` if the + /// dictionary was invalid, + + init?(dictionary: Dictionary) { + guard let name = dictionary["name"], + let latitudeItem = dictionary["latitude"], + let latitude = CLLocationDegrees(latitudeItem), + let longitudeItem = dictionary["longitude"], + let longitude = CLLocationDegrees(longitudeItem) else { + return nil + } + + self.name = name + self.latitude = latitude + self.longitude = longitude + if !CLLocationCoordinate2DIsValid(coordinate) { + return nil + } + } +} diff --git a/Container/Container-SB/Container/LocationCell.swift b/Container/Container-SB/Container/LocationCell.swift new file mode 100644 index 0000000..8fdb057 --- /dev/null +++ b/Container/Container-SB/Container/LocationCell.swift @@ -0,0 +1,56 @@ +// +// LocationCell.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class LocationCell: UITableViewCell, ReusableIdentifier { + + @IBOutlet fileprivate weak var name: UILabel! + @IBOutlet fileprivate weak var coordinates: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + if #available(iOS 10.0, *) { + name.adjustsFontForContentSizeCategory = true + coordinates.adjustsFontForContentSizeCategory = true + } + } +} + +extension LocationCell: ConfigurableCell { + func configure(object: Location) { + name.text = object.name + coordinates.text = String("\(object.latitude) \(object.longitude)") + } +} diff --git a/Container/Container-SB/Container/LocationDataSource.swift b/Container/Container-SB/Container/LocationDataSource.swift new file mode 100644 index 0000000..7df4a4c --- /dev/null +++ b/Container/Container-SB/Container/LocationDataSource.swift @@ -0,0 +1,88 @@ +// +// LocationDataSource.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class LocationDataSource: NSObject { + + fileprivate let tableView: UITableView + fileprivate var locations = [Location]() + + init(tableView: UITableView, from path: String) { + self.tableView = tableView + super.init() + readFromPlist(name: path) + tableView.dataSource = self + tableView.reloadData() + } + + func locationAtIndexPath(_ indexPath: IndexPath) -> Location? { + return indexPath.row < locations.count ? locations[indexPath.row] : nil + } + + private func readFromPlist(name: String) { + guard let items = NSArray(contentsOfFile: name) as? [Dictionary] else { + return + } + for item in items { + if let location = Location(dictionary: item) { + locations.append(location) + } + } + } +} + +extension LocationDataSource: UITableViewDataSource { + + func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return locations.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: LocationCell.reuseIdentifier, for: indexPath) + configure(cell: cell, indexPath: indexPath) + return cell + } + + private func configure(cell: UITableViewCell, indexPath: IndexPath) { + if let cell = cell as? LocationCell { + let object = locations[indexPath.row] + cell.configure(object: object) + } + } +} + diff --git a/Container/Container-SB/Container/LocationTableViewController.swift b/Container/Container-SB/Container/LocationTableViewController.swift new file mode 100644 index 0000000..304d82d --- /dev/null +++ b/Container/Container-SB/Container/LocationTableViewController.swift @@ -0,0 +1,63 @@ +// +// LocationTableViewController.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +protocol LocationProviderDelegate: class { + func didSelectLocation(_ location: Location) +} + +class LocationTableViewController: UITableViewController { + + weak var delegate:LocationProviderDelegate? + + private var locationDataSource: LocationDataSource? + + override func viewDidLoad() { + super.viewDidLoad() + tableView.rowHeight = UITableViewAutomaticDimension + tableView.estimatedRowHeight = 64.0 + tableView.delegate = self + + if let plistPath = Bundle.main.path(forResource: "locations", ofType: "plist") { + locationDataSource = LocationDataSource(tableView: tableView, from: plistPath) + tableView.dataSource = locationDataSource + } + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if let location = locationDataSource?.locationAtIndexPath(indexPath) { + delegate?.didSelectLocation(location) + } + } +} diff --git a/Container/Container-SB/Container/MapViewController.swift b/Container/Container-SB/Container/MapViewController.swift new file mode 100644 index 0000000..182c0a3 --- /dev/null +++ b/Container/Container-SB/Container/MapViewController.swift @@ -0,0 +1,92 @@ +// +// MapViewController.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit +import MapKit + +class MapViewController: UIViewController { + + @IBOutlet private weak var mapView: MKMapView! + + /// The zoom level to use when setting the span + /// of the map region to show. Default is 10 degrees. + + var zoom: CLLocationDegrees = 10.0 + + /// The coordinate to center the map on. Setting a new + /// coordinate centers the map on a region spanned by + /// the `zoom` level and drops a pin annotation at the + /// coordinate. + + var coordinate: CLLocationCoordinate2D? { + didSet { + if let coordinate = coordinate { + centerMap(coordinate) + annotate(coordinate) + } + } + } + + private func centerMap(_ coordinate: CLLocationCoordinate2D) { + let span = MKCoordinateSpanMake(zoom, zoom) + let region = MKCoordinateRegion(center: coordinate, span: span) + mapView.setRegion(region, animated: true) + } + + private func annotate(_ coordinate: CLLocationCoordinate2D) { + let annotation = MKPointAnnotation() + annotation.coordinate = coordinate + mapView.addAnnotation(annotation) + } +} + +extension MapViewController: MKMapViewDelegate { + + private enum AnnotationView: String { + case pin = "Pin" + } + + func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { + guard let annotation = annotation as? MKPointAnnotation else { + return nil + } + + let identifier = AnnotationView.pin.rawValue + guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView else { + return MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) + } + + annotationView.annotation = annotation + return annotationView + } +} diff --git a/Container/Container-SB/Container/MapViewDelegate.swift b/Container/Container-SB/Container/MapViewDelegate.swift new file mode 100644 index 0000000..87a4623 --- /dev/null +++ b/Container/Container-SB/Container/MapViewDelegate.swift @@ -0,0 +1,56 @@ +// +// MapViewDelegate.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit +import MapKit + +class MapViewDelegate: NSObject, MKMapViewDelegate { + + private enum AnnotationView: String { + case pin = "Pin" + } + + func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { + guard let annotation = annotation as? MKPointAnnotation else { + return nil + } + + let identifier = AnnotationView.pin.rawValue + guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView else { + return MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) + } + + annotationView.annotation = annotation + return annotationView + } +} diff --git a/Container/Container-SB/Container/MasterViewController.swift b/Container/Container-SB/Container/MasterViewController.swift new file mode 100644 index 0000000..e6e49cb --- /dev/null +++ b/Container/Container-SB/Container/MasterViewController.swift @@ -0,0 +1,63 @@ +// +// MasterViewController.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class MasterViewController: UIViewController { + + fileprivate var locationTableViewController: LocationTableViewController? + fileprivate var mapViewController: MapViewController? + + override func viewDidLoad() { + super.viewDidLoad() + + guard let locationController = childViewControllers.first as? LocationTableViewController else { + fatalError("Check storyboard for missing LocationTableViewController") + } + + guard let mapController = childViewControllers.last as? MapViewController else { + fatalError("Check storyboard for missing MapViewController") + } + + locationTableViewController = locationController + mapViewController = mapController + locationController.delegate = self + } +} + +extension MasterViewController: LocationProviderDelegate { + + func didSelectLocation(_ location: Location) { + mapViewController?.coordinate = location.coordinate + } +} diff --git a/Container/Container-SB/Container/ReusableIdentifier.swift b/Container/Container-SB/Container/ReusableIdentifier.swift new file mode 100644 index 0000000..893e7f4 --- /dev/null +++ b/Container/Container-SB/Container/ReusableIdentifier.swift @@ -0,0 +1,43 @@ +// +// ReusableIdentifier.swift +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016-2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +protocol ReusableIdentifier: class { + static var reuseIdentifier: String { get } +} + +extension ReusableIdentifier { + static var reuseIdentifier: String { + return "\(self)" + } +} diff --git a/Container/Container-SB/Container/locations.plist b/Container/Container-SB/Container/locations.plist new file mode 100644 index 0000000..1d4ad3c --- /dev/null +++ b/Container/Container-SB/Container/locations.plist @@ -0,0 +1,247 @@ +( +{name="Afghanistan";latitude="33.93911";longitude="67.709953";}, +{name="Albania";latitude="41.153332";longitude="20.168331";}, +{name="Algeria";latitude="28.033886";longitude="1.659626";}, +{name="American Samoa";latitude="-14.270972";longitude="-170.132217";}, +{name="Andorra";latitude="42.546245";longitude="1.601554";}, +{name="Angola";latitude="-11.202692";longitude="17.873887";}, +{name="Anguilla";latitude="18.220554";longitude="-63.068615";}, +{name="Antarctica";latitude="-75.250973";longitude="-0.071389";}, +{name="Antigua and Barbuda";latitude="17.060816";longitude="-61.796428";}, +{name="Argentina";latitude="-38.416097";longitude="-63.616672";}, +{name="Armenia";latitude="40.069099";longitude="45.038189";}, +{name="Aruba";latitude="12.52111";longitude="-69.968338";}, +{name="Australia";latitude="-25.274398";longitude="133.775136";}, +{name="Austria";latitude="47.516231";longitude="14.550072";}, +{name="Azerbaijan";latitude="40.143105";longitude="47.576927";}, +{name="Bahamas";latitude="25.03428";longitude="-77.39628";}, +{name="Bahrain";latitude="25.930414";longitude="50.637772";}, +{name="Bangladesh";latitude="23.684994";longitude="90.356331";}, +{name="Barbados";latitude="13.193887";longitude="-59.543198";}, +{name="Belarus";latitude="53.709807";longitude="27.953389";}, +{name="Belgium";latitude="50.503887";longitude="4.469936";}, +{name="Belize";latitude="17.189877";longitude="-88.49765";}, +{name="Benin";latitude="9.30769";longitude="2.315834";}, +{name="Bermuda";latitude="32.321384";longitude="-64.75737";}, +{name="Bhutan";latitude="27.514162";longitude="90.433601";}, +{name="Bolivia";latitude="-16.290154";longitude="-63.588653";}, +{name="Bosnia and Herzegovina";latitude="43.915886";longitude="17.679076";}, +{name="Botswana";latitude="-22.328474";longitude="24.684866";}, +{name="Bouvet Island";latitude="-54.423199";longitude="3.413194";}, +{name="Brazil";latitude="-14.235004";longitude="-51.92528";}, +{name="British Indian Ocean Territory";latitude="-6.343194";longitude="71.876519";}, +{name="British Virgin Islands";latitude="18.420695";longitude="-64.639968";}, +{name="Brunei";latitude="4.535277";longitude="114.727669";}, +{name="Bulgaria";latitude="42.733883";longitude="25.48583";}, +{name="Burkina Faso";latitude="12.238333";longitude="-1.561593";}, +{name="Burundi";latitude="-3.373056";longitude="29.918886";}, +{name="Cambodia";latitude="12.565679";longitude="104.990963";}, +{name="Cameroon";latitude="7.369722";longitude="12.354722";}, +{name="Canada";latitude="56.130366";longitude="-106.346771";}, +{name="Cape Verde";latitude="16.002082";longitude="-24.013197";}, +{name="Cayman Islands";latitude="19.513469";longitude="-80.566956";}, +{name="Central African Republic";latitude="6.611111";longitude="20.939444";}, +{name="Chad";latitude="15.454166";longitude="18.732207";}, +{name="Chile";latitude="-35.675147";longitude="-71.542969";}, +{name="China";latitude="35.86166";longitude="104.195397";}, +{name="Christmas Island";latitude="-10.447525";longitude="105.690449";}, +{name="Cocos [Keeling] Islands";latitude="-12.164165";longitude="96.870956";}, +{name="Colombia";latitude="4.570868";longitude="-74.297333";}, +{name="Comoros";latitude="-11.875001";longitude="43.872219";}, +{name="Congo [DRC]";latitude="-4.038333";longitude="21.758664";}, +{name="Congo [Republic]";latitude="-0.228021";longitude="15.827659";}, +{name="Cook Islands";latitude="-21.236736";longitude="-159.777671";}, +{name="Costa Rica";latitude="9.748917";longitude="-83.753428";}, +{name="Croatia";latitude="45.1";longitude="15.2";}, +{name="Cuba";latitude="21.521757";longitude="-77.781167";}, +{name="Cyprus";latitude="35.126413";longitude="33.429859";}, +{name="Czech Republic";latitude="49.817492";longitude="15.472962";}, +{name="Côte d'Ivoire";latitude="7.539989";longitude="-5.54708";}, +{name="Denmark";latitude="56.26392";longitude="9.501785";}, +{name="Djibouti";latitude="11.825138";longitude="42.590275";}, +{name="Dominica";latitude="15.414999";longitude="-61.370976";}, +{name="Dominican Republic";latitude="18.735693";longitude="-70.162651";}, +{name="Ecuador";latitude="-1.831239";longitude="-78.183406";}, +{name="Egypt";latitude="26.820553";longitude="30.802498";}, +{name="El Salvador";latitude="13.794185";longitude="-88.89653";}, +{name="Equatorial Guinea";latitude="1.650801";longitude="10.267895";}, +{name="Eritrea";latitude="15.179384";longitude="39.782334";}, +{name="Estonia";latitude="58.595272";longitude="25.013607";}, +{name="Ethiopia";latitude="9.145";longitude="40.489673";}, +{name="Falkland Islands [Islas Malvinas]";latitude="-51.796253";longitude="-59.523613";}, +{name="Faroe Islands";latitude="61.892635";longitude="-6.911806";}, +{name="Fiji";latitude="-16.578193";longitude="179.414413";}, +{name="Finland";latitude="61.92411";longitude="25.748151";}, +{name="France";latitude="46.227638";longitude="2.213749";}, +{name="French Guiana";latitude="3.933889";longitude="-53.125782";}, +{name="French Polynesia";latitude="-17.679742";longitude="-149.406843";}, +{name="French Southern Territories";latitude="-49.280366";longitude="69.348557";}, +{name="Gabon";latitude="-0.803689";longitude="11.609444";}, +{name="Gambia";latitude="13.443182";longitude="-15.310139";}, +{name="Gaza Strip";latitude="31.354676";longitude="34.308825";}, +{name="Georgia";latitude="42.315407";longitude="43.356892";}, +{name="Germany";latitude="51.165691";longitude="10.451526";}, +{name="Ghana";latitude="7.946527";longitude="-1.023194";}, +{name="Gibraltar";latitude="36.137741";longitude="-5.345374";}, +{name="Greece";latitude="39.074208";longitude="21.824312";}, +{name="Greenland";latitude="71.706936";longitude="-42.604303";}, +{name="Grenada";latitude="12.262776";longitude="-61.604171";}, +{name="Guadeloupe";latitude="16.995971";longitude="-62.067641";}, +{name="Guam";latitude="13.444304";longitude="144.793731";}, +{name="Guatemala";latitude="15.783471";longitude="-90.230759";}, +{name="Guernsey";latitude="49.465691";longitude="-2.585278";}, +{name="Guinea";latitude="9.945587";longitude="-9.696645";}, +{name="Guinea-Bissau";latitude="11.803749";longitude="-15.180413";}, +{name="Guyana";latitude="4.860416";longitude="-58.93018";}, +{name="Haiti";latitude="18.971187";longitude="-72.285215";}, +{name="Heard Island and McDonald Islands";latitude="-53.08181";longitude="73.504158";}, +{name="Honduras";latitude="15.199999";longitude="-86.241905";}, +{name="Hong Kong";latitude="22.396428";longitude="114.109497";}, +{name="Hungary";latitude="47.162494";longitude="19.503304";}, +{name="Iceland";latitude="64.963051";longitude="-19.020835";}, +{name="India";latitude="20.593684";longitude="78.96288";}, +{name="Indonesia";latitude="-0.789275";longitude="113.921327";}, +{name="Iran";latitude="32.427908";longitude="53.688046";}, +{name="Iraq";latitude="33.223191";longitude="43.679291";}, +{name="Ireland";latitude="53.41291";longitude="-8.24389";}, +{name="Isle of Man";latitude="54.236107";longitude="-4.548056";}, +{name="Israel";latitude="31.046051";longitude="34.851612";}, +{name="Italy";latitude="41.87194";longitude="12.56738";}, +{name="Jamaica";latitude="18.109581";longitude="-77.297508";}, +{name="Japan";latitude="36.204824";longitude="138.252924";}, +{name="Jersey";latitude="49.214439";longitude="-2.13125";}, +{name="Jordan";latitude="30.585164";longitude="36.238414";}, +{name="Kazakhstan";latitude="48.019573";longitude="66.923684";}, +{name="Kenya";latitude="-0.023559";longitude="37.906193";}, +{name="Kiribati";latitude="-3.370417";longitude="-168.734039";}, +{name="Kosovo";latitude="42.602636";longitude="20.902977";}, +{name="Kuwait";latitude="29.31166";longitude="47.481766";}, +{name="Kyrgyzstan";latitude="41.20438";longitude="74.766098";}, +{name="Laos";latitude="19.85627";longitude="102.495496";}, +{name="Latvia";latitude="56.879635";longitude="24.603189";}, +{name="Lebanon";latitude="33.854721";longitude="35.862285";}, +{name="Lesotho";latitude="-29.609988";longitude="28.233608";}, +{name="Liberia";latitude="6.428055";longitude="-9.429499";}, +{name="Libya";latitude="26.3351";longitude="17.228331";}, +{name="Liechtenstein";latitude="47.166";longitude="9.555373";}, +{name="Lithuania";latitude="55.169438";longitude="23.881275";}, +{name="Luxembourg";latitude="49.815273";longitude="6.129583";}, +{name="Macau";latitude="22.198745";longitude="113.543873";}, +{name="Macedonia [FYROM]";latitude="41.608635";longitude="21.745275";}, +{name="Madagascar";latitude="-18.766947";longitude="46.869107";}, +{name="Malawi";latitude="-13.254308";longitude="34.301525";}, +{name="Malaysia";latitude="4.210484";longitude="101.975766";}, +{name="Maldives";latitude="3.202778";longitude="73.22068";}, +{name="Mali";latitude="17.570692";longitude="-3.996166";}, +{name="Malta";latitude="35.937496";longitude="14.375416";}, +{name="Marshall Islands";latitude="7.131474";longitude="171.184478";}, +{name="Martinique";latitude="14.641528";longitude="-61.024174";}, +{name="Mauritania";latitude="21.00789";longitude="-10.940835";}, +{name="Mauritius";latitude="-20.348404";longitude="57.552152";}, +{name="Mayotte";latitude="-12.8275";longitude="45.166244";}, +{name="Mexico";latitude="23.634501";longitude="-102.552784";}, +{name="Micronesia";latitude="7.425554";longitude="150.550812";}, +{name="Moldova";latitude="47.411631";longitude="28.369885";}, +{name="Monaco";latitude="43.750298";longitude="7.412841";}, +{name="Mongolia";latitude="46.862496";longitude="103.846656";}, +{name="Montenegro";latitude="42.708678";longitude="19.37439";}, +{name="Montserrat";latitude="16.742498";longitude="-62.187366";}, +{name="Morocco";latitude="31.791702";longitude="-7.09262";}, +{name="Mozambique";latitude="-18.665695";longitude="35.529562";}, +{name="Myanmar [Burma]";latitude="21.913965";longitude="95.956223";}, +{name="Namibia";latitude="-22.95764";longitude="18.49041";}, +{name="Nauru";latitude="-0.522778";longitude="166.931503";}, +{name="Nepal";latitude="28.394857";longitude="84.124008";}, +{name="Netherlands Antilles";latitude="12.226079";longitude="-69.060087";}, +{name="Netherlands";latitude="52.132633";longitude="5.291266";}, +{name="New Caledonia";latitude="-20.904305";longitude="165.618042";}, +{name="New Zealand";latitude="-40.900557";longitude="174.885971";}, +{name="Nicaragua";latitude="12.865416";longitude="-85.207229";}, +{name="Niger";latitude="17.607789";longitude="8.081666";}, +{name="Nigeria";latitude="9.081999";longitude="8.675277";}, +{name="Niue";latitude="-19.054445";longitude="-169.867233";}, +{name="Norfolk Island";latitude="-29.040835";longitude="167.954712";}, +{name="North Korea";latitude="40.339852";longitude="127.510093";}, +{name="Northern Mariana Islands";latitude="17.33083";longitude="145.38469";}, +{name="Norway";latitude="60.472024";longitude="8.468946";}, +{name="Oman";latitude="21.512583";longitude="55.923255";}, +{name="Pakistan";latitude="30.375321";longitude="69.345116";}, +{name="Palau";latitude="7.51498";longitude="134.58252";}, +{name="Palestinian Territories";latitude="31.952162";longitude="35.233154";}, +{name="Panama";latitude="8.537981";longitude="-80.782127";}, +{name="Papua New Guinea";latitude="-6.314993";longitude="143.95555";}, +{name="Paraguay";latitude="-23.442503";longitude="-58.443832";}, +{name="Peru";latitude="-9.189967";longitude="-75.015152";}, +{name="Philippines";latitude="12.879721";longitude="121.774017";}, +{name="Pitcairn Islands";latitude="-24.703615";longitude="-127.439308";}, +{name="Poland";latitude="51.919438";longitude="19.145136";}, +{name="Portugal";latitude="39.399872";longitude="-8.224454";}, +{name="Puerto Rico";latitude="18.220833";longitude="-66.590149";}, +{name="Qatar";latitude="25.354826";longitude="51.183884";}, +{name="Romania";latitude="45.943161";longitude="24.96676";}, +{name="Russia";latitude="61.52401";longitude="105.318756";}, +{name="Rwanda";latitude="-1.940278";longitude="29.873888";}, +{name="Réunion";latitude="-21.115141";longitude="55.536384";}, +{name="Saint Helena";latitude="-24.143474";longitude="-10.030696";}, +{name="Saint Kitts and Nevis";latitude="17.357822";longitude="-62.782998";}, +{name="Saint Lucia";latitude="13.909444";longitude="-60.978893";}, +{name="Saint Pierre and Miquelon";latitude="46.941936";longitude="-56.27111";}, +{name="Saint Vincent and the Grenadines";latitude="12.984305";longitude="-61.287228";}, +{name="Samoa";latitude="-13.759029";longitude="-172.104629";}, +{name="San Marino";latitude="43.94236";longitude="12.457777";}, +{name="Saudi Arabia";latitude="23.885942";longitude="45.079162";}, +{name="Senegal";latitude="14.497401";longitude="-14.452362";}, +{name="Serbia";latitude="44.016521";longitude="21.005859";}, +{name="Seychelles";latitude="-4.679574";longitude="55.491977";}, +{name="Sierra Leone";latitude="8.460555";longitude="-11.779889";}, +{name="Singapore";latitude="1.352083";longitude="103.819836";}, +{name="Slovakia";latitude="48.669026";longitude="19.699024";}, +{name="Slovenia";latitude="46.151241";longitude="14.995463";}, +{name="Solomon Islands";latitude="-9.64571";longitude="160.156194";}, +{name="Somalia";latitude="5.152149";longitude="46.199616";}, +{name="South Africa";latitude="-30.559482";longitude="22.937506";}, +{name="South Georgia and the South Sandwich Islands";latitude="-54.429579";longitude="-36.587909";}, +{name="South Korea";latitude="35.907757";longitude="127.766922";}, +{name="Spain";latitude="40.463667";longitude="-3.74922";}, +{name="Sri Lanka";latitude="7.873054";longitude="80.771797";}, +{name="Sudan";latitude="12.862807";longitude="30.217636";}, +{name="Suriname";latitude="3.919305";longitude="-56.027783";}, +{name="Svalbard and Jan Mayen";latitude="77.553604";longitude="23.670272";}, +{name="Swaziland";latitude="-26.522503";longitude="31.465866";}, +{name="Sweden";latitude="60.128161";longitude="18.643501";}, +{name="Switzerland";latitude="46.818188";longitude="8.227512";}, +{name="Syria";latitude="34.802075";longitude="38.996815";}, +{name="São Tomé and Príncipe";latitude="0.18636";longitude="6.613081";}, +{name="Taiwan";latitude="23.69781";longitude="120.960515";}, +{name="Tajikistan";latitude="38.861034";longitude="71.276093";}, +{name="Tanzania";latitude="-6.369028";longitude="34.888822";}, +{name="Thailand";latitude="15.870032";longitude="100.992541";}, +{name="Timor-Leste";latitude="-8.874217";longitude="125.727539";}, +{name="Togo";latitude="8.619543";longitude="0.824782";}, +{name="Tokelau";latitude="-8.967363";longitude="-171.855881";}, +{name="Tonga";latitude="-21.178986";longitude="-175.198242";}, +{name="Trinidad and Tobago";latitude="10.691803";longitude="-61.222503";}, +{name="Tunisia";latitude="33.886917";longitude="9.537499";}, +{name="Turkey";latitude="38.963745";longitude="35.243322";}, +{name="Turkmenistan";latitude="38.969719";longitude="59.556278";}, +{name="Turks and Caicos Islands";latitude="21.694025";longitude="-71.797928";}, +{name="Tuvalu";latitude="-7.109535";longitude="177.64933";}, +{name="U.S. Minor Outlying Islands";latitude="";longitude="";}, +{name="U.S. Virgin Islands";latitude="18.335765";longitude="-64.896335";}, +{name="Uganda";latitude="1.373333";longitude="32.290275";}, +{name="Ukraine";latitude="48.379433";longitude="31.16558";}, +{name="United Arab Emirates";latitude="23.424076";longitude="53.847818";}, +{name="United Kingdom";latitude="55.378051";longitude="-3.435973";}, +{name="United States";latitude="37.09024";longitude="-95.712891";}, +{name="Uruguay";latitude="-32.522779";longitude="-55.765835";}, +{name="Uzbekistan";latitude="41.377491";longitude="64.585262";}, +{name="Vanuatu";latitude="-15.376706";longitude="166.959158";}, +{name="Vatican City";latitude="41.902916";longitude="12.453389";}, +{name="Venezuela";latitude="6.42375";longitude="-66.58973";}, +{name="Vietnam";latitude="14.058324";longitude="108.277199";}, +{name="Wallis and Futuna";latitude="-13.768752";longitude="-177.156097";}, +{name="Western Sahara";latitude="24.215527";longitude="-12.885834";}, +{name="Yemen";latitude="15.552727";longitude="48.516388";}, +{name="Zambia";latitude="-13.133897";longitude="27.849332";}, +{name="Zimbabwe";latitude="-19.015438";longitude="29.154857";} +) diff --git a/Container/Container-SB/ContainerTests/Info.plist b/Container/Container-SB/ContainerTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Container/Container-SB/ContainerTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Container/Container-SB/ContainerTests/LocationTests.swift b/Container/Container-SB/ContainerTests/LocationTests.swift new file mode 100644 index 0000000..93179fa --- /dev/null +++ b/Container/Container-SB/ContainerTests/LocationTests.swift @@ -0,0 +1,105 @@ +// +// LocationTests.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import XCTest +import CoreLocation + +@testable import Container + +class LocationTests: XCTestCase { + + override func setUp() { + super.setUp() + } + + override func tearDown() { + super.tearDown() + } + + func testInitFromDictionary() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "-25", + "longitude" : "135"]) + XCTAssertNotNil(australia) + XCTAssert(australia?.name == "Australia") + XCTAssert(australia?.latitude == -25.0) + XCTAssert(australia?.longitude == 135.0) + } + + func testMissingName() { + let australia = Location(dictionary: ["latitude" : "-25", + "longitude" : "135"]) + XCTAssertNil(australia) + } + + func testMissingLatitude() { + let australia = Location(dictionary: ["name" : "Australis", + "longitude" : "135"]) + XCTAssertNil(australia) + } + + func testMissingLongitude() { + let australia = Location(dictionary: ["name" : "Australis", + "latitude" : "-25"]) + XCTAssertNil(australia) + } + + func testExtraKeysIgnored() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "-25", + "longitude" : "135", + "capital" : "Canberra"]) + XCTAssertNotNil(australia) + } + + func testInvalidLatitude() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "hello", + "longitude" : "135"]) + XCTAssertNil(australia) + } + + func testInvalidLongitude() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "-25", + "longitude" : "12a"]) + XCTAssertNil(australia) + } + + func testInvalidCoordinare() { + let nowhere = Location(dictionary: ["name" : "OffTheGrid", + "latitude" : "-100", + "longitude" : "200"]) + XCTAssertNil(nowhere) + } +} diff --git a/Container/Container-SB/README.md b/Container/Container-SB/README.md new file mode 100644 index 0000000..ce4638f --- /dev/null +++ b/Container/Container-SB/README.md @@ -0,0 +1,6 @@ +### Attribution + +The country location data used in this example is based on work created and [shared by Google](https://developers.google.com/readme/policies/) and used according to terms described in [Creative Commons 3.0 Attribution License](http://creativecommons.org/licenses/by/3.0/). + +See the [original source page](https://developers.google.com/public-data/docs/canonical/countries_csv) for details. + diff --git a/Container/Container-code/Container.xcodeproj/project.pbxproj b/Container/Container-code/Container.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d74b533 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.pbxproj @@ -0,0 +1,523 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 534452FA1E61BA1F00649AF9 /* LocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534452F91E61BA1F00649AF9 /* LocationTests.swift */; }; + 534452FE1E61DF6200649AF9 /* locations.plist in Resources */ = {isa = PBXBuildFile; fileRef = 534452FD1E61DF6100649AF9 /* locations.plist */; }; + 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534453061E621BDE00649AF9 /* MapViewDelegate.swift */; }; + 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B24B1E608B79001744C8 /* AppDelegate.swift */; }; + 5367B2511E608B79001744C8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5367B24F1E608B79001744C8 /* Main.storyboard */; }; + 5367B2531E608B79001744C8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5367B2521E608B79001744C8 /* Assets.xcassets */; }; + 5367B2561E608B79001744C8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5367B2541E608B79001744C8 /* LaunchScreen.storyboard */; }; + 5367B25E1E608BE4001744C8 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B25D1E608BE4001744C8 /* MasterViewController.swift */; }; + 5367B2601E60A129001744C8 /* LocationTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B25F1E60A129001744C8 /* LocationTableViewController.swift */; }; + 5367B2621E60A140001744C8 /* LocationDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2611E60A140001744C8 /* LocationDataSource.swift */; }; + 5367B2641E60A1A9001744C8 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2631E60A1A9001744C8 /* MapViewController.swift */; }; + 5367B2691E60A3C3001744C8 /* LocationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2681E60A3C3001744C8 /* LocationCell.swift */; }; + 5367B26B1E60A5C6001744C8 /* ReusableIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B26A1E60A5C6001744C8 /* ReusableIdentifier.swift */; }; + 5367B26E1E60A641001744C8 /* ConfigurableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B26D1E60A641001744C8 /* ConfigurableCell.swift */; }; + 5367B2721E60A694001744C8 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B2711E60A694001744C8 /* Location.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 534452F41E61B9E600649AF9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5367B2401E608B79001744C8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5367B2471E608B79001744C8; + remoteInfo = Container; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 534452EF1E61B9E600649AF9 /* ContainerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ContainerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 534452F31E61B9E600649AF9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 534452F91E61BA1F00649AF9 /* LocationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationTests.swift; sourceTree = ""; }; + 534452FD1E61DF6100649AF9 /* locations.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = locations.plist; sourceTree = ""; }; + 534452FF1E6216A100649AF9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; + 534453061E621BDE00649AF9 /* MapViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewDelegate.swift; sourceTree = ""; }; + 5367B2481E608B79001744C8 /* Container.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Container.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5367B24B1E608B79001744C8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5367B2501E608B79001744C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5367B2521E608B79001744C8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5367B2551E608B79001744C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5367B2571E608B79001744C8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5367B25D1E608BE4001744C8 /* MasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; }; + 5367B25F1E60A129001744C8 /* LocationTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationTableViewController.swift; sourceTree = ""; }; + 5367B2611E60A140001744C8 /* LocationDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationDataSource.swift; sourceTree = ""; }; + 5367B2631E60A1A9001744C8 /* MapViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = ""; }; + 5367B2661E60A29E001744C8 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + 5367B2681E60A3C3001744C8 /* LocationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationCell.swift; sourceTree = ""; }; + 5367B26A1E60A5C6001744C8 /* ReusableIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReusableIdentifier.swift; sourceTree = ""; }; + 5367B26D1E60A641001744C8 /* ConfigurableCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurableCell.swift; sourceTree = ""; }; + 5367B2711E60A694001744C8 /* Location.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 534452EC1E61B9E600649AF9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5367B2451E608B79001744C8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 534452F01E61B9E600649AF9 /* ContainerTests */ = { + isa = PBXGroup; + children = ( + 534452F91E61BA1F00649AF9 /* LocationTests.swift */, + 534452F31E61B9E600649AF9 /* Info.plist */, + ); + path = ContainerTests; + sourceTree = ""; + }; + 534453011E6217D600649AF9 /* Controllers */ = { + isa = PBXGroup; + children = ( + 5367B25D1E608BE4001744C8 /* MasterViewController.swift */, + 5367B2631E60A1A9001744C8 /* MapViewController.swift */, + 5367B25F1E60A129001744C8 /* LocationTableViewController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; + 534453021E6217E300649AF9 /* Delegates and DataSources */ = { + isa = PBXGroup; + children = ( + 5367B24B1E608B79001744C8 /* AppDelegate.swift */, + 5367B2611E60A140001744C8 /* LocationDataSource.swift */, + 534453061E621BDE00649AF9 /* MapViewDelegate.swift */, + ); + name = "Delegates and DataSources"; + sourceTree = ""; + }; + 534453031E6217F800649AF9 /* Model */ = { + isa = PBXGroup; + children = ( + 534452FD1E61DF6100649AF9 /* locations.plist */, + 5367B2711E60A694001744C8 /* Location.swift */, + ); + name = Model; + sourceTree = ""; + }; + 534453041E62181D00649AF9 /* Views */ = { + isa = PBXGroup; + children = ( + 5367B2681E60A3C3001744C8 /* LocationCell.swift */, + 5367B24F1E608B79001744C8 /* Main.storyboard */, + 5367B2521E608B79001744C8 /* Assets.xcassets */, + 5367B2541E608B79001744C8 /* LaunchScreen.storyboard */, + ); + name = Views; + sourceTree = ""; + }; + 534453051E62182900649AF9 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 5367B2571E608B79001744C8 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 5367B23F1E608B79001744C8 = { + isa = PBXGroup; + children = ( + 534452FF1E6216A100649AF9 /* README.md */, + 5367B24A1E608B79001744C8 /* Container */, + 534452F01E61B9E600649AF9 /* ContainerTests */, + 5367B2491E608B79001744C8 /* Products */, + 5367B2651E60A29E001744C8 /* Frameworks */, + ); + sourceTree = ""; + }; + 5367B2491E608B79001744C8 /* Products */ = { + isa = PBXGroup; + children = ( + 5367B2481E608B79001744C8 /* Container.app */, + 534452EF1E61B9E600649AF9 /* ContainerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 5367B24A1E608B79001744C8 /* Container */ = { + isa = PBXGroup; + children = ( + 5367B26C1E60A5F0001744C8 /* Protocols and Extensions */, + 534453031E6217F800649AF9 /* Model */, + 534453011E6217D600649AF9 /* Controllers */, + 534453021E6217E300649AF9 /* Delegates and DataSources */, + 534453041E62181D00649AF9 /* Views */, + 534453051E62182900649AF9 /* Supporting Files */, + ); + path = Container; + sourceTree = ""; + }; + 5367B2651E60A29E001744C8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5367B2661E60A29E001744C8 /* MapKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5367B26C1E60A5F0001744C8 /* Protocols and Extensions */ = { + isa = PBXGroup; + children = ( + 5367B26D1E60A641001744C8 /* ConfigurableCell.swift */, + 5367B26A1E60A5C6001744C8 /* ReusableIdentifier.swift */, + ); + name = "Protocols and Extensions"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 534452EE1E61B9E600649AF9 /* ContainerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 534452F61E61B9E600649AF9 /* Build configuration list for PBXNativeTarget "ContainerTests" */; + buildPhases = ( + 534452EB1E61B9E600649AF9 /* Sources */, + 534452EC1E61B9E600649AF9 /* Frameworks */, + 534452ED1E61B9E600649AF9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 534452F51E61B9E600649AF9 /* PBXTargetDependency */, + ); + name = ContainerTests; + productName = ContainerTests; + productReference = 534452EF1E61B9E600649AF9 /* ContainerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 5367B2471E608B79001744C8 /* Container */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5367B25A1E608B79001744C8 /* Build configuration list for PBXNativeTarget "Container" */; + buildPhases = ( + 5367B2441E608B79001744C8 /* Sources */, + 5367B2451E608B79001744C8 /* Frameworks */, + 5367B2461E608B79001744C8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Container; + productName = Container; + productReference = 5367B2481E608B79001744C8 /* Container.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5367B2401E608B79001744C8 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 534452EE1E61B9E600649AF9 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + TestTargetID = 5367B2471E608B79001744C8; + }; + 5367B2471E608B79001744C8 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 5367B2431E608B79001744C8 /* Build configuration list for PBXProject "Container" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5367B23F1E608B79001744C8; + productRefGroup = 5367B2491E608B79001744C8 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5367B2471E608B79001744C8 /* Container */, + 534452EE1E61B9E600649AF9 /* ContainerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 534452ED1E61B9E600649AF9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5367B2461E608B79001744C8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5367B2561E608B79001744C8 /* LaunchScreen.storyboard in Resources */, + 534452FE1E61DF6200649AF9 /* locations.plist in Resources */, + 5367B2531E608B79001744C8 /* Assets.xcassets in Resources */, + 5367B2511E608B79001744C8 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 534452EB1E61B9E600649AF9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 534452FA1E61BA1F00649AF9 /* LocationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5367B2441E608B79001744C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5367B26B1E60A5C6001744C8 /* ReusableIdentifier.swift in Sources */, + 5367B2691E60A3C3001744C8 /* LocationCell.swift in Sources */, + 5367B26E1E60A641001744C8 /* ConfigurableCell.swift in Sources */, + 5367B25E1E608BE4001744C8 /* MasterViewController.swift in Sources */, + 5367B2721E60A694001744C8 /* Location.swift in Sources */, + 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */, + 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */, + 5367B2601E60A129001744C8 /* LocationTableViewController.swift in Sources */, + 5367B2641E60A1A9001744C8 /* MapViewController.swift in Sources */, + 5367B2621E60A140001744C8 /* LocationDataSource.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 534452F51E61B9E600649AF9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5367B2471E608B79001744C8 /* Container */; + targetProxy = 534452F41E61B9E600649AF9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 5367B24F1E608B79001744C8 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5367B2501E608B79001744C8 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5367B2541E608B79001744C8 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5367B2551E608B79001744C8 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 534452F71E61B9E600649AF9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ContainerTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ContainerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Container.app/Container"; + }; + name = Debug; + }; + 534452F81E61B9E600649AF9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ContainerTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ContainerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Container.app/Container"; + }; + name = Release; + }; + 5367B2581E608B79001744C8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5367B2591E608B79001744C8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5367B25B1E608B79001744C8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Container/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Container; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 5367B25C1E608B79001744C8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Container/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Container; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 534452F61E61B9E600649AF9 /* Build configuration list for PBXNativeTarget "ContainerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 534452F71E61B9E600649AF9 /* Debug */, + 534452F81E61B9E600649AF9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5367B2431E608B79001744C8 /* Build configuration list for PBXProject "Container" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5367B2581E608B79001744C8 /* Debug */, + 5367B2591E608B79001744C8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5367B25A1E608B79001744C8 /* Build configuration list for PBXNativeTarget "Container" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5367B25B1E608B79001744C8 /* Debug */, + 5367B25C1E608B79001744C8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5367B2401E608B79001744C8 /* Project object */; +} diff --git a/Container/Container-code/Container/AppDelegate.swift b/Container/Container-code/Container/AppDelegate.swift new file mode 100644 index 0000000..1e60a63 --- /dev/null +++ b/Container/Container-code/Container/AppDelegate.swift @@ -0,0 +1,39 @@ +// +// AppDelegate.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/Container/Container-code/Container/Assets.xcassets/AppIcon.appiconset/Contents.json b/Container/Container-code/Container/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/Container/Container-code/Container/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/Container/Container-code/Container/Base.lproj/LaunchScreen.storyboard b/Container/Container-code/Container/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/Container/Container-code/Container/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Container/Container-code/Container/Base.lproj/Main.storyboard b/Container/Container-code/Container/Base.lproj/Main.storyboard new file mode 100644 index 0000000..718a804 --- /dev/null +++ b/Container/Container-code/Container/Base.lproj/Main.storyboard @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Container/Container-code/Container/ConfigurableCell.swift b/Container/Container-code/Container/ConfigurableCell.swift new file mode 100644 index 0000000..eced6d5 --- /dev/null +++ b/Container/Container-code/Container/ConfigurableCell.swift @@ -0,0 +1,38 @@ +// +// ConfigurableCell.swift +// +// 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 Foundation + +protocol ConfigurableCell { + associatedtype Object + func configure(object: Object) +} diff --git a/Container/Container-code/Container/Info.plist b/Container/Container-code/Container/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/Container/Container-code/Container/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Container/Container-code/Container/Location.swift b/Container/Container-code/Container/Location.swift new file mode 100644 index 0000000..d65003c --- /dev/null +++ b/Container/Container-code/Container/Location.swift @@ -0,0 +1,96 @@ +// +// Location.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import CoreLocation + +/// A structure representing the location of a point on +/// the map. + +struct Location { + + /// The name of the location. + + let name: String + + /// The latitude of the location in degrees. + + let latitude: CLLocationDegrees + + /// The longitude of the location in degrees. + + let longitude: CLLocationDegrees + + /// A read-only `CLLocationCoordinate2D` value for the + /// geographic coordinate of the location. + + var coordinate: CLLocationCoordinate2D { + return CLLocationCoordinate2DMake(latitude, longitude) + } +} + +extension Location { + + /// A failable initializer that builds a `Location` from + /// a dictionary of String keys and values. The dictionary + /// must contain at least "name", "latitude" and "longitude" + /// items. + /// + /// The values must all be `String` and the `latitude` + /// and `longitude` must convert to a `CLLocationDegrees` + /// value (Double) and specify a valid coordinate. A valid + /// latitude is from -90 to +90 and a valid longitude is + /// from -180 to +180. + /// + /// - Parameter dictionary: A dictionary containing the + /// details to initialize the location. + /// + /// - Returns: A `Location` structure or `nil` if the + /// dictionary was invalid, + + init?(dictionary: Dictionary) { + guard let name = dictionary["name"], + let latitudeItem = dictionary["latitude"], + let latitude = CLLocationDegrees(latitudeItem), + let longitudeItem = dictionary["longitude"], + let longitude = CLLocationDegrees(longitudeItem) else { + return nil + } + + self.name = name + self.latitude = latitude + self.longitude = longitude + if !CLLocationCoordinate2DIsValid(coordinate) { + return nil + } + } +} diff --git a/Container/Container-code/Container/LocationCell.swift b/Container/Container-code/Container/LocationCell.swift new file mode 100644 index 0000000..8fdb057 --- /dev/null +++ b/Container/Container-code/Container/LocationCell.swift @@ -0,0 +1,56 @@ +// +// LocationCell.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class LocationCell: UITableViewCell, ReusableIdentifier { + + @IBOutlet fileprivate weak var name: UILabel! + @IBOutlet fileprivate weak var coordinates: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + if #available(iOS 10.0, *) { + name.adjustsFontForContentSizeCategory = true + coordinates.adjustsFontForContentSizeCategory = true + } + } +} + +extension LocationCell: ConfigurableCell { + func configure(object: Location) { + name.text = object.name + coordinates.text = String("\(object.latitude) \(object.longitude)") + } +} diff --git a/Container/Container-code/Container/LocationDataSource.swift b/Container/Container-code/Container/LocationDataSource.swift new file mode 100644 index 0000000..7df4a4c --- /dev/null +++ b/Container/Container-code/Container/LocationDataSource.swift @@ -0,0 +1,88 @@ +// +// LocationDataSource.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class LocationDataSource: NSObject { + + fileprivate let tableView: UITableView + fileprivate var locations = [Location]() + + init(tableView: UITableView, from path: String) { + self.tableView = tableView + super.init() + readFromPlist(name: path) + tableView.dataSource = self + tableView.reloadData() + } + + func locationAtIndexPath(_ indexPath: IndexPath) -> Location? { + return indexPath.row < locations.count ? locations[indexPath.row] : nil + } + + private func readFromPlist(name: String) { + guard let items = NSArray(contentsOfFile: name) as? [Dictionary] else { + return + } + for item in items { + if let location = Location(dictionary: item) { + locations.append(location) + } + } + } +} + +extension LocationDataSource: UITableViewDataSource { + + func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return locations.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: LocationCell.reuseIdentifier, for: indexPath) + configure(cell: cell, indexPath: indexPath) + return cell + } + + private func configure(cell: UITableViewCell, indexPath: IndexPath) { + if let cell = cell as? LocationCell { + let object = locations[indexPath.row] + cell.configure(object: object) + } + } +} + diff --git a/Container/Container-code/Container/LocationTableViewController.swift b/Container/Container-code/Container/LocationTableViewController.swift new file mode 100644 index 0000000..304d82d --- /dev/null +++ b/Container/Container-code/Container/LocationTableViewController.swift @@ -0,0 +1,63 @@ +// +// LocationTableViewController.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +protocol LocationProviderDelegate: class { + func didSelectLocation(_ location: Location) +} + +class LocationTableViewController: UITableViewController { + + weak var delegate:LocationProviderDelegate? + + private var locationDataSource: LocationDataSource? + + override func viewDidLoad() { + super.viewDidLoad() + tableView.rowHeight = UITableViewAutomaticDimension + tableView.estimatedRowHeight = 64.0 + tableView.delegate = self + + if let plistPath = Bundle.main.path(forResource: "locations", ofType: "plist") { + locationDataSource = LocationDataSource(tableView: tableView, from: plistPath) + tableView.dataSource = locationDataSource + } + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if let location = locationDataSource?.locationAtIndexPath(indexPath) { + delegate?.didSelectLocation(location) + } + } +} diff --git a/Container/Container-code/Container/MapViewController.swift b/Container/Container-code/Container/MapViewController.swift new file mode 100644 index 0000000..182c0a3 --- /dev/null +++ b/Container/Container-code/Container/MapViewController.swift @@ -0,0 +1,92 @@ +// +// MapViewController.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit +import MapKit + +class MapViewController: UIViewController { + + @IBOutlet private weak var mapView: MKMapView! + + /// The zoom level to use when setting the span + /// of the map region to show. Default is 10 degrees. + + var zoom: CLLocationDegrees = 10.0 + + /// The coordinate to center the map on. Setting a new + /// coordinate centers the map on a region spanned by + /// the `zoom` level and drops a pin annotation at the + /// coordinate. + + var coordinate: CLLocationCoordinate2D? { + didSet { + if let coordinate = coordinate { + centerMap(coordinate) + annotate(coordinate) + } + } + } + + private func centerMap(_ coordinate: CLLocationCoordinate2D) { + let span = MKCoordinateSpanMake(zoom, zoom) + let region = MKCoordinateRegion(center: coordinate, span: span) + mapView.setRegion(region, animated: true) + } + + private func annotate(_ coordinate: CLLocationCoordinate2D) { + let annotation = MKPointAnnotation() + annotation.coordinate = coordinate + mapView.addAnnotation(annotation) + } +} + +extension MapViewController: MKMapViewDelegate { + + private enum AnnotationView: String { + case pin = "Pin" + } + + func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { + guard let annotation = annotation as? MKPointAnnotation else { + return nil + } + + let identifier = AnnotationView.pin.rawValue + guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView else { + return MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) + } + + annotationView.annotation = annotation + return annotationView + } +} diff --git a/Container/Container-code/Container/MapViewDelegate.swift b/Container/Container-code/Container/MapViewDelegate.swift new file mode 100644 index 0000000..87a4623 --- /dev/null +++ b/Container/Container-code/Container/MapViewDelegate.swift @@ -0,0 +1,56 @@ +// +// MapViewDelegate.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit +import MapKit + +class MapViewDelegate: NSObject, MKMapViewDelegate { + + private enum AnnotationView: String { + case pin = "Pin" + } + + func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { + guard let annotation = annotation as? MKPointAnnotation else { + return nil + } + + let identifier = AnnotationView.pin.rawValue + guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView else { + return MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) + } + + annotationView.annotation = annotation + return annotationView + } +} diff --git a/Container/Container-code/Container/MasterViewController.swift b/Container/Container-code/Container/MasterViewController.swift new file mode 100644 index 0000000..1eba174 --- /dev/null +++ b/Container/Container-code/Container/MasterViewController.swift @@ -0,0 +1,110 @@ +// +// MasterViewController.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class MasterViewController: UIViewController { + + private let topStackView = UIStackView() + + fileprivate lazy var locationTableViewController: LocationTableViewController = self.buildFromStoryboard("Main") + fileprivate lazy var mapViewController: MapViewController = self.buildFromStoryboard("Main") + + override func viewDidLoad() { + super.viewDidLoad() + setupStackView() + + addContentController(locationTableViewController, to: topStackView) + addContentController(mapViewController, to: topStackView) + locationTableViewController.delegate = self + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + + super.viewWillTransition(to: size, with: coordinator) + topStackView.axis = axisForSize(size) + } + + private func addContentController(_ child: UIViewController, to stackView: UIStackView) { + + addChildViewController(child) + stackView.addArrangedSubview(child.view) + child.didMove(toParentViewController: self) + } + + private func removeContentController(_ child: UIViewController, from stackView: UIStackView) { + + child.willMove(toParentViewController: nil) + stackView.removeArrangedSubview(child.view) + child.removeFromParentViewController() + } + + private func setupStackView() { + + topStackView.axis = axisForSize(view.bounds.size) + topStackView.alignment = .fill + topStackView.distribution = .fillEqually + topStackView.spacing = 8.0 + + topStackView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(topStackView) + + let margins = view.layoutMarginsGuide + NSLayoutConstraint.activate([ + topStackView.leadingAnchor.constraint(equalTo: margins.leadingAnchor), + topStackView.trailingAnchor.constraint(equalTo: margins.trailingAnchor), + topStackView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 8.0), + bottomLayoutGuide.topAnchor.constraint(equalTo: topStackView.bottomAnchor, constant: 8.0) + ]) + } + + private func axisForSize(_ size: CGSize) -> UILayoutConstraintAxis { + return size.width > size.height ? .horizontal : .vertical + } + + private func buildFromStoryboard(_ name: String) -> T { + let storyboard = UIStoryboard(name: name, bundle: nil) + let identifier = String(describing: T.self) + guard let viewController = storyboard.instantiateViewController(withIdentifier: identifier) as? T else { + fatalError("Missing \(identifier) in Storyboard") + } + return viewController + } +} + +extension MasterViewController: LocationProviderDelegate { + + func didSelectLocation(_ location: Location) { + mapViewController.coordinate = location.coordinate + } +} diff --git a/Container/Container-code/Container/ReusableIdentifier.swift b/Container/Container-code/Container/ReusableIdentifier.swift new file mode 100644 index 0000000..893e7f4 --- /dev/null +++ b/Container/Container-code/Container/ReusableIdentifier.swift @@ -0,0 +1,43 @@ +// +// ReusableIdentifier.swift +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016-2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +protocol ReusableIdentifier: class { + static var reuseIdentifier: String { get } +} + +extension ReusableIdentifier { + static var reuseIdentifier: String { + return "\(self)" + } +} diff --git a/Container/Container-code/Container/locations.plist b/Container/Container-code/Container/locations.plist new file mode 100644 index 0000000..1d4ad3c --- /dev/null +++ b/Container/Container-code/Container/locations.plist @@ -0,0 +1,247 @@ +( +{name="Afghanistan";latitude="33.93911";longitude="67.709953";}, +{name="Albania";latitude="41.153332";longitude="20.168331";}, +{name="Algeria";latitude="28.033886";longitude="1.659626";}, +{name="American Samoa";latitude="-14.270972";longitude="-170.132217";}, +{name="Andorra";latitude="42.546245";longitude="1.601554";}, +{name="Angola";latitude="-11.202692";longitude="17.873887";}, +{name="Anguilla";latitude="18.220554";longitude="-63.068615";}, +{name="Antarctica";latitude="-75.250973";longitude="-0.071389";}, +{name="Antigua and Barbuda";latitude="17.060816";longitude="-61.796428";}, +{name="Argentina";latitude="-38.416097";longitude="-63.616672";}, +{name="Armenia";latitude="40.069099";longitude="45.038189";}, +{name="Aruba";latitude="12.52111";longitude="-69.968338";}, +{name="Australia";latitude="-25.274398";longitude="133.775136";}, +{name="Austria";latitude="47.516231";longitude="14.550072";}, +{name="Azerbaijan";latitude="40.143105";longitude="47.576927";}, +{name="Bahamas";latitude="25.03428";longitude="-77.39628";}, +{name="Bahrain";latitude="25.930414";longitude="50.637772";}, +{name="Bangladesh";latitude="23.684994";longitude="90.356331";}, +{name="Barbados";latitude="13.193887";longitude="-59.543198";}, +{name="Belarus";latitude="53.709807";longitude="27.953389";}, +{name="Belgium";latitude="50.503887";longitude="4.469936";}, +{name="Belize";latitude="17.189877";longitude="-88.49765";}, +{name="Benin";latitude="9.30769";longitude="2.315834";}, +{name="Bermuda";latitude="32.321384";longitude="-64.75737";}, +{name="Bhutan";latitude="27.514162";longitude="90.433601";}, +{name="Bolivia";latitude="-16.290154";longitude="-63.588653";}, +{name="Bosnia and Herzegovina";latitude="43.915886";longitude="17.679076";}, +{name="Botswana";latitude="-22.328474";longitude="24.684866";}, +{name="Bouvet Island";latitude="-54.423199";longitude="3.413194";}, +{name="Brazil";latitude="-14.235004";longitude="-51.92528";}, +{name="British Indian Ocean Territory";latitude="-6.343194";longitude="71.876519";}, +{name="British Virgin Islands";latitude="18.420695";longitude="-64.639968";}, +{name="Brunei";latitude="4.535277";longitude="114.727669";}, +{name="Bulgaria";latitude="42.733883";longitude="25.48583";}, +{name="Burkina Faso";latitude="12.238333";longitude="-1.561593";}, +{name="Burundi";latitude="-3.373056";longitude="29.918886";}, +{name="Cambodia";latitude="12.565679";longitude="104.990963";}, +{name="Cameroon";latitude="7.369722";longitude="12.354722";}, +{name="Canada";latitude="56.130366";longitude="-106.346771";}, +{name="Cape Verde";latitude="16.002082";longitude="-24.013197";}, +{name="Cayman Islands";latitude="19.513469";longitude="-80.566956";}, +{name="Central African Republic";latitude="6.611111";longitude="20.939444";}, +{name="Chad";latitude="15.454166";longitude="18.732207";}, +{name="Chile";latitude="-35.675147";longitude="-71.542969";}, +{name="China";latitude="35.86166";longitude="104.195397";}, +{name="Christmas Island";latitude="-10.447525";longitude="105.690449";}, +{name="Cocos [Keeling] Islands";latitude="-12.164165";longitude="96.870956";}, +{name="Colombia";latitude="4.570868";longitude="-74.297333";}, +{name="Comoros";latitude="-11.875001";longitude="43.872219";}, +{name="Congo [DRC]";latitude="-4.038333";longitude="21.758664";}, +{name="Congo [Republic]";latitude="-0.228021";longitude="15.827659";}, +{name="Cook Islands";latitude="-21.236736";longitude="-159.777671";}, +{name="Costa Rica";latitude="9.748917";longitude="-83.753428";}, +{name="Croatia";latitude="45.1";longitude="15.2";}, +{name="Cuba";latitude="21.521757";longitude="-77.781167";}, +{name="Cyprus";latitude="35.126413";longitude="33.429859";}, +{name="Czech Republic";latitude="49.817492";longitude="15.472962";}, +{name="Côte d'Ivoire";latitude="7.539989";longitude="-5.54708";}, +{name="Denmark";latitude="56.26392";longitude="9.501785";}, +{name="Djibouti";latitude="11.825138";longitude="42.590275";}, +{name="Dominica";latitude="15.414999";longitude="-61.370976";}, +{name="Dominican Republic";latitude="18.735693";longitude="-70.162651";}, +{name="Ecuador";latitude="-1.831239";longitude="-78.183406";}, +{name="Egypt";latitude="26.820553";longitude="30.802498";}, +{name="El Salvador";latitude="13.794185";longitude="-88.89653";}, +{name="Equatorial Guinea";latitude="1.650801";longitude="10.267895";}, +{name="Eritrea";latitude="15.179384";longitude="39.782334";}, +{name="Estonia";latitude="58.595272";longitude="25.013607";}, +{name="Ethiopia";latitude="9.145";longitude="40.489673";}, +{name="Falkland Islands [Islas Malvinas]";latitude="-51.796253";longitude="-59.523613";}, +{name="Faroe Islands";latitude="61.892635";longitude="-6.911806";}, +{name="Fiji";latitude="-16.578193";longitude="179.414413";}, +{name="Finland";latitude="61.92411";longitude="25.748151";}, +{name="France";latitude="46.227638";longitude="2.213749";}, +{name="French Guiana";latitude="3.933889";longitude="-53.125782";}, +{name="French Polynesia";latitude="-17.679742";longitude="-149.406843";}, +{name="French Southern Territories";latitude="-49.280366";longitude="69.348557";}, +{name="Gabon";latitude="-0.803689";longitude="11.609444";}, +{name="Gambia";latitude="13.443182";longitude="-15.310139";}, +{name="Gaza Strip";latitude="31.354676";longitude="34.308825";}, +{name="Georgia";latitude="42.315407";longitude="43.356892";}, +{name="Germany";latitude="51.165691";longitude="10.451526";}, +{name="Ghana";latitude="7.946527";longitude="-1.023194";}, +{name="Gibraltar";latitude="36.137741";longitude="-5.345374";}, +{name="Greece";latitude="39.074208";longitude="21.824312";}, +{name="Greenland";latitude="71.706936";longitude="-42.604303";}, +{name="Grenada";latitude="12.262776";longitude="-61.604171";}, +{name="Guadeloupe";latitude="16.995971";longitude="-62.067641";}, +{name="Guam";latitude="13.444304";longitude="144.793731";}, +{name="Guatemala";latitude="15.783471";longitude="-90.230759";}, +{name="Guernsey";latitude="49.465691";longitude="-2.585278";}, +{name="Guinea";latitude="9.945587";longitude="-9.696645";}, +{name="Guinea-Bissau";latitude="11.803749";longitude="-15.180413";}, +{name="Guyana";latitude="4.860416";longitude="-58.93018";}, +{name="Haiti";latitude="18.971187";longitude="-72.285215";}, +{name="Heard Island and McDonald Islands";latitude="-53.08181";longitude="73.504158";}, +{name="Honduras";latitude="15.199999";longitude="-86.241905";}, +{name="Hong Kong";latitude="22.396428";longitude="114.109497";}, +{name="Hungary";latitude="47.162494";longitude="19.503304";}, +{name="Iceland";latitude="64.963051";longitude="-19.020835";}, +{name="India";latitude="20.593684";longitude="78.96288";}, +{name="Indonesia";latitude="-0.789275";longitude="113.921327";}, +{name="Iran";latitude="32.427908";longitude="53.688046";}, +{name="Iraq";latitude="33.223191";longitude="43.679291";}, +{name="Ireland";latitude="53.41291";longitude="-8.24389";}, +{name="Isle of Man";latitude="54.236107";longitude="-4.548056";}, +{name="Israel";latitude="31.046051";longitude="34.851612";}, +{name="Italy";latitude="41.87194";longitude="12.56738";}, +{name="Jamaica";latitude="18.109581";longitude="-77.297508";}, +{name="Japan";latitude="36.204824";longitude="138.252924";}, +{name="Jersey";latitude="49.214439";longitude="-2.13125";}, +{name="Jordan";latitude="30.585164";longitude="36.238414";}, +{name="Kazakhstan";latitude="48.019573";longitude="66.923684";}, +{name="Kenya";latitude="-0.023559";longitude="37.906193";}, +{name="Kiribati";latitude="-3.370417";longitude="-168.734039";}, +{name="Kosovo";latitude="42.602636";longitude="20.902977";}, +{name="Kuwait";latitude="29.31166";longitude="47.481766";}, +{name="Kyrgyzstan";latitude="41.20438";longitude="74.766098";}, +{name="Laos";latitude="19.85627";longitude="102.495496";}, +{name="Latvia";latitude="56.879635";longitude="24.603189";}, +{name="Lebanon";latitude="33.854721";longitude="35.862285";}, +{name="Lesotho";latitude="-29.609988";longitude="28.233608";}, +{name="Liberia";latitude="6.428055";longitude="-9.429499";}, +{name="Libya";latitude="26.3351";longitude="17.228331";}, +{name="Liechtenstein";latitude="47.166";longitude="9.555373";}, +{name="Lithuania";latitude="55.169438";longitude="23.881275";}, +{name="Luxembourg";latitude="49.815273";longitude="6.129583";}, +{name="Macau";latitude="22.198745";longitude="113.543873";}, +{name="Macedonia [FYROM]";latitude="41.608635";longitude="21.745275";}, +{name="Madagascar";latitude="-18.766947";longitude="46.869107";}, +{name="Malawi";latitude="-13.254308";longitude="34.301525";}, +{name="Malaysia";latitude="4.210484";longitude="101.975766";}, +{name="Maldives";latitude="3.202778";longitude="73.22068";}, +{name="Mali";latitude="17.570692";longitude="-3.996166";}, +{name="Malta";latitude="35.937496";longitude="14.375416";}, +{name="Marshall Islands";latitude="7.131474";longitude="171.184478";}, +{name="Martinique";latitude="14.641528";longitude="-61.024174";}, +{name="Mauritania";latitude="21.00789";longitude="-10.940835";}, +{name="Mauritius";latitude="-20.348404";longitude="57.552152";}, +{name="Mayotte";latitude="-12.8275";longitude="45.166244";}, +{name="Mexico";latitude="23.634501";longitude="-102.552784";}, +{name="Micronesia";latitude="7.425554";longitude="150.550812";}, +{name="Moldova";latitude="47.411631";longitude="28.369885";}, +{name="Monaco";latitude="43.750298";longitude="7.412841";}, +{name="Mongolia";latitude="46.862496";longitude="103.846656";}, +{name="Montenegro";latitude="42.708678";longitude="19.37439";}, +{name="Montserrat";latitude="16.742498";longitude="-62.187366";}, +{name="Morocco";latitude="31.791702";longitude="-7.09262";}, +{name="Mozambique";latitude="-18.665695";longitude="35.529562";}, +{name="Myanmar [Burma]";latitude="21.913965";longitude="95.956223";}, +{name="Namibia";latitude="-22.95764";longitude="18.49041";}, +{name="Nauru";latitude="-0.522778";longitude="166.931503";}, +{name="Nepal";latitude="28.394857";longitude="84.124008";}, +{name="Netherlands Antilles";latitude="12.226079";longitude="-69.060087";}, +{name="Netherlands";latitude="52.132633";longitude="5.291266";}, +{name="New Caledonia";latitude="-20.904305";longitude="165.618042";}, +{name="New Zealand";latitude="-40.900557";longitude="174.885971";}, +{name="Nicaragua";latitude="12.865416";longitude="-85.207229";}, +{name="Niger";latitude="17.607789";longitude="8.081666";}, +{name="Nigeria";latitude="9.081999";longitude="8.675277";}, +{name="Niue";latitude="-19.054445";longitude="-169.867233";}, +{name="Norfolk Island";latitude="-29.040835";longitude="167.954712";}, +{name="North Korea";latitude="40.339852";longitude="127.510093";}, +{name="Northern Mariana Islands";latitude="17.33083";longitude="145.38469";}, +{name="Norway";latitude="60.472024";longitude="8.468946";}, +{name="Oman";latitude="21.512583";longitude="55.923255";}, +{name="Pakistan";latitude="30.375321";longitude="69.345116";}, +{name="Palau";latitude="7.51498";longitude="134.58252";}, +{name="Palestinian Territories";latitude="31.952162";longitude="35.233154";}, +{name="Panama";latitude="8.537981";longitude="-80.782127";}, +{name="Papua New Guinea";latitude="-6.314993";longitude="143.95555";}, +{name="Paraguay";latitude="-23.442503";longitude="-58.443832";}, +{name="Peru";latitude="-9.189967";longitude="-75.015152";}, +{name="Philippines";latitude="12.879721";longitude="121.774017";}, +{name="Pitcairn Islands";latitude="-24.703615";longitude="-127.439308";}, +{name="Poland";latitude="51.919438";longitude="19.145136";}, +{name="Portugal";latitude="39.399872";longitude="-8.224454";}, +{name="Puerto Rico";latitude="18.220833";longitude="-66.590149";}, +{name="Qatar";latitude="25.354826";longitude="51.183884";}, +{name="Romania";latitude="45.943161";longitude="24.96676";}, +{name="Russia";latitude="61.52401";longitude="105.318756";}, +{name="Rwanda";latitude="-1.940278";longitude="29.873888";}, +{name="Réunion";latitude="-21.115141";longitude="55.536384";}, +{name="Saint Helena";latitude="-24.143474";longitude="-10.030696";}, +{name="Saint Kitts and Nevis";latitude="17.357822";longitude="-62.782998";}, +{name="Saint Lucia";latitude="13.909444";longitude="-60.978893";}, +{name="Saint Pierre and Miquelon";latitude="46.941936";longitude="-56.27111";}, +{name="Saint Vincent and the Grenadines";latitude="12.984305";longitude="-61.287228";}, +{name="Samoa";latitude="-13.759029";longitude="-172.104629";}, +{name="San Marino";latitude="43.94236";longitude="12.457777";}, +{name="Saudi Arabia";latitude="23.885942";longitude="45.079162";}, +{name="Senegal";latitude="14.497401";longitude="-14.452362";}, +{name="Serbia";latitude="44.016521";longitude="21.005859";}, +{name="Seychelles";latitude="-4.679574";longitude="55.491977";}, +{name="Sierra Leone";latitude="8.460555";longitude="-11.779889";}, +{name="Singapore";latitude="1.352083";longitude="103.819836";}, +{name="Slovakia";latitude="48.669026";longitude="19.699024";}, +{name="Slovenia";latitude="46.151241";longitude="14.995463";}, +{name="Solomon Islands";latitude="-9.64571";longitude="160.156194";}, +{name="Somalia";latitude="5.152149";longitude="46.199616";}, +{name="South Africa";latitude="-30.559482";longitude="22.937506";}, +{name="South Georgia and the South Sandwich Islands";latitude="-54.429579";longitude="-36.587909";}, +{name="South Korea";latitude="35.907757";longitude="127.766922";}, +{name="Spain";latitude="40.463667";longitude="-3.74922";}, +{name="Sri Lanka";latitude="7.873054";longitude="80.771797";}, +{name="Sudan";latitude="12.862807";longitude="30.217636";}, +{name="Suriname";latitude="3.919305";longitude="-56.027783";}, +{name="Svalbard and Jan Mayen";latitude="77.553604";longitude="23.670272";}, +{name="Swaziland";latitude="-26.522503";longitude="31.465866";}, +{name="Sweden";latitude="60.128161";longitude="18.643501";}, +{name="Switzerland";latitude="46.818188";longitude="8.227512";}, +{name="Syria";latitude="34.802075";longitude="38.996815";}, +{name="São Tomé and Príncipe";latitude="0.18636";longitude="6.613081";}, +{name="Taiwan";latitude="23.69781";longitude="120.960515";}, +{name="Tajikistan";latitude="38.861034";longitude="71.276093";}, +{name="Tanzania";latitude="-6.369028";longitude="34.888822";}, +{name="Thailand";latitude="15.870032";longitude="100.992541";}, +{name="Timor-Leste";latitude="-8.874217";longitude="125.727539";}, +{name="Togo";latitude="8.619543";longitude="0.824782";}, +{name="Tokelau";latitude="-8.967363";longitude="-171.855881";}, +{name="Tonga";latitude="-21.178986";longitude="-175.198242";}, +{name="Trinidad and Tobago";latitude="10.691803";longitude="-61.222503";}, +{name="Tunisia";latitude="33.886917";longitude="9.537499";}, +{name="Turkey";latitude="38.963745";longitude="35.243322";}, +{name="Turkmenistan";latitude="38.969719";longitude="59.556278";}, +{name="Turks and Caicos Islands";latitude="21.694025";longitude="-71.797928";}, +{name="Tuvalu";latitude="-7.109535";longitude="177.64933";}, +{name="U.S. Minor Outlying Islands";latitude="";longitude="";}, +{name="U.S. Virgin Islands";latitude="18.335765";longitude="-64.896335";}, +{name="Uganda";latitude="1.373333";longitude="32.290275";}, +{name="Ukraine";latitude="48.379433";longitude="31.16558";}, +{name="United Arab Emirates";latitude="23.424076";longitude="53.847818";}, +{name="United Kingdom";latitude="55.378051";longitude="-3.435973";}, +{name="United States";latitude="37.09024";longitude="-95.712891";}, +{name="Uruguay";latitude="-32.522779";longitude="-55.765835";}, +{name="Uzbekistan";latitude="41.377491";longitude="64.585262";}, +{name="Vanuatu";latitude="-15.376706";longitude="166.959158";}, +{name="Vatican City";latitude="41.902916";longitude="12.453389";}, +{name="Venezuela";latitude="6.42375";longitude="-66.58973";}, +{name="Vietnam";latitude="14.058324";longitude="108.277199";}, +{name="Wallis and Futuna";latitude="-13.768752";longitude="-177.156097";}, +{name="Western Sahara";latitude="24.215527";longitude="-12.885834";}, +{name="Yemen";latitude="15.552727";longitude="48.516388";}, +{name="Zambia";latitude="-13.133897";longitude="27.849332";}, +{name="Zimbabwe";latitude="-19.015438";longitude="29.154857";} +) diff --git a/Container/Container-code/ContainerTests/Info.plist b/Container/Container-code/ContainerTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Container/Container-code/ContainerTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Container/Container-code/ContainerTests/LocationTests.swift b/Container/Container-code/ContainerTests/LocationTests.swift new file mode 100644 index 0000000..93179fa --- /dev/null +++ b/Container/Container-code/ContainerTests/LocationTests.swift @@ -0,0 +1,105 @@ +// +// LocationTests.swift +// Container +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import XCTest +import CoreLocation + +@testable import Container + +class LocationTests: XCTestCase { + + override func setUp() { + super.setUp() + } + + override func tearDown() { + super.tearDown() + } + + func testInitFromDictionary() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "-25", + "longitude" : "135"]) + XCTAssertNotNil(australia) + XCTAssert(australia?.name == "Australia") + XCTAssert(australia?.latitude == -25.0) + XCTAssert(australia?.longitude == 135.0) + } + + func testMissingName() { + let australia = Location(dictionary: ["latitude" : "-25", + "longitude" : "135"]) + XCTAssertNil(australia) + } + + func testMissingLatitude() { + let australia = Location(dictionary: ["name" : "Australis", + "longitude" : "135"]) + XCTAssertNil(australia) + } + + func testMissingLongitude() { + let australia = Location(dictionary: ["name" : "Australis", + "latitude" : "-25"]) + XCTAssertNil(australia) + } + + func testExtraKeysIgnored() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "-25", + "longitude" : "135", + "capital" : "Canberra"]) + XCTAssertNotNil(australia) + } + + func testInvalidLatitude() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "hello", + "longitude" : "135"]) + XCTAssertNil(australia) + } + + func testInvalidLongitude() { + let australia = Location(dictionary: ["name" : "Australia", + "latitude" : "-25", + "longitude" : "12a"]) + XCTAssertNil(australia) + } + + func testInvalidCoordinare() { + let nowhere = Location(dictionary: ["name" : "OffTheGrid", + "latitude" : "-100", + "longitude" : "200"]) + XCTAssertNil(nowhere) + } +} diff --git a/Container/Container-code/README.md b/Container/Container-code/README.md new file mode 100644 index 0000000..ce4638f --- /dev/null +++ b/Container/Container-code/README.md @@ -0,0 +1,6 @@ +### Attribution + +The country location data used in this example is based on work created and [shared by Google](https://developers.google.com/readme/policies/) and used according to terms described in [Creative Commons 3.0 Attribution License](http://creativecommons.org/licenses/by/3.0/). + +See the [original source page](https://developers.google.com/public-data/docs/canonical/countries_csv) for details. + diff --git a/Container/README.md b/Container/README.md new file mode 100644 index 0000000..0bf0a02 --- /dev/null +++ b/Container/README.md @@ -0,0 +1,14 @@ +### Container + +Example of using view containment to avoid massive view controllers. This folder contains two Xcode projects: + ++ Container-SB: Implements everything with a Storyboard. ++ Container-code: Manages the child views in code. + +#### Further Information + ++ + +#### Version History + ++ Version 1.0 26 Feb 2017 Initial release From 7e834ee7f59445964c140697bc1616c9e23abb23 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 27 Feb 2017 16:33:59 +0000 Subject: [PATCH 010/142] Add link to post --- Container/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Container/README.md b/Container/README.md index 0bf0a02..f4d5777 100644 --- a/Container/README.md +++ b/Container/README.md @@ -7,7 +7,7 @@ Example of using view containment to avoid massive view controllers. This folder #### Further Information -+ ++ [Container View Controllers](https://useyourloaf.com/blog/container-view-controllers/) #### Version History From 950fa3de9ef8675ccf38e745833e0d5f00220c9b Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 27 Feb 2017 16:54:05 +0000 Subject: [PATCH 011/142] MapViewDelegate removed --- .../Container.xcodeproj/project.pbxproj | 4 -- .../Container/MapViewDelegate.swift | 56 ------------------- .../Container.xcodeproj/project.pbxproj | 4 -- .../Container/MapViewDelegate.swift | 56 ------------------- 4 files changed, 120 deletions(-) delete mode 100644 Container/Container-SB/Container/MapViewDelegate.swift delete mode 100644 Container/Container-code/Container/MapViewDelegate.swift diff --git a/Container/Container-SB/Container.xcodeproj/project.pbxproj b/Container/Container-SB/Container.xcodeproj/project.pbxproj index d74b533..2291a49 100644 --- a/Container/Container-SB/Container.xcodeproj/project.pbxproj +++ b/Container/Container-SB/Container.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 534452FA1E61BA1F00649AF9 /* LocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534452F91E61BA1F00649AF9 /* LocationTests.swift */; }; 534452FE1E61DF6200649AF9 /* locations.plist in Resources */ = {isa = PBXBuildFile; fileRef = 534452FD1E61DF6100649AF9 /* locations.plist */; }; - 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534453061E621BDE00649AF9 /* MapViewDelegate.swift */; }; 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B24B1E608B79001744C8 /* AppDelegate.swift */; }; 5367B2511E608B79001744C8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5367B24F1E608B79001744C8 /* Main.storyboard */; }; 5367B2531E608B79001744C8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5367B2521E608B79001744C8 /* Assets.xcassets */; }; @@ -40,7 +39,6 @@ 534452F91E61BA1F00649AF9 /* LocationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationTests.swift; sourceTree = ""; }; 534452FD1E61DF6100649AF9 /* locations.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = locations.plist; sourceTree = ""; }; 534452FF1E6216A100649AF9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; - 534453061E621BDE00649AF9 /* MapViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewDelegate.swift; sourceTree = ""; }; 5367B2481E608B79001744C8 /* Container.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Container.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5367B24B1E608B79001744C8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5367B2501E608B79001744C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -100,7 +98,6 @@ children = ( 5367B24B1E608B79001744C8 /* AppDelegate.swift */, 5367B2611E60A140001744C8 /* LocationDataSource.swift */, - 534453061E621BDE00649AF9 /* MapViewDelegate.swift */, ); name = "Delegates and DataSources"; sourceTree = ""; @@ -303,7 +300,6 @@ 5367B25E1E608BE4001744C8 /* MasterViewController.swift in Sources */, 5367B2721E60A694001744C8 /* Location.swift in Sources */, 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */, - 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */, 5367B2601E60A129001744C8 /* LocationTableViewController.swift in Sources */, 5367B2641E60A1A9001744C8 /* MapViewController.swift in Sources */, 5367B2621E60A140001744C8 /* LocationDataSource.swift in Sources */, diff --git a/Container/Container-SB/Container/MapViewDelegate.swift b/Container/Container-SB/Container/MapViewDelegate.swift deleted file mode 100644 index 87a4623..0000000 --- a/Container/Container-SB/Container/MapViewDelegate.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// MapViewDelegate.swift -// Container -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -import UIKit -import MapKit - -class MapViewDelegate: NSObject, MKMapViewDelegate { - - private enum AnnotationView: String { - case pin = "Pin" - } - - func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { - guard let annotation = annotation as? MKPointAnnotation else { - return nil - } - - let identifier = AnnotationView.pin.rawValue - guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView else { - return MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) - } - - annotationView.annotation = annotation - return annotationView - } -} diff --git a/Container/Container-code/Container.xcodeproj/project.pbxproj b/Container/Container-code/Container.xcodeproj/project.pbxproj index d74b533..2291a49 100644 --- a/Container/Container-code/Container.xcodeproj/project.pbxproj +++ b/Container/Container-code/Container.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 534452FA1E61BA1F00649AF9 /* LocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534452F91E61BA1F00649AF9 /* LocationTests.swift */; }; 534452FE1E61DF6200649AF9 /* locations.plist in Resources */ = {isa = PBXBuildFile; fileRef = 534452FD1E61DF6100649AF9 /* locations.plist */; }; - 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534453061E621BDE00649AF9 /* MapViewDelegate.swift */; }; 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5367B24B1E608B79001744C8 /* AppDelegate.swift */; }; 5367B2511E608B79001744C8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5367B24F1E608B79001744C8 /* Main.storyboard */; }; 5367B2531E608B79001744C8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5367B2521E608B79001744C8 /* Assets.xcassets */; }; @@ -40,7 +39,6 @@ 534452F91E61BA1F00649AF9 /* LocationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationTests.swift; sourceTree = ""; }; 534452FD1E61DF6100649AF9 /* locations.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = locations.plist; sourceTree = ""; }; 534452FF1E6216A100649AF9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; - 534453061E621BDE00649AF9 /* MapViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewDelegate.swift; sourceTree = ""; }; 5367B2481E608B79001744C8 /* Container.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Container.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5367B24B1E608B79001744C8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5367B2501E608B79001744C8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -100,7 +98,6 @@ children = ( 5367B24B1E608B79001744C8 /* AppDelegate.swift */, 5367B2611E60A140001744C8 /* LocationDataSource.swift */, - 534453061E621BDE00649AF9 /* MapViewDelegate.swift */, ); name = "Delegates and DataSources"; sourceTree = ""; @@ -303,7 +300,6 @@ 5367B25E1E608BE4001744C8 /* MasterViewController.swift in Sources */, 5367B2721E60A694001744C8 /* Location.swift in Sources */, 5367B24C1E608B79001744C8 /* AppDelegate.swift in Sources */, - 534453071E621BDE00649AF9 /* MapViewDelegate.swift in Sources */, 5367B2601E60A129001744C8 /* LocationTableViewController.swift in Sources */, 5367B2641E60A1A9001744C8 /* MapViewController.swift in Sources */, 5367B2621E60A140001744C8 /* LocationDataSource.swift in Sources */, diff --git a/Container/Container-code/Container/MapViewDelegate.swift b/Container/Container-code/Container/MapViewDelegate.swift deleted file mode 100644 index 87a4623..0000000 --- a/Container/Container-code/Container/MapViewDelegate.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// MapViewDelegate.swift -// Container -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -import UIKit -import MapKit - -class MapViewDelegate: NSObject, MKMapViewDelegate { - - private enum AnnotationView: String { - case pin = "Pin" - } - - func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { - guard let annotation = annotation as? MKPointAnnotation else { - return nil - } - - let identifier = AnnotationView.pin.rawValue - guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView else { - return MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) - } - - annotationView.annotation = annotation - return annotationView - } -} From fc19b11bf40b6f237348c4247e06c83b928e6393 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 28 Feb 2017 10:19:38 +0000 Subject: [PATCH 012/142] Remove child view from superview --- Container/Container-code/Container/MasterViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Container/Container-code/Container/MasterViewController.swift b/Container/Container-code/Container/MasterViewController.swift index 1eba174..332b13f 100644 --- a/Container/Container-code/Container/MasterViewController.swift +++ b/Container/Container-code/Container/MasterViewController.swift @@ -66,6 +66,7 @@ class MasterViewController: UIViewController { child.willMove(toParentViewController: nil) stackView.removeArrangedSubview(child.view) + child.view.removeFromSuperview() child.removeFromParentViewController() } From 62adf71eb54f6b498bb259eb4f279626ea0faf7d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 28 Feb 2017 10:49:11 +0000 Subject: [PATCH 013/142] Alternate approach with prepareForSegue: --- .../Container/MasterViewController.swift | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/Container/Container-SB/Container/MasterViewController.swift b/Container/Container-SB/Container/MasterViewController.swift index e6e49cb..3f7aebb 100644 --- a/Container/Container-SB/Container/MasterViewController.swift +++ b/Container/Container-SB/Container/MasterViewController.swift @@ -38,20 +38,36 @@ class MasterViewController: UIViewController { fileprivate var locationTableViewController: LocationTableViewController? fileprivate var mapViewController: MapViewController? - override func viewDidLoad() { - super.viewDidLoad() +// override func viewDidLoad() { +// super.viewDidLoad() +// +// guard let locationController = childViewControllers.first as? LocationTableViewController else { +// fatalError("Check storyboard for missing LocationTableViewController") +// } +// +// guard let mapController = childViewControllers.last as? MapViewController else { +// fatalError("Check storyboard for missing MapViewController") +// } +// +// locationTableViewController = locationController +// mapViewController = mapController +// locationController.delegate = self +// } - guard let locationController = childViewControllers.first as? LocationTableViewController else { - fatalError("Check storyboard for missing LocationTableViewController") - } + // Alternative to wiring up the interface in viewDidLoad (above) is to + // use prepare(for segue:sender:) which is still called for + // embed segues. - guard let mapController = childViewControllers.last as? MapViewController else { - fatalError("Check storyboard for missing MapViewController") + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + let destination = segue.destination + if let locationController = destination as? LocationTableViewController { + locationTableViewController = locationController + locationController.delegate = self } - locationTableViewController = locationController - mapViewController = mapController - locationController.delegate = self + if let mapController = destination as? MapViewController { + mapViewController = mapController + } } } From ea0f06864ea62c327988ad1e52c90acac3c78baf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 28 Feb 2017 10:57:58 +0000 Subject: [PATCH 014/142] Missing viewWillTransition --- .../Container-SB/Container/Base.lproj/Main.storyboard | 3 +++ .../Container-SB/Container/MasterViewController.swift | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/Container/Container-SB/Container/Base.lproj/Main.storyboard b/Container/Container-SB/Container/Base.lproj/Main.storyboard index 3aac46b..56b8b92 100644 --- a/Container/Container-SB/Container/Base.lproj/Main.storyboard +++ b/Container/Container-SB/Container/Base.lproj/Main.storyboard @@ -50,6 +50,9 @@ + + + diff --git a/Container/Container-SB/Container/MasterViewController.swift b/Container/Container-SB/Container/MasterViewController.swift index 3f7aebb..e60e9d9 100644 --- a/Container/Container-SB/Container/MasterViewController.swift +++ b/Container/Container-SB/Container/MasterViewController.swift @@ -35,6 +35,7 @@ import UIKit class MasterViewController: UIViewController { + @IBOutlet private weak var topStackView: UIStackView! fileprivate var locationTableViewController: LocationTableViewController? fileprivate var mapViewController: MapViewController? @@ -69,6 +70,15 @@ class MasterViewController: UIViewController { mapViewController = mapController } } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + topStackView.axis = axisForSize(size) + } + + private func axisForSize(_ size: CGSize) -> UILayoutConstraintAxis { + return size.width > size.height ? .horizontal : .vertical + } } extension MasterViewController: LocationProviderDelegate { From 86c8917c9a64505edf2603796cacd017cc66c9b8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 28 Feb 2017 11:08:31 +0000 Subject: [PATCH 015/142] Update stack view axis in viewDidLoad --- .../Container-SB/Container/Base.lproj/Main.storyboard | 1 - .../Container-SB/Container/MasterViewController.swift | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Container/Container-SB/Container/Base.lproj/Main.storyboard b/Container/Container-SB/Container/Base.lproj/Main.storyboard index 56b8b92..349f3da 100644 --- a/Container/Container-SB/Container/Base.lproj/Main.storyboard +++ b/Container/Container-SB/Container/Base.lproj/Main.storyboard @@ -38,7 +38,6 @@ - diff --git a/Container/Container-SB/Container/MasterViewController.swift b/Container/Container-SB/Container/MasterViewController.swift index e60e9d9..a55629f 100644 --- a/Container/Container-SB/Container/MasterViewController.swift +++ b/Container/Container-SB/Container/MasterViewController.swift @@ -39,9 +39,9 @@ class MasterViewController: UIViewController { fileprivate var locationTableViewController: LocationTableViewController? fileprivate var mapViewController: MapViewController? -// override func viewDidLoad() { -// super.viewDidLoad() -// + override func viewDidLoad() { + super.viewDidLoad() + // guard let locationController = childViewControllers.first as? LocationTableViewController else { // fatalError("Check storyboard for missing LocationTableViewController") // } @@ -53,7 +53,9 @@ class MasterViewController: UIViewController { // locationTableViewController = locationController // mapViewController = mapController // locationController.delegate = self -// } + + topStackView.axis = axisForSize(view.bounds.size) + } // Alternative to wiring up the interface in viewDidLoad (above) is to // use prepare(for segue:sender:) which is still called for From 587f3b72a19375c5720fe8701cfe3e59f4333eca Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 13 Mar 2017 20:11:09 +0000 Subject: [PATCH 016/142] Add RemindMe10 --- RemindMe10/RemindMe.xcodeproj/project.pbxproj | 477 ++++++++++++++++++ RemindMe10/RemindMe/AppDelegate.swift | 60 +++ .../AppIcon.appiconset/Contents.json | 93 ++++ .../Base.lproj/LaunchScreen.storyboard | 27 + .../RemindMe/Base.lproj/Main.storyboard | 101 ++++ RemindMe10/RemindMe/Info.plist | 46 ++ .../RemindMe/RemindMeViewController.swift | 120 +++++ .../RemindMe/UIAlertController+UYLAlert.swift | 47 ++ .../RemindMe/UNMutableNotification+UYL.swift | 73 +++ .../RemindMe/UYLNotificationDelegate.swift | 143 ++++++ RemindMe10/RemindMeObjc/AppDelegate.h | 40 ++ RemindMe10/RemindMeObjc/AppDelegate.m | 77 +++ .../AppIcon.appiconset/Contents.json | 68 +++ .../Base.lproj/LaunchScreen.storyboard | 27 + .../RemindMeObjc/Base.lproj/Main.storyboard | 101 ++++ RemindMe10/RemindMeObjc/Info.plist | 45 ++ .../RemindMeObjc/RemindMeViewController.h | 39 ++ .../RemindMeObjc/RemindMeViewController.m | 105 ++++ .../UNMutableNotificationContent+UYLHelper.h | 39 ++ .../UNMutableNotificationContent+UYLHelper.m | 48 ++ .../RemindMeObjc/UYLNotificationDelegate.h | 40 ++ .../RemindMeObjc/UYLNotificationDelegate.m | 47 ++ RemindMe10/RemindMeObjc/main.m | 42 ++ 23 files changed, 1905 insertions(+) create mode 100644 RemindMe10/RemindMe.xcodeproj/project.pbxproj create mode 100644 RemindMe10/RemindMe/AppDelegate.swift create mode 100644 RemindMe10/RemindMe/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 RemindMe10/RemindMe/Base.lproj/LaunchScreen.storyboard create mode 100644 RemindMe10/RemindMe/Base.lproj/Main.storyboard create mode 100644 RemindMe10/RemindMe/Info.plist create mode 100644 RemindMe10/RemindMe/RemindMeViewController.swift create mode 100644 RemindMe10/RemindMe/UIAlertController+UYLAlert.swift create mode 100644 RemindMe10/RemindMe/UNMutableNotification+UYL.swift create mode 100644 RemindMe10/RemindMe/UYLNotificationDelegate.swift create mode 100644 RemindMe10/RemindMeObjc/AppDelegate.h create mode 100644 RemindMe10/RemindMeObjc/AppDelegate.m create mode 100644 RemindMe10/RemindMeObjc/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 RemindMe10/RemindMeObjc/Base.lproj/LaunchScreen.storyboard create mode 100644 RemindMe10/RemindMeObjc/Base.lproj/Main.storyboard create mode 100644 RemindMe10/RemindMeObjc/Info.plist create mode 100644 RemindMe10/RemindMeObjc/RemindMeViewController.h create mode 100644 RemindMe10/RemindMeObjc/RemindMeViewController.m create mode 100644 RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.h create mode 100644 RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.m create mode 100644 RemindMe10/RemindMeObjc/UYLNotificationDelegate.h create mode 100644 RemindMe10/RemindMeObjc/UYLNotificationDelegate.m create mode 100644 RemindMe10/RemindMeObjc/main.m diff --git a/RemindMe10/RemindMe.xcodeproj/project.pbxproj b/RemindMe10/RemindMe.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d17847a --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.pbxproj @@ -0,0 +1,477 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 532E65951DB6C89000D63AC8 /* UYLNotificationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532E65941DB6C89000D63AC8 /* UYLNotificationDelegate.swift */; }; + 532E65971DB6CEC300D63AC8 /* UIAlertController+UYLAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532E65961DB6CEC300D63AC8 /* UIAlertController+UYLAlert.swift */; }; + 538B04F61DB55F210085BDA4 /* RemindMeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 538B04F51DB55F210085BDA4 /* RemindMeViewController.swift */; }; + 539D5EBD1DC4DBF500130F2F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 539D5EBC1DC4DBF500130F2F /* main.m */; }; + 539D5EC01DC4DBF500130F2F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 539D5EBF1DC4DBF500130F2F /* AppDelegate.m */; }; + 539D5EC61DC4DBF500130F2F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539D5EC41DC4DBF500130F2F /* Main.storyboard */; }; + 539D5EC81DC4DBF500130F2F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 539D5EC71DC4DBF500130F2F /* Assets.xcassets */; }; + 539D5ECB1DC4DBF500130F2F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539D5EC91DC4DBF500130F2F /* LaunchScreen.storyboard */; }; + 539D5ED21DC4E0CF00130F2F /* UYLNotificationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 539D5ED11DC4E0CF00130F2F /* UYLNotificationDelegate.m */; }; + 539D5ED51DC4E93000130F2F /* RemindMeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 539D5ED41DC4E93000130F2F /* RemindMeViewController.m */; }; + 539D5ED81DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 539D5ED71DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.m */; }; + 53BA9AF91DB283D7000BD07D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BA9AF81DB283D7000BD07D /* AppDelegate.swift */; }; + 53BA9AFE1DB283D7000BD07D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53BA9AFC1DB283D7000BD07D /* Main.storyboard */; }; + 53BA9B001DB283D7000BD07D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53BA9AFF1DB283D7000BD07D /* Assets.xcassets */; }; + 53BA9B031DB283D7000BD07D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53BA9B011DB283D7000BD07D /* LaunchScreen.storyboard */; }; + 53DE938E1DCBD7F300196391 /* UNMutableNotification+UYL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DE938D1DCBD7F300196391 /* UNMutableNotification+UYL.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 532E65941DB6C89000D63AC8 /* UYLNotificationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UYLNotificationDelegate.swift; sourceTree = ""; }; + 532E65961DB6CEC300D63AC8 /* UIAlertController+UYLAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIAlertController+UYLAlert.swift"; sourceTree = ""; }; + 538B04F51DB55F210085BDA4 /* RemindMeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindMeViewController.swift; sourceTree = ""; }; + 539D5EB91DC4DBF500130F2F /* RemindMeObjc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RemindMeObjc.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 539D5EBC1DC4DBF500130F2F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 539D5EBE1DC4DBF500130F2F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 539D5EBF1DC4DBF500130F2F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 539D5EC51DC4DBF500130F2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 539D5EC71DC4DBF500130F2F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 539D5ECA1DC4DBF500130F2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 539D5ECC1DC4DBF500130F2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 539D5ED01DC4E0CF00130F2F /* UYLNotificationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLNotificationDelegate.h; sourceTree = ""; }; + 539D5ED11DC4E0CF00130F2F /* UYLNotificationDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLNotificationDelegate.m; sourceTree = ""; }; + 539D5ED31DC4E93000130F2F /* RemindMeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemindMeViewController.h; sourceTree = ""; }; + 539D5ED41DC4E93000130F2F /* RemindMeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RemindMeViewController.m; sourceTree = ""; }; + 539D5ED61DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UNMutableNotificationContent+UYLHelper.h"; sourceTree = ""; }; + 539D5ED71DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UNMutableNotificationContent+UYLHelper.m"; sourceTree = ""; }; + 53BA9AF51DB283D7000BD07D /* RemindMe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RemindMe.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53BA9AF81DB283D7000BD07D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53BA9AFD1DB283D7000BD07D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53BA9AFF1DB283D7000BD07D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53BA9B021DB283D7000BD07D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53BA9B041DB283D7000BD07D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53DE938D1DCBD7F300196391 /* UNMutableNotification+UYL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UNMutableNotification+UYL.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 539D5EB61DC4DBF500130F2F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53BA9AF21DB283D7000BD07D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 539D5EBA1DC4DBF500130F2F /* RemindMeObjc */ = { + isa = PBXGroup; + children = ( + 539D5EBE1DC4DBF500130F2F /* AppDelegate.h */, + 539D5EBF1DC4DBF500130F2F /* AppDelegate.m */, + 539D5ED31DC4E93000130F2F /* RemindMeViewController.h */, + 539D5ED41DC4E93000130F2F /* RemindMeViewController.m */, + 539D5EC41DC4DBF500130F2F /* Main.storyboard */, + 539D5ED61DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.h */, + 539D5ED71DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.m */, + 539D5EC71DC4DBF500130F2F /* Assets.xcassets */, + 539D5EC91DC4DBF500130F2F /* LaunchScreen.storyboard */, + 539D5ECC1DC4DBF500130F2F /* Info.plist */, + 539D5EBB1DC4DBF500130F2F /* Supporting Files */, + 539D5ED01DC4E0CF00130F2F /* UYLNotificationDelegate.h */, + 539D5ED11DC4E0CF00130F2F /* UYLNotificationDelegate.m */, + ); + path = RemindMeObjc; + sourceTree = ""; + }; + 539D5EBB1DC4DBF500130F2F /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 539D5EBC1DC4DBF500130F2F /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 53BA9AEC1DB283D7000BD07D = { + isa = PBXGroup; + children = ( + 53BA9AF71DB283D7000BD07D /* RemindMe */, + 539D5EBA1DC4DBF500130F2F /* RemindMeObjc */, + 53BA9AF61DB283D7000BD07D /* Products */, + ); + sourceTree = ""; + }; + 53BA9AF61DB283D7000BD07D /* Products */ = { + isa = PBXGroup; + children = ( + 53BA9AF51DB283D7000BD07D /* RemindMe.app */, + 539D5EB91DC4DBF500130F2F /* RemindMeObjc.app */, + ); + name = Products; + sourceTree = ""; + }; + 53BA9AF71DB283D7000BD07D /* RemindMe */ = { + isa = PBXGroup; + children = ( + 53DE938D1DCBD7F300196391 /* UNMutableNotification+UYL.swift */, + 538B04F51DB55F210085BDA4 /* RemindMeViewController.swift */, + 532E65961DB6CEC300D63AC8 /* UIAlertController+UYLAlert.swift */, + 532E65941DB6C89000D63AC8 /* UYLNotificationDelegate.swift */, + 53BA9AF81DB283D7000BD07D /* AppDelegate.swift */, + 53BA9AFC1DB283D7000BD07D /* Main.storyboard */, + 53BA9AFF1DB283D7000BD07D /* Assets.xcassets */, + 53BA9B011DB283D7000BD07D /* LaunchScreen.storyboard */, + 53BA9B041DB283D7000BD07D /* Info.plist */, + ); + path = RemindMe; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 539D5EB81DC4DBF500130F2F /* RemindMeObjc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 539D5ECF1DC4DBF500130F2F /* Build configuration list for PBXNativeTarget "RemindMeObjc" */; + buildPhases = ( + 539D5EB51DC4DBF500130F2F /* Sources */, + 539D5EB61DC4DBF500130F2F /* Frameworks */, + 539D5EB71DC4DBF500130F2F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RemindMeObjc; + productName = RemindMeObjc; + productReference = 539D5EB91DC4DBF500130F2F /* RemindMeObjc.app */; + productType = "com.apple.product-type.application"; + }; + 53BA9AF41DB283D7000BD07D /* RemindMe */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53BA9B071DB283D7000BD07D /* Build configuration list for PBXNativeTarget "RemindMe" */; + buildPhases = ( + 53BA9AF11DB283D7000BD07D /* Sources */, + 53BA9AF21DB283D7000BD07D /* Frameworks */, + 53BA9AF31DB283D7000BD07D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RemindMe; + productName = RemindMe; + productReference = 53BA9AF51DB283D7000BD07D /* RemindMe.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53BA9AED1DB283D7000BD07D /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 0810; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 539D5EB81DC4DBF500130F2F = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + 53BA9AF41DB283D7000BD07D = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 53BA9AF01DB283D7000BD07D /* Build configuration list for PBXProject "RemindMe" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53BA9AEC1DB283D7000BD07D; + productRefGroup = 53BA9AF61DB283D7000BD07D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53BA9AF41DB283D7000BD07D /* RemindMe */, + 539D5EB81DC4DBF500130F2F /* RemindMeObjc */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 539D5EB71DC4DBF500130F2F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 539D5ECB1DC4DBF500130F2F /* LaunchScreen.storyboard in Resources */, + 539D5EC81DC4DBF500130F2F /* Assets.xcassets in Resources */, + 539D5EC61DC4DBF500130F2F /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53BA9AF31DB283D7000BD07D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53BA9B031DB283D7000BD07D /* LaunchScreen.storyboard in Resources */, + 53BA9B001DB283D7000BD07D /* Assets.xcassets in Resources */, + 53BA9AFE1DB283D7000BD07D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 539D5EB51DC4DBF500130F2F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 539D5ED81DC4ECE200130F2F /* UNMutableNotificationContent+UYLHelper.m in Sources */, + 539D5EC01DC4DBF500130F2F /* AppDelegate.m in Sources */, + 539D5EBD1DC4DBF500130F2F /* main.m in Sources */, + 539D5ED21DC4E0CF00130F2F /* UYLNotificationDelegate.m in Sources */, + 539D5ED51DC4E93000130F2F /* RemindMeViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53BA9AF11DB283D7000BD07D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53DE938E1DCBD7F300196391 /* UNMutableNotification+UYL.swift in Sources */, + 532E65971DB6CEC300D63AC8 /* UIAlertController+UYLAlert.swift in Sources */, + 53BA9AF91DB283D7000BD07D /* AppDelegate.swift in Sources */, + 532E65951DB6C89000D63AC8 /* UYLNotificationDelegate.swift in Sources */, + 538B04F61DB55F210085BDA4 /* RemindMeViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 539D5EC41DC4DBF500130F2F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 539D5EC51DC4DBF500130F2F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 539D5EC91DC4DBF500130F2F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 539D5ECA1DC4DBF500130F2F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 53BA9AFC1DB283D7000BD07D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53BA9AFD1DB283D7000BD07D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53BA9B011DB283D7000BD07D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53BA9B021DB283D7000BD07D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 539D5ECD1DC4DBF500130F2F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RemindMeObjc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 539D5ECE1DC4DBF500130F2F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RemindMeObjc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 53BA9B051DB283D7000BD07D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + 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 = 10.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53BA9B061DB283D7000BD07D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + 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 = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53BA9B081DB283D7000BD07D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RemindMe/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 53BA9B091DB283D7000BD07D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RemindMe/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 539D5ECF1DC4DBF500130F2F /* Build configuration list for PBXNativeTarget "RemindMeObjc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 539D5ECD1DC4DBF500130F2F /* Debug */, + 539D5ECE1DC4DBF500130F2F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53BA9AF01DB283D7000BD07D /* Build configuration list for PBXProject "RemindMe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53BA9B051DB283D7000BD07D /* Debug */, + 53BA9B061DB283D7000BD07D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53BA9B071DB283D7000BD07D /* Build configuration list for PBXNativeTarget "RemindMe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53BA9B081DB283D7000BD07D /* Debug */, + 53BA9B091DB283D7000BD07D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53BA9AED1DB283D7000BD07D /* Project object */; +} diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift new file mode 100644 index 0000000..b57cf86 --- /dev/null +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -0,0 +1,60 @@ +// +// AppDelegate.swift +// RemindMe +// +// 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 +import UserNotifications + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + let notificationDelegate = UYLNotificationDelegate() + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + let options: UNAuthorizationOptions = [.alert, .sound]; + registerForLocalNotifications(options: options) + let center = UNUserNotificationCenter.current() + center.delegate = notificationDelegate + notificationDelegate.registerCategories() + return true + } + + private func registerForLocalNotifications(options: UNAuthorizationOptions = [.alert, .sound]) { + let center = UNUserNotificationCenter.current() + center.requestAuthorization(options: options) { (granted, error) in + if !granted { + print("Unable to register") + } + } + } +} diff --git a/RemindMe10/RemindMe/Assets.xcassets/AppIcon.appiconset/Contents.json b/RemindMe10/RemindMe/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/RemindMe10/RemindMe/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/RemindMe10/RemindMe/Base.lproj/LaunchScreen.storyboard b/RemindMe10/RemindMe/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/RemindMe10/RemindMe/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RemindMe10/RemindMe/Base.lproj/Main.storyboard b/RemindMe10/RemindMe/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b721145 --- /dev/null +++ b/RemindMe10/RemindMe/Base.lproj/Main.storyboard @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RemindMe10/RemindMe/Info.plist b/RemindMe10/RemindMe/Info.plist new file mode 100644 index 0000000..3e33804 --- /dev/null +++ b/RemindMe10/RemindMe/Info.plist @@ -0,0 +1,46 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/RemindMe10/RemindMe/RemindMeViewController.swift b/RemindMe10/RemindMe/RemindMeViewController.swift new file mode 100644 index 0000000..e2663e1 --- /dev/null +++ b/RemindMe10/RemindMe/RemindMeViewController.swift @@ -0,0 +1,120 @@ +// +// RemindMeViewController.swift +// RemindMe +// +// 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 +import UserNotifications + +class RemindMeViewController: UIViewController { + + @IBOutlet private weak var reminderText: UITextField! + @IBOutlet private weak var scheduleControl: UISegmentedControl! + @IBOutlet private weak var datePicker: UIDatePicker! + + @IBAction private func scheduleNotification() { + + guard let body = reminderText.text, !body.isEmpty else { + return + } + + clearNotification() + + let content = UNMutableNotificationContent(body: body, title: "Don't forget") + content.categoryIdentifier = UYLNotificationCategory.reminder.rawValue + + // If we want this notification to repeat starting at a future date we schedule + // a non repeating notification at the initial fire date and include + // the repeat interval in the userInfo of the content. + + if let interval = UYLNotificationRepeatInterval(index: scheduleControl.selectedSegmentIndex), + interval != .none { + let userInfo = [UYLNotificationUserDataKey.repeatInterval.rawValue : interval.rawValue] + content.userInfo = userInfo + } + + let triggerDate = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: datePicker.date) + let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false) + + let request = UNNotificationRequest(identifier: UYLNotificationIdentifier.reminder.rawValue, content: content, trigger: trigger) + + UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in + if let error = error { + print(error) + } + self.show(body: body, error: error) + }) + } + + @IBAction private func clearNotification() { + UNUserNotificationCenter.current().removeAllPendingNotificationRequests() + reminderText.resignFirstResponder() + } + + private func show(body: String, error: Error?) { + var alertController: UIAlertController + let title = NSLocalizedString("Scheduled Reminder", comment: "Scheduled Reminder") + if let error = error { + alertController = UIAlertController(title: title, error: error) + } else { + alertController = UIAlertController(title: title, message: body) + } + + DispatchQueue.main.async { + self.present(alertController, animated: true) + } + } + + private func dumpNotifications() { + UNUserNotificationCenter.current().getPendingNotificationRequests { (requests) in + for request in requests { + print(request) + } + } + } + + override func viewDidLoad() { + super.viewDidLoad() + setupInterface() + } + + private func setupInterface() { + datePicker.minimumDate = Date() + } +} + +extension RemindMeViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } +} diff --git a/RemindMe10/RemindMe/UIAlertController+UYLAlert.swift b/RemindMe10/RemindMe/UIAlertController+UYLAlert.swift new file mode 100644 index 0000000..68db2b6 --- /dev/null +++ b/RemindMe10/RemindMe/UIAlertController+UYLAlert.swift @@ -0,0 +1,47 @@ +// +// UIAlertController+UYLALert.swift +// +// 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 + +extension UIAlertController { + + convenience init(title: String, message: String, okHandler: ((UIAlertAction) -> Void)? = nil) { + self.init(title: title, message: message, preferredStyle: .alert) + let okAction = UIAlertAction(title: NSLocalizedString("OK", comment: "OK Alert Button"), style: .cancel, handler: okHandler) + addAction(okAction) + } + + convenience init(title: String, error: Error, okHandler: ((UIAlertAction) -> Void)? = nil) { + let message = error.localizedDescription + self.init(title: title, message: message, okHandler: okHandler) + } +} diff --git a/RemindMe10/RemindMe/UNMutableNotification+UYL.swift b/RemindMe10/RemindMe/UNMutableNotification+UYL.swift new file mode 100644 index 0000000..58cf0df --- /dev/null +++ b/RemindMe10/RemindMe/UNMutableNotification+UYL.swift @@ -0,0 +1,73 @@ +// +// UNMutableNotification+UYL.swift +// +// 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 UserNotifications + +extension UNMutableNotificationContent { + + /// Create editable content for a user notification. This + /// is a convenience initializer for a simple notification + /// containing a title, body and default sound. + /// + /// - parameters: + /// - body: The message displayed in the notification alert. + /// - title: A short description of the reason for the alert. + /// - sound: The sound to play when the notification is + /// delivered. Defaults to `UNNotificationSound.default()`. + + convenience init(body: String, title: String, sound: UNNotificationSound = UNNotificationSound.default()) { + self.init() + self.title = NSString.localizedUserNotificationString(forKey: title, arguments: nil) + self.body = body + self.sound = sound + } + + /// Create editiable content for a user notification + /// from the content of an existing notification. + /// + /// - parameters: + /// - content: The content of a local or remote + /// notification. + + convenience init(content: UNNotificationContent) { + self.init() + self.title = content.title + self.subtitle = content.subtitle + self.body = content.body + self.sound = content.sound + self.badge = content.badge + self.launchImageName = content.launchImageName + self.categoryIdentifier = content.categoryIdentifier + self.threadIdentifier = content.threadIdentifier + } +} + diff --git a/RemindMe10/RemindMe/UYLNotificationDelegate.swift b/RemindMe10/RemindMe/UYLNotificationDelegate.swift new file mode 100644 index 0000000..502720a --- /dev/null +++ b/RemindMe10/RemindMe/UYLNotificationDelegate.swift @@ -0,0 +1,143 @@ +// +// UYLNotificationDelegate.swift +// +// 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 UserNotifications + +enum UYLNotificationIdentifier: String { + case reminder +} + +enum UYLNotificationUserDataKey: String { + case repeatInterval +} + +enum UYLNotificationRepeatInterval: String { + case none + case minute + case hour + case day + case week + + init?(index: Int) { + switch index { + case 0: self = .none + case 1: self = .minute + case 2: self = .hour + case 3: self = .day + case 4: self = .week + default: return nil + } + } +} + +enum UYLNotificationAction: String { + case snooze = "com.useyourloaf.actionSnooze" + case delete = "com.useyourloaf.actionDelete" +} + +enum UYLNotificationCategory: String { + case reminder = "com.useyourloaf.reminder" +} + +class UYLNotificationDelegate: NSObject, UNUserNotificationCenterDelegate { + + func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + rescheduleRepeating(notification: notification) + completionHandler([.alert,.sound]) + } + + func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { + + switch response.actionIdentifier { + case UNNotificationDismissActionIdentifier: + print("Dismiss Action") + case UNNotificationDefaultActionIdentifier: + print("Default Action") + case UYLNotificationAction.snooze.rawValue: + print("Snooze") + case UYLNotificationAction.delete.rawValue: + print("Delete") + let identifier = response.notification.request.identifier + UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [identifier]) + break + default: + rescheduleRepeating(notification: response.notification) + } + completionHandler() + } + + func registerCategories() { + let snoozeAction = UNNotificationAction(identifier: UYLNotificationAction.snooze.rawValue, title: "Snooze", options: []) + let deleteAction = UNNotificationAction(identifier: UYLNotificationAction.delete.rawValue, title: "Delete", options: [.destructive]) + let category = UNNotificationCategory(identifier: UYLNotificationCategory.reminder.rawValue, actions: [snoozeAction,deleteAction], intentIdentifiers: [], options: []) + UNUserNotificationCenter.current().setNotificationCategories([category]) + } + + private func rescheduleRepeating(notification: UNNotification) { + + let userInfo = notification.request.content.userInfo + let repeatKey = UYLNotificationUserDataKey.repeatInterval.rawValue + + guard let identifier = UYLNotificationIdentifier(rawValue: notification.request.identifier), + identifier == .reminder, + let repeatIntervalRawValue = userInfo[repeatKey] as? String, + let repeatInterval = UYLNotificationRepeatInterval(rawValue: repeatIntervalRawValue), + repeatInterval != .none else { + return + } + + let triggerDate = Calendar.current.dateComponents([.weekday,.day,.hour,.minute], from: notification.date) + + var date = DateComponents() + switch repeatInterval { + case .minute: + date.second = 0 + case .hour: + date.minute = triggerDate.minute + case .day: + date.hour = triggerDate.hour + date.minute = triggerDate.minute + case .week: + date.weekday = triggerDate.weekday + date.hour = triggerDate.hour + date.minute = triggerDate.minute + case .none: + return + } + + let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true) + let content = UNMutableNotificationContent(content: notification.request.content) + let request = UNNotificationRequest(identifier: UYLNotificationIdentifier.reminder.rawValue, content: content, trigger: trigger) + + UNUserNotificationCenter.current().add(request) + } +} diff --git a/RemindMe10/RemindMeObjc/AppDelegate.h b/RemindMe10/RemindMeObjc/AppDelegate.h new file mode 100644 index 0000000..d6e06d6 --- /dev/null +++ b/RemindMe10/RemindMeObjc/AppDelegate.h @@ -0,0 +1,40 @@ +// +// AppDelegate.h +// RemindMeObjc +// +// 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 + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end + diff --git a/RemindMe10/RemindMeObjc/AppDelegate.m b/RemindMe10/RemindMeObjc/AppDelegate.m new file mode 100644 index 0000000..c725a0f --- /dev/null +++ b/RemindMe10/RemindMeObjc/AppDelegate.m @@ -0,0 +1,77 @@ +// +// AppDelegate.m +// RemindMeObjc +// +// 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 UserNotifications; + +#import "AppDelegate.h" +#import "UYLNotificationDelegate.h" + +@interface AppDelegate () +@property (nonatomic,strong) id notificationDelegate; +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [self registerForLocalNotifications]; + self.notificationDelegate = [UYLNotificationDelegate new]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + center.delegate = self.notificationDelegate; + return YES; +} + +- (void)registerForLocalNotifications { + + UNAuthorizationOptions options = UNAuthorizationOptionAlert + UNAuthorizationOptionSound; + UNUserNotificationCenter *center = UNUserNotificationCenter.currentNotificationCenter; + [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) { + if (!granted) { + NSLog(@"Something went wrong"); + } + }]; + + UNNotificationAction *snoozeAction = [UNNotificationAction actionWithIdentifier:@"Snooze" title:@"Snooze" options:UNNotificationActionOptionNone]; + UNNotificationAction *deleteAction = [UNNotificationAction actionWithIdentifier:@"Delete" title:@"Delete" options:UNNotificationActionOptionDestructive]; + + UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"UYLReminderCategory" actions:@[snoozeAction,deleteAction] intentIdentifiers:@[] options:UNNotificationCategoryOptionNone]; + NSSet *categories = [NSSet setWithObject:category]; + [center setNotificationCategories:categories]; + +// let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: []) +// let deleteAction = UNNotificationAction(identifier: UYLNotificationAction.delete.rawValue, title: "Delete", options: [.destructive]) +// let category = UNNotificationCategory(identifier: UYLNotificationCategory.reminder.rawValue, actions: [snoozeAction,deleteAction], intentIdentifiers: [], options: []) +// UNUserNotificationCenter.current().setNotificationCategories([category]) + +} +@end diff --git a/RemindMe10/RemindMeObjc/Assets.xcassets/AppIcon.appiconset/Contents.json b/RemindMe10/RemindMeObjc/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/RemindMe10/RemindMeObjc/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/RemindMe10/RemindMeObjc/Base.lproj/LaunchScreen.storyboard b/RemindMe10/RemindMeObjc/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/RemindMe10/RemindMeObjc/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RemindMe10/RemindMeObjc/Base.lproj/Main.storyboard b/RemindMe10/RemindMeObjc/Base.lproj/Main.storyboard new file mode 100644 index 0000000..d193fc6 --- /dev/null +++ b/RemindMe10/RemindMeObjc/Base.lproj/Main.storyboard @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RemindMe10/RemindMeObjc/Info.plist b/RemindMe10/RemindMeObjc/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/RemindMe10/RemindMeObjc/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/RemindMe10/RemindMeObjc/RemindMeViewController.h b/RemindMe10/RemindMeObjc/RemindMeViewController.h new file mode 100644 index 0000000..69ec74a --- /dev/null +++ b/RemindMe10/RemindMeObjc/RemindMeViewController.h @@ -0,0 +1,39 @@ +// +// RemindMeViewController.h +// RemindMe +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface RemindMeViewController : UIViewController + +@end diff --git a/RemindMe10/RemindMeObjc/RemindMeViewController.m b/RemindMe10/RemindMeObjc/RemindMeViewController.m new file mode 100644 index 0000000..06b7f5b --- /dev/null +++ b/RemindMe10/RemindMeObjc/RemindMeViewController.m @@ -0,0 +1,105 @@ +// +// RemindMeViewController.m +// RemindMe +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "RemindMeViewController.h" +@import UserNotifications; + +@interface RemindMeViewController () +@property (weak, nonatomic) IBOutlet UITextField *reminderText; +@property (weak, nonatomic) IBOutlet UISegmentedControl *scheduleControl; +@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker; +@end + +@implementation RemindMeViewController + +- (IBAction)scheduleNotification { + + if (self.reminderText.text == nil || [self.reminderText.text isEqual:@""]) { + return; + } + + [self clearNotification]; + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + + UNMutableNotificationContent *content = [UNMutableNotificationContent new]; + content.title = @"Don't forget"; + content.body = self.reminderText.text; + content.sound = [UNNotificationSound defaultSound]; + + NSDateComponents *triggerDate = [[NSCalendar currentCalendar] components:NSCalendarUnitYear+NSCalendarUnitMonth+NSCalendarUnitDay+NSCalendarUnitHour+NSCalendarUnitMinute+NSCalendarUnitSecond fromDate:self.datePicker.date]; + UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerDate repeats:NO]; + + NSString *identifier = @"UYLLocalNotification"; + + UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger]; + + [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { + if (error != nil) { + NSLog(@"Something went wrong: %@",error); + } + }]; +} + + +- (IBAction)clearNotification { + [UNUserNotificationCenter.currentNotificationCenter removeAllPendingNotificationRequests]; + [self.reminderText resignFirstResponder]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self setupInterface]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { + if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) { + // Notifications not allowed + } + }]; +} + +- (void)setupInterface { + self.datePicker.minimumDate = [NSDate date]; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + [textField resignFirstResponder]; + return YES; +} + +@end diff --git a/RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.h b/RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.h new file mode 100644 index 0000000..fff2fde --- /dev/null +++ b/RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.h @@ -0,0 +1,39 @@ +// +// UNMutableNotificationContent+UYLHelper.h +// RemindMe +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UNMutableNotificationContent (UYLHelper) + +@end diff --git a/RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.m b/RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.m new file mode 100644 index 0000000..4277bdf --- /dev/null +++ b/RemindMe10/RemindMeObjc/UNMutableNotificationContent+UYLHelper.m @@ -0,0 +1,48 @@ +// +// UNMutableNotificationContent+UYLHelper.m +// RemindMe +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "UNMutableNotificationContent+UYLHelper.h" + +@implementation UNMutableNotificationContent (UYLHelper) + +- (instancetype)initWithBody:(NSString *)body title:(NSString *)title sound:(UNNotificationSound *)sound { + self = [super init]; + if (self) { + self.title = title; + self.body = body; + self.sound = sound; + } + return self; +} +@end diff --git a/RemindMe10/RemindMeObjc/UYLNotificationDelegate.h b/RemindMe10/RemindMeObjc/UYLNotificationDelegate.h new file mode 100644 index 0000000..ea756c7 --- /dev/null +++ b/RemindMe10/RemindMeObjc/UYLNotificationDelegate.h @@ -0,0 +1,40 @@ +// +// UYLNotificationDelegate.h +// RemindMe +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import +@import UserNotifications; + +@interface UYLNotificationDelegate : NSObject + +@end diff --git a/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m b/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m new file mode 100644 index 0000000..776c88a --- /dev/null +++ b/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m @@ -0,0 +1,47 @@ +// +// UYLNotificationDelegate.m +// RemindMe +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLNotificationDelegate.h" + +@implementation UYLNotificationDelegate + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { + completionHandler(UNNotificationPresentationOptionAlert + UNNotificationPresentationOptionSound); +} + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { + completionHandler(); +} + +@end diff --git a/RemindMe10/RemindMeObjc/main.m b/RemindMe10/RemindMeObjc/main.m new file mode 100644 index 0000000..7017275 --- /dev/null +++ b/RemindMe10/RemindMeObjc/main.m @@ -0,0 +1,42 @@ +// +// main.m +// RemindMeObjc +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} From 6522dfff94664a54645dd5713fd64368b90c5a4a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 16 Mar 2017 14:35:30 +0000 Subject: [PATCH 017/142] Update for Xcode 8 and Swift 3 --- Stacks/Stacks.xcodeproj/project.pbxproj | 230 +----------------- Stacks/Stacks/AppDelegate.swift | 18 +- Stacks/Stacks/Base.lproj/Main.storyboard | 106 +++----- Stacks/Stacks/HiddenViewController.swift | 10 +- .../Stacks/ScrollingStackViewController.swift | 8 +- Stacks/Stacks/ViewController.swift | 16 +- Stacks/StacksTests/Info.plist | 24 -- Stacks/StacksTests/StacksTests.swift | 35 --- Stacks/StacksUITests/Info.plist | 24 -- Stacks/StacksUITests/StacksUITests.swift | 35 --- 10 files changed, 72 insertions(+), 434 deletions(-) delete mode 100644 Stacks/StacksTests/Info.plist delete mode 100644 Stacks/StacksTests/StacksTests.swift delete mode 100644 Stacks/StacksUITests/Info.plist delete mode 100644 Stacks/StacksUITests/StacksUITests.swift diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index fadae18..95ecb7f 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -9,36 +9,15 @@ /* 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 */; }; - 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 */; }; 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 */; }; 53E9DC1B1C90E0FB00C9A89C /* ScrollingStackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.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 */ 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 = ""; }; @@ -51,12 +30,6 @@ 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 = ""; }; 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollingStackViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -68,20 +41,6 @@ ); 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 */ @@ -90,8 +49,6 @@ children = ( 53BB4E981C94C22D0019483F /* README.md */, 53DA13EC1B32184600FEEE79 /* Stacks */, - 53DA14011B32184600FEEE79 /* StacksTests */, - 53DA140C1B32184600FEEE79 /* StacksUITests */, 53DA13EB1B32184600FEEE79 /* Products */, ); sourceTree = ""; @@ -100,8 +57,6 @@ isa = PBXGroup; children = ( 53DA13EA1B32184600FEEE79 /* Stacks.app */, - 53DA13FE1B32184600FEEE79 /* StacksTests.xctest */, - 53DA14091B32184600FEEE79 /* StacksUITests.xctest */, ); name = Products; sourceTree = ""; @@ -123,24 +78,6 @@ 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 */ @@ -161,62 +98,19 @@ 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; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53DA13E91B32184600FEEE79 = { CreatedOnToolsVersion = 7.0; DevelopmentTeam = LCC2J94N44; - }; - 53DA13FD1B32184600FEEE79 = { - CreatedOnToolsVersion = 7.0; - TestTargetID = 53DA13E91B32184600FEEE79; - }; - 53DA14081B32184600FEEE79 = { - CreatedOnToolsVersion = 7.0; - TestTargetID = 53DA13E91B32184600FEEE79; + LastSwiftMigration = 0820; }; }; }; @@ -234,8 +128,6 @@ projectRoot = ""; targets = ( 53DA13E91B32184600FEEE79 /* Stacks */, - 53DA13FD1B32184600FEEE79 /* StacksTests */, - 53DA14081B32184600FEEE79 /* StacksUITests */, ); }; /* End PBXProject section */ @@ -252,21 +144,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 53DA13FC1B32184600FEEE79 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 53DA14071B32184600FEEE79 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -282,38 +159,8 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 53DA13FA1B32184600FEEE79 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53DA14031B32184600FEEE79 /* StacksTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 53DA14051B32184600FEEE79 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, - 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 */ 53B55B981BC1B89A0071291E /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -355,8 +202,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -400,8 +249,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -420,6 +271,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -434,6 +286,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -447,58 +300,11 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; 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 */ @@ -520,24 +326,6 @@ 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 index f9d2779..44d7e28 100644 --- a/Stacks/Stacks/AppDelegate.swift +++ b/Stacks/Stacks/AppDelegate.swift @@ -42,7 +42,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { case OpenTopRated init?(fullIdentifier: String) { - guard let shortIdentifier = fullIdentifier.componentsSeparatedByString(".").last else { + guard let shortIdentifier = fullIdentifier.components(separatedBy: ".").last else { return nil } self.init(rawValue: shortIdentifier) @@ -51,9 +51,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { + if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem { handleShortcut(shortcutItem) return false @@ -62,14 +62,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - func application(application: UIApplication, - performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, - completionHandler: (Bool) -> Void) { + func application(_ application: UIApplication, + performActionFor shortcutItem: UIApplicationShortcutItem, + completionHandler: @escaping (Bool) -> Void) { completionHandler(handleShortcut(shortcutItem)) } - private func handleShortcut(shortcutItem: UIApplicationShortcutItem) -> Bool { + @discardableResult fileprivate func handleShortcut(_ shortcutItem: UIApplicationShortcutItem) -> Bool { let shortcutType = shortcutItem.type guard let shortcutIdentifier = ShortcutIdentifier(fullIdentifier: shortcutType) else { @@ -79,7 +79,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return selectTabBarItemForIdentifier(shortcutIdentifier) } - private func selectTabBarItemForIdentifier(identifier: ShortcutIdentifier) -> Bool { + fileprivate func selectTabBarItemForIdentifier(_ identifier: ShortcutIdentifier) -> Bool { guard let tabBarController = self.window?.rootViewController as? UITabBarController else { return false @@ -97,4 +97,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } } -} \ No newline at end of file +} diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index d119908..efc7d33 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -1,8 +1,12 @@ - - + + + + + - + + @@ -14,11 +18,11 @@ - + - + @@ -32,7 +36,7 @@ - + @@ -56,23 +60,23 @@ - + - + - + - + @@ -93,7 +97,7 @@ - + @@ -118,64 +122,46 @@ - + - + - + - + - + - - - - - - - - - - + - - - - - - - - - - + @@ -192,7 +178,7 @@ - + @@ -240,41 +226,23 @@ - + - + - - - - - - - - - - + - - - - - - - - - - + - + @@ -299,7 +267,7 @@ - + diff --git a/Stacks/Stacks/HiddenViewController.swift b/Stacks/Stacks/HiddenViewController.swift index c79f8c1..dfd0964 100644 --- a/Stacks/Stacks/HiddenViewController.swift +++ b/Stacks/Stacks/HiddenViewController.swift @@ -42,15 +42,15 @@ class HiddenViewController: UIViewController { configureView(traitCollection.verticalSizeClass) } - override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { - super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator) + override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { + super.willTransition(to: newCollection, with: coordinator) configureView(newCollection.verticalSizeClass) } - private func configureView(verticalSizeClass: UIUserInterfaceSizeClass) { + fileprivate func configureView(_ verticalSizeClass: UIUserInterfaceSizeClass) { guard extraHeart != nil else { return } - extraHeart.hidden = (verticalSizeClass == .Compact) + extraHeart.isHidden = (verticalSizeClass == .compact) } -} \ No newline at end of file +} diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift index 554b609..39e3ea9 100644 --- a/Stacks/Stacks/ScrollingStackViewController.swift +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -38,21 +38,21 @@ class ScrollingStackViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var stackView: UIStackView! - @IBAction func singleTap(sender: UITapGestureRecognizer) { + @IBAction func singleTap(_ sender: UITapGestureRecognizer) { let heartImage = UIImage(named: "Heart") let heartImageView = UIImageView(image: heartImage) stackView.addArrangedSubview(heartImageView) scrollToEnd(heartImageView) } - @IBAction func twoFingerTap(sender: UITapGestureRecognizer) { + @IBAction func twoFingerTap(_ sender: UITapGestureRecognizer) { let starImage = UIImage(named: "Star") let starImageView = UIImageView(image: starImage) stackView.addArrangedSubview(starImageView) scrollToEnd(starImageView) } - @IBAction func threeFingerTap(sender: UITapGestureRecognizer) { + @IBAction func threeFingerTap(_ sender: UITapGestureRecognizer) { let views = stackView.arrangedSubviews for entry in views { stackView.removeArrangedSubview(entry) @@ -60,7 +60,7 @@ class ScrollingStackViewController: UIViewController { } } - private func scrollToEnd(addedView: UIView) { + fileprivate func scrollToEnd(_ addedView: UIView) { let contentViewHeight = scrollView.contentSize.height + addedView.bounds.height + stackView.spacing let offsetY = contentViewHeight - scrollView.bounds.height if (offsetY > 0) { diff --git a/Stacks/Stacks/ViewController.swift b/Stacks/Stacks/ViewController.swift index 2d1fa07..f4750d3 100644 --- a/Stacks/Stacks/ViewController.swift +++ b/Stacks/Stacks/ViewController.swift @@ -38,10 +38,10 @@ class ViewController: UIViewController { @IBOutlet weak var axisSwitch: UISwitch! @IBOutlet weak var stackView: UIStackView! - @IBAction func axisChange(sender: UISwitch) { - UIView.animateWithDuration(1.0) { + @IBAction func axisChange(_ sender: UISwitch) { + UIView.animate(withDuration: 1.0, animations: { self.updateConstraintsForAxis() - } + }) } override func viewDidLoad() { @@ -49,11 +49,11 @@ class ViewController: UIViewController { updateConstraintsForAxis() } - private func updateConstraintsForAxis() { - if (axisSwitch.on) { - stackView.axis = .Horizontal + fileprivate func updateConstraintsForAxis() { + if (axisSwitch.isOn) { + stackView.axis = .horizontal } else { - stackView.axis = .Vertical + stackView.axis = .vertical } } -} \ No newline at end of file +} diff --git a/Stacks/StacksTests/Info.plist b/Stacks/StacksTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Stacks/StacksTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Stacks/StacksTests/StacksTests.swift b/Stacks/StacksTests/StacksTests.swift deleted file mode 100644 index 01917ad..0000000 --- a/Stacks/StacksTests/StacksTests.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// 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 deleted file mode 100644 index ba72822..0000000 --- a/Stacks/StacksUITests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Stacks/StacksUITests/StacksUITests.swift b/Stacks/StacksUITests/StacksUITests.swift deleted file mode 100644 index 59661fb..0000000 --- a/Stacks/StacksUITests/StacksUITests.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// 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 cb07330533cc92e95903bd1d4ab11db19aa2d912 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 17 Mar 2017 20:43:03 +0000 Subject: [PATCH 018/142] Added TableHeader project --- TableHeader/README.md | 12 + .../TableHeaderObjC.xcodeproj/project.pbxproj | 363 +++++++++++++++++ .../TableHeaderObjC/AppDelegate.h | 39 ++ .../TableHeaderObjC/AppDelegate.m | 38 ++ .../AppIcon.appiconset/Contents.json | 93 +++++ .../Base.lproj/LaunchScreen.storyboard | 27 ++ .../Base.lproj/Main.storyboard | 101 +++++ .../TableHeaderObjC/DataCell.h | 42 ++ .../TableHeaderObjC/DataCell.m | 54 +++ .../TableHeaderObjC/Info.plist | 45 +++ .../TableHeaderObjC/ListDataSource.h | 39 ++ .../TableHeaderObjC/ListDataSource.m | 76 ++++ .../TableHeaderObjC/ListTableViewController.h | 39 ++ .../TableHeaderObjC/ListTableViewController.m | 108 +++++ .../TableHeaderObjC/TextTableHeader.h | 39 ++ .../TableHeaderObjC/TextTableHeader.m | 53 +++ .../TableHeaderObjC/TableHeaderObjC/main.m | 42 ++ .../TableHeader.xcodeproj/project.pbxproj | 371 ++++++++++++++++++ .../TableHeader/AppDelegate.swift | 40 ++ .../AppIcon.appiconset/Contents.json | 93 +++++ .../Base.lproj/LaunchScreen.storyboard | 27 ++ .../TableHeader/Base.lproj/Main.storyboard | 101 +++++ .../TableHeader/ConfigurableCell.swift | 38 ++ .../TableHeader/DataCell.swift | 55 +++ .../TableHeaderSwift/TableHeader/Info.plist | 45 +++ .../TableHeader/ListDataSource.swift | 69 ++++ .../TableHeader/ListTableViewController.swift | 109 +++++ .../TableHeader/ReusableIdentifier.swift | 43 ++ .../TableHeader/TextTableHeader.swift | 53 +++ 29 files changed, 2254 insertions(+) create mode 100644 TableHeader/README.md create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.h create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.m create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/LaunchScreen.storyboard create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.h create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.m create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/Info.plist create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.h create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.m create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.h create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.h create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.m create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC/main.m create mode 100644 TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj create mode 100644 TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift create mode 100644 TableHeader/TableHeaderSwift/TableHeader/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TableHeader/TableHeaderSwift/TableHeader/Base.lproj/LaunchScreen.storyboard create mode 100644 TableHeader/TableHeaderSwift/TableHeader/Base.lproj/Main.storyboard create mode 100644 TableHeader/TableHeaderSwift/TableHeader/ConfigurableCell.swift create mode 100644 TableHeader/TableHeaderSwift/TableHeader/DataCell.swift create mode 100644 TableHeader/TableHeaderSwift/TableHeader/Info.plist create mode 100644 TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift create mode 100644 TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift create mode 100644 TableHeader/TableHeaderSwift/TableHeader/ReusableIdentifier.swift create mode 100644 TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift diff --git a/TableHeader/README.md b/TableHeader/README.md new file mode 100644 index 0000000..4869471 --- /dev/null +++ b/TableHeader/README.md @@ -0,0 +1,12 @@ +### Container + +Example of creating a table view header with a variable height sized to fit +a text label subview. This folder contains both Swift and Objective-C projects. + +#### Further Information + +blog costing coming shortly... + +#### Version History + ++ Version 1.0 17 Mar 2017 Initial release diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8b69e77 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj @@ -0,0 +1,363 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 5362BE9C1E7C042700204B31 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362BE9B1E7C042700204B31 /* main.m */; }; + 5362BE9F1E7C042700204B31 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362BE9E1E7C042700204B31 /* AppDelegate.m */; }; + 5362BEA51E7C042700204B31 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5362BEA31E7C042700204B31 /* Main.storyboard */; }; + 5362BEA71E7C042700204B31 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5362BEA61E7C042700204B31 /* Assets.xcassets */; }; + 5362BEAA1E7C042700204B31 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5362BEA81E7C042700204B31 /* LaunchScreen.storyboard */; }; + 5362BEB51E7C04BC00204B31 /* ListTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362BEB41E7C04BC00204B31 /* ListTableViewController.m */; }; + 5362BEB91E7C050E00204B31 /* ListDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362BEB81E7C050E00204B31 /* ListDataSource.m */; }; + 5362BEBC1E7C1B3800204B31 /* DataCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362BEBB1E7C1B3800204B31 /* DataCell.m */; }; + 5362BEBF1E7C239100204B31 /* TextTableHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362BEBE1E7C239100204B31 /* TextTableHeader.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5362BE971E7C042700204B31 /* TableHeaderObjC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TableHeaderObjC.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5362BE9B1E7C042700204B31 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 5362BE9D1E7C042700204B31 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 5362BE9E1E7C042700204B31 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 5362BEA41E7C042700204B31 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5362BEA61E7C042700204B31 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5362BEA91E7C042700204B31 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5362BEAB1E7C042700204B31 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5362BEB31E7C04BC00204B31 /* ListTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListTableViewController.h; sourceTree = ""; }; + 5362BEB41E7C04BC00204B31 /* ListTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ListTableViewController.m; sourceTree = ""; }; + 5362BEB71E7C050E00204B31 /* ListDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListDataSource.h; sourceTree = ""; }; + 5362BEB81E7C050E00204B31 /* ListDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ListDataSource.m; sourceTree = ""; }; + 5362BEBA1E7C1B3800204B31 /* DataCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataCell.h; sourceTree = ""; }; + 5362BEBB1E7C1B3800204B31 /* DataCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataCell.m; sourceTree = ""; }; + 5362BEBD1E7C239100204B31 /* TextTableHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTableHeader.h; sourceTree = ""; }; + 5362BEBE1E7C239100204B31 /* TextTableHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextTableHeader.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5362BE941E7C042700204B31 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5362BE8E1E7C042700204B31 = { + isa = PBXGroup; + children = ( + 5362BE991E7C042700204B31 /* TableHeaderObjC */, + 5362BE981E7C042700204B31 /* Products */, + ); + sourceTree = ""; + }; + 5362BE981E7C042700204B31 /* Products */ = { + isa = PBXGroup; + children = ( + 5362BE971E7C042700204B31 /* TableHeaderObjC.app */, + ); + name = Products; + sourceTree = ""; + }; + 5362BE991E7C042700204B31 /* TableHeaderObjC */ = { + isa = PBXGroup; + children = ( + 5362BEB61E7C04CB00204B31 /* Controllers */, + 5362BEB11E7C044A00204B31 /* Delegates */, + 5362BEB21E7C049800204B31 /* Views */, + 5362BE9A1E7C042700204B31 /* Supporting Files */, + ); + path = TableHeaderObjC; + sourceTree = ""; + }; + 5362BE9A1E7C042700204B31 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 5362BEA61E7C042700204B31 /* Assets.xcassets */, + 5362BEAB1E7C042700204B31 /* Info.plist */, + 5362BE9B1E7C042700204B31 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 5362BEB11E7C044A00204B31 /* Delegates */ = { + isa = PBXGroup; + children = ( + 5362BE9D1E7C042700204B31 /* AppDelegate.h */, + 5362BE9E1E7C042700204B31 /* AppDelegate.m */, + 5362BEB71E7C050E00204B31 /* ListDataSource.h */, + 5362BEB81E7C050E00204B31 /* ListDataSource.m */, + ); + name = Delegates; + sourceTree = ""; + }; + 5362BEB21E7C049800204B31 /* Views */ = { + isa = PBXGroup; + children = ( + 5362BEA31E7C042700204B31 /* Main.storyboard */, + 5362BEA81E7C042700204B31 /* LaunchScreen.storyboard */, + 5362BEBA1E7C1B3800204B31 /* DataCell.h */, + 5362BEBB1E7C1B3800204B31 /* DataCell.m */, + 5362BEBD1E7C239100204B31 /* TextTableHeader.h */, + 5362BEBE1E7C239100204B31 /* TextTableHeader.m */, + ); + name = Views; + sourceTree = ""; + }; + 5362BEB61E7C04CB00204B31 /* Controllers */ = { + isa = PBXGroup; + children = ( + 5362BEB31E7C04BC00204B31 /* ListTableViewController.h */, + 5362BEB41E7C04BC00204B31 /* ListTableViewController.m */, + ); + name = Controllers; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5362BE961E7C042700204B31 /* TableHeaderObjC */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5362BEAE1E7C042700204B31 /* Build configuration list for PBXNativeTarget "TableHeaderObjC" */; + buildPhases = ( + 5362BE931E7C042700204B31 /* Sources */, + 5362BE941E7C042700204B31 /* Frameworks */, + 5362BE951E7C042700204B31 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TableHeaderObjC; + productName = TableHeaderObjC; + productReference = 5362BE971E7C042700204B31 /* TableHeaderObjC.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5362BE8F1E7C042700204B31 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 5362BE961E7C042700204B31 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 5362BE921E7C042700204B31 /* Build configuration list for PBXProject "TableHeaderObjC" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5362BE8E1E7C042700204B31; + productRefGroup = 5362BE981E7C042700204B31 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5362BE961E7C042700204B31 /* TableHeaderObjC */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5362BE951E7C042700204B31 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5362BEAA1E7C042700204B31 /* LaunchScreen.storyboard in Resources */, + 5362BEA71E7C042700204B31 /* Assets.xcassets in Resources */, + 5362BEA51E7C042700204B31 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5362BE931E7C042700204B31 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5362BE9F1E7C042700204B31 /* AppDelegate.m in Sources */, + 5362BEBC1E7C1B3800204B31 /* DataCell.m in Sources */, + 5362BEBF1E7C239100204B31 /* TextTableHeader.m in Sources */, + 5362BE9C1E7C042700204B31 /* main.m in Sources */, + 5362BEB91E7C050E00204B31 /* ListDataSource.m in Sources */, + 5362BEB51E7C04BC00204B31 /* ListTableViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5362BEA31E7C042700204B31 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5362BEA41E7C042700204B31 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5362BEA81E7C042700204B31 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5362BEA91E7C042700204B31 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5362BEAC1E7C042700204B31 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5362BEAD1E7C042700204B31 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5362BEAF1E7C042700204B31 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = TableHeaderObjC/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TableHeaderObjC; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 5362BEB01E7C042700204B31 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = TableHeaderObjC/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TableHeaderObjC; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5362BE921E7C042700204B31 /* Build configuration list for PBXProject "TableHeaderObjC" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5362BEAC1E7C042700204B31 /* Debug */, + 5362BEAD1E7C042700204B31 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5362BEAE1E7C042700204B31 /* Build configuration list for PBXNativeTarget "TableHeaderObjC" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5362BEAF1E7C042700204B31 /* Debug */, + 5362BEB01E7C042700204B31 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5362BE8F1E7C042700204B31 /* Project object */; +} diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.h b/TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.h new file mode 100644 index 0000000..0c8fe76 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.h @@ -0,0 +1,39 @@ +// +// AppDelegate.h +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.m new file mode 100644 index 0000000..eba1f80 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/AppDelegate.m @@ -0,0 +1,38 @@ +// +// AppDelegate.m +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "AppDelegate.h" + +@implementation AppDelegate +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/Assets.xcassets/AppIcon.appiconset/Contents.json b/TableHeader/TableHeaderObjC/TableHeaderObjC/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/LaunchScreen.storyboard b/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard b/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52b3d33 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.h b/TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.h new file mode 100644 index 0000000..70414f1 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.h @@ -0,0 +1,42 @@ +// +// DataCell.h +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface DataCell : UITableViewCell + ++ (NSString *)reuseIdentifier; +- (void)configure:(NSString *)title; + +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.m new file mode 100644 index 0000000..40e9941 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/DataCell.m @@ -0,0 +1,54 @@ +// +// DataCell.m +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#import "DataCell.h" + +@interface DataCell () +@property (weak, nonatomic) IBOutlet UILabel *titleLabel; +@end + +@implementation DataCell + ++ (NSString *)reuseIdentifier { + return NSStringFromClass([self class]); +} + +- (void)configure:(NSString *)title { + self.titleLabel.text = title; + + // Still need to do this manually for iOS 9 + self.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; +} + +@end + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/Info.plist b/TableHeader/TableHeaderObjC/TableHeaderObjC/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.h b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.h new file mode 100644 index 0000000..7dca1fa --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.h @@ -0,0 +1,39 @@ +// +// ListDataSource.h +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +@import UIKit; + +@interface ListDataSource : NSObject +- (instancetype)init:(UITableView *)tableView; +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.m new file mode 100644 index 0000000..a863135 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListDataSource.m @@ -0,0 +1,76 @@ +// +// ListDataSource.m +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "ListDataSource.h" +#import "DataCell.h" + +@interface ListDataSource () +@property (nonatomic, strong) UITableView *tableView; +@end + +@implementation ListDataSource + +- (instancetype)init:(UITableView *)tableView { + self = [super init]; + if (self) { + self.tableView = tableView; + tableView.dataSource = self; + [tableView reloadData]; + } + return self; +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return 50; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:[DataCell reuseIdentifier] forIndexPath:indexPath]; + [self configure:cell forIndexPath:indexPath]; + return cell; +} + +- (void)configure:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath { + if ([cell isKindOfClass:[DataCell class]]) { + DataCell *dataCell = (DataCell *)cell; + NSString *title = [NSString stringWithFormat:@"Title for row %ld",(long)indexPath.row]; + [dataCell configure:title]; + } +} + +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.h b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.h new file mode 100644 index 0000000..0219e37 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.h @@ -0,0 +1,39 @@ +// +// ListTableViewController.h +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +@import UIKit; + +@interface ListTableViewController : UITableViewController + +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m new file mode 100644 index 0000000..17a78fb --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m @@ -0,0 +1,108 @@ +// +// ListTableViewController.m +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "ListTableViewController.h" +#import "ListDataSource.h" + +@interface ListTableViewController () +@property (nonatomic,strong) ListDataSource *listDataSource; +@end + +@implementation ListTableViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.listDataSource = [[ListDataSource alloc] init:self.tableView]; + self.tableView.dataSource = self.listDataSource; + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 56.0; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentSizeDidChange:) name:UIContentSizeCategoryDidChangeNotification object:nil]; +} + +- (void)contentSizeDidChange:(NSNotification *)notification { + [self.tableView reloadData]; +} + +// viewDidLayoutSubviews() +// Called to notify the view controller that its view has just laid out its +// subviews. + +// When the bounds change for a view controller'€™s view, the view adjusts +// the positions of its subviews and then the system calls this method. +// However, this method being called does not indicate that the individual +// layouts of the view'€™s subviews have been adjusted. Each subview is +// responsible for adjusting its own layout. + +// Your view controller can override this method to make changes after the +// view lays out its subviews. + +// The default implementation of this method does nothing. + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + UIView *headerView = self.tableView.tableHeaderView; + if (headerView != nil) { + + // The table view header is created with the frame size set in + // the Storyboard. Calculate the new size and reset the header + // view to trigger the layout. + + // Calculate the minimum height of the header view that allows + // the text label to fit its preferred width. + + CGSize size = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; + + if (headerView.frame.size.height != size.height) { + CGRect frame = headerView.frame; + frame.size.height = size.height; + headerView.frame = frame; + + // Need to set the header view property of the table view + // to trigger the new layout. Be careful to only do this + // once when the height changes or we get stuck in a layout loop. + + self.tableView.tableHeaderView = headerView; + + // Now that the table view header is sized correctly have + // the table view redo its layout so that the cells are + // correcly positioned under the new header size. + + [self.tableView layoutIfNeeded]; + } + } +} + +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.h b/TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.h new file mode 100644 index 0000000..faf7414 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.h @@ -0,0 +1,39 @@ +// +// TextTableHeader.h +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +@import UIKit; + +@interface TextTableHeader : UIView + +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.m new file mode 100644 index 0000000..e0f7746 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/TextTableHeader.m @@ -0,0 +1,53 @@ +// +// TextTableHeader.m +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "TextTableHeader.h" + +@interface TextTableHeader () +@property (weak, nonatomic) IBOutlet UILabel *titleLabel; +@end + +@implementation TextTableHeader + +- (void)awakeFromNib { + [super awakeFromNib]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentSizeDidChange:) name:UIContentSizeCategoryDidChangeNotification object:nil]; +} + +- (void)contentSizeDidChange:(NSNotification *)notification { + self.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3]; +} + +@end diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/main.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/main.m new file mode 100644 index 0000000..b4ccdaf --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/main.m @@ -0,0 +1,42 @@ +// +// main.m +// TableHeaderObjC +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj new file mode 100644 index 0000000..038edf7 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj @@ -0,0 +1,371 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 53F945981E780436002E1728 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945971E780436002E1728 /* AppDelegate.swift */; }; + 53F9459D1E780436002E1728 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53F9459B1E780436002E1728 /* Main.storyboard */; }; + 53F9459F1E780436002E1728 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53F9459E1E780436002E1728 /* Assets.xcassets */; }; + 53F945A21E780436002E1728 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53F945A01E780436002E1728 /* LaunchScreen.storyboard */; }; + 53F945AD1E7805AB002E1728 /* ListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945AC1E7805AB002E1728 /* ListTableViewController.swift */; }; + 53F945B01E7805E8002E1728 /* ListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945AF1E7805E8002E1728 /* ListDataSource.swift */; }; + 53F945B21E7806F6002E1728 /* DataCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945B11E7806F6002E1728 /* DataCell.swift */; }; + 53F945B51E780713002E1728 /* ConfigurableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945B31E780713002E1728 /* ConfigurableCell.swift */; }; + 53F945B61E780713002E1728 /* ReusableIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945B41E780713002E1728 /* ReusableIdentifier.swift */; }; + 53F945B91E780AE3002E1728 /* TextTableHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F945B81E780AE3002E1728 /* TextTableHeader.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53F945941E780436002E1728 /* TableHeader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TableHeader.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53F945971E780436002E1728 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53F9459C1E780436002E1728 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53F9459E1E780436002E1728 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53F945A11E780436002E1728 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53F945A31E780436002E1728 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53F945AC1E7805AB002E1728 /* ListTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTableViewController.swift; sourceTree = ""; }; + 53F945AF1E7805E8002E1728 /* ListDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListDataSource.swift; sourceTree = ""; }; + 53F945B11E7806F6002E1728 /* DataCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataCell.swift; sourceTree = ""; }; + 53F945B31E780713002E1728 /* ConfigurableCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurableCell.swift; sourceTree = ""; }; + 53F945B41E780713002E1728 /* ReusableIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReusableIdentifier.swift; sourceTree = ""; }; + 53F945B81E780AE3002E1728 /* TextTableHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextTableHeader.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53F945911E780436002E1728 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53F9458B1E780436002E1728 = { + isa = PBXGroup; + children = ( + 53F945961E780436002E1728 /* TableHeader */, + 53F945951E780436002E1728 /* Products */, + ); + sourceTree = ""; + }; + 53F945951E780436002E1728 /* Products */ = { + isa = PBXGroup; + children = ( + 53F945941E780436002E1728 /* TableHeader.app */, + ); + name = Products; + sourceTree = ""; + }; + 53F945961E780436002E1728 /* TableHeader */ = { + isa = PBXGroup; + children = ( + 53F945B71E780719002E1728 /* Protocols and Extensions */, + 53F945A91E780562002E1728 /* Delegates */, + 53F945AE1E7805B6002E1728 /* Controllers */, + 53F945AA1E780570002E1728 /* Views */, + 53F945AB1E780583002E1728 /* Supporting Files */, + ); + path = TableHeader; + sourceTree = ""; + }; + 53F945A91E780562002E1728 /* Delegates */ = { + isa = PBXGroup; + children = ( + 53F945971E780436002E1728 /* AppDelegate.swift */, + 53F945AF1E7805E8002E1728 /* ListDataSource.swift */, + ); + name = Delegates; + sourceTree = ""; + }; + 53F945AA1E780570002E1728 /* Views */ = { + isa = PBXGroup; + children = ( + 53F945B11E7806F6002E1728 /* DataCell.swift */, + 53F945A01E780436002E1728 /* LaunchScreen.storyboard */, + 53F9459B1E780436002E1728 /* Main.storyboard */, + 53F945B81E780AE3002E1728 /* TextTableHeader.swift */, + ); + name = Views; + sourceTree = ""; + }; + 53F945AB1E780583002E1728 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 53F9459E1E780436002E1728 /* Assets.xcassets */, + 53F945A31E780436002E1728 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 53F945AE1E7805B6002E1728 /* Controllers */ = { + isa = PBXGroup; + children = ( + 53F945AC1E7805AB002E1728 /* ListTableViewController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; + 53F945B71E780719002E1728 /* Protocols and Extensions */ = { + isa = PBXGroup; + children = ( + 53F945B31E780713002E1728 /* ConfigurableCell.swift */, + 53F945B41E780713002E1728 /* ReusableIdentifier.swift */, + ); + name = "Protocols and Extensions"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53F945931E780436002E1728 /* TableHeader */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53F945A61E780436002E1728 /* Build configuration list for PBXNativeTarget "TableHeader" */; + buildPhases = ( + 53F945901E780436002E1728 /* Sources */, + 53F945911E780436002E1728 /* Frameworks */, + 53F945921E780436002E1728 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TableHeader; + productName = TableHeader; + productReference = 53F945941E780436002E1728 /* TableHeader.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53F9458C1E780436002E1728 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53F945931E780436002E1728 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 53F9458F1E780436002E1728 /* Build configuration list for PBXProject "TableHeader" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53F9458B1E780436002E1728; + productRefGroup = 53F945951E780436002E1728 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53F945931E780436002E1728 /* TableHeader */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53F945921E780436002E1728 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53F945A21E780436002E1728 /* LaunchScreen.storyboard in Resources */, + 53F9459F1E780436002E1728 /* Assets.xcassets in Resources */, + 53F9459D1E780436002E1728 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53F945901E780436002E1728 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53F945B51E780713002E1728 /* ConfigurableCell.swift in Sources */, + 53F945B61E780713002E1728 /* ReusableIdentifier.swift in Sources */, + 53F945981E780436002E1728 /* AppDelegate.swift in Sources */, + 53F945B91E780AE3002E1728 /* TextTableHeader.swift in Sources */, + 53F945B01E7805E8002E1728 /* ListDataSource.swift in Sources */, + 53F945AD1E7805AB002E1728 /* ListTableViewController.swift in Sources */, + 53F945B21E7806F6002E1728 /* DataCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53F9459B1E780436002E1728 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53F9459C1E780436002E1728 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53F945A01E780436002E1728 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53F945A11E780436002E1728 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53F945A41E780436002E1728 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53F945A51E780436002E1728 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53F945A71E780436002E1728 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = TableHeader/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TableHeader; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 53F945A81E780436002E1728 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = TableHeader/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TableHeader; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53F9458F1E780436002E1728 /* Build configuration list for PBXProject "TableHeader" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53F945A41E780436002E1728 /* Debug */, + 53F945A51E780436002E1728 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53F945A61E780436002E1728 /* Build configuration list for PBXNativeTarget "TableHeader" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53F945A71E780436002E1728 /* Debug */, + 53F945A81E780436002E1728 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53F9458C1E780436002E1728 /* Project object */; +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift b/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift new file mode 100644 index 0000000..6945ded --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift @@ -0,0 +1,40 @@ +// +// AppDelegate.swift +// TableHeader +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/Assets.xcassets/AppIcon.appiconset/Contents.json b/TableHeader/TableHeaderSwift/TableHeader/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/TableHeader/TableHeaderSwift/TableHeader/Base.lproj/LaunchScreen.storyboard b/TableHeader/TableHeaderSwift/TableHeader/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader/Base.lproj/Main.storyboard b/TableHeader/TableHeaderSwift/TableHeader/Base.lproj/Main.storyboard new file mode 100644 index 0000000..2eae62d --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/Base.lproj/Main.storyboard @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader/ConfigurableCell.swift b/TableHeader/TableHeaderSwift/TableHeader/ConfigurableCell.swift new file mode 100644 index 0000000..eced6d5 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/ConfigurableCell.swift @@ -0,0 +1,38 @@ +// +// ConfigurableCell.swift +// +// 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 Foundation + +protocol ConfigurableCell { + associatedtype Object + func configure(object: Object) +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift b/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift new file mode 100644 index 0000000..e6d8880 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift @@ -0,0 +1,55 @@ +// +// DataCell.swift +// AdjustScroll +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class DataCell: UITableViewCell, ReusableIdentifier { + + @IBOutlet fileprivate weak var title: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + if #available(iOS 10.0, *) { + title.adjustsFontForContentSizeCategory = true + } + } +} + +extension DataCell: ConfigurableCell { + func configure(object: String) { + title.text = object + + // Still need to do this manually for iOS 9 + title.font = UIFont.preferredFont(forTextStyle: .body) + } +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/Info.plist b/TableHeader/TableHeaderSwift/TableHeader/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift b/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift new file mode 100644 index 0000000..b5e55c3 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift @@ -0,0 +1,69 @@ +// +// ListDataSource.swift +// TableHeader +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit; + +class ListDataSource: NSObject { + + fileprivate let tableView: UITableView + + init(tableView: UITableView) { + self.tableView = tableView + super.init() + tableView.dataSource = self + tableView.reloadData() + } +} + +extension ListDataSource: UITableViewDataSource { + + func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 50 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: DataCell.reuseIdentifier, for: indexPath) + configure(cell: cell, indexPath: indexPath) + return cell + } + + private func configure(cell: UITableViewCell, indexPath: IndexPath) { + if let cell = cell as? DataCell { + cell.configure(object: "Title for row \(indexPath.row)") + } + } +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift new file mode 100644 index 0000000..97202ce --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift @@ -0,0 +1,109 @@ +// +// ListTableViewController.swift +// TableHeader +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class ListTableViewController: UITableViewController { + + private var listDataSource: ListDataSource? + + override func viewDidLoad() { + super.viewDidLoad() + listDataSource = ListDataSource(tableView: tableView) + tableView.dataSource = listDataSource + tableView.rowHeight = UITableViewAutomaticDimension + tableView.estimatedRowHeight = 56 + + guard #available(iOS 10.0, *) else { + + // Manually observe the UIContentSizeCategoryDidChange + // notification for iOS 9. + + NotificationCenter.default.addObserver(self,selector:#selector(contentSizeDidChange(notification:)),name: NSNotification.Name.UIContentSizeCategoryDidChange,object: nil) + return + } + + } + + @objc private func contentSizeDidChange(notification: NSNotification) { + tableView.reloadData() + } + + // viewDidLayoutSubviews() + // Called to notify the view controller that its view has just laid out its + // subviews. + + // When the bounds change for a view controller'€™s view, the view adjusts + // the positions of its subviews and then the system calls this method. + // However, this method being called does not indicate that the individual + // layouts of the view'€™s subviews have been adjusted. Each subview is + // responsible for adjusting its own layout. + + // Your view controller can override this method to make changes after the + // view lays out its subviews. + + // The default implementation of this method does nothing. + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + guard let headerView = tableView.tableHeaderView else { + return + } + + // The table view header is created with the frame size set in + // the Storyboard. Calculate the new size and reset the header + // view to trigger the layout. + + // Calculate the minimum height of the header view that allows + // the text label to fit its preferred width. + + let size = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize) + + if headerView.frame.size.height != size.height { + headerView.frame.size.height = size.height + + // Need to set the header view property of the table view + // to trigger the new layout. Be careful to only do this + // once when the height changes or we get stuck in a layout loop. + + tableView.tableHeaderView = headerView + + // Now that the table view header is sized correctly have + // the table view redo its layout so that the cells are + // correcly positioned for the new header size. + + tableView.layoutIfNeeded() + } + } +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/ReusableIdentifier.swift b/TableHeader/TableHeaderSwift/TableHeader/ReusableIdentifier.swift new file mode 100644 index 0000000..893e7f4 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/ReusableIdentifier.swift @@ -0,0 +1,43 @@ +// +// ReusableIdentifier.swift +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016-2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +protocol ReusableIdentifier: class { + static var reuseIdentifier: String { get } +} + +extension ReusableIdentifier { + static var reuseIdentifier: String { + return "\(self)" + } +} diff --git a/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift b/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift new file mode 100644 index 0000000..eaca78b --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift @@ -0,0 +1,53 @@ +// +// TextTableHeader.swift +// TableHeader +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class TextTableHeader: UIView { + + @IBOutlet private weak var title: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + if #available(iOS 10.0, *) { + title.adjustsFontForContentSizeCategory = true + } else { + NotificationCenter.default.addObserver(self,selector:#selector(contentSizeDidChange(notification:)),name: NSNotification.Name.UIContentSizeCategoryDidChange,object: nil) + } + } + + // Still need to do this manually for iOS 9 + @objc private func contentSizeDidChange(notification: NSNotification) { + title.font = UIFont.preferredFont(forTextStyle: .title3) + } +} From 7fe2233d771b34de2a4e5212eac08a9de32b6555 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 17 Mar 2017 21:21:36 +0000 Subject: [PATCH 019/142] layoutIfNeeded for iOS 9 only --- .../TableHeaderObjC/TableHeaderObjC/ListTableViewController.m | 4 +++- .../TableHeader/ListTableViewController.swift | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m index 17a78fb..329d24a 100644 --- a/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/ListTableViewController.m @@ -98,7 +98,9 @@ - (void)viewDidLayoutSubviews { // Now that the table view header is sized correctly have // the table view redo its layout so that the cells are - // correcly positioned under the new header size. + // correcly positioned for the new header size. + + // This only seems to be necessary on iOS 9. [self.tableView layoutIfNeeded]; } diff --git a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift index 97202ce..b16ef58 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift @@ -103,6 +103,8 @@ class ListTableViewController: UITableViewController { // the table view redo its layout so that the cells are // correcly positioned for the new header size. + // This only seems to be necessary on iOS 9. + tableView.layoutIfNeeded() } } From 743125fdbdd86b5dc03439dffc8320819de2d035 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 20 Mar 2017 10:15:51 +0000 Subject: [PATCH 020/142] Added link to post --- TableHeader/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TableHeader/README.md b/TableHeader/README.md index 4869471..56fc831 100644 --- a/TableHeader/README.md +++ b/TableHeader/README.md @@ -5,7 +5,9 @@ a text label subview. This folder contains both Swift and Objective-C projects. #### Further Information -blog costing coming shortly... +See the following blog post: + ++ [Variable Height Table View Header](https://useyourloaf.com/blog/variable-height-table-view-header/) #### Version History From 5e740c36eafacd901a2af2587290ab6ae9d445ee Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 3 Apr 2017 09:38:51 +0100 Subject: [PATCH 021/142] Added RevealStack --- RevealStack/README.md | 13 + .../RevealStack.xcodeproj/project.pbxproj | 318 ++++++++++++++++++ RevealStack/RevealStack/AppDelegate.swift | 40 +++ .../AppIcon.appiconset/Contents.json | 93 +++++ .../RevealStack/Assets.xcassets/Contents.json | 6 + .../Heart.imageset/Contents.json | 23 ++ .../Heart.imageset/heart100.png | Bin 0 -> 1135 bytes .../Heart.imageset/heart200.png | Bin 0 -> 1958 bytes .../Heart.imageset/heart300.png | Bin 0 -> 2655 bytes .../Star.imageset/Contents.json | 23 ++ .../Assets.xcassets/Star.imageset/star100.png | Bin 0 -> 1306 bytes .../Assets.xcassets/Star.imageset/star200.png | Bin 0 -> 2143 bytes .../Assets.xcassets/Star.imageset/star300.png | Bin 0 -> 2794 bytes .../Base.lproj/LaunchScreen.storyboard | 27 ++ .../RevealStack/Base.lproj/Main.storyboard | 90 +++++ RevealStack/RevealStack/Info.plist | 45 +++ .../RevealStack/RevealViewController.swift | 85 +++++ .../RevealStack/UIView+UYLExtensions.swift | 45 +++ 18 files changed, 808 insertions(+) create mode 100644 RevealStack/README.md create mode 100644 RevealStack/RevealStack.xcodeproj/project.pbxproj create mode 100644 RevealStack/RevealStack/AppDelegate.swift create mode 100644 RevealStack/RevealStack/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 RevealStack/RevealStack/Assets.xcassets/Contents.json create mode 100644 RevealStack/RevealStack/Assets.xcassets/Heart.imageset/Contents.json create mode 100644 RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart100.png create mode 100644 RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart200.png create mode 100644 RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart300.png create mode 100644 RevealStack/RevealStack/Assets.xcassets/Star.imageset/Contents.json create mode 100644 RevealStack/RevealStack/Assets.xcassets/Star.imageset/star100.png create mode 100644 RevealStack/RevealStack/Assets.xcassets/Star.imageset/star200.png create mode 100644 RevealStack/RevealStack/Assets.xcassets/Star.imageset/star300.png create mode 100644 RevealStack/RevealStack/Base.lproj/LaunchScreen.storyboard create mode 100644 RevealStack/RevealStack/Base.lproj/Main.storyboard create mode 100644 RevealStack/RevealStack/Info.plist create mode 100644 RevealStack/RevealStack/RevealViewController.swift create mode 100644 RevealStack/RevealStack/UIView+UYLExtensions.swift diff --git a/RevealStack/README.md b/RevealStack/README.md new file mode 100644 index 0000000..8e4c4af --- /dev/null +++ b/RevealStack/README.md @@ -0,0 +1,13 @@ +### RevealStack - Background Views for Stack Views + +An example of adding subviews to a stack view without adding them to +`arrangedSubviews`. This is useful when you want the stack view to have +a background view or to add an overlay. + +See the following post for more: + ++ [Stack View Background Color](https://useyourloaf.com/blog/stack-view-background-color/) + +### Version History + ++ Version 1.0 03-Apr-2017 Initial Version diff --git a/RevealStack/RevealStack.xcodeproj/project.pbxproj b/RevealStack/RevealStack.xcodeproj/project.pbxproj new file mode 100644 index 0000000..12c97d1 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.pbxproj @@ -0,0 +1,318 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 535B225D1E915D1C002F6D4C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535B225C1E915D1C002F6D4C /* AppDelegate.swift */; }; + 535B22621E915D1C002F6D4C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 535B22601E915D1C002F6D4C /* Main.storyboard */; }; + 535B22641E915D1C002F6D4C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 535B22631E915D1C002F6D4C /* Assets.xcassets */; }; + 535B22671E915D1C002F6D4C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 535B22651E915D1C002F6D4C /* LaunchScreen.storyboard */; }; + 535B226F1E915D7B002F6D4C /* RevealViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535B226E1E915D7B002F6D4C /* RevealViewController.swift */; }; + 535B22711E915DA7002F6D4C /* UIView+UYLExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535B22701E915DA7002F6D4C /* UIView+UYLExtensions.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 535B22591E915D1C002F6D4C /* RevealStack.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RevealStack.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 535B225C1E915D1C002F6D4C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 535B22611E915D1C002F6D4C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 535B22631E915D1C002F6D4C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 535B22661E915D1C002F6D4C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 535B22681E915D1C002F6D4C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 535B226E1E915D7B002F6D4C /* RevealViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RevealViewController.swift; sourceTree = ""; }; + 535B22701E915DA7002F6D4C /* UIView+UYLExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+UYLExtensions.swift"; sourceTree = ""; }; + 535B22721E923F62002F6D4C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 535B22561E915D1C002F6D4C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 535B22501E915D1C002F6D4C = { + isa = PBXGroup; + children = ( + 535B22721E923F62002F6D4C /* README.md */, + 535B225B1E915D1C002F6D4C /* RevealStack */, + 535B225A1E915D1C002F6D4C /* Products */, + ); + sourceTree = ""; + }; + 535B225A1E915D1C002F6D4C /* Products */ = { + isa = PBXGroup; + children = ( + 535B22591E915D1C002F6D4C /* RevealStack.app */, + ); + name = Products; + sourceTree = ""; + }; + 535B225B1E915D1C002F6D4C /* RevealStack */ = { + isa = PBXGroup; + children = ( + 535B226E1E915D7B002F6D4C /* RevealViewController.swift */, + 535B225C1E915D1C002F6D4C /* AppDelegate.swift */, + 535B22701E915DA7002F6D4C /* UIView+UYLExtensions.swift */, + 535B22601E915D1C002F6D4C /* Main.storyboard */, + 535B22631E915D1C002F6D4C /* Assets.xcassets */, + 535B22651E915D1C002F6D4C /* LaunchScreen.storyboard */, + 535B22681E915D1C002F6D4C /* Info.plist */, + ); + path = RevealStack; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 535B22581E915D1C002F6D4C /* RevealStack */ = { + isa = PBXNativeTarget; + buildConfigurationList = 535B226B1E915D1C002F6D4C /* Build configuration list for PBXNativeTarget "RevealStack" */; + buildPhases = ( + 535B22551E915D1C002F6D4C /* Sources */, + 535B22561E915D1C002F6D4C /* Frameworks */, + 535B22571E915D1C002F6D4C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RevealStack; + productName = RevealStack; + productReference = 535B22591E915D1C002F6D4C /* RevealStack.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 535B22511E915D1C002F6D4C /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 535B22581E915D1C002F6D4C = { + CreatedOnToolsVersion = 8.3; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 535B22541E915D1C002F6D4C /* Build configuration list for PBXProject "RevealStack" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 535B22501E915D1C002F6D4C; + productRefGroup = 535B225A1E915D1C002F6D4C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 535B22581E915D1C002F6D4C /* RevealStack */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 535B22571E915D1C002F6D4C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 535B22671E915D1C002F6D4C /* LaunchScreen.storyboard in Resources */, + 535B22641E915D1C002F6D4C /* Assets.xcassets in Resources */, + 535B22621E915D1C002F6D4C /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 535B22551E915D1C002F6D4C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 535B225D1E915D1C002F6D4C /* AppDelegate.swift in Sources */, + 535B226F1E915D7B002F6D4C /* RevealViewController.swift in Sources */, + 535B22711E915DA7002F6D4C /* UIView+UYLExtensions.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 535B22601E915D1C002F6D4C /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 535B22611E915D1C002F6D4C /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 535B22651E915D1C002F6D4C /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 535B22661E915D1C002F6D4C /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 535B22691E915D1C002F6D4C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 535B226A1E915D1C002F6D4C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 535B226C1E915D1C002F6D4C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RevealStack/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RevealStack; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 535B226D1E915D1C002F6D4C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = RevealStack/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RevealStack; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 535B22541E915D1C002F6D4C /* Build configuration list for PBXProject "RevealStack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 535B22691E915D1C002F6D4C /* Debug */, + 535B226A1E915D1C002F6D4C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 535B226B1E915D1C002F6D4C /* Build configuration list for PBXNativeTarget "RevealStack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 535B226C1E915D1C002F6D4C /* Debug */, + 535B226D1E915D1C002F6D4C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 535B22511E915D1C002F6D4C /* Project object */; +} diff --git a/RevealStack/RevealStack/AppDelegate.swift b/RevealStack/RevealStack/AppDelegate.swift new file mode 100644 index 0000000..5bd45f7 --- /dev/null +++ b/RevealStack/RevealStack/AppDelegate.swift @@ -0,0 +1,40 @@ +// +// AppDelegate.swift +// RevealStack +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? +} diff --git a/RevealStack/RevealStack/Assets.xcassets/AppIcon.appiconset/Contents.json b/RevealStack/RevealStack/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/RevealStack/RevealStack/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/RevealStack/RevealStack/Assets.xcassets/Contents.json b/RevealStack/RevealStack/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RevealStack/RevealStack/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/Contents.json b/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/Contents.json new file mode 100644 index 0000000..581c8f1 --- /dev/null +++ b/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "heart100.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "heart200.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "heart300.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart100.png b/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart100.png new file mode 100644 index 0000000000000000000000000000000000000000..d6be769605f6debffe0476e66459073bd52d11e3 GIT binary patch literal 1135 zcmV-#1d#iQP)OcbPJpk%I0^VyZ&8KF*+nB|{e&Sjj>OTSLK?K}zG0doE zz22I}zplVKM+wiLUc zVI#!EfyuXY=|u?OVkE-PjOs!K=|l$1t7+y>5yZ!Y)r?HN;GNE)VCP8-#=U#ighR!{ zfWyd!&!Atv+n3~5801wK$Gv;YtZUwFF1_EI<5(K#NDIHzk-^fB&7@+|l~ljhlE2lG z#=m{O+LzXbM%0T--fS()uWjl>2G@i|;A17d+?c}7i^jly$+L0Cx_HRAcEietzS)-C zaWdX&E5pf!#Kwc=R2IO~klS@O-e@Vtym{VjE#*-Yz2KbObT#8w8PaE(~?ofzI@h)N6W5k&7)%5b2HPBP|%uM+;cR}qG8&2ILoYR z*?T+5wR6~iK<7#f)Q?Z!W+&=E1I(>!#m0l?P7uP)isV)pz}A!6c{#g^KjHuY0$fQ% zK~#7F?bhR>1P2rZ;l8%n*S2ljwr$(7?Wc{o8Sb17=X-(rTlhz^*=#nOo4bdnm$#3v zpML-}1O^3%gocGjM0y0kq^RhaSpFg|J|Pi`l0uVH_>0uE^b8o6nMDWLIk|9@m!3}t z1%)uEsJMiGR$7*aKPa!Dg32lwQC&l2wRQL%-+C%)XoSAPRH|ue#;;nas-+b=+DfRd zy#qgspoUIp>q@1T(r)~yhngaxrMHjT`rQCvAeEX@2B9I8dWHZDk5I?x7*vg?Qr849 zNnJTmclUHIi*x(4_iTVBV`VCGIsiAuop}l)Mh7T)ZK0jJk%?Xw;j4 zctyV*laeN?K`6buTcK0J!b#_002ovPDHLkV1lPP BF;oBm literal 0 HcmV?d00001 diff --git a/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart200.png b/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart200.png new file mode 100644 index 0000000000000000000000000000000000000000..932019f94132479fa12c96df192546a77164dad4 GIT binary patch literal 1958 zcmV;X2U+-uP)LEdR9M z)r?HuZ7$_h7V1I;=tc?FghR=)aJ}4^$+vXWi%Z~PBkDi{!O)G%t7+MNJ?2jl-fS(* zsb{_3n%0O%=1mXHsAj$2o4wzh%CT?Ub2RBe1m{W&)`mvH&5FF?oy@Ik;$0upkx;(c zm(rG1*?vCaS{%}qRnw4A=tv9Kgha&0gym5a=1vgXb2GozlEBlD+;1?z)|0}|jLEce z$+B_hOAh5w62`oF$GdpalvC{ZJk6tG;9?`(a539*GtQ=D;$9%! zaWdX&E6TBO;$0rudOO3)hv-KM+ITqQSQ^}NGRv=R)rm;Rw{_rQBI!g1zt@w~l2P4n zFzQ1F!^nonwR7o32j6HY%dBhQWhUcX9pqFNVbGdc-e@VvyCRO*+L;y1Jda(1GNxVHnmeiB3J6iqh2YPKSD= z!lYQ|Oe*Nv3nl5@kP7Vp8qkQ$B>=FL zMl6E5@G_dQ96)YIno$wTYSWYzKn4w231zEj%IY?eH8iCK6s@H>>sHX1Stv$W;k>RN zD#Ms(QlMrgh1vuq^(fUEDA`Q0>On;ZinRqQwoP_v;X z_b^48-yDi|Q>1ZFRj)cFIs#>rC{T@&P_}{s?S;BFhbd15XlOujra;HhsN8;5z`H4j zW6*Mp!W@UDu@q%~UuZfJr6ebz?Gy!Bd>Y!$B+Hy(R9A~)Eb9#y$}Of8>*2~A3Xv6t zE8#e0I186nP=s@B;8q`*GuP@;&NJ~Yz<`|s+QJ+d5Sb^lx2W!7G85}u3}&=sLRH@n zLq=YbIpd)2#9}7SvxP8cGZUuzT$ps3iSjgz3SVJjtf>pLjwLe@k}JTpPE3TWFfR8R z{kJ><^LqE7->#pA7j7)3zoK*DjYkA;!-U`s5!WK{O73O)=jH-W!Xh|DWwN} zk_vC#T1;QuhSwgcP9NOKh35{?d-Fy@f!s>CdvExnE4`Jq9sbC@OE1m82fwr#OYdxK z3;)EH(<{~Q!%u||WUe2m>vf5qXb->jK1UA}z<;OD$qa|O7uLuOhq`hv3Rpc5m?kel zoxpNZeJ4;BLK0nv#Oi&CCJZ}*M0uE?5TSPr8!;q!*9qQ;a64HdGQe9dI^5pKNss@m04wXcALaK#S zkoh{~I#8WXO@9NDy}6Ojq+f(=^)u&_BH-$G!doMW*X=OI9PJzz1i?jcYL-)50kPeZ`O+OY^pRS`ImclbZ;Mk0uA^FQX~ zBADK-&VShW9s(;PlYcqC0|EB_GX5dG5(4dmf&5K=IRsq2MkG1*Nd#W+3FMv#%7DTT sH^Z_l%d#xXvMkH8EX%Si%d*t{3^75F>fvq9<^TWy07*qoM6N<$g8yOE9RL6T literal 0 HcmV?d00001 diff --git a/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart300.png b/RevealStack/RevealStack/Assets.xcassets/Heart.imageset/heart300.png new file mode 100644 index 0000000000000000000000000000000000000000..c24ae626319c2f4962d507978be4bb655175cf46 GIT binary patch literal 2655 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 N002ovPDHLkV1h;)7%cz* literal 0 HcmV?d00001 diff --git a/RevealStack/RevealStack/Assets.xcassets/Star.imageset/Contents.json b/RevealStack/RevealStack/Assets.xcassets/Star.imageset/Contents.json new file mode 100644 index 0000000..9ee1843 --- /dev/null +++ b/RevealStack/RevealStack/Assets.xcassets/Star.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "star100.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "star200.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "star300.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RevealStack/RevealStack/Assets.xcassets/Star.imageset/star100.png b/RevealStack/RevealStack/Assets.xcassets/Star.imageset/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/RevealStack/RevealStack/Assets.xcassets/Star.imageset/star200.png b/RevealStack/RevealStack/Assets.xcassets/Star.imageset/star200.png new file mode 100644 index 0000000000000000000000000000000000000000..49311bcd268c09f49e3bc6005fe674418cd397b1 GIT binary patch literal 2143 zcmV-l2%z_gP)kkjp>nhgK zd*6Pe<5uSE5f0MrC)L#T?gDt;fuQ7Blg^p^BvUP^6dp`-H(#uX5H!=2hsE!)Zg*# z258-qkK$?D>Kz8s^%>ORWZjn8=^q8s_7~IRVceP5>L3Kt_Z8FSUfZ08;B(aJBLmU+ z6V&JI>;s+ogQpeaz@90nz&B>kv@dsmbUr4btxA z>=I4ctaaan#^^Ch+OWjuG)LL9!RI##((**vwrkyvzUDgK>KZ`Ux<1*wV%(Uz=RR%S zj3(99IoQG0>LIb^M~&fYYTb}V*|b^QprYef#pp8W>kh5uONrrcX5ExR*tjv)$yM8= zdEbDY<6Oe$HqGcNJ=nc1*3D7csJ-Sp;p-QH;CNlzoGI4QOxmrL;$ykyKgH-Xq2yS7 z-+W2hv25Lqkm6{y=0h;o$|2R-McK7!+>wmoY}M)_(CH_)=0POY*I?Y5+Ug!3)!Q7@ z-b>oA$mlOY*ts;<#<=D{f2q%sXoNM}YS9FRpa8xBY&nUf27d3=@+c?En{SOjs! zd{qK*rF>OZ4rvv9R|#oVd{yoU}NKuGcm~!rXXjUq0G!e%-lRfT7Z~EhPJc} zDJ!cCV+~T)8P3KggluIntZfL%W_UZhkg=D;2=*Z(pOG9KLc~!aBRYnN6GnD=1_|dE zjN%d!DjChyH3ZyLGpbt%xMOtp*N^Sl|YHrIIi>E)Ug&hrnqOkyO+TPU}upJ>asU zMX0PN99Ep_dcj?#O45Vga8_A*(Fd;TTb`cugQNP>n*nfBwSn|#5L^=yZSauhL+MrH zD#LmXuLCDE9nmaxrtriJT)~l}Mvoa=tR*aIpI}_Z@e?Lemr89XO`bBfVmpY*Ic@rk znX@8kMy%Osnm3wL7bX>*JFk0*`3oqab$F(Qi$*ksUey*aDZX@BRmz*Ve8tLf3ECrA z4GOGUy=HCw+_WrTpP4hJugeMVTCU%)aZ{qrW$2Uz^Gg&8OJ54Ank?N?gYL>ub?Y{$ z8D5nx%e@_{itV7g3bui|osH?LGSlJ3t`>Atr7(C?cMDxqV>i5t-<9r(H5T5r+C$eQ z-itt_TTZv6n1jGX=|h)HjDtW$%%?j-_aSga_tO>m)*%>uqtXor(jz$44$=kX7b948 z($K!D1rWR@hiKc5V$h-GVcOOB2=r)olr|l!4qZZy)1FSTp-)H*+S0Wtv`R=j_Oya# zCuqa+bkME~<(-TI15Q!e>HIL_3}tOC1w+PA(%HT+rd|e$nN$r1HOoyQ=NiDMaRn*j zd=nUUp$r9FYzgBoRibev+Cf0i%QWmt2t;g%N25kV%AmwF=qltyPeEfALejO&G$b2j zCCx!2xFqrzSfdw0>-(6U6h5F@#1p{b6Y{<(&1MWdwG@39B z;x^EP`w(}ACd`7kqckCH2&65i5j!C)q&1D`31P)(Mj;4$Kr;?Q*eRM34q+>3My!^Q z^^k@Pho~ksXh;}DEv6~iAnF25$plduY04IedPGyo)PbbORM)55{W4TH7lJAjq^hn< z02DZ%fvP${P%0`KIj$Yvx}J!NQbSN1D!DVI0X}+ino5#GP%adsVkCFSq&_+wF>NVfrhKt zEf>|d6>#(UxiU+uBRF*`FW?s%LPjV*$&h^;f>-qKP=02re7e234n5NSlb9c^mQJ_R zBcM;iHI;+|?hN1QF&282o|#)T;EwW*w*Q7eyR2#WMv4$f=tZ*j_LeYWUre!p3u(;* ztE<77z5fXX-1><#^24ZZv;PkPP20n?b_HOH&*$^`d_JGg=kxh|KA+F$^Z9%}-z&Ga V#rHCL@ksyx002ovPDHLkV1iS=M+yJ{ literal 0 HcmV?d00001 diff --git a/RevealStack/RevealStack/Assets.xcassets/Star.imageset/star300.png b/RevealStack/RevealStack/Assets.xcassets/Star.imageset/star300.png new file mode 100644 index 0000000000000000000000000000000000000000..d46d41b635b7d094c17ba416aec8c1649adb66ac GIT binary patch literal 2794 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 z + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RevealStack/RevealStack/Base.lproj/Main.storyboard b/RevealStack/RevealStack/Base.lproj/Main.storyboard new file mode 100644 index 0000000..d28c0af --- /dev/null +++ b/RevealStack/RevealStack/Base.lproj/Main.storyboard @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RevealStack/RevealStack/Info.plist b/RevealStack/RevealStack/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/RevealStack/RevealStack/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/RevealStack/RevealStack/RevealViewController.swift b/RevealStack/RevealStack/RevealViewController.swift new file mode 100644 index 0000000..ecf63c4 --- /dev/null +++ b/RevealStack/RevealStack/RevealViewController.swift @@ -0,0 +1,85 @@ +// +// RevealViewController.swift +// RevealStack +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class RevealViewController: UIViewController { + + @IBOutlet private weak var rootStackView: UIStackView! + @IBOutlet private weak var imageStackView: UIStackView! + @IBOutlet private weak var revealSwitch: UISwitch! + + private lazy var coverView: UIView = { + let view = UIView() + view.backgroundColor = .yellow + view.isOpaque = false + return view + }() + + private lazy var backgroundView: UIView = { + let view = UIView() + view.backgroundColor = .purple + view.layer.cornerRadius = 10.0 + return view + }() + + @IBAction func revealAction(_ sender: UISwitch) { + UIView.animate(withDuration: 0.25) { + self.configureReveal() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + pinBackground(backgroundView, to: rootStackView) + pinForeground(coverView, to: imageStackView) + configureReveal() + } + + private func configureReveal() { + coverView.alpha = revealSwitch.isOn ? 0 : 1.0 + } + + private func pinBackground(_ view: UIView, to stackView: UIStackView) { + view.translatesAutoresizingMaskIntoConstraints = false + stackView.insertSubview(view, at: 0) + view.pin(to: stackView) + } + + private func pinForeground(_ view: UIView, to stackView: UIStackView) { + view.translatesAutoresizingMaskIntoConstraints = false + stackView.addSubview(view) + view.pin(to: stackView) + } +} + diff --git a/RevealStack/RevealStack/UIView+UYLExtensions.swift b/RevealStack/RevealStack/UIView+UYLExtensions.swift new file mode 100644 index 0000000..fe04753 --- /dev/null +++ b/RevealStack/RevealStack/UIView+UYLExtensions.swift @@ -0,0 +1,45 @@ +// +// UIView+UYLExtensions.swift +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +public extension UIView { + + public func pin(to view: UIView) { + NSLayoutConstraint.activate([ + leadingAnchor.constraint(equalTo: view.leadingAnchor), + trailingAnchor.constraint(equalTo: view.trailingAnchor), + topAnchor.constraint(equalTo: view.topAnchor), + bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + } +} From 2c149678d7167ce74e55fc7dce2d0806571624ba Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 5 Apr 2017 10:36:59 +0100 Subject: [PATCH 022/142] No need to set opaque on view --- RevealStack/RevealStack/RevealViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/RevealStack/RevealStack/RevealViewController.swift b/RevealStack/RevealStack/RevealViewController.swift index ecf63c4..8a59386 100644 --- a/RevealStack/RevealStack/RevealViewController.swift +++ b/RevealStack/RevealStack/RevealViewController.swift @@ -42,7 +42,6 @@ class RevealViewController: UIViewController { private lazy var coverView: UIView = { let view = UIView() view.backgroundColor = .yellow - view.isOpaque = false return view }() From 7bd8c60900b2690fdb95869a0014c4907b352f68 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 24 Apr 2017 14:22:40 +0100 Subject: [PATCH 023/142] Add GridView --- GridView/GridView.xcodeproj/project.pbxproj | 441 ++++++++++++++++++ .../contents.xcworkspacedata | 13 + GridView/GridView/AppDelegate.swift | 39 ++ .../AppIcon.appiconset/Contents.json | 68 +++ .../Base.lproj/LaunchScreen.storyboard | 27 ++ GridView/GridView/Base.lproj/Main.storyboard | 76 +++ GridView/GridView/GridView.swift | 93 ++++ GridView/GridView/Info.plist | 45 ++ GridView/GridViewUI/GridViewUI.h | 19 + GridView/GridViewUI/Info.plist | 24 + GridView/README.md | 9 + .../UIPlayground.playground/Contents.swift | 16 + .../contents.xcplayground | 4 + .../timeline.xctimeline | 6 + 14 files changed, 880 insertions(+) create mode 100644 GridView/GridView.xcodeproj/project.pbxproj create mode 100644 GridView/GridView.xcworkspace/contents.xcworkspacedata create mode 100644 GridView/GridView/AppDelegate.swift create mode 100644 GridView/GridView/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 GridView/GridView/Base.lproj/LaunchScreen.storyboard create mode 100644 GridView/GridView/Base.lproj/Main.storyboard create mode 100644 GridView/GridView/GridView.swift create mode 100644 GridView/GridView/Info.plist create mode 100644 GridView/GridViewUI/GridViewUI.h create mode 100644 GridView/GridViewUI/Info.plist create mode 100644 GridView/README.md create mode 100644 GridView/UIPlayground.playground/Contents.swift create mode 100644 GridView/UIPlayground.playground/contents.xcplayground create mode 100644 GridView/UIPlayground.playground/timeline.xctimeline diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a28eca8 --- /dev/null +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -0,0 +1,441 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 531CCB8B1EAA45D2008349F4 /* GridViewUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 531CCB891EAA45D2008349F4 /* GridViewUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 531CCB8F1EAA475A008349F4 /* GridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5366BC771EA8E15E006A06E5 /* GridView.swift */; }; + 5366BC661EA8DF80006A06E5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5366BC651EA8DF80006A06E5 /* AppDelegate.swift */; }; + 5366BC6B1EA8DF80006A06E5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5366BC691EA8DF80006A06E5 /* Main.storyboard */; }; + 5366BC6D1EA8DF80006A06E5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5366BC6C1EA8DF80006A06E5 /* Assets.xcassets */; }; + 5366BC701EA8DF80006A06E5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5366BC6E1EA8DF80006A06E5 /* LaunchScreen.storyboard */; }; + 5366BC781EA8E15E006A06E5 /* GridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5366BC771EA8E15E006A06E5 /* GridView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 531CCB871EAA45D2008349F4 /* GridViewUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GridViewUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 531CCB891EAA45D2008349F4 /* GridViewUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GridViewUI.h; sourceTree = ""; }; + 531CCB8A1EAA45D2008349F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5366BC621EA8DF80006A06E5 /* GridView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GridView.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5366BC651EA8DF80006A06E5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5366BC6A1EA8DF80006A06E5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5366BC6C1EA8DF80006A06E5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5366BC6F1EA8DF80006A06E5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5366BC711EA8DF80006A06E5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5366BC771EA8E15E006A06E5 /* GridView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GridView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 531CCB831EAA45D2008349F4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5366BC5F1EA8DF80006A06E5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 531CCB881EAA45D2008349F4 /* GridViewUI */ = { + isa = PBXGroup; + children = ( + 531CCB891EAA45D2008349F4 /* GridViewUI.h */, + 531CCB8A1EAA45D2008349F4 /* Info.plist */, + ); + path = GridViewUI; + sourceTree = ""; + }; + 5366BC591EA8DF80006A06E5 = { + isa = PBXGroup; + children = ( + 5366BC641EA8DF80006A06E5 /* GridView */, + 531CCB881EAA45D2008349F4 /* GridViewUI */, + 5366BC631EA8DF80006A06E5 /* Products */, + ); + sourceTree = ""; + }; + 5366BC631EA8DF80006A06E5 /* Products */ = { + isa = PBXGroup; + children = ( + 5366BC621EA8DF80006A06E5 /* GridView.app */, + 531CCB871EAA45D2008349F4 /* GridViewUI.framework */, + ); + name = Products; + sourceTree = ""; + }; + 5366BC641EA8DF80006A06E5 /* GridView */ = { + isa = PBXGroup; + children = ( + 5366BC651EA8DF80006A06E5 /* AppDelegate.swift */, + 5366BC691EA8DF80006A06E5 /* Main.storyboard */, + 5366BC771EA8E15E006A06E5 /* GridView.swift */, + 5366BC6C1EA8DF80006A06E5 /* Assets.xcassets */, + 5366BC6E1EA8DF80006A06E5 /* LaunchScreen.storyboard */, + 5366BC711EA8DF80006A06E5 /* Info.plist */, + ); + path = GridView; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 531CCB841EAA45D2008349F4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 531CCB8B1EAA45D2008349F4 /* GridViewUI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 531CCB861EAA45D2008349F4 /* GridViewUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 531CCB8E1EAA45D2008349F4 /* Build configuration list for PBXNativeTarget "GridViewUI" */; + buildPhases = ( + 531CCB821EAA45D2008349F4 /* Sources */, + 531CCB831EAA45D2008349F4 /* Frameworks */, + 531CCB841EAA45D2008349F4 /* Headers */, + 531CCB851EAA45D2008349F4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GridViewUI; + productName = GridViewUI; + productReference = 531CCB871EAA45D2008349F4 /* GridViewUI.framework */; + productType = "com.apple.product-type.framework"; + }; + 5366BC611EA8DF80006A06E5 /* GridView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5366BC741EA8DF80006A06E5 /* Build configuration list for PBXNativeTarget "GridView" */; + buildPhases = ( + 5366BC5E1EA8DF80006A06E5 /* Sources */, + 5366BC5F1EA8DF80006A06E5 /* Frameworks */, + 5366BC601EA8DF80006A06E5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GridView; + productName = GridView; + productReference = 5366BC621EA8DF80006A06E5 /* GridView.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5366BC5A1EA8DF80006A06E5 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 531CCB861EAA45D2008349F4 = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + 5366BC611EA8DF80006A06E5 = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 5366BC5D1EA8DF80006A06E5 /* Build configuration list for PBXProject "GridView" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5366BC591EA8DF80006A06E5; + productRefGroup = 5366BC631EA8DF80006A06E5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5366BC611EA8DF80006A06E5 /* GridView */, + 531CCB861EAA45D2008349F4 /* GridViewUI */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 531CCB851EAA45D2008349F4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5366BC601EA8DF80006A06E5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5366BC701EA8DF80006A06E5 /* LaunchScreen.storyboard in Resources */, + 5366BC6D1EA8DF80006A06E5 /* Assets.xcassets in Resources */, + 5366BC6B1EA8DF80006A06E5 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 531CCB821EAA45D2008349F4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 531CCB8F1EAA475A008349F4 /* GridView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5366BC5E1EA8DF80006A06E5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5366BC781EA8E15E006A06E5 /* GridView.swift in Sources */, + 5366BC661EA8DF80006A06E5 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5366BC691EA8DF80006A06E5 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5366BC6A1EA8DF80006A06E5 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5366BC6E1EA8DF80006A06E5 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5366BC6F1EA8DF80006A06E5 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 531CCB8C1EAA45D2008349F4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = LCC2J94N44; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = GridViewUI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridViewUI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 531CCB8D1EAA45D2008349F4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = LCC2J94N44; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = GridViewUI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridViewUI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 5366BC721EA8DF80006A06E5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5366BC731EA8DF80006A06E5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5366BC751EA8DF80006A06E5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = GridView/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 5366BC761EA8DF80006A06E5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = GridView/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 531CCB8E1EAA45D2008349F4 /* Build configuration list for PBXNativeTarget "GridViewUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 531CCB8C1EAA45D2008349F4 /* Debug */, + 531CCB8D1EAA45D2008349F4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5366BC5D1EA8DF80006A06E5 /* Build configuration list for PBXProject "GridView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5366BC721EA8DF80006A06E5 /* Debug */, + 5366BC731EA8DF80006A06E5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5366BC741EA8DF80006A06E5 /* Build configuration list for PBXNativeTarget "GridView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5366BC751EA8DF80006A06E5 /* Debug */, + 5366BC761EA8DF80006A06E5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5366BC5A1EA8DF80006A06E5 /* Project object */; +} diff --git a/GridView/GridView.xcworkspace/contents.xcworkspacedata b/GridView/GridView.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8a969d2 --- /dev/null +++ b/GridView/GridView.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/GridView/GridView/AppDelegate.swift b/GridView/GridView/AppDelegate.swift new file mode 100644 index 0000000..e757b1f --- /dev/null +++ b/GridView/GridView/AppDelegate.swift @@ -0,0 +1,39 @@ +// +// AppDelegate.swift +// GridView +// +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/GridView/GridView/Assets.xcassets/AppIcon.appiconset/Contents.json b/GridView/GridView/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/GridView/GridView/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/GridView/GridView/Base.lproj/LaunchScreen.storyboard b/GridView/GridView/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/GridView/GridView/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GridView/GridView/Base.lproj/Main.storyboard b/GridView/GridView/Base.lproj/Main.storyboard new file mode 100644 index 0000000..a2f2c4c --- /dev/null +++ b/GridView/GridView/Base.lproj/Main.storyboard @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GridView/GridView/GridView.swift b/GridView/GridView/GridView.swift new file mode 100644 index 0000000..8167594 --- /dev/null +++ b/GridView/GridView/GridView.swift @@ -0,0 +1,93 @@ +// GridView.swift +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +/// `GridView` is a custom `UIView` subclass that draws +/// a grid of evenly spaced lines in the bounds of the view. +/// Attention: You probably want to set the `contentMode` to `.redraw`. + +@IBDesignable +public class GridView: UIView { + + /// The number of horizontal rows - default is 1. + @IBInspectable public var rowCount: Int = 1 { didSet { setNeedsDisplay() } } + + /// The number of vertical columns - default is 1. + @IBInspectable public var columnCount: Int = 1 { didSet { setNeedsDisplay() } } + + /// The grid line color - default is red. + @IBInspectable public var lineColor: UIColor = .red { didSet { setNeedsDisplay() } } + + /// The grid line width - default is 1 point. + @IBInspectable public var lineWidth: CGFloat = 1.0 { didSet { setNeedsDisplay() } } + + override public func draw(_ rect: CGRect) { + lineColor.set() + rowPath?.stroke() + columnPath?.stroke() + } + + private var rowPath: UIBezierPath? { + guard rowCount > 0 else { + return nil + } + + let rowPath = UIBezierPath() + rowPath.lineWidth = lineWidth + let rowHeight = bounds.size.height / CGFloat(rowCount + 1) + for row in 1...rowCount { + let y = rowHeight * CGFloat(row) + let startPoint = CGPoint(x: bounds.minX, y: y) + let endPoint = CGPoint(x: bounds.maxX, y: y) + rowPath.move(to: startPoint) + rowPath.addLine(to: endPoint) + } + return rowPath + } + + private var columnPath: UIBezierPath? { + guard columnCount > 0 else { + return nil + } + + let columnPath = UIBezierPath() + columnPath.lineWidth = lineWidth + let columnWidth = bounds.size.width / CGFloat(columnCount + 1) + for row in 1...columnCount { + let x = columnWidth * CGFloat(row) + let startPoint = CGPoint(x: x, y: bounds.minY) + let endPoint = CGPoint(x: x, y: bounds.maxY) + columnPath.move(to: startPoint) + columnPath.addLine(to: endPoint) + } + return columnPath + } +} diff --git a/GridView/GridView/Info.plist b/GridView/GridView/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/GridView/GridView/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/GridView/GridViewUI/GridViewUI.h b/GridView/GridViewUI/GridViewUI.h new file mode 100644 index 0000000..d02e371 --- /dev/null +++ b/GridView/GridViewUI/GridViewUI.h @@ -0,0 +1,19 @@ +// +// GridViewUI.h +// GridViewUI +// +// Created by Keith Harrison on 21/04/2017. +// Copyright © 2017 Keith Harrison. All rights reserved. +// + +#import + +//! Project version number for GridViewUI. +FOUNDATION_EXPORT double GridViewUIVersionNumber; + +//! Project version string for GridViewUI. +FOUNDATION_EXPORT const unsigned char GridViewUIVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/GridView/GridViewUI/Info.plist b/GridView/GridViewUI/Info.plist new file mode 100644 index 0000000..fbe1e6b --- /dev/null +++ b/GridView/GridViewUI/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/GridView/README.md b/GridView/README.md new file mode 100644 index 0000000..73c2a51 --- /dev/null +++ b/GridView/README.md @@ -0,0 +1,9 @@ +### Adding a Playground to an Xcode Project + +Example setup of a workspace containing a playground and project. The resources +in the project that need to be accessible from the playground are added to a +framework. + +See the following blog post for a step-by-step guide to creating this setup + ++ [Adding playgrounds to Xcode projects](https://useyourloaf.com/blog/adding-playgrounds-to-xcode-projects/) diff --git a/GridView/UIPlayground.playground/Contents.swift b/GridView/UIPlayground.playground/Contents.swift new file mode 100644 index 0000000..b9594ed --- /dev/null +++ b/GridView/UIPlayground.playground/Contents.swift @@ -0,0 +1,16 @@ +//: PlaygroundUI +import UIKit +import GridViewUI +import PlaygroundSupport + +//: Demo using the grid view +let grid = GridView() +grid.backgroundColor = .lightGray +grid.rowCount = 3 +grid.columnCount = 3 +grid.lineColor = .blue +grid.lineWidth = 5 + +//: Show in live view +grid.frame = CGRect(x: 0, y: 0, width: 200, height: 300) +PlaygroundPage.current.liveView = grid \ No newline at end of file diff --git a/GridView/UIPlayground.playground/contents.xcplayground b/GridView/UIPlayground.playground/contents.xcplayground new file mode 100644 index 0000000..5da2641 --- /dev/null +++ b/GridView/UIPlayground.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/GridView/UIPlayground.playground/timeline.xctimeline b/GridView/UIPlayground.playground/timeline.xctimeline new file mode 100644 index 0000000..bf468af --- /dev/null +++ b/GridView/UIPlayground.playground/timeline.xctimeline @@ -0,0 +1,6 @@ + + + + + From c30aca393cc9454f53a71397a0b1e5c47607e20c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 1 May 2017 11:43:39 +0100 Subject: [PATCH 024/142] Add Margins --- Margins/Margins.playground/Contents.swift | 14 + .../Sources/MarginViewController.swift | 95 ++++++ .../Margins.playground/contents.xcplayground | 4 + .../Margins.playground/timeline.xctimeline | 6 + Margins/Margins.xcodeproj/project.pbxproj | 310 ++++++++++++++++++ .../contents.xcworkspacedata | 10 + Margins/Margins/AppDelegate.swift | 39 +++ .../AppIcon.appiconset/Contents.json | 68 ++++ .../Base.lproj/LaunchScreen.storyboard | 27 ++ Margins/Margins/Base.lproj/Main.storyboard | 93 ++++++ Margins/Margins/Info.plist | 45 +++ Margins/README.md | 7 + 12 files changed, 718 insertions(+) create mode 100644 Margins/Margins.playground/Contents.swift create mode 100644 Margins/Margins.playground/Sources/MarginViewController.swift create mode 100644 Margins/Margins.playground/contents.xcplayground create mode 100644 Margins/Margins.playground/timeline.xctimeline create mode 100644 Margins/Margins.xcodeproj/project.pbxproj create mode 100644 Margins/Margins.xcworkspace/contents.xcworkspacedata create mode 100644 Margins/Margins/AppDelegate.swift create mode 100644 Margins/Margins/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Margins/Margins/Base.lproj/LaunchScreen.storyboard create mode 100644 Margins/Margins/Base.lproj/Main.storyboard create mode 100644 Margins/Margins/Info.plist create mode 100644 Margins/README.md diff --git a/Margins/Margins.playground/Contents.swift b/Margins/Margins.playground/Contents.swift new file mode 100644 index 0000000..330e633 --- /dev/null +++ b/Margins/Margins.playground/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import PlaygroundSupport + +let viewController = MarginViewController() +viewController.view.backgroundColor = .white +viewController.view.frame = CGRect(x: 0, y: 0, width: 320, height: 640) +PlaygroundPage.current.liveView = viewController.view + +viewController.redView.preservesSuperviewLayoutMargins = true + +viewController.stackView.preservesSuperviewLayoutMargins = true +viewController.stackView.isLayoutMarginsRelativeArrangement = true + +viewController.stackView.layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8) diff --git a/Margins/Margins.playground/Sources/MarginViewController.swift b/Margins/Margins.playground/Sources/MarginViewController.swift new file mode 100644 index 0000000..f05d54a --- /dev/null +++ b/Margins/Margins.playground/Sources/MarginViewController.swift @@ -0,0 +1,95 @@ +// +// MarginViewController.swift +// Margins +// +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +public class MarginViewController: UIViewController { + + override public func viewDidLoad() { + super.viewDidLoad() + setupViews() + } + + public lazy var redView: UIView = { + return self.simpleView(color: .red) + }() + + public lazy var stackView: UIStackView = { + return UIStackView() + }() + + private func setupViews() { + view.addSubview(redView) + NSLayoutConstraint.activate([ + redView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor), + redView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + redView.trailingAnchor.constraint(equalTo: view.trailingAnchor) + ]) + + let yellowView = simpleView(color: .yellow) + redView.addSubview(yellowView) + let redMargins = redView.layoutMarginsGuide + NSLayoutConstraint.activate([ + yellowView.leadingAnchor.constraint(equalTo: redMargins.leadingAnchor), + yellowView.trailingAnchor.constraint(equalTo: redMargins.trailingAnchor), + yellowView.topAnchor.constraint(equalTo: redMargins.topAnchor), + yellowView.bottomAnchor.constraint(equalTo: redMargins.bottomAnchor) + ]) + + let blueView = simpleView(color: .blue) + stackView.addArrangedSubview(blueView) + let greenView = simpleView(color: .green) + stackView.addArrangedSubview(greenView) + stackView.spacing = 8.0 + stackView.distribution = .fillEqually + stackView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(stackView) + + NSLayoutConstraint.activate([ + stackView.topAnchor.constraint(equalTo: redView.bottomAnchor), + stackView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor), + stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + + stackView.heightAnchor.constraint(equalTo: redView.heightAnchor) + ]) + } + + private func simpleView(color: UIColor) -> UIView { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = color + return view + } +} + diff --git a/Margins/Margins.playground/contents.xcplayground b/Margins/Margins.playground/contents.xcplayground new file mode 100644 index 0000000..5da2641 --- /dev/null +++ b/Margins/Margins.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Margins/Margins.playground/timeline.xctimeline b/Margins/Margins.playground/timeline.xctimeline new file mode 100644 index 0000000..bf468af --- /dev/null +++ b/Margins/Margins.playground/timeline.xctimeline @@ -0,0 +1,6 @@ + + + + + diff --git a/Margins/Margins.xcodeproj/project.pbxproj b/Margins/Margins.xcodeproj/project.pbxproj new file mode 100644 index 0000000..672ef9a --- /dev/null +++ b/Margins/Margins.xcodeproj/project.pbxproj @@ -0,0 +1,310 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 53E307761EB33A650055FFCB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E307751EB33A650055FFCB /* AppDelegate.swift */; }; + 53E3077B1EB33A650055FFCB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E307791EB33A650055FFCB /* Main.storyboard */; }; + 53E3077D1EB33A650055FFCB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53E3077C1EB33A650055FFCB /* Assets.xcassets */; }; + 53E307801EB33A650055FFCB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53E3077E1EB33A650055FFCB /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53E307721EB33A650055FFCB /* Margins.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Margins.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53E307751EB33A650055FFCB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53E3077A1EB33A650055FFCB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53E3077C1EB33A650055FFCB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53E3077F1EB33A650055FFCB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53E307811EB33A650055FFCB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53FE21E91EB7487400DAC6C2 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53E3076F1EB33A650055FFCB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53E307691EB33A650055FFCB = { + isa = PBXGroup; + children = ( + 53FE21E91EB7487400DAC6C2 /* README.md */, + 53E307741EB33A650055FFCB /* Margins */, + 53E307731EB33A650055FFCB /* Products */, + ); + sourceTree = ""; + }; + 53E307731EB33A650055FFCB /* Products */ = { + isa = PBXGroup; + children = ( + 53E307721EB33A650055FFCB /* Margins.app */, + ); + name = Products; + sourceTree = ""; + }; + 53E307741EB33A650055FFCB /* Margins */ = { + isa = PBXGroup; + children = ( + 53E307751EB33A650055FFCB /* AppDelegate.swift */, + 53E307791EB33A650055FFCB /* Main.storyboard */, + 53E3077C1EB33A650055FFCB /* Assets.xcassets */, + 53E3077E1EB33A650055FFCB /* LaunchScreen.storyboard */, + 53E307811EB33A650055FFCB /* Info.plist */, + ); + path = Margins; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53E307711EB33A650055FFCB /* Margins */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53E307841EB33A650055FFCB /* Build configuration list for PBXNativeTarget "Margins" */; + buildPhases = ( + 53E3076E1EB33A650055FFCB /* Sources */, + 53E3076F1EB33A650055FFCB /* Frameworks */, + 53E307701EB33A650055FFCB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Margins; + productName = Margins; + productReference = 53E307721EB33A650055FFCB /* Margins.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53E3076A1EB33A650055FFCB /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53E307711EB33A650055FFCB = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = LCC2J94N44; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 53E3076D1EB33A650055FFCB /* Build configuration list for PBXProject "Margins" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53E307691EB33A650055FFCB; + productRefGroup = 53E307731EB33A650055FFCB /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53E307711EB33A650055FFCB /* Margins */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53E307701EB33A650055FFCB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53E307801EB33A650055FFCB /* LaunchScreen.storyboard in Resources */, + 53E3077D1EB33A650055FFCB /* Assets.xcassets in Resources */, + 53E3077B1EB33A650055FFCB /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53E3076E1EB33A650055FFCB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53E307761EB33A650055FFCB /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53E307791EB33A650055FFCB /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53E3077A1EB33A650055FFCB /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53E3077E1EB33A650055FFCB /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53E3077F1EB33A650055FFCB /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53E307821EB33A650055FFCB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53E307831EB33A650055FFCB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53E307851EB33A650055FFCB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Margins/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Margins; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 53E307861EB33A650055FFCB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Margins/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Margins; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53E3076D1EB33A650055FFCB /* Build configuration list for PBXProject "Margins" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53E307821EB33A650055FFCB /* Debug */, + 53E307831EB33A650055FFCB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53E307841EB33A650055FFCB /* Build configuration list for PBXNativeTarget "Margins" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53E307851EB33A650055FFCB /* Debug */, + 53E307861EB33A650055FFCB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53E3076A1EB33A650055FFCB /* Project object */; +} diff --git a/Margins/Margins.xcworkspace/contents.xcworkspacedata b/Margins/Margins.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b988434 --- /dev/null +++ b/Margins/Margins.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Margins/Margins/AppDelegate.swift b/Margins/Margins/AppDelegate.swift new file mode 100644 index 0000000..de79b3d --- /dev/null +++ b/Margins/Margins/AppDelegate.swift @@ -0,0 +1,39 @@ +// +// AppDelegate.swift +// Margins +// +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/Margins/Margins/Assets.xcassets/AppIcon.appiconset/Contents.json b/Margins/Margins/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Margins/Margins/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/Margins/Margins/Base.lproj/LaunchScreen.storyboard b/Margins/Margins/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/Margins/Margins/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Margins/Margins/Base.lproj/Main.storyboard b/Margins/Margins/Base.lproj/Main.storyboard new file mode 100644 index 0000000..bc78122 --- /dev/null +++ b/Margins/Margins/Base.lproj/Main.storyboard @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Margins/Margins/Info.plist b/Margins/Margins/Info.plist new file mode 100644 index 0000000..d052473 --- /dev/null +++ b/Margins/Margins/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Margins/README.md b/Margins/README.md new file mode 100644 index 0000000..74ee017 --- /dev/null +++ b/Margins/README.md @@ -0,0 +1,7 @@ +### Preserving Superview Margins + +Example of how to use `preservesSuperviewLayoutMargins`. + +See the following blog post: + ++ [Preserves Superview Layout Margins](https://useyourloaf.com/blog/preserves-superview-layout-margins/) \ No newline at end of file From d611d089d717a73e3f3d0adf41fe78d581215a18 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 6 Jul 2017 10:48:53 +0100 Subject: [PATCH 025/142] Update to recommended settings --- AllVisible/AllVisible.xcodeproj/project.pbxproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AllVisible/AllVisible.xcodeproj/project.pbxproj b/AllVisible/AllVisible.xcodeproj/project.pbxproj index 65cd580..7e2b795 100644 --- a/AllVisible/AllVisible.xcodeproj/project.pbxproj +++ b/AllVisible/AllVisible.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53AA2EB11DA2A957008EBF84 = { @@ -302,6 +302,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -352,6 +353,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; From 353bd4a47859b98e60ae00b6ad20e32b59b1b8c0 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 6 Jul 2017 10:50:07 +0100 Subject: [PATCH 026/142] Link to blog post uses https --- AllVisible/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AllVisible/README.md b/AllVisible/README.md index df93f0b..c5ee204 100644 --- a/AllVisible/README.md +++ b/AllVisible/README.md @@ -2,4 +2,4 @@ A simple Xcode project template showing how to configure a split view controller to prefer to show both the primary and secondary view controllers. Both Swift and Objective-C versions are included. -For a more detailed explanation see [Split View Controller Display Modes](http://useyourloaf.com/blog/split-view-controller-display-modes/) +For a more detailed explanation see [Split View Controller Display Modes](https://useyourloaf.com/blog/split-view-controller-display-modes/) From b34e760f8d8f872ad66a283d129828b4c5f05b68 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 31 Jul 2017 13:57:40 +0100 Subject: [PATCH 027/142] Add Swiper project --- Swiper/Swiper.xcodeproj/project.pbxproj | 324 ++++++++++++++++++ Swiper/Swiper/AppDelegate.swift | 67 ++++ .../AppIcon.appiconset/Contents.json | 93 +++++ .../Swiper/Base.lproj/LaunchScreen.storyboard | 25 ++ Swiper/Swiper/Base.lproj/Main.storyboard | 114 ++++++ Swiper/Swiper/Info.plist | 45 +++ Swiper/Swiper/ViewController.swift | 107 ++++++ 7 files changed, 775 insertions(+) create mode 100644 Swiper/Swiper.xcodeproj/project.pbxproj create mode 100644 Swiper/Swiper/AppDelegate.swift create mode 100644 Swiper/Swiper/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Swiper/Swiper/Base.lproj/LaunchScreen.storyboard create mode 100644 Swiper/Swiper/Base.lproj/Main.storyboard create mode 100644 Swiper/Swiper/Info.plist create mode 100644 Swiper/Swiper/ViewController.swift diff --git a/Swiper/Swiper.xcodeproj/project.pbxproj b/Swiper/Swiper.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d413463 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.pbxproj @@ -0,0 +1,324 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 53AF5D0A1F2B662A00BBF2B8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53AF5D091F2B662A00BBF2B8 /* AppDelegate.swift */; }; + 53AF5D0C1F2B662A00BBF2B8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53AF5D0B1F2B662A00BBF2B8 /* ViewController.swift */; }; + 53AF5D0F1F2B662A00BBF2B8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53AF5D0D1F2B662A00BBF2B8 /* Main.storyboard */; }; + 53AF5D111F2B662A00BBF2B8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53AF5D101F2B662A00BBF2B8 /* Assets.xcassets */; }; + 53AF5D141F2B662A00BBF2B8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53AF5D121F2B662A00BBF2B8 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53AF5D061F2B662A00BBF2B8 /* Swiper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Swiper.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53AF5D091F2B662A00BBF2B8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53AF5D0B1F2B662A00BBF2B8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 53AF5D0E1F2B662A00BBF2B8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53AF5D101F2B662A00BBF2B8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53AF5D131F2B662A00BBF2B8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53AF5D151F2B662A00BBF2B8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53AF5D031F2B662A00BBF2B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53AF5CFD1F2B662A00BBF2B8 = { + isa = PBXGroup; + children = ( + 53AF5D081F2B662A00BBF2B8 /* Swiper */, + 53AF5D071F2B662A00BBF2B8 /* Products */, + ); + sourceTree = ""; + }; + 53AF5D071F2B662A00BBF2B8 /* Products */ = { + isa = PBXGroup; + children = ( + 53AF5D061F2B662A00BBF2B8 /* Swiper.app */, + ); + name = Products; + sourceTree = ""; + }; + 53AF5D081F2B662A00BBF2B8 /* Swiper */ = { + isa = PBXGroup; + children = ( + 53AF5D091F2B662A00BBF2B8 /* AppDelegate.swift */, + 53AF5D0B1F2B662A00BBF2B8 /* ViewController.swift */, + 53AF5D0D1F2B662A00BBF2B8 /* Main.storyboard */, + 53AF5D101F2B662A00BBF2B8 /* Assets.xcassets */, + 53AF5D121F2B662A00BBF2B8 /* LaunchScreen.storyboard */, + 53AF5D151F2B662A00BBF2B8 /* Info.plist */, + ); + path = Swiper; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53AF5D051F2B662A00BBF2B8 /* Swiper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53AF5D181F2B662A00BBF2B8 /* Build configuration list for PBXNativeTarget "Swiper" */; + buildPhases = ( + 53AF5D021F2B662A00BBF2B8 /* Sources */, + 53AF5D031F2B662A00BBF2B8 /* Frameworks */, + 53AF5D041F2B662A00BBF2B8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Swiper; + productName = Swiper; + productReference = 53AF5D061F2B662A00BBF2B8 /* Swiper.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53AF5CFE1F2B662A00BBF2B8 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53AF5D051F2B662A00BBF2B8 = { + CreatedOnToolsVersion = 9.0; + }; + }; + }; + buildConfigurationList = 53AF5D011F2B662A00BBF2B8 /* Build configuration list for PBXProject "Swiper" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53AF5CFD1F2B662A00BBF2B8; + productRefGroup = 53AF5D071F2B662A00BBF2B8 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53AF5D051F2B662A00BBF2B8 /* Swiper */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53AF5D041F2B662A00BBF2B8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53AF5D141F2B662A00BBF2B8 /* LaunchScreen.storyboard in Resources */, + 53AF5D111F2B662A00BBF2B8 /* Assets.xcassets in Resources */, + 53AF5D0F1F2B662A00BBF2B8 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53AF5D021F2B662A00BBF2B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53AF5D0C1F2B662A00BBF2B8 /* ViewController.swift in Sources */, + 53AF5D0A1F2B662A00BBF2B8 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53AF5D0D1F2B662A00BBF2B8 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53AF5D0E1F2B662A00BBF2B8 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53AF5D121F2B662A00BBF2B8 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53AF5D131F2B662A00BBF2B8 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53AF5D161F2B662A00BBF2B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 53AF5D171F2B662A00BBF2B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "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 = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53AF5D191F2B662A00BBF2B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Swiper/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Swiper; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53AF5D1A1F2B662A00BBF2B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Swiper/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Swiper; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53AF5D011F2B662A00BBF2B8 /* Build configuration list for PBXProject "Swiper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53AF5D161F2B662A00BBF2B8 /* Debug */, + 53AF5D171F2B662A00BBF2B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53AF5D181F2B662A00BBF2B8 /* Build configuration list for PBXNativeTarget "Swiper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53AF5D191F2B662A00BBF2B8 /* Debug */, + 53AF5D1A1F2B662A00BBF2B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53AF5CFE1F2B662A00BBF2B8 /* Project object */; +} diff --git a/Swiper/Swiper/AppDelegate.swift b/Swiper/Swiper/AppDelegate.swift new file mode 100644 index 0000000..73948c9 --- /dev/null +++ b/Swiper/Swiper/AppDelegate.swift @@ -0,0 +1,67 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Swiper/Swiper/Assets.xcassets/AppIcon.appiconset/Contents.json b/Swiper/Swiper/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/Swiper/Swiper/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/Swiper/Swiper/Base.lproj/LaunchScreen.storyboard b/Swiper/Swiper/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..5654142 --- /dev/null +++ b/Swiper/Swiper/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Swiper/Swiper/Base.lproj/Main.storyboard b/Swiper/Swiper/Base.lproj/Main.storyboard new file mode 100644 index 0000000..022df81 --- /dev/null +++ b/Swiper/Swiper/Base.lproj/Main.storyboard @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Swiper/Swiper/Info.plist b/Swiper/Swiper/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/Swiper/Swiper/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Swiper/Swiper/ViewController.swift b/Swiper/Swiper/ViewController.swift new file mode 100644 index 0000000..265d9ad --- /dev/null +++ b/Swiper/Swiper/ViewController.swift @@ -0,0 +1,107 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class ViewController: UIViewController { + + @IBOutlet private var fullScreenConstraints: [NSLayoutConstraint]! + @IBOutlet private var halfScreenConstraints: [NSLayoutConstraint]! + @IBOutlet private weak var modeSwitch: UISwitch! + @IBOutlet private weak var countDisplay: UILabel! + + override var prefersStatusBarHidden: Bool { + if #available(iOS 11.0, *) { + return super.prefersStatusBarHidden + } else { + return fullScreenMode || super.prefersStatusBarHidden + } + } + + override func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge { + return fullScreenMode ? [.bottom,.top] : UIRectEdge() + } + + private var count = 0 { + didSet { + countDisplay.text = NumberFormatter.localizedString(from: NSNumber(value: count), number: .decimal) + } + } + + private var fullScreenMode: Bool = false { + didSet { + updateAppearance() + } + } + + private func updateAppearance() { + view.layoutIfNeeded() + updateConstraints() + UIView.animate(withDuration: 0.25) { + self.updateDeferringSystemGestures() + self.view.layoutIfNeeded() + } + } + + private func updateDeferringSystemGestures() { + if #available(iOS 11.0, *) { + setNeedsUpdateOfScreenEdgesDeferringSystemGestures() + } else { + setNeedsStatusBarAppearanceUpdate() + } + } + + private func updateConstraints() { + if fullScreenMode { + halfScreenConstraints.forEach { $0.isActive = false } + fullScreenConstraints.forEach { $0.isActive = true } + } else { + fullScreenConstraints.forEach { $0.isActive = false } + halfScreenConstraints.forEach { $0.isActive = true } + } + } + + @IBAction func fullScreen(_ sender: UISwitch) { + fullScreenMode = sender.isOn + } + + @IBAction func swipeUp(_ sender: UISwipeGestureRecognizer) { + count += 1 + } + + @IBAction func swipeDown(_ sender: UISwipeGestureRecognizer) { + count -= 1 + } + + override func viewDidLoad() { + super.viewDidLoad() + modeSwitch.isOn = fullScreenMode + updateAppearance() + } +} From c18243008b6b6a247fc8d6f940bb78af70754796 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 13 Aug 2017 22:24:17 +0100 Subject: [PATCH 028/142] Add ScaledFont --- ScaledFont/README.md | 44 +++ .../ScaledFont.xcodeproj/project.pbxproj | 362 ++++++++++++++++++ ScaledFont/ScaledFont/AppDelegate.swift | 36 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../ScaledFont/Base.lproj/Main.storyboard | 47 +++ ScaledFont/ScaledFont/Info.plist | 52 +++ ScaledFont/ScaledFont/Noteworthy.plist | 83 ++++ ScaledFont/ScaledFont/NotoSerif.plist | 83 ++++ ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt | 202 ++++++++++ .../ScaledFont/Noto_Serif/NotoSerif-Bold.ttf | Bin 0 -> 370884 bytes .../Noto_Serif/NotoSerif-BoldItalic.ttf | Bin 0 -> 333656 bytes .../Noto_Serif/NotoSerif-Italic.ttf | Bin 0 -> 323188 bytes .../Noto_Serif/NotoSerif-Regular.ttf | Bin 0 -> 350668 bytes ScaledFont/ScaledFont/ScaledFont.swift | 114 ++++++ ScaledFont/ScaledFont/ViewController.swift | 125 ++++++ 16 files changed, 1271 insertions(+) create mode 100644 ScaledFont/README.md create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.pbxproj create mode 100644 ScaledFont/ScaledFont/AppDelegate.swift create mode 100644 ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard create mode 100644 ScaledFont/ScaledFont/Base.lproj/Main.storyboard create mode 100644 ScaledFont/ScaledFont/Info.plist create mode 100644 ScaledFont/ScaledFont/Noteworthy.plist create mode 100644 ScaledFont/ScaledFont/NotoSerif.plist create mode 100755 ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt create mode 100755 ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf create mode 100755 ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf create mode 100755 ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf create mode 100755 ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf create mode 100644 ScaledFont/ScaledFont/ScaledFont.swift create mode 100644 ScaledFont/ScaledFont/ViewController.swift diff --git a/ScaledFont/README.md b/ScaledFont/README.md new file mode 100644 index 0000000..8a73ffa --- /dev/null +++ b/ScaledFont/README.md @@ -0,0 +1,44 @@ +# Scaled Font + +## Using Dynamic Type With Custom Fonts + +An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the NotoSerif font which was downloaded from google fonts: + ++ [Noto Sans]([NotoSans](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif)) + +*Refer to LICENSE.txt if you plan on using NotoSans in a shipping application.* + +**This project requires iOS 11** + +### ScaledFont + +A utility class to help you use custom fonts with dynamic type. + +To use this class you must supply the name of a style dictionary for the font when creating the class. The style dictionary should be stored as a property list file in the main bundle. + +The style dictionary contains an entry for each text style that uses the raw string value for each `UIFontTextStyle` as the key. + +The value of each entry is a dictionary with two keys: + ++ fontName: A String which is the font name. ++ fontSize: A number which is the point size to use at the `.large` content size. + +For example to use a 17 pt Noteworthy-Bold font for the `.headline` style at the `.large` content size: + + + UICTFontTextStyleHeadline + + fontName + Noteworthy-Bold + fontSize + 17 + + + +You do not need to include an entry for every text style but if you try to use a text style that is not included in the dictionary it will fallback to the system preferred font. + +### Further Details + +See the following blog post for further details: + ++ [Using A Custom Font With Dynamic Type](https://useyourloaf.com/blog/using-a-custom-font-with-dynamic-type/) diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f1f5db0 --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -0,0 +1,362 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; + 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */; }; + 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919201F3FA05700FF9E25 /* ViewController.swift */; }; + 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919221F3FA05700FF9E25 /* Main.storyboard */; }; + 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 537919251F3FA05700FF9E25 /* Assets.xcassets */; }; + 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */; }; + 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919301F3FA0B500FF9E25 /* ScaledFont.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 537709DD1F40AFD80041A64F /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; + 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Bold.ttf"; sourceTree = ""; }; + 537709DF1F40AFD80041A64F /* NotoSerif-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-BoldItalic.ttf"; sourceTree = ""; }; + 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Italic.ttf"; sourceTree = ""; }; + 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Regular.ttf"; sourceTree = ""; }; + 537709E51F40B18B0041A64F /* NotoSerif.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = NotoSerif.plist; sourceTree = ""; }; + 537709E71F40F3B80041A64F /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 5379191B1F3FA05700FF9E25 /* ScaledFont.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScaledFont.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 537919201F3FA05700FF9E25 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 537919231F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 537919251F3FA05700FF9E25 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 537919281F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5379192A1F3FA05700FF9E25 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 537919301F3FA0B500FF9E25 /* ScaledFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScaledFont.swift; sourceTree = ""; }; + 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Noteworthy.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 537919181F3FA05700FF9E25 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 537709DC1F40AFD80041A64F /* Noto_Serif */ = { + isa = PBXGroup; + children = ( + 537709DD1F40AFD80041A64F /* LICENSE.txt */, + 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */, + 537709DF1F40AFD80041A64F /* NotoSerif-BoldItalic.ttf */, + 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */, + 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */, + ); + path = Noto_Serif; + sourceTree = ""; + }; + 537919121F3FA05700FF9E25 = { + isa = PBXGroup; + children = ( + 537709E71F40F3B80041A64F /* README.md */, + 5379191D1F3FA05700FF9E25 /* ScaledFont */, + 5379191C1F3FA05700FF9E25 /* Products */, + ); + sourceTree = ""; + }; + 5379191C1F3FA05700FF9E25 /* Products */ = { + isa = PBXGroup; + children = ( + 5379191B1F3FA05700FF9E25 /* ScaledFont.app */, + ); + name = Products; + sourceTree = ""; + }; + 5379191D1F3FA05700FF9E25 /* ScaledFont */ = { + isa = PBXGroup; + children = ( + 537709DC1F40AFD80041A64F /* Noto_Serif */, + 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */, + 537919201F3FA05700FF9E25 /* ViewController.swift */, + 537919301F3FA0B500FF9E25 /* ScaledFont.swift */, + 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */, + 537709E51F40B18B0041A64F /* NotoSerif.plist */, + 537919221F3FA05700FF9E25 /* Main.storyboard */, + 537919251F3FA05700FF9E25 /* Assets.xcassets */, + 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */, + 5379192A1F3FA05700FF9E25 /* Info.plist */, + ); + path = ScaledFont; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5379191A1F3FA05700FF9E25 /* ScaledFont */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */; + buildPhases = ( + 537919171F3FA05700FF9E25 /* Sources */, + 537919181F3FA05700FF9E25 /* Frameworks */, + 537919191F3FA05700FF9E25 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ScaledFont; + productName = ScaledFont; + productReference = 5379191B1F3FA05700FF9E25 /* ScaledFont.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 537919131F3FA05700FF9E25 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 5379191A1F3FA05700FF9E25 = { + CreatedOnToolsVersion = 9.0; + }; + }; + }; + buildConfigurationList = 537919161F3FA05700FF9E25 /* Build configuration list for PBXProject "ScaledFont" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 537919121F3FA05700FF9E25; + productRefGroup = 5379191C1F3FA05700FF9E25 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5379191A1F3FA05700FF9E25 /* ScaledFont */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 537919191F3FA05700FF9E25 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */, + 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */, + 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */, + 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */, + 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */, + 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */, + 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */, + 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 537919171F3FA05700FF9E25 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */, + 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */, + 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 537919221F3FA05700FF9E25 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 537919231F3FA05700FF9E25 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 537919281F3FA05700FF9E25 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5379192B1F3FA05700FF9E25 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 5379192C1F3FA05700FF9E25 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "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 = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5379192E1F3FA05700FF9E25 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ScaledFont/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5379192F1F3FA05700FF9E25 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ScaledFont/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 537919161F3FA05700FF9E25 /* Build configuration list for PBXProject "ScaledFont" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5379192B1F3FA05700FF9E25 /* Debug */, + 5379192C1F3FA05700FF9E25 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5379192E1F3FA05700FF9E25 /* Debug */, + 5379192F1F3FA05700FF9E25 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 537919131F3FA05700FF9E25 /* Project object */; +} diff --git a/ScaledFont/ScaledFont/AppDelegate.swift b/ScaledFont/ScaledFont/AppDelegate.swift new file mode 100644 index 0000000..130fe68 --- /dev/null +++ b/ScaledFont/ScaledFont/AppDelegate.swift @@ -0,0 +1,36 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? +} diff --git a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard b/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard b/ScaledFont/ScaledFont/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f995ddd --- /dev/null +++ b/ScaledFont/ScaledFont/Base.lproj/Main.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScaledFont/ScaledFont/Info.plist b/ScaledFont/ScaledFont/Info.plist new file mode 100644 index 0000000..24cd042 --- /dev/null +++ b/ScaledFont/ScaledFont/Info.plist @@ -0,0 +1,52 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ScaledFont/ScaledFont/Noteworthy.plist b/ScaledFont/ScaledFont/Noteworthy.plist new file mode 100644 index 0000000..4395e75 --- /dev/null +++ b/ScaledFont/ScaledFont/Noteworthy.plist @@ -0,0 +1,83 @@ + + + + + UICTFontTextStyleTitle0 + + fontName + Noteworthy-Light + fontSize + 34 + + UICTFontTextStyleTitle1 + + fontName + Noteworthy-Light + fontSize + 28 + + UICTFontTextStyleTitle2 + + fontName + Noteworthy-Light + fontSize + 22 + + UICTFontTextStyleTitle3 + + fontName + Noteworthy-Light + fontSize + 20 + + UICTFontTextStyleHeadline + + fontName + Noteworthy-Bold + fontSize + 17 + + UICTFontTextStyleSubhead + + fontName + Noteworthy-Light + fontSize + 15 + + UICTFontTextStyleBody + + fontName + Noteworthy-Light + fontSize + 17 + + UICTFontTextStyleCallout + + fontName + Noteworthy-Light + fontSize + 16 + + UICTFontTextStyleFootnote + + fontName + Noteworthy-Light + fontSize + 13 + + UICTFontTextStyleCaption1 + + fontName + Noteworthy-Light + fontSize + 12 + + UICTFontTextStyleCaption2 + + fontName + Noteworthy-Light + fontSize + 11 + + + diff --git a/ScaledFont/ScaledFont/NotoSerif.plist b/ScaledFont/ScaledFont/NotoSerif.plist new file mode 100644 index 0000000..2d35c45 --- /dev/null +++ b/ScaledFont/ScaledFont/NotoSerif.plist @@ -0,0 +1,83 @@ + + + + + UICTFontTextStyleTitle0 + + fontName + NotoSerif + fontSize + 34 + + UICTFontTextStyleTitle1 + + fontName + NotoSerif + fontSize + 28 + + UICTFontTextStyleTitle2 + + fontName + NotoSerif + fontSize + 22 + + UICTFontTextStyleTitle3 + + fontName + NotoSerif + fontSize + 20 + + UICTFontTextStyleHeadline + + fontName + NotoSerif-Bold + fontSize + 17 + + UICTFontTextStyleSubhead + + fontName + NotoSerif-Italic + fontSize + 15 + + UICTFontTextStyleBody + + fontName + NotoSerif + fontSize + 17 + + UICTFontTextStyleCallout + + fontName + NotoSerif + fontSize + 16 + + UICTFontTextStyleFootnote + + fontName + NotoSerif + fontSize + 13 + + UICTFontTextStyleCaption1 + + fontName + NotoSerif-Italic + fontSize + 12 + + UICTFontTextStyleCaption2 + + fontName + NotoSerif-Italic + fontSize + 10 + + + diff --git a/ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt b/ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt new file mode 100755 index 0000000..75b5248 --- /dev/null +++ b/ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf b/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..580ff2861e5ce772b6942d6f92b57b2986acfb50 GIT binary patch literal 370884 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 literal 0 HcmV?d00001 diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf b/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..1d3cc3a3320071345cf423ebca29226c26ef614d GIT binary patch literal 323188 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%0D2pq*W0zuGP?v$IY+ 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 IA2jX%0kh)i^8f$< literal 0 HcmV?d00001 diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf b/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a1c6f1059970cd3391149bf2c298755aeb94e6dc GIT binary patch literal 350668 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�^ zOS9%*Zqn}6e*c_SZ@Y5TQ2*R#kAG>$^K9(Nk6GzIcb1k`S63KuD@30B z0B0(n@e{{tX@}ZYjhb!=#l;?jIX}muRJyS{OE8<1gdF@fd6L)GI%=6IKi^cCnPsiC zI1Fa9Np>rx4udJ#qF@6dVn|ptVE8agd=-J=aDH@xXIG{e9-kC_DT#iK7>(?=%Y`h3 z_ELHrPf1RuO;>!Xe+$lnegSi}6szOiWjH*UM}=69}M`_z56JupAC zdd2WSZNGYJI5aTuO%`}VyPD0`ektc^PcqZrWq^#x6~D_4WX*$=8QB~l6!5JqieKl zOV^<;LrZ;4ZmvOkrj)6uI+IgVoe>Dsr&X0B^LSo)5QbZ+bIEc`l2V0CbptghP3%_1^& zX?tqMr^$fQeeqscVTj7pdr975jlo18g+>ZL`@wd&)zTn>NZ(6ZNGJv_Q}hu z=d9{FcWdTI#~)eKa!R+$# z#4IumjT*r}_Q+-R!iRUFLqwExX;ef|3#@<)$D8@3fe0xR6zQlJ8kh z5^KnUZoQnC#rOHY4$$5ok|@|#U1bav(Qecis!fgU=Mf1Z?R7!lQzh(YO|r}AqCGyj ztn$0stJ>qNmzAvj&6^t+UB6xKuq0{u< zEcliC)n!=OGcyV@s%BN!H3geOHMJ5$?zR-XaB`$)q&GF$OM@&3SD@X2vf2)ZJ+m%U zQ=MaSyFIzHYNaZ#$>~g)Xi9f@@;tJ~V@p>`eW+DmBAhxB7{0D2H=-mm_vhf?>5d!@ zLE*kZFZG?&=lwOTM0#v67950!R*%2rl%;xUg`W{jRJ>*{wo_Q|!C!W7pVijY6Vwv? z?G3(R?H{bNU)#;@|K|5GR$m*eewmGAvCF|VD;0~*0;bq#-`q?kF`~H@aA95x7 z%GrCrNe{YaRSgYwjD9rs+L&B>?j%06*SgAvhE~JR`U9(fjn&t#xUaW$*LL!w5Cfsi zk_m%loaw#vH}U+rGyTh_Afy02f`)p_wPKmCuv zu2mhY%ag~-R&{RQwq_BcC&PPA{=B@mU<|R=?UO5cv@RFE(M4*h+m@T_H9N^SG-Nsx z{puD!^BKmAy^yg9Cgr506cjjZ7Bkpzk}s+F$b2QLbeYaKYdB|w(p^C3u<~*RjH#Ub zwDxE16&7OdwUL)ES+IW1#_x2y(th@Rt@ek9et78q|4-YO07h9|`+xU-%WO$zCdp*q zC&?s)>>CM?3=l#D1dM5*F(e^`5H=AJV@xqn#3@ijzy&v?lp;k+sX_?Uq81SmDN;(2 zB2r7$`n1ZkK1(6<@&DcX%}gd?ae4n2NM^fp?z!ild(OG%o^$Raf#hLQgY~sK{MK<& z=Zx}6v(^S&30Efm5JRbc$n*%Es~(DwE`(u$y~Dg;9YB6K)>V=)&si205`y!yFfmmW zBLmX|sXmZMfua~>NDzc%9Ll!ZZYH~sO zTCfUP&QQT3!Pr9hhtaIyu6r{P16jxj*CHIrY#coS+1If(#~m@lM6X3OU})Bzg{_F3ibkX^w=_ zk-52fW=Fh(4l5mBN=>EFrBukXN=-C-; z%jvnPL3D{)c1g&kx+I~1?euub)G`{tgx*6a7#j#_g{*CSG=^ZbSLEC>xGJf?d_0%t0Pb9{U9-Wj* zr=%uTJ+yq)stG@w-!d80j6}58ad2r0YPQ{ic-O`^sERHkq|s7xG7k);B4Yzuo$eLA(KkER;Dr{>&tPz0Liu> z5BK$!l;bdvJ?GX3lXM_H(-0Q!2=JXiAU}#v1Cw-2&EmE9ybXIjM&0YUbtLXXPJyEh z>%|u8ott8)5xzlW{!&Z}&Z3xq9ZO1=FIBA^K1?24G_*?nvi{Mz(|%Mjv@kQfj7T$| zc+kCgG5zTNE5B9r*_mo@XmF_YZ?n%EZQ%jx>CALljQ{*8eXuNBm0>$VZy#yT9yhKu zd)%$_Z?BnmOP<4#J*qfm(zrQer!5GTyWRh=MCxNJD?>A=!~I&grLr=X2J7oS3N48Y z&9`o0lBE`Edkw;9W8qgHOlgFKit#^)pC5lbp5{b2BPK;)XDB8|5WPt7R5Zrg!fk;D zgV7A~dOU34>jl^|vlAWeIEEB~=ZuHP^m#S7+ZRkL=EIwjPs`PZ$o)Ca3MwUy$jL8D z>OHP+lf~g9a9?o)Da_5QsmaK7!|JRdu~m5^5G!Z9dQn*Ob#JQPNaDzVU50IvGB(|h>J@S5UKm>OUPj5j|eB^k7&Ukkyoq*&S|;L zT4Y`_?+uZ_=#AyVrV97`p|7`s-83sigBlmdp*U>}yc3l*2+NWsB*ckNLXb(S_rmL!~L_9~*E0#W9m0b1s(h5v3A(pEL z=|!mv{lqx~0|E_!R17j3s2qr(lx)WF8dxUou}Ng-47OAU9L}fuz=)elhie@SFYUDt z#GM)hlVUOi0C&M)G2CTXVtB+LW9LO7%Q@~i-}A#g)xr8;TUKZjxvLNNUOVaP>$E@a zG0p%1aaelbP7O)`Q1`<;r3i_PI!2MOaBDuz=mWC354w2HpX!JZaHcS-2iXF`gTrm0 zy%G^=^QV1~zK{B#KMWub{jW0zeq-{V4XXC_?>8?#{QSolE~GhwX=p&W!E6o>6(b^p zY}meHl5pDR8>^>l|C#a|yWgDoy6~SnH|;|Qhx(SQRh%(c4M27@Y8ZC-& zrwj0-1u6zl{}7bg@WFqOjWC6neS9N4EbOB3Lp~gQPueC)Q~Fq`A39gBs%t=wi@1?Y zL46MvpS_h%Alt+icx*Zxj8dp$pfpK`ajFyH1Z8AN(Sbf-1vWJ-LIOOT&klphh6ZW& zl_ApMD^E1wd*N4AX}hFH78=|#A%f8)m_ltP!OWww*toRl3XI8Gz+EU|Hbh22daMtp2B8rVokVXoWE;v2^9|<>UlZ{MR7Jl8jR!en5Vs}?W>Sum$@ydr`89ck z=*scu3nC(tbLs+|CuZkC+!r&VTN$Q1akO_ZhccbT zI6_iG>2CB9DnvmCgz7_WVJ7szSmIb;5Ba!V-s5=53l9tDnw;9#ZeCt8Dc^37G{(hS zVwkL*L17ATP()BTK8~Lu<%u!t}{jxF+E240NuJ4v8&`X z@MzN=LCcVCiWou&Zs5Q$@GzyFoL;+DcjW7Fj54d$P!3n-SnDKNR&@Lud7iKEFENtZ z>1xs8p0iFYUVG(Eh7o8Q4~+N<5JU+pz!Oxf^#yYUh=F;HV){DZcKMvdl7#4LHWJ{+ zdz7$hSdUPoo~7fFDtztG)$8bEy=QbsuH4C@azO(zo_`Z-PLSbG(Fuf^<$TS-x1jZy zZ#B{wYvmgmd<{j#y5XAG8ijp2I7%b_qH zl9_YcfY@2qzZXUy1{gJP(2)3g90tzm#VM_0>q7+o41l7M%u8&TeA;w!y2%HC0h`q; zcWMwkl;aR|oB}{W)=1!`fd>MH1Eyefc#KoRLqRs%7=sD&-Kq-|WP^bkQMybIDDaiB zk>vBG%2&S^8xD(O#Nla3N$UWTBL-jR*W^o#?K3WQikz{c4%kVOUTOq#@-~6I2|@|G z;8%gOwNFjFOQTDh;{4MsT;u1&<$tU>IK$Jrh#@8E@s3g z8+6#u2w3x8iR)u;1a6WuYuA!l8k-yTfYrU6{u$&GVk0qoCP}Y{`DoHLN<@?l+eGrF zi0RxV5Hn;C!xAAH3$i(yeDN?my{p0Iw<0*Bh@Y)Hy|xz?9>bQ;vq4C8T8K%f7eNRk zdPAR(vjE|TF^9(%7yl>kR^!*cyOysoMqk;kjh@q1=JMQ5_4+`B@tR~4?59SBh>A(R z5$^e3 z3i0TmlmEo}WC^2_Q9K7Cc_fOD0~wEi0~wW^&LqiTfLn~}C?k@Qh(@Zr5z_sM#PKHR zC9x0(X+T~)xwdyVy=Sc&OYadsyPPIha{M8W=xWCG;7fxr%$WdgGO-y3M{SeIn=($F zcTr+SP92*iq|;!_4Gqg#UlWi%e&Vu@ag;~uXfm(Y4vu2{EtUFn5|{1nS&&1Vlf-kEQ5;*-3`|0BPGT|{0>Wrg2-PCQ z{YV5(V#zNW?ZuNY^Dk)3#MT?6ESF_m+As=1QW#(@m;}*;%!q9U@}>dz1n)8uGolCx zBM{6S%)zw;()ft?lnDATKI*lL3o=7}g2`B}3AmUQL{0v2X>EWvYrHcpNKvc;3DCpjBnFFBlegQ<!BJ3x|Q=$b5J+TFu~Uyp-01K)VG6r(C6KeG_Pf|y5v zm=ryfYk!*h+X{@LMld2*SzKK+n?bfiZ;3v*BDmWujCDG6fq~!HNq=!yn>mpT@X~`PNpY0Zz6qzap=gkY(5!#;t9kZvk?t@z@B*aVWaaEK5H{cabc4sVK=0aoGM&#RlW2M$ zhJ|~Ud;ny{9E$Igwsrn?6SrBgi8mN!#fT0SBeqdoQS{Rkj8naExweoGaHZTJ9)n6ehh@QyDlRemEJ5@Jt)fs+)gZ&Wq%o_%)bvnQ z>w;O9Tx^mLJhmk_1{tsVX&1isC9~OzdyAkN5yWq?$_B3tr5+&~(1;*!O_BKx=z28e zD_-MQ#xGm~xgYj0tQspH&>g|>r1{`i2wA>g@L0PcLaj3saU(cj5)6S>oJ0l(huSPc zAh%`$B(ESacS6ylpK<$!qsA1tpLAeimy2GHl<>%3pXI}; zkCG?O7|9kGY&4pg3=V-14zk>Z}owW`iMs8&I-s zn~l6_BiIk`3M1w)5@uzwdtRCCM=IdpC%H9DHF~kxgX5KB>RBClhf5x2G%$p{tHd*} zd`>U#*H#OcMa(v*pUd01hOzF!#zkUzt=XQvFv3q0jj)-f@wBF=Jgt#OB5Rmn^xVv_Cel;x40_7bnmy^moA|W`D`|N5wH_q2 zs_kf8^|>TFboD8~6~xiCr?BaFkvBrI<74&?1l7iJ1`g!#fk zpS_GlK_>tb0Jd`|gm8QFnC73yo2w)ep zhozP^{8+yC-f%~G<1)E@-Q!Pf+$wM0y#9%&pL<^Z`On*@FPu4lj&9p8r_cPkIA=~% z%O!;LAy!|?Ro)N1?m5&+Y99B_0^l33azhKA)F(<>3ot>6EI6D3b z(Qc23c~ndY4>6lVEde^ydJ&Ed{Uf5VtgEwg$&c=9tEsBU8JrLx+;^W4kT5u>qN=9N z_~1Qv&7Ir6aQ><_&xZe2{s75mU*GX7Hsi9RzxxRk+YrnbzWazv7-r4~%d9 zfOBj_m85unWxwYv+T@$wXOSu1Hs7^9@%!$;=REfjpZh>BH)N|9+_ou6W zovypsBnWUK{@<-e;RWH>!b`$l;kUvo!a>}qdsH|soD@zAXHm`Og7C5MDazCSOZc~N zMYxLHw~mz4>37y^69t<5AXb1e*gXWiEDoSZ~44Z)VjHc1a-@Q z{G+aT=FfYG8I4XRRX_0JW%+M^v)|tJ(iQoFv2^yv9unLw|KSg&p>v+=!6B1PKAu|p z<8D>{=p)DEWqYs69|x7)`4qC|y5+atGMCSPx`%}Ck&h0lduV?Tq22O-{a3~vuHW_$ zagY3I@W{I#?;%m$@*8i2j9U0a4~gC*AI@r6d7y_V-SX$3XE&~TrHAPD$X|q2-n*`c z#C6NR|9$wF_Vpv|Bpw>IoK@e3!DMpq{Vk9w->bav!j4_LdtUA#!@8AiOxA%|L-#7rKmW+18=l$JLxyxKTe_CH zR;}qF#e0>`&L1s#@Fzd*AqCyaeKY6GU)bJ5^7ks!r?<4tz3ZMHlGCj;O}u^b9gRIC zd#}P|V$GEL9x}LFsVW{?K59%4$=Itf!8puW(L>U@m7I9HBLiuPj=f5BbWB2W+Tb3N z+^t0DOy-dA9%A3CFcBGG3GE>XyA|QzSFY~o%rkC}@~?k=b*Xnh>On}P${DU){L{8A z_cc}JLdPW|Kp9`XS$2Q zV*T9gk?9fE7CHn19{*3YwVmL)t?eEDS#RC{q7_pPeUJ{ewu)PM2dqOc zSZEK{pI^gS-=fWxudeypbub0gS@^lpU-pSdV{y&n(OXk4jz+LDnH_x!_UJ9b zt-@`{r~08VRhTBs5M~MUP}^e>BEuF7ONHga3RG2GD?BDVDLgCuO!$THOW{|-Z-hO< zKH+!5Yp5A@L^vj#5Kakagmc0NxN-gy;h(~P3;!ehM{vUfC?oYKkXVV0M3PvNNK!~T z$t1Z5U@IZR$p|u<+(K?8w}~V6!T!G8dH=XMt6sPyA3cgalhq~@()OcY{v%30a)gUP zS)4fkv0r~BA3r{R?oW68M}E7d>lc5IlMfx5wRr0%(efL&FI@A|Mfv2(Nq4Q=^*{1E zP0N1v*ChG1*Jdo){9(NO`^oK3?EOqWeY)nJM|S_W{HJ=?v+t$Kzx&;^2RD9Tmk(Sy z0HGHRO)?2u1XnwEPq}YH&p+jNUm<$P!E{n348jK`q-5{ZpFDNWA@9FBA{JsZ5t?Z{ zJ}4*ULNA173>i#r!|P!X#^EG|R0vskRfvBE&>$6;4rbtW(Oxe2<*KR!5Ze|KM{>xm zc;C4GT<82X&tr{c?;L0LL zi3t0{AOE}$YO!qZ80D?Ee)rm;Bl{Sc_bBvbD7<~7fDGBA$TBqEK4xOv)Cz>go=2QwyYj}jONb+`}YH18Rv%(?UKd-uV)8nkz)GJAG? zQ%l=EkVd~p3A&?k`pkVyhdCn@s};)f%GDvtxCzy@m(^lr>{zC(_Tg6Hsy#~ZS!k<$ zOtbG%Y_`uXezlK`CzG5p18FPNzrOP7H15uY zv!D>R{WZV&wtU2KU+>p$gUj&RUoxO^INCV;esu#rm+@J#-+MBiC*oIEXt$-{F$9lx zzu$r1|HjY#`et~Lfv-J%d-3$b*Lm<__=KZ>_RH|_e(vqp_u2zD#PcYhx|}h)?`O_z z_HQ2hGkcEz&*jIwAI+Kb?(Es8wEv#>+@GK||6cDe=aBL_r{<9D^XAN%$KRae`{KaY zeSm2Aym_bR;Ct*p{fzZKd-k93iai5>+3I9;`6t$k_L=t)ZO{_fsG%frI!TyLlBTi0 ziOnQYQxKlN2eCnFP|s@r>(z5jN}HyN8X69Glu@(q4X@TZJYo#I{~k@^Kiuo!aq zj5@{hy@}GP-bBQ*;LuAtF8R)zWs#!t7Xk*ZbKcCp8iE2!ige^k@pvhhJxGhM9G7y@ z=RDFy+r&=ZXFu-{`egnd+NR3n3h5%faB2Cq*3S3w4I<%`8wpX|%jR=4YhM=8s|H}4 z`ZR-~P9n`J!f@d65|-)(`U&rs0&6V*1kN}3neeSdy>JO1yAi^K5FErYjhA+!fB4cU zMhK5OkNg0RiO|Oz=@eQk?YvTrwrj6`sMJY2&^BZ*JYCpd@URUov~qI{l&s~$-{Icq zewxEZ`|;9x4jauqemdqGWUZC)?(Obv()uga=)NCxD{c%zYj)Db2aN$+iBbp3?zmDy zX8_(dVY8GerSoWMLeqaAzr(JI6nMg_kn0&h}_LwWcti%v#(kD_dA zKXG5@iH?pFo%fw+uWj1aJbim}(~jv)+nZ=h$H@--zYm}Op|g2=Q`2_#Ve>Wte%WTB zR%(!{afW7wUoIX#xor63%HfNf2tQmSd~oyOf9n!@oolDmPikwcnLFgZ`-c4}?XJ59 z-;>bPl-#1PstOp7qiU(bl9Ll!5D^noP%*yco*&JvH!N8?_U?Np-22YGf4!HEy#Im9 z2i|$$uMg0?*>@J*x$906Ro4*L5L{gwR=cM5mD=OAA}uXb%8;pw(KnoOMIFhWdc>2|$DLo6BY6m&_5I~f zQ6t6ohV~(!Yv#@IXsUco=4Po;_rJu*9~~>ec$^y@biJMQwG5I z_9vdsN9~aH1tlc~|1K^pF0`|k>JU^@D*9D%VPP??W`Et$NP8}(OMPwKI}1vRi|mC% zh7^*+tg%{;oaZ8dC@fyj+KP|k4~nH1t0#+#3ooE*I(Zb0>lm@~9*)-{*xPqFb;h2}s>5 zqO<3nS*WUeyH$1mY4P%+Gqd-qDxrJlo@&RMz(KgQLt2Ja&tnTEK@1QALT!4%f+c+{ z+Z%(%gaDlGRx)56q)W?srS_xuE;`oUezg7GV~eC^R~FNec;0?&(LH$c7$E!i0Y9`e zI8+d0Vge*VN>0%ySR#Z3-q*Q5pqh>rqUq~yz%q1Pr~7IwuxVIe+oxf%O}G{pe2fpK zvxPX_A1_pPB5?K^9HIz;N?>GE7z?3A3>?b5!Q+b)Ge5aN{NwO+T7V_8 z8S;u~^JCLn*RF4wRe8&}nU$kwPQPVBBV9aa^&@Sq>&8~KR<^cQR<*R@)RXLjeCvQb zG@;jIWSW%=6Hl;B7m8l>;Y3=xR9^03}gqqk>N28`NHG&8|Mp0fsmLW=nB9i z2vrOf^7910k%h^9qr{0#ejbu;5!tA8s894>QJHH&Xvk|ThlSy6eU;hX89!S8_ zFIjb3o~){{BDIL?fDN1KK%LlB2hv%KSpC|f;&5K|0o?8=NEKI%95G|){>+|QxH>K4 zdvd$;CQljJ(eiRe_XNx7(*cuqr@uV^uJ~229bB>M4e^jP^o-)j?9S|2a8KFdCNxSJ z6nN&0W$fuy6`!h`{Y-|mOhllEP ztdfI{XY+V68pCzoDZ^MKVSNSy-1Lc~hD}LNG6zYP07(k6rPzZ$t@+K}i*{`599{Ed zUFYH{Q#uz*LPmxZWY9~JH83D3dg%093la>9GO{lB^Xj>acW&vpZ+k{UM_uE+tTpt} zQ0Ng!I*!_f>CQ04f`XATN|N0aj$8n(G@z9kW=LGhXVD~VP+&Z;9scvM={TgvCKj`r z7=_H>g5rY8q=^yJ9$Q^Wmri-6MVhpExzhVzO6QI#b=&V)I%UR+<$sHC}*leh>g$Eg@ltJV?p5{li3t+qFMTQ zq~7VRW-BpSO;*&A0FD~t;4eS0?~@dXiN$4NA(n;*y}WQf51>B?t^>OH2+h_KSb84F%l77OtMT@rN-8O6SQ}-1i4W0yB|nKW(X9<49aHW!jo4 z^H(nouig7;=ZvKz=B!xQ-oD5+z4pM0mrkLlkyk$!PlAFt?cZZSEE^9<^mIYOgm6XB zr3#KBfhuE(zOzz2UX!6-e(W9uxE)@sKCz-wo%LunnfKxfGKJxNNQf1ON=t=EAjm9ETD8=E=^;|+R(jwmmTa!} z7T=nYEiG+%ZT^NHfj2@6B85-nFxNf#v-s)oj~n7Qb{zz8A6Xp|#D zr1%8A7!YlW5hG(_qvK2g`lzramRK-DKJGN&sdNax^&-Uu2vZzj1WsSnM)gO@nnF+t zM7sENX8 z)tQei+5n5J^=h$1yQD=}65)oJ%FH14tS!1*z zD8L*S8ypfA8DR_zH-uX(;RaC`iik$igo`Ue!PW>$X1UL>+AYUWi4VU%B5Nnuo`YpLxw-6K1rNS z&oz**n>IC}&cg?rNWFTrVPlhOtXoRH-lQ7A31DMh^(9@H;VcfwaGEn3GrBUwGz7Cm zhljKbN=`^fB$1I(vdu=rqL!pZnWN&P8lyy0lqt%bC@KT0xnPk-AraCOVZ$UPtB}QW zC8y#8j3|+d_W_j|3*p5o^j09#$_^xo7WFu)vm7V2w@eMP%?`TqRa8?|FMg_;qG%0@ z+>l&WSV)b#qv1)l3WXK4nqq~h-BvrMLOsa%9HXPHN~n+|R6}nCgoa8&e7rsRYBHhW z(a}*MiHVk^C1!+anUM-nj-Uk57-cgUS-nJF4uH*vFNHmyH1b+B-UM#AlYBU{qY++Q z%|D^mUU=@vkulSv$g(%_1GL@0jhZ&*2;GJnNKd0UkNd%C!2f3q;jy;>dxkN>@uaQD zd@T^BIdd6SFn_}>Mb12 zmes-H&C7%EgpAj6l8EK2H~4^H+(Z1MVj;`>YE59&nVPjxefOm?L62ySPBkp{VQukT!G*N>g zFk{4BODQE4p1B$eslaZ5l9prSv2eWCIrCBziV|o-YGkTm=3w*S#=-Lk|9Y^L6c-c} z8`+W(n3NbD9T$^?e=>}Z(BMJLBZMk#zEUBc%`N9XJfDiBbkG5VCNL*4oIDg|N85B2R1(O{3_`bX7Rmu&Rp`< z_IR(QMLo6c)!lH*P@x1TF2xuTHtfP=XKs9Mb}mhc5;DT$b8~V@V=n2+B}hhlC6G7~ zM3)oAG(|{UVsLhFFw80=FB$^|EoGDlRR6jx5msXi{u7GVnv5QnE_WCWS?7BU_#q%3+^tg(yN~)SVxSyW5gY8^$VB%{*79_S%08z z6rIt&S{*x~zF|D+4o{u1O1w1ffzmOJGbpO9ZHW5W6YhWB?yTKaTQ*2iXOpKwezD^5 zr>$fuRSQK~9j!dEH~!-BZD#PNAnj>m(rsDz_T=mgKy*)9Jq=u&RyWiAm zC6ec9!Yv2+m!ei97ZYj{t~I-m@`K#2+~;zS=ZbOBdVNSuPDWgilxT^F6j&KCTN)Aq z%k#AKajl>dPaDT-|2qQsc+oYMcIhvZwbc(RL6^_%MgF1H4hzjLw$EME(S;J0?lTrv zN6|t$6l$zLv1iYSso5+b0BEz33cfi>Pu06bH-OES%X1IR+ zMjob$-9Vq;4@XS|)Y5A8)e$43Xe~zW-a+eT7!7l7uNIdLpQR`En%*w=xyM{A;$K*Z zdN1kN8^j1{hyhQsVaJ~&%oyYxv}DjDgT%C;*7V3QQExM)SfzNAuaYc71{i5oxY+7q zUW62F={VT60a{ULSY0UD$=8p7g5|+h3uRTM)zyzG67piZoFCizM z*_wx>TI9$-z-4bRD!F#c2eDfAIu~XamKRPe#2Ha0k&=nkl9N1`3=V};FE}*BF+7LJ z;W@;VLxx~~80-k9hG24wgNQ>NM8UeU;lV*1!8u}-U^bU3WUxYP;G;sJ&{9b4Hd|CI z_7ph|M{q_)Xq1S0*#YcQ959t;cxwhLs{{fHO=Tr?c}-njOqE{(!?+FBI8$XP{_c@R zjZ?AEwEFHk&4fj$ApYaI*MMb}QsL-;`#%KL$oUiHGmm{)+QPuRTM^WY}GYFMVrLku>mSrU51w@A3yX4AIsq@Nm=__AZQ}=?& zyCpZ*4T&R&JYU6HT^g8?}X|y_!X~ zWbMwP30XN=&MZ;N3eBQfnIXrm(2LJT31A@trn zl9orJ@`wSUBOz&w?vZ9x2_WWHg^X0HksQ)<^*v{X=@w;3*N`#orl@Qeo%N4^TiD=K4W-`&lUR&Q|0#nb9}&ziFOg@>UE|ppU)YaJoZd}eB=Y| z!^)Er%&D=3qw+r3@>PoZKI%nA3>~f~m!r#uo0O*T#2~$rm2hh5v8Y^=-jEzmFPwjL zI3_JH(q6L}q53CWz1u|Bh{3hB$$8eCaCO@co~umTG?mVA|7_BZ!u-dkW6s!#NxRel zpLeNn!dZwrVIqkVNg_jI?8%}d`bad{7Tps~)1ynGZ;2KoqDgcvEsaw2V0K4AXhmpE zs2Iu!Sp!0b4tr%7u?!<`l#=I5_mmaaw9?^eGIG>7C5A8gNrF}-Zi8#ABI zOF11&)6};BMOf_0Ic7X|pDZs`~@Y z2x+SF8X+{E9#IpRrBO9b{0v4O#HZTK^iwu4SquHdFo6wA0%~G#xm;u9{75k}Qiu9V z)?l-&*Q0uyW|VqR>BHoPW)jl9UaV}=yN^SXk8Oyix%z3N$$2WNXDddt61{XqWo2z` zWrcdF0bI%Ma7uTl+%RlbXh{wF|y%t)cL2WxO5XoXg~#l;P@Xdmh|?f zi;CNhKMrvRF4G`&?r8j(g50|eayV($wE>n{2-=N(CaOARAJggs!*eEiGy?M#ljaWf z*9eR%9G;OmRM+PIHNEZQp(Q0{g@t9%=~p*M%gG_-Wj{#lG*p8GG`!c{aY%>M`dYG8 zb$FpE>1urqDu8;yQT4QRillp>;TAdtS08HSPk6l(R0iZZMumyqTlF~DboWk}AoIOY zrBfXw-wP5o?mm>xkZ1+Dsi=bzgrXbb5&|KBa0M13f*Q)WlabR6S#9}N^+R%Go^)p3 zTj~+UyKAIwx=EJ_+bYi)VGIdD8Y{~H2NS=OKm)MT#SeJ#Yb1OL#HO$^{ z%hc={DNWVW;)g}+GSx2DZ|e*9HSN9ImU?SG>0&n8NjjgL!kvwbGg8?-fC9=PS**wm z4cN~z`jM`VT5cttLMgmIY;o<1AIF^gysDwvdqbQ~afh7oTn4AXUk3Qm9DbS;dBVt; zHNaNGeeCD}wN228c5@Vl1evRi2qDx(Y2nO5&iPQS>Lfq%r#|;K{M;sish9#0&U#@S|iwNJJn$IekvZ;e- zl1JlNN%WC<>*pz!xknKs$?vDcH46yzWEC8OyLI9c#NUFC@GZ`q;2|xJ5S+xmIPWbK z^E(2p{-_QXv##EQOqOw1fAgQ)1>K86;Cdj%XtGr}K(jhmG#{VXwvH= zf*^b#ouR8Va`<0H?0;1szn+g#gb|-Tl1Dsbp@%$A&|526CKifoFaxYMj9HI`T>rWbzXHiiPf6dfc5$dOJGEdSsjt;T(B}9K~)4g{pAVCyZV^)6fI~ z8BZ`ikh`yZ#M+95p0+`|(U!Gj^2)!Ry9?6f6lx%4=p6W5$7@WXz?6=Pyxt5{F*YRp zJCINz_|2%Tt<^bti^U_CFR{PKeYfEI7x8^WC!j(Vj{jsV9c_A;RZLJTNyIAWmMz@R z7Z0(^`wpqK6ZC}>Cj9#-lqS0~wO05LFeDZocArQPN(KR;UA`K^&K5r0U#oO%xwKS& z0BAy) zZ`_gyh6F2?0CN5*>g}6!?-M@P>puF{(Jy73jhLKzP4`Q)UK(yI`}q*i>vJVtTCJ=G zH(ci?*VR|1NzW7u&z?#9KW1D9>d-E)6>{6#kNs&qh%^uj?EjptaYmvXsL?m}TrnU#F;z!CEk zBoqKlw$n(2vv(|Ryj$IRQ7M1%_)q5oPVeW^Awj`DHxLrkro)3E8kbDeJ*T5)UAe9i zbvhU*h#I~LV0dXeFVEqD@@)6C84sk?C%pXd;?s39O?Q+{T)Zlc-PU_qIxGgu$2G`- zC}t!mOT>xB=Zw^BEH^e9Md$>S1&eyy3z<0{nIls3O)4+_yy33<66zCvw|eoP?~vDK zC62D@THyd>VH1$-mX|`Rq2h|5L-@Iom0i(+O)+pdJlU-*Oe8az3_l?X7$DeyAoIH0 zrEXD=krtBS5;u~1mwJk1fC~RRh-=ipaftL3O>wD}WdHvf;&Syfawkc2kxgQq%Uwse z`a{%15+WmCR18L)q_EmZ+L(PqW+V0+aF_Ze2PR#1^;U>4W3@TB!H5W2 zQAcDZQklQlLp+Uk$kfAKvLIcLI

09#t;sFye_GY6A808D`bK`QUYe_cfxM14A4aDjK1LpF*@+E^I&A zZ*GgVnRUlE&}A+w*!7*@(X?#L;taOftOZ?#!5?}@C<{4-;*?rda8T|!$ zXtvs>=7?>8SLvf0t1!lA02?V(RpW#7qnRJ5t?Gh0vhxF%xS4dcs&m{=Ba)Cqq6;ts z14oE*V;cYZV`c?ns8qRNrP^3W#;gS6cD1OdNjl&_C0}nQWunuDc%zxztya$=W7te~ zxKGmy6Wr%%BAZDsJXWX2yRsN-$X=TH0D9IH;|+~w9Ap#8#z@s&^ul=ei^vN~1Wa7* z>{+e-xWfk$_IJP0`ffLxKg-HH`!Su#sP+9|Y7_9HTG5F+J7Qh5 zR^26y&Fx)Gg6RT=DNaehFONK~Hg}L^B)~^k#xW1Jt-DstH*aO!Y zcaa^ZT%<~(#l5z7rGp+Ce*3vC^sQ7jAuGR<>V0z&>lvXYy}8Wg)~vQrne)a^exUSb zpUf>mw382U9Qf?KKV4mE8Iu1WWTx9iFy?D<5HKMWb|8C9Hut8J!%e{+z~Eu zQST~wQg&~+ID09B+PD6{6I8F%oX`dTbEb=~aW9Z-GOk>}{%qIxhKfKKO%?;{BBHoR zv3i6-U3^(w#c*Z58aBtw!(c>x99eI`lH<$PD^Q@nm^6X;Cw8kD>V&1_(NA4+P39Fv zVp15sKR&nLZsjupJaQ=+z7hbuv*49&Ixahq;RhU8$-ir4hcyunhD0`=W9sfEvXJ~s zx~z6Lllg2UxM;}3{n|Q3tw&Z87PZTWUITT_RKjnfk*8ZdSWlj2{IQl4sb^bB2kaZJ zm9GmG^*p}~)D7y{S`L+_)1~UyZKT8f8ZEyet~Y^NNMs+b%hbX_YWmG8RvHQyV&4db$PB}N ztIR>TT0Pi6o?a;(RL=n?hL6|2)I$q;?IW0$GIYJ>#>mHQA({!oEhL#)myB7j3hDyf z)-cp19r~M#V2Sp@;?*X-G8m#5H{Y@(e4qsN=R@lnYxNn}SWKzXHqz-*4^kAm_+P`^ zsGdYVlEp;|=}wpXOA#Wy52iL|&9;GQDcxYq%)ay(OFPs<G>;sux6smUhqs?ZDZ zKKjXu=!NBD=4;H$Sxu;z(Zr0BQ)E-KdX};(!+m_5cw z@nXp=x*(6uD#>7D_=tG;N?Eu?=*&i#X_o8SeYV4Su85bBUtOgO_kVHerNg z;@oGh&Zs9l&$#G9^5hJ)T5XZ)G)O+p^(`@CB5pz4)&$NKu7#y#h^_xvbelJo! z>R&UPRf~XPjZ2E{{ZMSGa&HjJ0j-=XE7j4~aHoaP_dJz(~F`FCRcZpS%?w`>| zb~E0EVDecHUONZd!JEU>=JKF=Yddbzg-Nnd-6BpI?yeyvw5lJ>zCGr*=8!Gw+;&vK zHo8cy7&+XXE5f7V!}43rtj8wVt=6}br_N)kilxJQ&mGll5{&oz%*iX(@+ zw~HCT$gA!B_JMq15w_`vZ|%lYJ7F=7nmsm&KDT#)w(h;~3__p134l5YMhRP1eh~eZ zs&{e$bC}m80nDk)B zJ5;krM7BR?>z|!i^=XVgn`S0Q7c< zC)jG}lSIt+{Z=-~2kQ1aNjtMi+`k`7ao4UdX z{pX!zC$mYa)!7UjGfF_uwtn;aZLE@u^GVlAsY@L?zW4KtHH`J5$FmL*(#QX(J@-m3f%*fyN zC{mvY@h*5D;eCcHU5bE}vom41zC|l<2$L0}|3;WTvlT&JOV$6G1+(>4agrZQO^5N> zWV-pfI*gsfdzfR^N3GbeE^uM@@KHT^wReleZ6&O*e)1RPFASK98|iv>8x~ur+{_e@ zsISf>Pk+sL;=9_J>}p_cXMU_sA+@B$CDo}TT`)iVV0{-mQ|I%FeyL6;tt8zgKBc;# zV*6Qy-vy$d+mTtB&Dac*6w>ZeUl*V9$MQQ^nVzZGrXC?HunVNmxKxSTH|#zlZIA!$ ztV~&RV!o!fHXtT?flEqpTgXovRI!O+=7r|vWad+bNBQP9gjaRVZ$P1xHka6ic*O@B z)JycfFBwdv;(TAbq(@y)j~ZxIE;>(ri!7UoZ9p!!#`^I59(KtF=4~Ah=Qp@#UcGvN z+a+Fz{dU3ElPf->)zLsZUG%jE_p>-Wz&Ps%tOw?={RZ2Yt%pVRBzq+WxoW0*f@@G5 zS$bx)&o7M`(0!9Va#S6@fE(oE!QSEY%y>0Is$h6|;dyl!pHtjsadX?jJE@cA17?Fu z%e0)pWFcEH`_Q~djv4c$ygUHhw3^r-u*Ehk0@yd^{VROl<#6W`JgU-CuTqtJJ;M=q$p?u0!u!6kMOOYboNRCl2)6zJZk5&b{j2`pl%fJaaZJuy}g^o zdOuA4?Gf&nzn-Vx58e*-BMlw`p{4*wujdLQ_nXykV~_j=a8^pO?h-a3zz7aQ&uaD9 znFgaoz3u`(YZu9FYOB^^BKZWvBc&&nT?cQ^jcb_wSb&iOOCXYoh!v2_ogy& z983~|>Tut7W<~GJo>3pa14;!4N_A?Bx}llW@)I~OB<>Yqh9Rzn5e4{_*rA!ds~@j)$u4uHykGqZdm$bV7$H^j-QVNN6|O2NjzpIT#xlA1qe1i*_(-@-%q90e$c#{fmtNj z*eEx%NKkFia}WZEMzYu?*7j}(#7p8|US*^8?)Uv+GRyU5FufZbj%6&F%`FmkKz*5Z zX%@-#pvpR2NO@CVj@Kdqro&<9kbG?X0re~?60zL+&Vs+4MZ#CFnyb#LNAL@rY3*(5 zHkc$D96#;#ZM-CaF?1z^a9;DFdA*w2=@IvmAbN_Qw)mYMp=v*qB2ZnQs&ki;7nwzJ zMah(FfJ2|ROFJv`SR~j5O4_N-HSVqyCM`7*T~=3h0UTUtt1e&Z1VC(WU}$|GsD66k zth!x;O2?9aUO57=?o(U_g!^_P18~LGRU31kvybo8{k7LYbxRj{2e^JBT6^``@}%Cg z+L=NBGflp$zVVr+ADTVtON+@{Z16bK%$BRYHc9{UIL*TWpDSCmI3V?{SQgLYJ-Jy* z4yb_3$dp4`~-gCK99YPVfH4Jz@s|5F$U|O|k9=6!nyn3g_<00~TOBk?~Vn?qlS9)y? z8>@F0;qU*tF?TTk*P46j$1bV$%2O5ca0X#u}BDthKvyfoN28+bqQbo^li=6Dx%ojuKix>08d9iuGeRwyRR}PJ< zR2Vqb*kyua5#gn_%_a}gt)KeA^G0Vej%7y?&7dOxkaE|1DvVk7sJBERA zabErayz9ykKmItT_B4|PWG-wG9xuQ>HT~oEJYGyN2ukj9cs>cDoe%nyO%IC^VB>^7 zKGj4XQr||Q8I04r2lO8&i?h4o%Jj@+9X5g_T|M1Gy2Oouts#t z;^@O0jHw+FdcBzHd37CPv6i~TmwPK*+}GfR!nt{Z? zS(t;`(R;=vr6c0mhuL?8r|IYq)JIVMd7+C|xLBd*u2^hmp zaRR63I*lI}3PSLUAZE|i_jhOK$f-Vh4s1EPujTpOw~V|=%gVl%=XN`926Ieb%lCKR zGIk(LPEQTbdjFQ$#W!hr2fU-65uMweJ?SPb>-u1x+dcMXFn`$B@`L^`IWOs!WBq9J zK84SFu+xYYPUQF$?{u;?KCtcNZ*05T2e^& zE{5;Gwv)fHEyGuXTl*c_{@_M!A(1Db3QxU!6cuVlJJZTDafPLjAUGkYB_XpblO$WM zF)f3W!voW##3V5^A|gCkk)pjBl1L|Ig?Cu0J_=t=pQ+vo`U2C4&eZre%irPq|HC{jQ{OZ4cWclKs(|TT$qBcDJmtVSbJsGEeM^&Ux ze)Qvie9ZI-uvg-dnUo;-?CkQpqPS_Y>i zN2j9tVuoUkiLh8Ak?*F{4N`b*D3%_JXh#-qP%@R(A^7S@p5@O|7aU;&^VA{WrGh+# zgox)+E9K!EIJOC^*>F^pLt^!<+QlfAJ4=zfx@t#u%>0Jlova3dH+}ZXGa{=Xge=-C z_TIlv>pmDP?c!rY7OOThx1vf)CYd6WDKHMcaeic}uQbxN^D}iSD+u@PXXwMvZ#F~Z z@Mm8%^}I$$-C&BSup9EQR*7bLmBKjZ;K2C!>@-7|Wpcs!0^%&VtALsdNOlf&(n)j) zm1sarOj44P7ZR2Mdx7QQvIsw3N`qx*TfWYFJrDI(P=`lKE%e=HuR~o>R?v`VU;7Fl zg2Vdqu~}v@+4j}n&YU{EV$t*KzIeaOHMcWrWJ=QDk|CB+@#B85^v-*Kyz(cZ|MNGB z+mL?qZ2P{fz~Up%e)O-|zj^ubUpY*{NeT9Jy&>wc`#V>!cexYyv23{0(it&b`4Z1U zP?zf#r!ms0OA8DXoz%vX+T#pCRkj415@}hYI3uE~6jtz6>6hmEUPeaLd#?wV48aW) zQOKo@dW$7mF{fIxqC-9@vdKM(kg_kyO4PDoU%c=BVI|FZSwkyGWkvof(>~o0n{=k* z^hgJAJvETB5l%C39Y9%2q_V`qaJ4X8E#E|0USF>- zqnM>}+fdDFAZ6VoQLw_)qfwUBRXRY`=+vyRviOA)P81)@=A`Z8 z13$`|(qwr6WdlO!k^qKn0K+!mneO30GGF$Omc^?-PlzTG8QPSp&xLEl_FrofSmNUX+ zvb`FE3)VwIEDKSIW{Ekn97O@dNZ#Gl5>(;iNtfuke~zJ!Z&98zaUT z=*yP3E%cWbVp$RrU{=bNMntu;#fSuElo82$o7J??(8b(we0_xrS)~ds(=h*r_&c(A zy~5g824`pK>vapJO+JvJrnBJ`f@mr&qBI=!r?d=WRy^Z92$#H)seINwe0u$KX4Dnzt7pI{e!aBf zbJLo`UbW4{M>~@>#oTzMlkoi>1m4_qZ1}(W=>3CnA@cfk>kA6BMWkzkzQF) ztB^4WHK!JWxMM;h0>GwNSb4k-3_+2LZ1qz_aM%c4&7E%Z~RS!}n$L?M&xLvpf)9twDT@v?Qs>9z@XR5e7Z|4FC{ z-;=yHcY?eiyC^rWD7$1xcJ`2>yzCP4)5Q<}v}^Q`VIxxS$_vf=?kR?atK-aaA!(YW1~35hpBJUZc_^iaqBtVV)H^W~i8(V%*~(;UAfB`Wed)P`ue zF}{pR`-IJPusqHfO6^Ljvh9v}wD4N8ZtrMHyE{A7;Yz#?R*6n);*wYmEB|sI*w?+6 z2cdd%y!w>Rjqo}#q43d|-L|TvYlybJqcYLu2+h7bjal0tNQcA}T?M3YEKb8l?GsY5 zBM8QhAT=R1D$x=(O1xd1j*7}XSKoC8qxzL-Sh5!)$Q)Q6*cd1VG9|#|WyXT{wEY1V zypKCsj=y(7UTYhY&JDD|I%C|p8P*1Q!;jVL*@@Djbu&xz@=E8frX?O*G26zhTCc5$ z5uC>e;{8Vu?-@aSLVT3{|6l|@H8*es=PQQ(zxK`qzN+fl|7V{QLIy}e0ttbT+z`l2 zW-<{-0tAwv5@L*~VNwQB0S_S6I^e)jY_<9-qF$}`QR+bTIy|d5)PX~B0H<0#*0By9 zp5T5eCHEaY zy!5#mzb^Y*gStp-NL^@+q#WvEs2#>{jQ0%VTQlphb>T-R14eZFM@R?MrKqnij6v%z zjdRDKebhRjGA~WuUF3~Lm8SK6GWap_Hr?9prgd3!OXoJuy?buds8Q*0aq&3if`Y=j zy4w2u`cb1s7Zl_drWdl%XkA@>ZG7#N&e;0;>66vu%EH>($`>ntU-@yRk<_U=D?2M^ zWaW<@ofV&+KB6g0WzC&&)U=ecv6)p>mC13V>I$M#vXfJX4NEcf?(QjQv{9mFcOf$F z-iwq)OjRifA6Ad%B@gmIEJ#o6;x6>+zFS_FbXm+3F;5))SIuMfc3JyPR#8kjV7)kR zwdriKN3t^jYb?oOl`IA$`6Pa=EQ>Hk>w0A6BR*q`iR5H=%{f(L+!|9mDShNaJJQBX zDUDH2Bv0w8V-16I^1E|K?Rzcm+}zCF?++W-I6WquK4e2t>9 zjOp&KnX5k37Y~p9YTwi04R_C)KCv}t@)hs1L+Npgirjg(v|{u-toPQXhBe*GB19b> zv*$F__Sis0puD`Isj0EKtT{V7(9tnx_So5t-LtzFbQ|4GDI;53*(0=~qIzr@ zJKJObimSEc=Gn8`X9iSYPW2o$r>iWvDfx+HV{7~U?fUZe%iHxpyJ~7ziS4Si{g(FL zb|cWGn!42RuB~17cNxj;U0vzEQF6+K99aV{iD6 z;j!Vc*QDpauBwij(%jvhnK_~$u>A(1MH*eCCH$xG=?&%3Vq`0~XdTGXVJl=RHS(c8*g3mX z@04D0RCcmn)}fy0P#qm<8riQ&S zxT!oQCbD95`+ROBjEJee;k1V?+_34w^VV%tzmA&!^842ulHVu4_}ob+BtAZBXAA2| z&T5M~jrAlSTCwnwoge?l?pOZs`fK4X)-3yX_`Vmu7c(p5mZk-H87g-){|hEgOph5d zBrf^!bTv0!9i6TkSpqe^K!%dZHKjF;HF|l$*xb>h6RWbS8mnekt*RPSRaKmwT|Ky@ zq&Pn2ix`Db9~Q%^Y{QHZ#YP}`h-}(`eS-guSS9vC@tlxrcSx7bb5r81)y(43tUd0o zY?|yY4(Q#xpa-ZFchz?G!(_p+f%{kFu!f~~2cQPOGqGx1cADq5Dl4OJiaR|nZr;)1 z+tq)BQ`8UVoRXMudg514vIhCH;r}{n(`{o0H!iMXNtr9y=Q!S4{OIjJz4n?x4}^nr zyF2&2vv}W)#~wE~9ArUGb$z&beO-44i$0b;wfX5MPu_fI@Lwe^PGV)~iEzDu`vG;@ z_nMj~B#jv{aiTudD9=hNO=?Us8p~Buc~W_7b#BJ-ld>lLb&?)C)G*4*Qex_Jasp!l z1#E=uzMS% z#@o`MGJAw~S87DIHwN_XDJa*W^DPqc*)Y?1@h?L{+v>LcXmHi6{9k@=^GnaE^D8$T zyXWnF-BCZjapBE*3F*(=vTx;zwQE;ArJBx5P;aa>hpR!KgzXh|-PJ9sCM~$~s!ek% z>v}(&|LSi$Cr9UwnzcSkTd{E2YISSWL-+mLcK6;78}OaWTGK7sj;74XlN%ZupTS+m z$27(&mU6v5=Jpu25T6VO}Oe(%Ag;jJyhM%SjwR(!2-Lt9g4HqKl>^PQPSZ6Hvz zc*Y=oYE)HOS$S4MEoYb#dq=#AZ-|>bc}i*R0(ZINyK4v4#!Z!8#!#q#E3-r z7m1F9fN&2DVsZKFY7uho^p|d(m-K28%P@#%l!frwgb0Ywoivfx>h$lQD(M8k9qXQsgIN`+vMFq z+`m@-88g}@-&MP%>(-@njvEx;9$V9}bj39tS8h0IjM2O@eCzQ?cTZif7Wb5f>*QYC z^p?n?`QhfGOU_x-v103{X;ZkvIG%Ka!@ATh+J81xL?vO8qnetgOb@W?_qcI6XXk9p z*`D)sPE<~AO|HtVlZ`ZM*_XUJFrjIB$8>$Vw8%2PG<{}3c4(MUS(vmg_tM-4a$n7j z%B>z>Gq*++)YR3qv0p*M;J_Dk>h-!0>-5X(9;(yl)}30X7u40&wbdDQIkn@CAEzY6 zHohpJY6IiP2WpLk^wA?nrYE|aJxp^KbaxvJt@}GD(E_ejb~h)GCXr>Qr4{Aorrfoq z-RA9*Hlv}u7L#Z0F~cg02;^uYRyaOV6G;mZ%Xq200~?y+!OL?|6Mu^!)aYx!vn))=w%qt@HR3s*7W%6qn8}dtu^B<7={JucSY7U31F6`{=oI8D5OKsKk*y_pCTQwBzIxM)eS#wFdolU4Y>`uWh0{78rv4Mt#7-k?UuGdWzz{^N9vV4 zvh$mb>Io^CW5;GECdOtbC&y+;Z@{VurKMk>M7Hl0O*3R*t41NdSm`9T43Rg<+M<#u zcZJ~nVIWJ@vy0=v-5|0L7xw$HVpK=lid$9Q&EemK_dfsHNpsF!fA5a)A78C1Aq?4f z=ji$E;g1gy=NliF&Tlu;hTIT->ls#_+qUkMnMa?$UX5g{VO=FehbM_fo0_A}Ib?7z zAGtal9(@h*eG58lLxTxJ^6SsceIi#ct8c15v;K+tsNDM8`qJUiGZSZKVR9DCylQ6e z%;?go`BSDerj;5Cj8(E}RCZ%xLPG4s;?&IS5yQCoBKi{zmWo1UU38c?K#9XxvD?=n zO4Qu-{qa+kZX_+S8TT~?7>(>B1=~@>$FvuHpklv#@s4}1JMEMUzyI@p&8p21bMZp- zqM6~(500sA?$qmZqhrE<4Sx~-bNKBgCth;Knm_&7d56ts{vwLQS`0m82;I`+TJNwH zb1K|BMmw)*s>{5oU08?Qsu9s0>pN6)K|$5x*|TO&W<)zu&u=c()fdgGv{~uRdUI)O zy-_?iv#hLCn8#j69`!_BuA(B`BleQl-g}WL7(zod+NZs5$-n`+^rA0sN`t#c46&H| zYEWz2il3|8Tf)B$|3!#+-UTiZCrTOk4L=mV zL#TMsxd%{@9lm~l@S@`CW^bMZTr3R_ADjRekI{bAG{@!QRQ7yEr^BN=5<9XwuIexh zQEb=j(pfVa&}@Elni1cuqDz|>u!oZ2v$5IWX={C=r($TCUE0UVgH^nMEu#B$TA{5jizVo)Ki%%tfY^ah+Q(55zxPa>(LXJr+PT2fS6)L68t$Y53Z!a%A@W-n<*pvbY!rt&DZa|!1zgeS}CP2fE9&WWmEc~K}p(i#VMIxMS00NIpY#X zrKOJ;!sZd&bYy_<{ufI_A>DHNTZ?#GoA?uA4qNW1r87E<7RSdOx9n>%8bkUuL)4d) z`47{l?fdlFE3a@(!`J^gP|==E=p6JG`kkmPYf4WV6kx@*L5VMFtfv&v%9w6-kM;y> z(@VH8c64T|R&#ZYDoslpySO@~w4!26KKBUNwIV($Gc#^XvR9#q?s4cuz7Z3^<`SmY z2=0WXeyWyn)q#eye`ojSWM#E2NS*(~tzrY$o5$XKb-&he_aM6emnS~<_`gdl{PAfT zL^Yj%R{k_Eh+;p0kEG`82he#!?!ymBz1guU>PvUWs;Nym1qG$!WY4M>%Jng$1`kf| zD$6S!Q8;F(5lBiKsl_EE42^6J;Q0r?R*dz9Sn$fN!nfYC%HOjpG9v81XI0y5S~GU; zl4By9R(a(;S=Y;o^B2#ouc@gWma4TB ztAe8FLTyIUjKBr>fMcsZ+CSjj@BX-MMD?J}+QkgUh$) z$u5_!rIBWIM=42fSL~$1?AV#9S5{2XCsvi{c~w(*p2=1y2|Akyxo^w9mlFkiF2iO_ zb%H)(#P|_|MvON`hj*nH)@L7cc1J;0^^Clfv87|ix7LqqUVYO^`yL%VcFKg&U-NJD zgehZ3>+Pd+CQlfx>chKKy-|5lxTdT=E3T+@Ud4o#@~pv`RpV0wQ>x&IQihZ*hh<3V1r#D@P|_MDvWKi9PcZMFa0 zAcu6J|2(SSF@xAUHgcY5c5C{Lf6QQQtM-BaJVq;28~x|8TE4o^e;&u3@7Mk3@mhmE z%6~pY+o*T@&xdL~`rH2V1g*=EOx7yxOzj*>wp?4rx-)C(pB41ba{dO0CRg!Trk$ZJ z;Z>WqQaeQ};aM~9oPq4@`_>xw)e>zDN3Pb^@pmyt9>cfSf`E3c`~GrmDc@Pb8PDST zi#YOVK3(Y^bq?k5uCjtpmT~5l{0;CsoWLQ^)9s#d4adnD0+hIfa#!>nyZ?&&OR=2t z1vqK$;)9za*} z&RUL_x&*Y-sI};M4aY3!)3yASvag}!->ip-_76UCI@b|BEOW0SSVXv z2Y+9*aPaqq3u|eUdhR!uQrcCnwo16leomCQ@2}wVGlAERt9Ul>yWi8~Q9_vpw)JvX zmywpbsiuSj*AExMt3^h~vCh1HV(u=La&a!e!c_>$s@jxk@O@YV=hK*ZY@4YH$?2 zX&NJqV<>YA9QV%2BKz{McPUIf^go?-xOJKPjg8i{As`j#@+x)(f7v+A{lxnlr)848 zQ)et%yOQt8XYv~o`KCI3$!dAeJ5IhQXO1r^dtv;P z`0Iymj@gi)fr}GAP5LmUBjvu-vXPt9*Ji|JRAqE$oR_i1eO5K*>dd&z;hBY*P5U35 z!+*qV=>Om>?jwC|%m&U9*Y6>(s`fuJ3p1)R3j?3YIb$~D-0qgkKPRPgAM)+^>nX>U zp__+p&bfX6+2rgI#Lh^#c+AxiB!22Wl0KA2q&z7dsb!hN)7NGermqcrCf`i_G-ubi z>0sr!`^P7Y&mT8^e09z)S8n8;P;N|aMQ#Uj8>7Zu-~;#BM|s2Z#^yD+k9J=!%-fRx zTEVkC-Yi^Kbbs+jCHLfQ$y->suH>G=b*1l>ZOz+Kbbsl4<*9N^>3cleQ~qT|pkh9M zfjrMFj65&j!`-Jn74tI-^R`q3q|^~e=___tE(K>~Hf6+(n_iVry||{LzBO-Q>3j7j z7Cc-0QSnEG>ni38O71EDvVJ4i`m*T$%tC=Ys_Jb)@9pcOu`9$h<8D zZ^{w%8#4<974r+;lsd@g1#cFARK7=$w@}L9o!dK8$vu(Ro{W@2q?}JsxXwL`XwKD4 z!Lw4Y?}7*mBQnB?LrKxrfe?O(1`mYC6k$tdVbX`%SZ!QykJjEB(k@0`0yY2(Tna7& z8++rl9mt(vS8tD+23mUK)B@yku&uX8KMt${uY%XW>%DQtsNNnU17v~#7z?BQrN)x0sK}r*(G(k!eq%=L0CP-<5lqN`Nf|RC*(gfAX zy*4EZs;#}Iy1mz-WI+|;`7gn*c>O%DUjd)=2KAWUIDH660{Oi*H3(9JpuW4;)b}7? z1+RhEsm-Uoj{X_=yw@=jdQBs-H)xDRrXxpz43G%|U@V~g)G|mdgVZueErZlDNG*ff zUD_aO5C?|#n%dZ2izz6MRtPFU6{z98T4Wu^)N@P&n8E9rpcS-(PS6GBf)hCY#9mwL z;q04ueJ$7wt^?PDAh;3S1bzZ;2Dfm|JCNJJFTkDPE^r^XAN&$L03HO}!NcGY@F+l& z+GF5xuJOTjX5Dp(Fq1E+&CVDt)Dx)MoGFwR7p$P3_C3v6{@t3%%uh6+1F zu+!G49SjX=)DRZ#g@q1%*P-t^^j(L(>(F-{`mRIYwP9We<~T6Np&vW+V~2h$E$Psb z4lOAyW79HwX_*i$l=t+ba`vT3Egv{Hyxa%d%o zR&r=1hd%Dm#~u2sLw|MXuMYjyp}#uxSBL)U&|e+;t3!Wv=&ug_RkRX9D-K!-p%n+M zgwTqERvhB^ff{kph~sO-K7tm4Xu&>0?Hy`vQ)}C=X^@&a)Y74b4z;tX&ECJWHa0b} zsfF#xT@$v^dLHLh#ALWL#ET3Gr&yH3dE0ef-Z0|pI-tt z01I3SE(05Tv$QRI{xh%@{2bg0ZUeW2JHR&Z3veg63)~0p2fqXlfCs^L@G#iHIc?-l z0lUF-;05p!cp1C`9Pm5v26zj+1KtJigFnEwL@*4bfDvFC{hzwRx-3O~ zu@NEkZ|dF1c`#xWePuK<133nniOfP`AB=3|SY!?oof+eixyU?ZKC%E=h%7=DBPSqB zkfq2nWI3`DOawK6o`+2dVN*ibln^#0ggpsiOG4O@5H=)){Rm+@LfDNEHY0?+2w^Ki z*ohD}B1AMU%=P;5{`TMKb6{X!+|P%WBXh!K)cS+`*$mE#y*s4u^8A*4Siki@_fa;M z#{P%;DDg?+kHi;=9}*uV{zrUI9Y8m(&k=tkzDE3v0$5VluZS)GNBa~hgZL8hBjQ7r z0r4H;H&$RvRsj<|k0QFUh;A(WMGqV^;h2ey31S(8_z4ReV`1w}Y`uxCH?cQC?2U!J zv9LEmtXvQ)7sSe0*zX?fcMtZv2is#|dn{~^1zyZ?h|Q9nfV_njj-iQqh+i0?Qc zf^&%A_EK-#^^pz86FG(!JuK62;%$VD;&FtLp4U0hrwT*o_wIEg znpT(~k&Hw!#{h|5Byy3cMIsi7R?vYPrO0;{f|J2wuoRpMP6KDaB+uUptHjp`vpj!0 z`3U~@+e9C(hwIbo4z#xu>^eYW;sL$r!||h!NW|fJL@(lS{D{NxBM!%nIR1XWEd9vy zu3oL3zFOY^(_6J+fN1w1>pC5t%m6b%D`*FupbK2g@t1%Nzygz54JKMY$du1;@vI0d&COcSO*IaZ{y)DJiLvE zxA5>b9^S&k+jw{j4{zh)Ej+x9hqv(Xw!z2*4{zh)Ej+x9hqv(XHXh!>!`pax3lDE& z;cYy;jfc1K@HQUa#>3lqcpDFI`=bWiA2rzisKNF}4YogOu>Dbk?T;F4f7D?6qXyd_ zHP~)nJc;wthlvPmGWuAJ!^W)r`wG$b-xGUkx4`2pc$~$RdJe&33m#kW*n-CvJhtGm z1&=L_D2tLECOZ-S>_xZDGmEx6nRmo1;mmd|C&=d$H<*@DX!T(;n{1(z+jY{6vUKgzJ+cMtrw;CB!Fw%~UU{I=kC5B#>^cMtrw;CB!Fw%~UU{I=kC z5B#>^cMtrw;CB!Fw%~UU{I=kC5B#>^w*|i~_-(;&3w~Sh+k)Q~{I-04TRy)npWl|x zZ_DSm<@4L}`EB|9wtRkDKEExW-TbC6xDCYJL? zIfu{A_0ObzmpCtjI4%g0!Dw z!F#aaJ?_{)7q3wWDnJz=Zql$m^dl21ZfdQd9dv>&fVDY7PM{SlZWEE%L?kv5iA_Xe z6Oq_NBuBF1CRW_Uiknz*6Dw|F#Z9cZi4`}o;wDzy#EP3(ansKgh!vMyfmm_L6^IqL ziAYSWxJ^W2V#RGD5)&(K6Oou$aT6#VPe^Baup_)-6mgQV%cqS7ABV6CU0S4*==$cCYIeMe_>+T zZE_eUmfa?gVPe^BA{SF*pG4w=I3VLIf6OG2yUuvUjjAQ0W(>hy!*4nwmc7BZa>lLP zv)s} zKREEzfuj!mbl|1~FC94Pz()rzI`GhegAV+2xFgK{7_5>>+tJVD8GXW}Pnh%x?_GEN z#Jhdo>Ho@onBX^B`Wq?lP2eZsX7JDZF#o&{b1FPu4o(A-PdfwKcDVa6cVc<|ckdp4 zQ*822#{Top;bK_11S|#1z;|KnVEjTSvkWG44{t^u2PkNlP*zop1+sT%& zt}oXbaQ~6JE`BD@t>pr0cQU1v+Ain0)L3eI4%huYxBy%Xt^ikqYXGq^H906-#T@0a zT-yYz!5V7gm7Y~~ct`5uP&!8&K0v?T)%xpGt|;Y~s~)IN`%wBM7V`7(=&^4G2A+1n z>{-~Nb7T|}F0bX&Hseyj^8 zY`TbXMC<_GOB+SnN4PE=hu^gIg_Kun^e=oTnsZx3Ll)WDyZr?s0uAb)%*b z$4QPT#4#a`3290044PkY<~P9yoPnOFpAXi9+rYnp`@sX?5%4Ma41A7-Akt*6XoT&z zaE7gvgM1tFaV+NJSZX`(@h$ZjcnUlX7=1BE$5P~gnWtl^*N|@jMp)`Y@E_n4cf`{d z$I&~3Iz3lk#rx+X&qIe7A?Z2#CCCj(3wbH>GUVj|e(NFR-N<{8_ab*7cY@uVXAgK4 zkbBl&Ly~`X=K)a`{Vnh|$B~29e~%;wt?xxrHvJ>yUy&ap{}1vLG!e}xWiW^Vu^@pF z6YXLo^H~b7Q;})Nk-V2q+cdaVW-Hpb72FOhwjn94qNHffQICRO@&4n;C(#I{R&N2( zz1)A`E{aYZfkqsi9^Th(SWLI=;FP|RV~9g_uA$!tq#Zf8+m;U^X&wDx@F=x-4A4So z#?fEm`K!p+!0X^W@G0l|8}c*ce<43deu4awTItj-3dDhU?(PghvT8G0aE#$#Bs_`2 zw#tl}pdJsHL#5^Nj?9fR(Sb>QP3mbn9 zN*zt=Xi~=@b+oBtP=63fK7jg})X$_|CUvkWzfIX~%5G9-lQKJ$*`&-;UQ?T`gv$oud&_I!WG4Mj2$uz% z`{40cdSHaZj?ZD~k+xeysof(0rs(uwYUt>&rH|t;@%%Rc*7#g@d@egammQzWj?ZOB zxO{+y9Q`Y_5)B4}7!V8MY4xGNl1aHEj8swS3K5zGkg{R>AVEg5_(} z>eJY6&c6r9{6@0)@V^JEVCk=iKhr4>nzVdPTD~SNUz3)vNz2!y{tyyTzLTeWN zp$Dtb<7>_Gt%61W=)o%VFkAb;I7xWO{R}Kbs84f`^7>c2roHJgt@IeHkDJeH1!&Px zuORnxGz3S3XfwjmP#;G>;keJ}DgEN5KF*#_ZSmE8+&v#{T)?sGk@(ba&0)$9k3+uJ z_w$(hFmO3Uk2T?QkREH&V}tZq3tordb*s_r({C@AKz6f$FmcX;^wr|^Q-?rPn zZMS{f9&&B_^U`WS{IJ;h4*MH>xk_S(K-Wd|82a!4|u*j zgto;8gwXbWAMgmzALYHr0R0j_VAB`G7liux0^9cmw(kqXmWnSBdn&#lbOc{u!+p;m zj6jY=tLgX!cXl0dL(tcj%;yzP81%Ij^tI)<+7d7LJluc9wFV*A6Atu(c3<=|(DR8$ zu=_loSHmDR>|eW}U%UMgPJhoPUM+zfIkU!muNI^RAuR)Y=gw%R7T8Sz2Veo zMopgoH2eG~?B}koN!(|`8}U^pe#*p0z3ciH@g<{(W#m49+yjvOzvTWU?=Lxj$@fdH zzZgi4pZq?*wCN@u%a_q5Gr2+0l z(?SQ#^a>Hbh43h1t1Rr4Ma&k$E{O*Sx%P;8p2TAztgZC05IM3Cv%x~l4hk_FETmma zhM@p$Qc7eUs0R&TI(nV~W`b7G4mv>>=msZ(lRyu+nD1W#HUJA;3N8b;aGouE{xh%@ z{2XAx`?A`1@EqI3U8rw2lb%>iBW|R1LvBVKjcC8-^)4iRl{-=Yd-?t`a5oEN12XAq z9DY3)~|+Au9-aDCVoa z1QP+}HYhW9n+DFVr=5*9FbfQ~k1C9m9lgFBiJQ3Lg{*C94fJecvz+>QX-hUE^)}lcShy$EUjn^itJWv3N zcs&8IPOd5km0%*M;j=pM71#%Qu~P~RM%(cq0J^{eN-9_cP6126GO!$+4pwNBja9$| z>nYE#=^uxhKX&lU2kyjabAZghITq>7!LhWtJeU3=eMROB9d2gCCO*FwYzEhX>p>7~ z!Ipg2SrLqBw8PEGVT{8sQfz*aV)KiX{qrSvQ11W7GbS`fyNa>CVw|ty0ArwUF@MLR zZ(8o%Ub)lD{4g~EFfUA%gGw+FNFSB{*}(HDpb11~V9dbk!g>0t%=59_eky%b`ls|w z?xNB^WiDIaEDV075}D8T|Lsf+L+ZE)oC21BWneit9Y}wdzD_@v>;rwNU*94cIaJip z?~bCxhJBI3Y>xIao43#^KSlFirc3;CB-3S+>9QG>*^I_)A~BmxmyByoq70LW)nr6w zGOjfliJ3$iCgWO@ajiw1e^ADgsLghL{JF^U_?-M85sAsT)+Q=3iQH@=6O-sovIRB~ zipdDeCQ30G*V;rXCJ~#h?*v}9%XDJ}Z(M77<61^N-niCeTx;vhZy>U>iEK>9wKma> zNrYz;;h02uHc^gAq-T>2Fd5gHjB8ECwI*?gWV=j8MmE_llM#_k@kl45a13+K=U|&h zYsc}()K0)QXJMOrSR3MEZ6k5P540<>%0K2YLEEHV&l#DEg>Ao&`w`8oWAHG$a6Yc> z;H*1&9Ifr*ag6pNs~XJKe#@g%dzHtr+G{+zwAXnYr@hIeTYH;1?FN^>MtmL=9ELwPh+*WoWC| z_&HNsrvfUVeNT;5W3{sttBYypC|1?czOPucQ#)4`szU8NRji7&^Hqr|(JoMBs!Ut2 zs#KMBp{mA@U!KTs#Ble8bI1?m*-3bj-%)&51Ds+Ma%R%fUc z+9p=mU!`qkcgC}{>(trmZ0#m>t~yuyiCV8N(r#9ls14e`s!LhX;b-ax>Id4b>I!v* zcANT<`jK|Kx<+l%?ogZ6X6+Yj$#{cyr@B$yq}`=%RyS*Rv&ksysHm;#cI{rZO>NU2 zPR#<3HkG|!dz8Iuw`;#r537f@$JiA1aqV%nQ|;7jwM#v%?POcsXSJu) z9`&5|G<){Gq&=&CtA4BPQLm}jwCB|8tS9ljdQ-ily`cW2{;a*M{-XA3uc%MeXPTov z$9KN2N7KVU(Bt$t?T>oCp0E8$KTbbh`?KDI7yXOAL|>x)RbQ^3u6?Yp(pPE!shhf~ zeX6g~&(Z#-pQ~@wzScMCK^3Rpq~E57>D%;eYK(rTey7UR@6#VtS^7izLu$PKg#Lue z)pzJSRGz+5->LHTr}Sr3f&Qxgx+>P+)ZbL)`rG;kszU#x{zp}(@6|t1^=!iUg=*Hn z*7vEIhGyuh&4@AvsiTY-BSsx##2ImFwvk{Ys175^NK$i*WFuL18pDm@>R4lxQK7nw zDx*rRFshAewbH0HYSk*E-l$h+8VyE+GL0$56t&uDGMdyHV}>zbtu+=J3)Pjz$%d(Z ZWL#ieKr4B_ua9HInt9Og@cB^F{u}P2xPbrw literal 0 HcmV?d00001 diff --git a/ScaledFont/ScaledFont/ScaledFont.swift b/ScaledFont/ScaledFont/ScaledFont.swift new file mode 100644 index 0000000..ed75db4 --- /dev/null +++ b/ScaledFont/ScaledFont/ScaledFont.swift @@ -0,0 +1,114 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +/// A utility class to help you use custom fonts with +/// dynamic type. +/// +/// To use this class you must supply the name of a style +/// dictionary for the font when creating the class. The +/// style dictionary should be stored as a property list +/// file in the main bundle. +/// +/// The style dictionary contains an entry for each text +/// style that uses the raw string value for each +/// `UIFontTextStyle` as the key. +/// +/// The value of each entry is a dictionary with two keys: +/// +/// + fontName: A String which is the font name. +/// + fontSize: A number which is the point size to use +/// at the `.large` content size. +/// +/// For example to use a 17 pt Noteworthy-Bold font +/// for the `.headline` style at the `.large` content size: +/// +/// +/// UICTFontTextStyleHeadline +/// +/// fontName +/// Noteworthy-Bold +/// fontSize +/// 17 +/// +/// +/// +/// You do not need to include an entry for every text style +/// but if you try to use a text style that is not included +/// in the dictionary it will fallback to the system preferred +/// font. + +public final class ScaledFont { + + private struct FontDescription: Decodable { + let fontSize: CGFloat + let fontName: String + } + + private typealias StyleDictionary = [UIFontTextStyle.RawValue: FontDescription] + private var styleDictionary: StyleDictionary? + + /// Create a `ScaledFont` + /// + /// - Parameter fontName: Name of a plist file (without the extension) + /// in the main bundle that contains the style dictionary used to + /// scale fonts for each text style. + + public init(fontName: String) { + if let url = Bundle.main.url(forResource: fontName, withExtension: "plist"), + let data = try? Data(contentsOf: url) { + let decoder = PropertyListDecoder() + styleDictionary = try? decoder.decode(StyleDictionary.self, from: data) + } + } + + /// Get the scaled font for the given text style using the + /// style dictionary supplied at initialization. + /// + /// - Parameter textStyle: The `UIFontTextStyle` for the + /// font. + /// - Returns: A `UIFont` of the custom font that has been + /// scaled for the users currently selected preferred + /// text size. + /// + /// - Note: If the style dictionary does not have + /// a font for this text style the default preferred + /// font is returned. + + public func font(forTextStyle textStyle: UIFontTextStyle) -> UIFont { + guard let fontDescription = styleDictionary?[textStyle.rawValue], + let font = UIFont(name: fontDescription.fontName, size: fontDescription.fontSize) else { + return UIFont.preferredFont(forTextStyle: textStyle) + } + + let fontMetrics = UIFontMetrics(forTextStyle: textStyle) + return fontMetrics.scaledFont(for: font) + } +} diff --git a/ScaledFont/ScaledFont/ViewController.swift b/ScaledFont/ScaledFont/ViewController.swift new file mode 100644 index 0000000..0063fa5 --- /dev/null +++ b/ScaledFont/ScaledFont/ViewController.swift @@ -0,0 +1,125 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class ViewController: UIViewController { + +// private let fontName = "Default" +// private let fontName = "Noteworthy" + private let fontName = "NotoSerif" + + private let defaultSpacing: CGFloat = 8.0 + + private lazy var scaledFont: ScaledFont = { + return ScaledFont(fontName: fontName) + }() + + override func viewDidLoad() { + super.viewDidLoad() + title = fontName + setupViews() + } + + private lazy var title1Label: UILabel = { + return label(forTextStyle: .title1, text: "Title 1") + }() + + private lazy var title2Label: UILabel = { + return label(forTextStyle: .title2, text: "Title 2") + }() + + private lazy var title3Label: UILabel = { + return label(forTextStyle: .title3, text: "Title 3") + }() + + private lazy var headlineLabel: UILabel = { + return label(forTextStyle: .headline, text: "Headline") + }() + + private lazy var subheadlineLabel: UILabel = { + return label(forTextStyle: .subheadline, text: "Subheadline") + }() + + private lazy var bodyLabel: UILabel = { + return label(forTextStyle: .body, text: "Body") + }() + + private lazy var calloutLabel: UILabel = { + return label(forTextStyle: .callout, text: "Callout") + }() + + private lazy var footnoteLabel: UILabel = { + return label(forTextStyle: .footnote, text: "Footnote") + }() + + private lazy var caption1Label: UILabel = { + return label(forTextStyle: .caption1, text: "Caption 1") + }() + + private lazy var caption2Label: UILabel = { + return label(forTextStyle: .caption2, text: "Caption 2") + }() + + private func label(forTextStyle textStyle: UIFontTextStyle, text: String) -> UILabel { + let label = UILabel() + label.font = scaledFont.font(forTextStyle: textStyle) + label.adjustsFontForContentSizeCategory = true + label.text = text + label.numberOfLines = 0 + return label + } + + private func setupViews() { + let stackView = UIStackView(arrangedSubviews: [title1Label, title2Label, title3Label, headlineLabel, subheadlineLabel, bodyLabel, calloutLabel, footnoteLabel, caption1Label, caption2Label]) + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.spacing = defaultSpacing + stackView.axis = .vertical + + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.addSubview(stackView) + view.addSubview(scrollView) + + let margins = view.readableContentGuide + NSLayoutConstraint.activate([ + scrollView.topAnchor.constraint(equalTo: margins.topAnchor), + scrollView.bottomAnchor.constraint(equalTo: margins.bottomAnchor), + scrollView.leadingAnchor.constraint(equalTo: margins.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: margins.trailingAnchor), + + scrollView.topAnchor.constraint(equalTo: stackView.topAnchor), + scrollView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor), + scrollView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor), + + scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor) + ]) + } +} From 25caaa5601c2d9679cd9c70d5d8f067d3b5e79cb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Aug 2017 10:45:28 +0100 Subject: [PATCH 029/142] Fix link to NotoSans --- ScaledFont/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ScaledFont/README.md b/ScaledFont/README.md index 8a73ffa..616776f 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -4,7 +4,7 @@ An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the NotoSerif font which was downloaded from google fonts: -+ [Noto Sans]([NotoSans](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif)) ++ [Noto Sans](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif) *Refer to LICENSE.txt if you plan on using NotoSans in a shipping application.* From 30a1f6a58178cd9fed0b56fbb84405e9afe333bf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Aug 2017 13:18:29 +0100 Subject: [PATCH 030/142] Updated for Xcode 8 and iOS 10 --- .../DynamicText.xcodeproj/project.pbxproj | 184 +++--------------- .../Base.lproj/LaunchScreen.storyboard | 77 ++++++++ .../DynamicText/DynamicText-Info.plist | 6 +- .../AppIcon.appiconset/Contents.json | 30 +++ .../AppIcon.appiconset/icon-120.png | Bin 0 -> 11031 bytes .../AppIcon.appiconset/icon-180.png | Bin 0 -> 17230 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 5904 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-60.png | Bin 0 -> 3017 bytes .../DynamicText/Images.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 30 --- .../Tab Bar/First.imageset/Contents.json | 13 +- .../Tab Bar/First.imageset/first.png | Bin 253 -> 0 bytes .../Tab Bar/First.imageset/first30.png | Bin 0 -> 230 bytes .../Tab Bar/First.imageset/first60.png | Bin 0 -> 407 bytes .../Tab Bar/First.imageset/first90.png | Bin 0 -> 672 bytes .../Tab Bar/First.imageset/first@2x.png | Bin 402 -> 0 bytes .../Tab Bar/Second.imageset/Contents.json | 13 +- .../Tab Bar/Second.imageset/second.png | Bin 128 -> 0 bytes .../Tab Bar/Second.imageset/second30.png | Bin 0 -> 110 bytes .../Tab Bar/Second.imageset/second60.png | Bin 0 -> 135 bytes .../Tab Bar/Second.imageset/second90.png | Bin 0 -> 148 bytes .../Tab Bar/Second.imageset/second@2x.png | Bin 130 -> 0 bytes .../DynamicTextTests-Info.plist | 22 --- .../DynamicTextTests/DynamicTextTests.m | 34 ---- .../en.lproj/InfoPlist.strings | 2 - DynamicText/README | 26 --- DynamicText/README.md | 31 +++ 28 files changed, 188 insertions(+), 286 deletions(-) create mode 100644 DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Contents.json delete mode 100644 DynamicText/DynamicText/Images.xcassets/LaunchImage.launchimage/Contents.json delete mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png delete mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first@2x.png delete mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png create mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png delete mode 100644 DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second@2x.png delete mode 100644 DynamicText/DynamicTextTests/DynamicTextTests-Info.plist delete mode 100644 DynamicText/DynamicTextTests/DynamicTextTests.m delete mode 100644 DynamicText/DynamicTextTests/en.lproj/InfoPlist.strings delete mode 100644 DynamicText/README create mode 100644 DynamicText/README.md diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 47eceeb..754fba6 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -3,11 +3,12 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 48; objects = { /* Begin PBXBuildFile section */ 531B320A1861EFB6005F2332 /* UYLScaledTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */; }; + 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */; }; 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52D17F83CB600AD2292 /* Foundation.framework */; }; 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */; }; 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B53117F83CB600AD2292 /* UIKit.framework */; }; @@ -16,29 +17,15 @@ 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */; }; 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53F17F83CB600AD2292 /* Main.storyboard */; }; 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Images.xcassets */; }; - 5393B54D17F83CB600AD2292 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B54C17F83CB600AD2292 /* XCTest.framework */; }; - 5393B54E17F83CB600AD2292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52D17F83CB600AD2292 /* Foundation.framework */; }; - 5393B54F17F83CB600AD2292 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B53117F83CB600AD2292 /* UIKit.framework */; }; - 5393B55717F83CB600AD2292 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5393B55517F83CB600AD2292 /* InfoPlist.strings */; }; - 5393B55917F83CB600AD2292 /* DynamicTextTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B55817F83CB600AD2292 /* DynamicTextTests.m */; }; 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */; }; 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 5393B55017F83CB600AD2292 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5393B52217F83CB600AD2292 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5393B52917F83CB600AD2292; - remoteInfo = DynamicText; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 531B32081861EFB6005F2332 /* UYLScaledTextStyleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLScaledTextStyleViewController.h; sourceTree = ""; }; 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLScaledTextStyleViewController.m; sourceTree = ""; }; - 5325F8AD18020B0B0000A32A /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 5325F8AD18020B0B0000A32A /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53615D2E1F41B67900C7D904 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 5393B52A17F83CB600AD2292 /* DynamicText.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicText.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5393B52D17F83CB600AD2292 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -51,11 +38,7 @@ 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 5393B54017F83CB600AD2292 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 5393B54517F83CB600AD2292 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 5393B54B17F83CB600AD2292 /* DynamicTextTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DynamicTextTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 5393B54C17F83CB600AD2292 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 5393B55417F83CB600AD2292 /* DynamicTextTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DynamicTextTests-Info.plist"; sourceTree = ""; }; - 5393B55617F83CB600AD2292 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5393B55817F83CB600AD2292 /* DynamicTextTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DynamicTextTests.m; sourceTree = ""; }; 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTextStyleViewController.h; sourceTree = ""; }; 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTextStyleViewController.m; sourceTree = ""; }; 53FE524A1871CDB700DE5F24 /* UIFont+UYLScaledFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIFont+UYLScaledFont.h"; sourceTree = ""; }; @@ -73,25 +56,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5393B54817F83CB600AD2292 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5393B54D17F83CB600AD2292 /* XCTest.framework in Frameworks */, - 5393B54F17F83CB600AD2292 /* UIKit.framework in Frameworks */, - 5393B54E17F83CB600AD2292 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 5393B52117F83CB600AD2292 = { isa = PBXGroup; children = ( - 5325F8AD18020B0B0000A32A /* README */, + 5325F8AD18020B0B0000A32A /* README.md */, 5393B53317F83CB600AD2292 /* DynamicText */, - 5393B55217F83CB600AD2292 /* DynamicTextTests */, 5393B52C17F83CB600AD2292 /* Frameworks */, 5393B52B17F83CB600AD2292 /* Products */, ); @@ -101,7 +73,6 @@ isa = PBXGroup; children = ( 5393B52A17F83CB600AD2292 /* DynamicText.app */, - 5393B54B17F83CB600AD2292 /* DynamicTextTests.xctest */, ); name = Products; sourceTree = ""; @@ -129,6 +100,7 @@ 53FE524A1871CDB700DE5F24 /* UIFont+UYLScaledFont.h */, 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */, 5393B53F17F83CB600AD2292 /* Main.storyboard */, + 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */, 5393B54517F83CB600AD2292 /* Images.xcassets */, 5393B53417F83CB600AD2292 /* Supporting Files */, ); @@ -146,24 +118,6 @@ name = "Supporting Files"; sourceTree = ""; }; - 5393B55217F83CB600AD2292 /* DynamicTextTests */ = { - isa = PBXGroup; - children = ( - 5393B55817F83CB600AD2292 /* DynamicTextTests.m */, - 5393B55317F83CB600AD2292 /* Supporting Files */, - ); - path = DynamicTextTests; - sourceTree = ""; - }; - 5393B55317F83CB600AD2292 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5393B55417F83CB600AD2292 /* DynamicTextTests-Info.plist */, - 5393B55517F83CB600AD2292 /* InfoPlist.strings */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -184,24 +138,6 @@ productReference = 5393B52A17F83CB600AD2292 /* DynamicText.app */; productType = "com.apple.product-type.application"; }; - 5393B54A17F83CB600AD2292 /* DynamicTextTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5393B55F17F83CB600AD2292 /* Build configuration list for PBXNativeTarget "DynamicTextTests" */; - buildPhases = ( - 5393B54717F83CB600AD2292 /* Sources */, - 5393B54817F83CB600AD2292 /* Frameworks */, - 5393B54917F83CB600AD2292 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5393B55117F83CB600AD2292 /* PBXTargetDependency */, - ); - name = DynamicTextTests; - productName = DynamicTextTests; - productReference = 5393B54B17F83CB600AD2292 /* DynamicTextTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -211,14 +147,9 @@ CLASSPREFIX = UYL; LastUpgradeCheck = 0510; ORGANIZATIONNAME = "Keith Harrison"; - TargetAttributes = { - 5393B54A17F83CB600AD2292 = { - TestTargetID = 5393B52917F83CB600AD2292; - }; - }; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 8.0"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( @@ -231,7 +162,6 @@ projectRoot = ""; targets = ( 5393B52917F83CB600AD2292 /* DynamicText */, - 5393B54A17F83CB600AD2292 /* DynamicTextTests */, ); }; /* End PBXProject section */ @@ -242,19 +172,12 @@ buildActionMask = 2147483647; files = ( 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */, + 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */, 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */, 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5393B54917F83CB600AD2292 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5393B55717F83CB600AD2292 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -270,25 +193,17 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5393B54717F83CB600AD2292 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5393B55917F83CB600AD2292 /* DynamicTextTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 5393B55117F83CB600AD2292 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5393B52917F83CB600AD2292 /* DynamicText */; - targetProxy = 5393B55017F83CB600AD2292 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ + 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53615D2E1F41B67900C7D904 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; 5393B53617F83CB600AD2292 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -305,14 +220,6 @@ name = Main.storyboard; sourceTree = ""; }; - 5393B55517F83CB600AD2292 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5393B55617F83CB600AD2292 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -348,7 +255,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -380,7 +287,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -390,11 +297,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; }; name = Debug; @@ -403,55 +311,16 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; }; name = Release; }; - 5393B56017F83CB600AD2292 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/DynamicText.app/DynamicText"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = "DynamicTextTests/DynamicTextTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 5393B56117F83CB600AD2292 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/DynamicText.app/DynamicText"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicTextTests/DynamicTextTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -473,15 +342,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5393B55F17F83CB600AD2292 /* Build configuration list for PBXNativeTarget "DynamicTextTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5393B56017F83CB600AD2292 /* Debug */, - 5393B56117F83CB600AD2292 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 5393B52217F83CB600AD2292 /* Project object */; diff --git a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f746012 --- /dev/null +++ b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/DynamicText-Info.plist b/DynamicText/DynamicText/DynamicText-Info.plist index 79bd7f0..aa928e4 100644 --- a/DynamicText/DynamicText/DynamicText-Info.plist +++ b/DynamicText/DynamicText/DynamicText-Info.plist @@ -17,13 +17,15 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.2 CFBundleSignature ???? CFBundleVersion - 1.0 + 1.2 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json index fb4b75f..f60b56f 100644 --- a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,22 +1,52 @@ { "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-40.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-60.png", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", "filename" : "icon-29@2x.png", "scale" : "2x" }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@3x.png", + "scale" : "3x" + }, { "size" : "40x40", "idiom" : "iphone", "filename" : "icon-40@2x.png", "scale" : "2x" }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-120.png", + "scale" : "3x" + }, { "size" : "60x60", "idiom" : "iphone", "filename" : "icon-60@2x.png", "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", + "scale" : "3x" } ], "info" : { diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b42eb733c454496d3f006ee95be509b23a5971 GIT binary patch literal 11031 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 R>I(n>002ovPDHLkV1hPf$(8^B literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..e943cc363c2790bef64f2b75704e943ce2a6df37 GIT binary patch literal 17230 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f32646aef02a6f965342f92bc4a76f8e2de15b4b GIT binary patch literal 5904 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 LNkvXXu0mjf{o2?p literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/Contents.json b/DynamicText/DynamicText/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/DynamicText/DynamicText/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/DynamicText/DynamicText/Images.xcassets/LaunchImage.launchimage/Contents.json b/DynamicText/DynamicText/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index dfb911d..0000000 --- a/DynamicText/DynamicText/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "subtype" : "retina4", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json b/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json index a345b09..f7afaee 100644 --- a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json +++ b/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json @@ -2,13 +2,18 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "first.png" + "filename" : "first30.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "first@2x.png" + "filename" : "first60.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "first90.png", + "scale" : "3x" } ], "info" : { diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first.png deleted file mode 100644 index 9300ee2cd85a05d8ab3d300acc09c13829ccb5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^av;pY3?xs=ZJr3EI14-?iy0WWg+Z8+Vb&Z8prA^C zPl)UP|NntZ{NT8nT`EuocS(?6FasltZ*a@vB{%Q?+`Lrc8c;aH)5S4F;&O7r0@i?& zF{WoZ52n7mx3~H`AG5@C!zy!*9MOhPk>$<~3{&!XpXRp}%-pr`k1SV$-RV4u0*22w zAO2x6m@j;8KEt!(gFm@9e7bmb^TL_!dGfoeFWl{ZC|~k_Q9HX^MW7%9gZ;w7yrcIE Q^gxdFboFyt=akR{03BgY=Kufz diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f0902bbf7675af6d18326db8d2310aab0084fe GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3Ydu{YLn;`P4luhlvMso4wQZsV z%OMS!oebrLtUt0A3+-~ez+Ng~{F}+?$x)*Z>fK+C`fp=k<71RudXl5y$85&y=_%ZYvqXg&VXq)O>voR`J%{aaksJr~EnOPpMJXI=dj)`!1x54+w_`uJ|nt*F1n z@61|a^<~Ujob~6Jw-oEgn6-2pt@(eo>8z@S-zRRD`qXWuoN}B8H)}|+uq^IRxFOuL e{Z!+>?RL+#_#_rxs;CA!oWax8&t;ucLK6Trj9G&K literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png new file mode 100644 index 0000000000000000000000000000000000000000..975a75f185cc454be83c825024039b1f509ad2ed GIT binary patch literal 407 zcmV;I0cie-P)O23dr+15>~nGz@{8Fa#1ykPeA+|KipclEmO+onQI}h=>5} zBc8uTIJBryB894QRCr*8ylBM(6> zL4yTykOd7cIJ5*k39MTOF~4T4H(*yO zR)}&dQf&4g5{Xj(o0W$*uND%CR{!(Y!}EBAL}J8dPe>%5_Ji#&9sfzB literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png new file mode 100644 index 0000000000000000000000000000000000000000..92341c241ccd42707bad3cbe1440bb567666d8f8 GIT binary patch literal 672 zcmV;R0$=@!P)K8k-7#u8oU=X%sYIFcl{g-SKu9Zk7@937|?jb90E(oSjY&R`(&B9NwYMC z1GN1=$KMv4dS` zhbdx&sC5w%yx|CQ@`X1fh)|o_nBWAvu@fd}qp~$I!U1+?2aM1}WePCB7WQDa7$88Y z>tYRiaBFl?%7!?@O5%(mN>hLoR#GVfJajEAVI{Xj3lG^dHn57=;Q0}My*8(hI6}LoyyOqLfBE?-A!fIxSo7Tk{Rx@XGagze9VKucz0QdgDYHk46 zn%Kf>Zi^<|8o}h-2rjj8fXTN5+PHcXnEYdcs}^OR@yQ7huGarB$&}z~&0vyghN~3f z2$M`lgt)jKOn%kF#Z6)It0^w3fgS8uvO@!fdx1$VFM2+g;5q#YlU({J+!!XgjCCeh zf-}VhOmbPEaPKh5Wrf1+VUo)ph5LX>E*~h|3g%CbjyX(nnd{HH+er1oQi2zjKFpt9 z!DE=@5~FY(nB>yYKmPsg(9ltqzbT0HoOTuC;zE4EGRYT0U7+#zhO3ppGD)IKj{Z)F zbZyt)L>JNh9njWjg};%8g-SmxL^OcL-!#x!oqp1ihEl1^9292 zyvjeVV{=an2A|-bR%UvqC9wBTYmK$2TZ_82dR`w>s810R%y5J`Ibwzc5o%qCp2G)k zdI*t`YTyMuykd+L3%q0h;~fj67~>Va8+^h^DW#NBN~ym@K8_W5vJ&h70000v!Xi!?i?%bXW@96u%f$_t!&|)uPtiNz4qKLWW4uxyKc$GyAh0z>RHi? zo?JOMgIVbMn$=FHmxgAuNz8E5cj=S)s26y^Y2l`4C#9y^`hQy?Q&Hsb^vq;qt?+p< z^QXJs7i0CAq7^vN;PmIOHOU=OL1sKI$sT45u8YIXzI2ur>+O#&*(9nR{qE3ar?Lw% i{+gxlr%3V4d&E5TcJ?AMtKADhA?WGq=d#Wzp$Pymd53oZ diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json b/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json index 2136402..fd58914 100644 --- a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json +++ b/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json @@ -2,13 +2,18 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "second.png" + "filename" : "second30.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "second@2x.png" + "filename" : "second60.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "second90.png", + "scale" : "3x" } ], "info" : { diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second.png deleted file mode 100644 index 1100b487f2ca4f4b885625ba575c842c210fb73c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^av;pe3?v!<**pYNoCO|{#S9GG!XV7ZFl&wkP>?Oa zC&cyt|NlT{=%LGXAk`&7e!&b5&u*jvIl`VUjv*Y^lM@bb&-nj;xnQF>1H+`lD#BN) SrXB@KGkCiCxvX^s(ZRPhEy;nFOYch-@ReJ!@oL}fA$Lh?TsWn{{;Tikhir@cp~n_$gnDM V{@G3a;))>SJYD@<);T3K0RY_vB*6dx literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png new file mode 100644 index 0000000000000000000000000000000000000000..617046103b2a3723431d791c31b2bed762d53962 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S933?yBTt(*v?cmjMvT!Azkn7%Zh2IMf81o;Is zcs_n~t~mh6HSu(D45?sDmN054{9j-4fkoxq7kTDC44uZwUH>J|JX(wdcf2y4^Yy_5 ZMuwbeb6+jl8O;YW+tbz0Wt~$(69DGqF&_W` literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second@2x.png b/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second@2x.png deleted file mode 100644 index 368d38f9a889fee56461e5552c36880a75618461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^HXzK%3?vzhybXaQXMsm#F$05`DhM-r2B~}i3bFFVdQ&MBb@0K*?3>;M1& diff --git a/DynamicText/DynamicTextTests/DynamicTextTests-Info.plist b/DynamicText/DynamicTextTests/DynamicTextTests-Info.plist deleted file mode 100644 index 6dd5353..0000000 --- a/DynamicText/DynamicTextTests/DynamicTextTests-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/DynamicText/DynamicTextTests/DynamicTextTests.m b/DynamicText/DynamicTextTests/DynamicTextTests.m deleted file mode 100644 index 88a0617..0000000 --- a/DynamicText/DynamicTextTests/DynamicTextTests.m +++ /dev/null @@ -1,34 +0,0 @@ -// -// DynamicTextTests.m -// DynamicTextTests -// -// Created by Keith Harrison on 29/09/2013. -// Copyright (c) 2013 Keith Harrison. All rights reserved. -// - -#import - -@interface DynamicTextTests : XCTestCase - -@end - -@implementation DynamicTextTests - -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testExample -{ - XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); -} - -@end diff --git a/DynamicText/DynamicTextTests/en.lproj/InfoPlist.strings b/DynamicText/DynamicTextTests/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/DynamicText/DynamicTextTests/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/DynamicText/README b/DynamicText/README deleted file mode 100644 index 5f71f7f..0000000 --- a/DynamicText/README +++ /dev/null @@ -1,26 +0,0 @@ -======================================================================= -DynamicText - Responding to text size changes - -Version 1.0 06 October 2013 Initial version. -Version 1.1 30 December 2013 Added UYLScaledTextViewController -======================================================================= - -This is a example project showing how to respond to the user changing -the preferred text size. - - -The UYLTextStyleViewController shows the standard way to listen for -and respond to changes to the users preferred text size using the -built-in UIFont Text Styles. - -For further details see the following blog post: -http://useyourloaf.com/blog/2013/12/17/supporting-dynamic-type.html - - -The UYLScaledTextStyleViewController extends the basic approach by -showing how to scale the preferred fonts using a UIFontDescriptor. -A convenience method to return the scaled font is added as a -category of UIFont for this purpose. - -For further details see the following blog post: -http://useyourloaf.com/blog/2013/12/30/scaling-dynamic-type-with-font-descriptors.html diff --git a/DynamicText/README.md b/DynamicText/README.md new file mode 100644 index 0000000..f7e87fa --- /dev/null +++ b/DynamicText/README.md @@ -0,0 +1,31 @@ +# DynamicText + +## Responding to text size changes + +This is a example project showing how to respond to the user changing +the preferred text size. + +**Minimum deployment target is now iOS 8.0 using Xcode 8** + +The `UYLTextStyleViewController` shows the standard way to listen for +and respond to changes to the users preferred text size using the +built-in `UIFont` Text Styles. + +For further details see the following blog post: + ++ [Supporting Dynamic Type](https://useyourloaf.com/blog/supporting-dynamic-type/) + +The `UYLScaledTextStyleViewController` extends the basic approach by +showing how to scale the preferred fonts using a `UIFontDescriptor`. +A convenience method to return the scaled font is added as a +category of `UIFont` for this purpose. + +For further details see the following blog post: + ++ [Scaling Synamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) + +## History + +Version 1.2 14 August 2017 Updated for Xcode 8 and iOS 10 +Version 1.1 30 December 2013 Added UYLScaledTextViewController +Version 1.0 06 October 2013 Initial version. From d1844aa8b6a80a0522a67a8e70e6c237d2ac97d1 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Aug 2017 13:35:08 +0100 Subject: [PATCH 031/142] Formatting of README --- DynamicText/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DynamicText/README.md b/DynamicText/README.md index f7e87fa..79cd491 100644 --- a/DynamicText/README.md +++ b/DynamicText/README.md @@ -26,6 +26,6 @@ For further details see the following blog post: ## History -Version 1.2 14 August 2017 Updated for Xcode 8 and iOS 10 -Version 1.1 30 December 2013 Added UYLScaledTextViewController -Version 1.0 06 October 2013 Initial version. +Version 1.2 14 August 2017 Updated for Xcode 8 and iOS 10 +Version 1.1 30 December 2013 Added UYLScaledTextViewController +Version 1.0 06 October 2013 Initial version. From f20c2ff2441886951acda36db7414d4819884d65 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Aug 2017 14:35:51 +0100 Subject: [PATCH 032/142] Update to Xcode 8 --- .../Huckleberry.xcodeproj/project.pbxproj | 19 ++++++++++++++++--- .../Huckleberry/Huckleberry-Info.plist | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Huckleberry/Huckleberry.xcodeproj/project.pbxproj b/Huckleberry/Huckleberry.xcodeproj/project.pbxproj index 539e4c2..ff4e7b4 100644 --- a/Huckleberry/Huckleberry.xcodeproj/project.pbxproj +++ b/Huckleberry/Huckleberry.xcodeproj/project.pbxproj @@ -140,7 +140,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 5363F6CD18AADBF6001CBD3A /* Build configuration list for PBXProject "Huckleberry" */; @@ -222,13 +222,19 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -241,7 +247,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -260,20 +266,25 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; 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; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -287,6 +298,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Huckleberry/Huckleberry-Prefix.pch"; INFOPLIST_FILE = "Huckleberry/Huckleberry-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -300,6 +312,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Huckleberry/Huckleberry-Prefix.pch"; INFOPLIST_FILE = "Huckleberry/Huckleberry-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Huckleberry/Huckleberry/Huckleberry-Info.plist b/Huckleberry/Huckleberry/Huckleberry-Info.plist index 79bd7f0..6667e41 100644 --- a/Huckleberry/Huckleberry/Huckleberry-Info.plist +++ b/Huckleberry/Huckleberry/Huckleberry-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 069e49c7c208abea084da39b2ad77267a734a614 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Aug 2017 14:42:24 +0100 Subject: [PATCH 033/142] Project is now deprecated --- .../Huckleberry.xcodeproj/project.pbxproj | 6 +++-- Huckleberry/{README => README.md} | 22 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) rename Huckleberry/{README => README.md} (52%) diff --git a/Huckleberry/Huckleberry.xcodeproj/project.pbxproj b/Huckleberry/Huckleberry.xcodeproj/project.pbxproj index ff4e7b4..779a6e6 100644 --- a/Huckleberry/Huckleberry.xcodeproj/project.pbxproj +++ b/Huckleberry/Huckleberry.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 53512CFC18AC3A0300A74F57 /* UYLTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53512CFB18AC3A0300A74F57 /* UYLTableViewController.m */; }; 535C803818AD71750039A2B3 /* SourceData.plist in Resources */ = {isa = PBXBuildFile; fileRef = 535C803718AD71750039A2B3 /* SourceData.plist */; }; + 536259DA1F41DEFD00616356 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 536259D91F41DEFD00616356 /* README.md */; }; 5363F6D618AADBF6001CBD3A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5363F6D518AADBF6001CBD3A /* Foundation.framework */; }; 5363F6D818AADBF6001CBD3A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5363F6D718AADBF6001CBD3A /* CoreGraphics.framework */; }; 5363F6DA18AADBF6001CBD3A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5363F6D918AADBF6001CBD3A /* UIKit.framework */; }; @@ -24,7 +25,7 @@ 53512CFA18AC3A0300A74F57 /* UYLTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTableViewController.h; sourceTree = ""; }; 53512CFB18AC3A0300A74F57 /* UYLTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTableViewController.m; sourceTree = ""; }; 535C803718AD71750039A2B3 /* SourceData.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SourceData.plist; sourceTree = ""; }; - 535C803918AD8AE50039A2B3 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 536259D91F41DEFD00616356 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5363F6D218AADBF6001CBD3A /* Huckleberry.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Huckleberry.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5363F6D518AADBF6001CBD3A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5363F6D718AADBF6001CBD3A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -59,7 +60,7 @@ 5363F6C918AADBF6001CBD3A = { isa = PBXGroup; children = ( - 535C803918AD8AE50039A2B3 /* README */, + 536259D91F41DEFD00616356 /* README.md */, 5363F6DB18AADBF6001CBD3A /* Huckleberry */, 5363F6D418AADBF6001CBD3A /* Frameworks */, 5363F6D318AADBF6001CBD3A /* Products */, @@ -182,6 +183,7 @@ files = ( 53512CFC18AC3A0300A74F57 /* UYLTableViewController.m in Sources */, 5363F6E218AADBF6001CBD3A /* main.m in Sources */, + 536259DA1F41DEFD00616356 /* README.md in Sources */, 53A8DCA618AC37530053ABAF /* UYLTextCell.m in Sources */, 5363F6E618AADBF6001CBD3A /* UYLAppDelegate.m in Sources */, ); diff --git a/Huckleberry/README b/Huckleberry/README.md similarity index 52% rename from Huckleberry/README rename to Huckleberry/README.md index cfd4d93..cd6fab6 100644 --- a/Huckleberry/README +++ b/Huckleberry/README.md @@ -1,9 +1,8 @@ -======================================================================= -Huckleberry - Auto layout table view cells with varying row heights -Version 1.2 17 March 2014 Fix device rotation -Version 1.1 12 March 2014 Added Quick Look Debug -Version 1.0 14 February 2014 Initial version. -======================================================================= +# Huckleberry + +**This project is of historical interest only. I recommend using a self-sizing table view instead of the prototype cell approach used in this project.** + +## Auto layout table view cells with varying row heights Example of how to implement table view cells with varying row heights using auto layout constraints and a dummy prototype cell. @@ -17,10 +16,17 @@ of Huckleberry Finn as found on Project Gutenberg. This gives nearly 2000 rows of data. For further details see the following blog post: -http://useyourloaf.com/blog/2014/02/14/table-view-cells-with-varying-row-heights.html + ++ [Table View Cells with Varying Row Heights](https://useyourloaf.com/blog/table-view-cells-with-varying-row-heights/) The custom table view class (UYLTextCell) includes an implementation of debugQuickLookObject to support Quick Look view of the cell in the Xcode debugger (requires Xcode 5.1). See the following post for details: -http://useyourloaf.com/blog/2014/03/12/xcode-debugger-quick-look.html \ No newline at end of file ++ [Xcode Debugger Quick Look](https://useyourloaf.com/blog/xcode-debugger-quick-look/) + +## History + +Version 1.2 17 March 2014 Fix device rotation +Version 1.1 12 March 2014 Added Quick Look Debug +Version 1.0 14 February 2014 Initial version. From 83e6b9a90820b1a073bd9628165b16fc1e21436c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Aug 2017 14:50:24 +0100 Subject: [PATCH 034/142] Update to Xcode 8 --- .../StaticTable.xcodeproj/project.pbxproj | 13 ++++- .../StaticTable/Base.lproj/Main.storyboard | 52 ++++++++++--------- .../StaticTableViewController.swift | 6 +-- .../UYLBasicStaticTableViewCell.swift | 2 +- .../UYLSubtitleStaticTableViewCell.swift | 8 +-- 5 files changed, 47 insertions(+), 34 deletions(-) diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.pbxproj b/StaticTableDynamicType/StaticTable.xcodeproj/project.pbxproj index 5a4c99a..ed7bf18 100644 --- a/StaticTableDynamicType/StaticTable.xcodeproj/project.pbxproj +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.pbxproj @@ -100,11 +100,13 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0730; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 5347A3B51CC968FF00154F49 = { CreatedOnToolsVersion = 7.3; + DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 0830; }; }; }; @@ -188,8 +190,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -234,8 +238,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -254,6 +260,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -263,11 +270,13 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = StaticTable/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StaticTable; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -275,11 +284,13 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = StaticTable/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StaticTable; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/StaticTableDynamicType/StaticTable/Base.lproj/Main.storyboard b/StaticTableDynamicType/StaticTable/Base.lproj/Main.storyboard index 8a368e4..fa779fe 100644 --- a/StaticTableDynamicType/StaticTable/Base.lproj/Main.storyboard +++ b/StaticTableDynamicType/StaticTable/Base.lproj/Main.storyboard @@ -1,9 +1,13 @@ - - + + + + + - + + @@ -11,28 +15,28 @@ - + - + - + - + - + - + @@ -48,17 +52,17 @@ - + - + @@ -78,22 +82,22 @@ - + - + @@ -121,12 +125,10 @@ - - - + @@ -144,7 +146,7 @@ - + diff --git a/StaticTableDynamicType/StaticTable/StaticTableViewController.swift b/StaticTableDynamicType/StaticTable/StaticTableViewController.swift index 1380c96..1e451ea 100644 --- a/StaticTableDynamicType/StaticTable/StaticTableViewController.swift +++ b/StaticTableDynamicType/StaticTable/StaticTableViewController.swift @@ -40,15 +40,15 @@ class StaticTableViewController: UITableViewController { tableView.estimatedRowHeight = 56.0 } - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath) + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = super.tableView(tableView, cellForRowAt: indexPath) if let cell = cell as? UYLPreferredFont { cell.contentSizeChanged() } return cell } - override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } } diff --git a/StaticTableDynamicType/StaticTable/UYLBasicStaticTableViewCell.swift b/StaticTableDynamicType/StaticTable/UYLBasicStaticTableViewCell.swift index c418b91..5feeb8a 100644 --- a/StaticTableDynamicType/StaticTable/UYLBasicStaticTableViewCell.swift +++ b/StaticTableDynamicType/StaticTable/UYLBasicStaticTableViewCell.swift @@ -15,6 +15,6 @@ class UYLBasicStaticTableViewCell: UITableViewCell { extension UYLBasicStaticTableViewCell: UYLPreferredFont { func contentSizeChanged() { - titleText.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline) + titleText.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline) } } diff --git a/StaticTableDynamicType/StaticTable/UYLSubtitleStaticTableViewCell.swift b/StaticTableDynamicType/StaticTable/UYLSubtitleStaticTableViewCell.swift index 8e4ff9a..a3a7688 100644 --- a/StaticTableDynamicType/StaticTable/UYLSubtitleStaticTableViewCell.swift +++ b/StaticTableDynamicType/StaticTable/UYLSubtitleStaticTableViewCell.swift @@ -34,13 +34,13 @@ import UIKit class UYLSubtitleStaticTableViewCell: UITableViewCell { - @IBOutlet private weak var titleText: UILabel! - @IBOutlet private weak var subtitleText: UILabel! + @IBOutlet fileprivate weak var titleText: UILabel! + @IBOutlet fileprivate weak var subtitleText: UILabel! } extension UYLSubtitleStaticTableViewCell: UYLPreferredFont { func contentSizeChanged() { - titleText.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline) - subtitleText.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline) + titleText.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline) + subtitleText.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.subheadline) } } From b7bcfdd312d8c9298a8019854d48d9d74c220cc7 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 11 Sep 2017 11:51:17 +0100 Subject: [PATCH 035/142] Add Vector project --- Vector/README.md | 12 + Vector/Vector.xcodeproj/project.pbxproj | 325 ++++++++++++++++++ Vector/Vector/AppDelegate.swift | 35 ++ .../AppIcon.appiconset/Contents.json | 98 ++++++ Vector/Vector/Assets.xcassets/Contents.json | 6 + .../arrow-fill.imageset/Contents.json | 15 + .../arrow-fill.imageset/arrow30-fill.pdf | Bin 0 -> 4660 bytes .../arrow-large.imageset/Contents.json | 15 + .../arrow-large.imageset/arrow30-fill.pdf | Bin 0 -> 4660 bytes .../arrow.imageset/Contents.json | 15 + .../arrow.imageset/arrow30.pdf | Bin 0 -> 4688 bytes .../cross-fill.imageset/Contents.json | 15 + .../cross-fill.imageset/cross30-fill.pdf | Bin 0 -> 4761 bytes .../cross-large.imageset/Contents.json | 15 + .../cross-large.imageset/cross75.pdf | Bin 0 -> 5137 bytes .../cross.imageset/Contents.json | 15 + .../cross.imageset/cross30.pdf | Bin 0 -> 4794 bytes .../star-vector.imageset/Contents.json | 15 + .../star-vector.imageset/star100.pdf | Bin 0 -> 14044 bytes .../star.imageset/Contents.json | 12 + .../Assets.xcassets/star.imageset/star100.pdf | Bin 0 -> 14044 bytes .../tick-fill.imageset/Contents.json | 15 + .../tick-fill.imageset/tick30-fill.pdf | Bin 0 -> 4729 bytes .../tick-large.imageset/Contents.json | 15 + .../tick-large.imageset/tick75.pdf | Bin 0 -> 5141 bytes .../tick.imageset/Contents.json | 15 + .../Assets.xcassets/tick.imageset/tick30.pdf | Bin 0 -> 4750 bytes .../Vector/Base.lproj/LaunchScreen.storyboard | 25 ++ Vector/Vector/Base.lproj/Main.storyboard | 136 ++++++++ Vector/Vector/Info.plist | 55 +++ 30 files changed, 854 insertions(+) create mode 100644 Vector/README.md create mode 100644 Vector/Vector.xcodeproj/project.pbxproj create mode 100644 Vector/Vector/AppDelegate.swift create mode 100644 Vector/Vector/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/arrow-fill.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/arrow-fill.imageset/arrow30-fill.pdf create mode 100644 Vector/Vector/Assets.xcassets/arrow-large.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/arrow-large.imageset/arrow30-fill.pdf create mode 100644 Vector/Vector/Assets.xcassets/arrow.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/arrow.imageset/arrow30.pdf create mode 100644 Vector/Vector/Assets.xcassets/cross-fill.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/cross-fill.imageset/cross30-fill.pdf create mode 100644 Vector/Vector/Assets.xcassets/cross-large.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/cross-large.imageset/cross75.pdf create mode 100644 Vector/Vector/Assets.xcassets/cross.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/cross.imageset/cross30.pdf create mode 100644 Vector/Vector/Assets.xcassets/star-vector.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/star-vector.imageset/star100.pdf create mode 100644 Vector/Vector/Assets.xcassets/star.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/star.imageset/star100.pdf create mode 100644 Vector/Vector/Assets.xcassets/tick-fill.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/tick-fill.imageset/tick30-fill.pdf create mode 100644 Vector/Vector/Assets.xcassets/tick-large.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/tick-large.imageset/tick75.pdf create mode 100644 Vector/Vector/Assets.xcassets/tick.imageset/Contents.json create mode 100644 Vector/Vector/Assets.xcassets/tick.imageset/tick30.pdf create mode 100644 Vector/Vector/Base.lproj/LaunchScreen.storyboard create mode 100644 Vector/Vector/Base.lproj/Main.storyboard create mode 100644 Vector/Vector/Info.plist diff --git a/Vector/README.md b/Vector/README.md new file mode 100644 index 0000000..fcf48ea --- /dev/null +++ b/Vector/README.md @@ -0,0 +1,12 @@ +# Vector + +## Scaled Vector Images + +Examples of using the new *Preserve Vector Data* asset catalog feature, introduced with Xcode 9, to create smooth scaling images. This also makes it easy to support two new accessibility features in iOS 11: + ++ Adjusing Image Sizes For Accessibility ++ Large Content Size Images For Bar Items + +For full details see the blog post: + ++ [Xcode 9 Vector Images](https://useyourloaf.com/blog/xcode-9-vector-images/) diff --git a/Vector/Vector.xcodeproj/project.pbxproj b/Vector/Vector.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c6e5261 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.pbxproj @@ -0,0 +1,325 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 53D182791F669CBB001F1840 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D182781F669CBB001F1840 /* AppDelegate.swift */; }; + 53D182801F669CBB001F1840 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D1827E1F669CBB001F1840 /* Main.storyboard */; }; + 53D182821F669CBB001F1840 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53D182811F669CBB001F1840 /* Assets.xcassets */; }; + 53D182851F669CBB001F1840 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D182831F669CBB001F1840 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53D182751F669CBB001F1840 /* Vector.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Vector.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53D182781F669CBB001F1840 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53D1827F1F669CBB001F1840 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53D182811F669CBB001F1840 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53D182841F669CBB001F1840 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53D182861F669CBB001F1840 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53D1828C1F66A024001F1840 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53D182721F669CBB001F1840 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53D1826C1F669CBB001F1840 = { + isa = PBXGroup; + children = ( + 53D1828C1F66A024001F1840 /* README.md */, + 53D182771F669CBB001F1840 /* Vector */, + 53D182761F669CBB001F1840 /* Products */, + ); + sourceTree = ""; + }; + 53D182761F669CBB001F1840 /* Products */ = { + isa = PBXGroup; + children = ( + 53D182751F669CBB001F1840 /* Vector.app */, + ); + name = Products; + sourceTree = ""; + }; + 53D182771F669CBB001F1840 /* Vector */ = { + isa = PBXGroup; + children = ( + 53D182781F669CBB001F1840 /* AppDelegate.swift */, + 53D1827E1F669CBB001F1840 /* Main.storyboard */, + 53D182811F669CBB001F1840 /* Assets.xcassets */, + 53D182831F669CBB001F1840 /* LaunchScreen.storyboard */, + 53D182861F669CBB001F1840 /* Info.plist */, + ); + path = Vector; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53D182741F669CBB001F1840 /* Vector */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53D182891F669CBB001F1840 /* Build configuration list for PBXNativeTarget "Vector" */; + buildPhases = ( + 53D182711F669CBB001F1840 /* Sources */, + 53D182721F669CBB001F1840 /* Frameworks */, + 53D182731F669CBB001F1840 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Vector; + productName = Vector; + productReference = 53D182751F669CBB001F1840 /* Vector.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53D1826D1F669CBB001F1840 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53D182741F669CBB001F1840 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 53D182701F669CBB001F1840 /* Build configuration list for PBXProject "Vector" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53D1826C1F669CBB001F1840; + productRefGroup = 53D182761F669CBB001F1840 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53D182741F669CBB001F1840 /* Vector */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53D182731F669CBB001F1840 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53D182851F669CBB001F1840 /* LaunchScreen.storyboard in Resources */, + 53D182821F669CBB001F1840 /* Assets.xcassets in Resources */, + 53D182801F669CBB001F1840 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53D182711F669CBB001F1840 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53D182791F669CBB001F1840 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53D1827E1F669CBB001F1840 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53D1827F1F669CBB001F1840 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53D182831F669CBB001F1840 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53D182841F669CBB001F1840 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53D182871F669CBB001F1840 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 53D182881F669CBB001F1840 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "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 = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53D1828A1F669CBB001F1840 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Vector/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Vector; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53D1828B1F669CBB001F1840 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Vector/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Vector; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53D182701F669CBB001F1840 /* Build configuration list for PBXProject "Vector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53D182871F669CBB001F1840 /* Debug */, + 53D182881F669CBB001F1840 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53D182891F669CBB001F1840 /* Build configuration list for PBXNativeTarget "Vector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53D1828A1F669CBB001F1840 /* Debug */, + 53D1828B1F669CBB001F1840 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53D1826D1F669CBB001F1840 /* Project object */; +} diff --git a/Vector/Vector/AppDelegate.swift b/Vector/Vector/AppDelegate.swift new file mode 100644 index 0000000..6420758 --- /dev/null +++ b/Vector/Vector/AppDelegate.swift @@ -0,0 +1,35 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/Vector/Vector/Assets.xcassets/AppIcon.appiconset/Contents.json b/Vector/Vector/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/Contents.json b/Vector/Vector/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/arrow-fill.imageset/Contents.json b/Vector/Vector/Assets.xcassets/arrow-fill.imageset/Contents.json new file mode 100644 index 0000000..b54f13d --- /dev/null +++ b/Vector/Vector/Assets.xcassets/arrow-fill.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "arrow30-fill.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/arrow-fill.imageset/arrow30-fill.pdf b/Vector/Vector/Assets.xcassets/arrow-fill.imageset/arrow30-fill.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e2184767de04c5ca035aac88dfaf9034ccbb1cf2 GIT binary patch literal 4660 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 R+z6^j6nID^V@NQ9{TuaSZP5S# literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/arrow-large.imageset/Contents.json b/Vector/Vector/Assets.xcassets/arrow-large.imageset/Contents.json new file mode 100644 index 0000000..b54f13d --- /dev/null +++ b/Vector/Vector/Assets.xcassets/arrow-large.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "arrow30-fill.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/arrow-large.imageset/arrow30-fill.pdf b/Vector/Vector/Assets.xcassets/arrow-large.imageset/arrow30-fill.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e2184767de04c5ca035aac88dfaf9034ccbb1cf2 GIT binary patch literal 4660 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 R+z6^j6nID^V@NQ9{TuaSZP5S# literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/arrow.imageset/Contents.json b/Vector/Vector/Assets.xcassets/arrow.imageset/Contents.json new file mode 100644 index 0000000..cd093a4 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/arrow.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "arrow30.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/arrow.imageset/arrow30.pdf b/Vector/Vector/Assets.xcassets/arrow.imageset/arrow30.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d1e947b4234a54826c9ec2f75f990a68c8350913 GIT binary patch literal 4688 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 literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/cross-fill.imageset/Contents.json b/Vector/Vector/Assets.xcassets/cross-fill.imageset/Contents.json new file mode 100644 index 0000000..c4d92d6 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/cross-fill.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "cross30-fill.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/cross-fill.imageset/cross30-fill.pdf b/Vector/Vector/Assets.xcassets/cross-fill.imageset/cross30-fill.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a8a20ba97ab8920ee3102f19b187fd705a23981 GIT binary patch literal 4761 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 S^zuT$pimf?tgN1~KI~s>2$_5U literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/cross-large.imageset/Contents.json b/Vector/Vector/Assets.xcassets/cross-large.imageset/Contents.json new file mode 100644 index 0000000..a00e719 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/cross-large.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "cross75.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/cross-large.imageset/cross75.pdf b/Vector/Vector/Assets.xcassets/cross-large.imageset/cross75.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7611740e207943a5fe6546d24dc494b54474e3f5 GIT binary patch literal 5137 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 literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/cross.imageset/Contents.json b/Vector/Vector/Assets.xcassets/cross.imageset/Contents.json new file mode 100644 index 0000000..1835714 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/cross.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "cross30.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/cross.imageset/cross30.pdf b/Vector/Vector/Assets.xcassets/cross.imageset/cross30.pdf new file mode 100644 index 0000000000000000000000000000000000000000..51eb1658c7a367bc5c10e57c449ff6028c28276a GIT binary patch literal 4794 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 DLmH%F literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/star-vector.imageset/Contents.json b/Vector/Vector/Assets.xcassets/star-vector.imageset/Contents.json new file mode 100644 index 0000000..3bc6cd0 --- /dev/null +++ b/Vector/Vector/Assets.xcassets/star-vector.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "star100.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/star-vector.imageset/star100.pdf b/Vector/Vector/Assets.xcassets/star-vector.imageset/star100.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ae25014b64b06f9e3e9bb925c3f480ca22cc4728 GIT binary patch literal 14044 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 hpaAy2uJX;BM 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%0AZ8nfDJ(L>* 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 literal 0 HcmV?d00001 diff --git a/Vector/Vector/Assets.xcassets/tick.imageset/Contents.json b/Vector/Vector/Assets.xcassets/tick.imageset/Contents.json new file mode 100644 index 0000000..266590c --- /dev/null +++ b/Vector/Vector/Assets.xcassets/tick.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "tick30.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Vector/Vector/Assets.xcassets/tick.imageset/tick30.pdf b/Vector/Vector/Assets.xcassets/tick.imageset/tick30.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4249d586bf7f9d6076753a1695355aeb1d5dfb4d GIT binary patch literal 4750 zcmbVQ2{=@57avTPA*n2p>LzPpR>M@*v5g3!kZm@MZ8XNxB9xRZ*%Bp5S+f*Hgh(VZ zB&0&JRY)X?(A(hcEnYy8=q0y{Q zS6b`pVHf}b&`EBv-May}G1be3=?bWTqJ02dpXR}&GQiP;$fW90$#e=8(9nSSFd0;$ zCoF(thb6D2yd?snLq=>jvf@4P$f9+Pp_0*FC3yvtW^?(+&|Ju49g&diLAzCfEIa(F zq+?fRv>;X*Yvo{6FUqnR@QLl6?UFrW5$td5C)6)-SswPL0&p{;%hE4{>cs@mKVsZR z^`ZMR$W$Ky`$K@IdojW9J^&jR2*QL)p%HcH0l+~7C_uAsdl-Bloe5$B1t6Yff9&}y zc`#$p$re;5a1eB=s}H~lo}g=;wGu7wHF#~nbj0fQOPp)q~Ts0=*a)0^(aPMzAnmKOGFX~$cU91sYk z_R42dPk}9Gw21eEIk>n5HXxi{qY4`ZSuk@8ZV^ zoF}`;=9Yvo8qcOqP56j;&^p$Yk56GHaUsO-UV`H?bcZ@*QCefeIf|2Ad33b)-isl` zVIyM#H+N>oMw^f~lU;XjHlm6=te-SrnYHE5ljhnfsbep#!3Q;t19LJXhid^6r z^h(jsDEnnYkMuPO5}1+?FE|)uFdX!FLskG=X#$3*Z}|S zFCq23zokXD=xJ7^YGvy>DL`gg;s_t`beEwB)I6LJY{nTDD(k1aN?&-b!hVY7eGY@u zQe-`0{*xz2U3^nQX7x4Zx_U!BQSN*b`6{1!Qx+O*`npF-ySiN_0=vo~X5UUgYnj#@ z!I*Sw;SZxVcI(zR)y;Bl5aJND=D6SQ>iy&*MFSLiX5HN2yu z@j{a9V7i1&i}*dv<){j?-V~Ysj3{Wj-36J~E*ZyosFjw46v)u5e0%$sOU4j{aI$0b zh-|t?I7&}g{6qK@Cxkbl4tI|s82J_FdKnUs=`t7r4JVK?*LGc?4ZVHjJU3Zv@s)(! zk?_Ez|4e`}Yq~_>EJ7@}kbYi|L&nB4*)?`NUvhlhrgPZ!YjtW_}hTTRN2 zu`X*zUAF1-7`p+l6ot%4+g{vMT$N}ADe>gi8tT7cIsrhYRzXU7FMZk^=HU=m_eMaD zKXPo$!-pfyU3te_)%mm&^vBgYi(UY@tsK>d5zzxh?#55nlbq+ENz7 zGXgObhRjt(@r=Guj~dQ(=XjV`V3-hP1gE0YYRO=&vRfjwB{1lXF*iS^*6A z0!Luz+6$cR#MRFscY?c%c1iLY)Hc1=4G_7+BX<8~zfqZ}hG1!}SpUY45XDoDweh@K zk9fJ-^sRX}PU`BMvzF#qyVX5b>KbQ`UdlPaYa8!I8^#_QPlHev~FRLzFxi!9VC&hrV!A8r$v_LuyaFkgSr)icTFDqx5=nQQtC;U?=wbnAAT?@-Q*W@WMbFSAk|F^hxWPQNcI4?j{i=l1!*d-eD6 z5-Ac@65w@a(1z`OUB;fmi6{=$_G`oOYKT6{B=zCz^&nqh2|6K8s=&FY1gU^st*P| zzTXPGaEjEvSd*O|kzP%_Ow8yfZ_AC%Yulb-o3X22jeO@&#H7Z+LD{14R6-mfy3xeq z`LkY2r*c*aOTc~DRTh({Qqgd==#`Dl4gJn5xCgr*9m_a;@#_wL^+@Z;RM8$$N5yeP z3#C!TEj9`^tE@ds-WSb1cu|+)Zch$u2y+`C7q?{g4ByVrQR?%n9uM4=VqerFTCul+ zH6u79H7`4lR?h}KwN(J{;9T&V>-p66 zab&J*-V~|^y}|bub`7cz-Or=JkK$Xm$`|^ehNGt9#1{BdM`^ofqMSP4@P4Ou^Qj2f zi_H0KP*%j;kR3Z*W)*Nez#pna($mG)RT#!Rdiuy9GFo(xsK0)r!9%?c0~5WYdP#bF zlB^YNiU;+hY@>iob+>~_Ut)5F!lyE@Ie`EcfNS+1>^QmP7|x(oMVm6 zq3xSDZrRi)v>3j=HfPAVVA}Dn{}8k*zT)(J+(`Y7k?2YLFVt_b(4^2?p>4WJb@t(8 zLIFX9Fu-Z5efzcVEyt;l!JLG12^k9LoVJ`Nw9t|-CG9#g#E7CD_GopvO85gz1_EFH znAY*ZYW-EMwpe3%9~RMgz9@6jhQHYDRWgn5BpZ5^1)p&|5Rsz-OIas{q1YY`#)EW#&`mrhTR{V^qZoo8~eN> zdY_qJF)yleaxI=1uGhJ%W8Pn>)N)YJE9S3U2_KUpV}Y#h2<3trpj4>eC+ohq$3Fjlpnc<_+Z z8d?k`rUaFJtJ0{@&7dRe{k8WY5-};mmG6(1j;Fq8c-d9m=NZ(_5zY0GM`N?FZ^~ zLk;wW*Pro6*XO-6LucIm0#)0Jn|#yoWy{26f!*DQBLZ{Z$t|SK+-bFquuboL)fs;0 z8kTm{_-Nm|;P%u_Et`}yFD@RNj+#kMDSqs-hZWl*a_J&2&Hwn6PW`FL$Z)aKI}b25 z%1Z{HrWOh%8dy0Vwh-O9x#IG9$FbwIcef`z zE8lq+FPtC9KU=jbaAeMY9^N}s9yoM%F?AzXB=_70<*K8L4zJYT1@lx{vN{qsf{^z1dZ`xy~8S z5z5=ac7NJLW>!RRUX|ud$U^!&dAcF?-I(bY)5NrBP5)zj-=+d&J)MX9W{r>$hAjgb83B*iA^K1$0Fu3j-3QpO>}gl#vANh!#_01W2L!DGsyGx# z-tcr^kPaaM_#PU?2PAvT_I}}R$Y0s<51V)*ljuQr`9Vj0R(R-sD#M3H_X6NZWz4Vh zS9q;FlSXz&BNSF*MXu0Ic@rWTFtq@zLB6JpL@8qdb6+BZc?1B7=Mt91f0MN?Vp9(7^OkQ^<3V~Eb;1F0O7ToruZ4n4L@cyZ}oX@3P(U=}o0J+Ti zLGDZOC4; zAkg62|5Jwj#V?aVq@;M2?%b5-59Jh z3Wrf6Bgj|^28(o7Q$>>1FeEhunTSMCa1;&Le^&vINS2Njz!kl;5HKhtc>E-zXQ~hT E4}mt7d;kCd literal 0 HcmV?d00001 diff --git a/Vector/Vector/Base.lproj/LaunchScreen.storyboard b/Vector/Vector/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/Vector/Vector/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Vector/Vector/Base.lproj/Main.storyboard b/Vector/Vector/Base.lproj/Main.storyboard new file mode 100644 index 0000000..4c052d6 --- /dev/null +++ b/Vector/Vector/Base.lproj/Main.storyboard @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Vector/Vector/Info.plist b/Vector/Vector/Info.plist new file mode 100644 index 0000000..6873106 --- /dev/null +++ b/Vector/Vector/Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + From 59e0bf46e857d4995de97d447e2cafe31dbd08b2 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 16 Sep 2017 16:42:55 +0100 Subject: [PATCH 036/142] Update for Xcode 9 and Swift 4 --- .../RefreshScroll.xcodeproj/project.pbxproj | 23 ++++++++++++++++--- .../RefreshScroll/AdaptiveScrollView.swift | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj index 7b5e766..1b685e5 100644 --- a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj @@ -102,12 +102,13 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0810; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53C353911DEB6CA700E33073 = { CreatedOnToolsVersion = 8.1; DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; }; @@ -195,7 +196,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -203,7 +206,12 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -245,7 +253,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -253,7 +263,12 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -288,7 +303,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RefreshScroll; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -301,7 +317,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RefreshScroll; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift b/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift index 2230c68..b5efdd7 100644 --- a/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift +++ b/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift @@ -52,7 +52,7 @@ class AdaptiveScrollView: UIScrollView { setup() } - func keyboardDidChangeFrame(_ notification:Notification) { + @objc func keyboardDidChangeFrame(_ notification:Notification) { guard let keyboardFrame = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue else { return } From fd5af97e21be187373be3f7be8f164239cb2fecf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 24 Sep 2017 17:55:10 +0100 Subject: [PATCH 037/142] Update Strings playground for Swift 4 --- Playgrounds/String.playground/Contents.swift | 420 +++++++++++------- .../String.playground/contents.xcplayground | 2 +- .../String.playground/timeline.xctimeline | 14 +- 3 files changed, 262 insertions(+), 174 deletions(-) diff --git a/Playgrounds/String.playground/Contents.swift b/Playgrounds/String.playground/Contents.swift index ee4ecb4..e9aabf1 100644 --- a/Playgrounds/String.playground/Contents.swift +++ b/Playgrounds/String.playground/Contents.swift @@ -1,14 +1,20 @@ -// Swift Standard Library - String Cheat Sheet -// Keith Harrison -// See http://useyourloaf.com/blog/swift-string-cheat-sheet/ +/*: +# Swift String Cheat Sheet -// Import Foundation if you want to bridge to NSString -import Foundation +A quick guide to using Strings with Swift. + + By Keith Harrison - [useyourloaf.com](https://useyourloaf.com) + + Last Update: **23 September 2017 for Swift 4 (Xcode 9)** -// ==== -// Initializing a String -// ==== + See Also: [Swift String Cheat Sheet](https://useyourloaf.com/blog/swift-string-cheat-sheet/) +*/ +//: ## Setup +//: Import Foundation if you want to bridge to NSString +import Foundation + +//: ## Initializing a String var emptyString = "" // Empty String var stillEmpty = String() // Another empty String let helloWorld = "Hello World!" // String inferred @@ -21,47 +27,71 @@ let e = String(1000) // from Int "1000" let f = "Result = \(d)" // Interpolation "Result = 3.14" let g = "\u{2126}" // Unicode Ohm sign Ω -// Creating a String by repeating values +//: ### Creating a String by repeating values let h = String(repeating:"01", count:3) // 010101 -// Creating a String from a file (in the Resources folder) +//: ### Creating a String from a file (in the Resources folder) if let txtPath = Bundle.main.path(forResource: "lorem", ofType: "txt") { do { let lorem = try String(contentsOfFile: txtPath, encoding: .utf8) + print(lorem) } catch { print("Something went wrong") } } -// === -// Strings are Value Types -// === - -// Strings are value types that are copied when assigned -// or passed to a function. The copy is performed lazily -// on mutation. - +/*: + ### Multi-line string literals (Swift 4) + Swift now allows you to create a multi-line String literals. You wrap the strings in triple double quotes (`"""String"""`). You do not need to escape newlines and quotes within the string: + */ +let verse = """ + To be, or not to be - that is the question; + Whether 'tis nobler in the mind to suffer + The slings and arrows of outrageous fortune, + Or to take arms against a sea of troubles, + """ +/*: +You can control the leading white space with the indentation of the text relative to the closing `"""`. In the last example there is no leading whitespace in the final string literal. In this next example we indent the text by two spaces: + */ +let indentedText = """ + Hello, this text is indented by + two spaces from the closing quotes + """ +/*: + Source code with overly long string literals can be hard to read. To split long lines in the source use a \ to escape the new line. + */ +let singleLongLine = """ + This is a much longer line split \ + over two lines by escaping the newline. + """ + +/*: + ## Strings are Value Types + Strings are value types that are copied when assigned + or passed to a function. The copy is performed lazily + on mutation. + */ var aString = "Hello" var bString = aString bString += " World!" print("\(aString)") // "Hello\n" -// === -// Testing for empty String -// === - -emptyString.isEmpty // true +//: ### Testing For Empty +let name = "" +name.isEmpty // true -// === -// Testing for equality -// === +let title = String() +title.isEmpty // true -// Swift is Unicode correct so the equality operator -// (“==”) checks for Unicode canonical equivalence. -// This means that two Strings that are composed from -// different Unicode scalars will be considered equal -// if they have the same linguistic meaning and appearance: +/*: + ### Testing for equality + Swift is Unicode correct so the equality operator + (“==”) checks for Unicode canonical equivalence. + This means that two Strings that are composed from + different Unicode scalars will be considered equal + if they have the same linguistic meaning and appearance: + */ let spain = "España" let tilde = "\u{303}" let country = "Espan" + "\(tilde)" + "a" @@ -69,112 +99,119 @@ if country == spain { print("Matched!") // "Matched!\n" } -// Order +//: ### Order if "aaa" < "bbb" { print("aaa is less than bbb") } -// === -// Testing for suffix/prefix -// === - +//: ### Testing for suffix/prefix let line = "0001 Some test data here %%%%" line.hasPrefix("0001") // true line.hasSuffix("%%%%") // true -// === -// Converting to upper/lower case -// === - +//: ### Converting to upper/lower case let mixedCase = "AbcDef" let upper = mixedCase.uppercased() // "ABCDEF" let lower = mixedCase.lowercased() // "abcdef" -// === -// Views -// === - -// Strings are not collections of anything but do provide -// collection views for different representations accessed -// through the appropriate property: +/*: + ## Views + In Swift 4 Strings are back to being collections of + characters. You can access different representations + of the string through the appropriate collection view. + */ country.characters // characters country.unicodeScalars // Unicode scalar 21-bit codes country.utf16 // UTF-16 encoding country.utf8 // UTF-8 encoding -// === -// Counting -// == +/*: + ### Strings Are Collections Of Characters (Swift 4) -// String does not directly have a property to return a count -// as it only has meaning for a particular representation. -// So count is implemented on each of the collection views: + The `CharacterView` is now the default when you are + working with a `String`. The following two loops + are equivalent in Swift 4 + */ + +// Swift 4 +for character in country { + print(character) +} + +// Swift 3 (still works in Swift 4) +for character in country.characters { + print(character) +} + +/*: + ### Counting + + Count is implemented for each of the collection views + as it is dependent on the representation. The `count` + property of a String is the character count. + */ // spain = "España" +spain.count // Same as spain.characters.count print("\(spain.characters.count)") // 6 print("\(spain.unicodeScalars.count)") // 6 print("\(spain.utf16.count)") // 6 print("\(spain.utf8.count)") // 7 -// === -// Using Index to traverse a collection -// === -// Each of the collection views has an Index -// that you use to traverse the collection. -// This is maybe one of the big causes of pain -// when getting to grips with String. You cannot -// randomly access an element in a string using -// a subscript (e.g. string[5]). +/*: + ## Using Index to traverse a collection -// To iterate over all items in a collection -// with a for..in loop: + Each of the collection views has an Index + that you use to traverse the collection. + This is maybe one of the big causes of pain + when getting to grips with String. You cannot + randomly access an element in a string using + a subscript (e.g. string[5]). -var sentence = "Never odd or even" -for character in sentence.characters { - print(character) -} - -// Each collection has two instance properties you -// can use as subscripts to index into the collection: -// startIndex: the position of the first element if -// non-empty, else identical to endIndex. -// endIndex: the position just “past the end” of the string. + Each collection has two instance properties you + can use as subscripts to index into the collection: + + `startIndex`: the position of the first element if + non-empty, else identical to endIndex. + + `endIndex`: the position just “past the end” of the string. + */ let hello = "hello" let helloStartIndex = hello.characters.startIndex // 0 -// If you do not specify a view you get the characters view +//: If you do not specify a view you get the characters view +//: which most of the time saves typing let startIndex = hello.startIndex // 0 let endIndex = hello.endIndex // 5 - -// Note the choice for endIndex means you cannot use it -// directly as a subscript as it is out of range. - +/*: + **Note the choice for endIndex means you cannot use it directly as a subscript as it is out of range.** + */ hello[startIndex] // "h" -// Use index(after:) and index(before:) to move -// forward or backward from an index - +/*: + Use index(after:) and index(before:) to move forward or backward from an index + */ hello[hello.index(after: startIndex)] // "e" hello[hello.index(before: endIndex)] // "o" -// Use index(_:offsetBy:) to move in arbitrary steps - +//: Use index(_:offsetBy:) to move in arbitrary steps hello[hello.index(startIndex, offsetBy: 1)] // "e" hello[hello.index(endIndex, offsetBy: -4)] // "e" -// To avoid overrunning the end of the string +//: To avoid overrunning the end of the string if let someIndex = hello.index(startIndex, offsetBy: 4, limitedBy: endIndex) { hello[someIndex] // "o" } -// To get the index of first matching element -let matchedIndex = hello.characters.index(of: "l") // 2 -let nomatchIndex = hello.characters.index(of: "A") // nil +/*: + To get the index of first matching element (but note that the + return value is an optional + */ +let matchedIndex = hello.index(of: "l") // 2 +let nomatchIndex = hello.index(of: "A") // nil -// Using the utf16 view +//: Using the utf16 view let cafe = "café" let view = cafe.utf16 let utf16StartIndex = view.startIndex @@ -184,162 +221,201 @@ view[utf16StartIndex] // 99 - "c" view[view.index(utf16StartIndex, offsetBy: 1)] // 97 - "a" view[view.index(before: utf16EndIndex)] // 233 - "é" -// The indices property returns a range for all elements -// in a String that can be useful for iterating through -// the collection: - -for index in cafe.characters.indices { +/*: + The indices property returns a range for all elements + in a String that can be useful for iterating through + the collection: + */ +for index in cafe.indices { print(cafe[index]) } -// You cannot use an index from one String to access a -// different string. You can convert an index to an integer -// value with the distanceTo method: - +/*: + You cannot use an index from one String to access a + different string. You can convert an index to an integer + value with the distanceTo method: + */ let word1 = "ABCDEF" let word2 = "012345" -if let indexC = word1.characters.index(of: "C") { +if let indexC = word1.index(of: "C") { let distance = word1.distance(from: word1.startIndex, to: indexC) // 2 let digit = word2[word2.index(startIndex, offsetBy: distance)] // "2" + print(digit) } -// === -// Using a range -// === - -// To identify a range of elements in a String collection -// use a range. A range is just a start and end index: +/*: + ## Using a range + To identify a range of elements in a String collection + use a range. A range is just a start and end index: + */ let fqdn = "useyourloaf.com" let tldEndIndex = fqdn.endIndex let tldStartIndex = fqdn.index(tldEndIndex, offsetBy: -3) let range = Range(uncheckedBounds: (lower: tldStartIndex, upper: tldEndIndex)) fqdn[range] -// Alternate creation of range (... or ..< syntax) +//: ### Alternate creation of range (... or ..< syntax) let endOfDomain = fqdn.index(fqdn.endIndex, offsetBy: -4) let rangeOfDomain = fqdn.startIndex ..< endOfDomain fqdn[rangeOfDomain] // useyourloaf -// Returning a range of matching substring +//: ### Returning a range of matching substring if let rangeOfTLD = fqdn.range(of: "com") { let tld = fqdn[rangeOfTLD] // "com" + print(tld) } -// === -// Getting a substring using index or range -// === -// Various methods to get a substring identified by an -// index or range: +/*: + ## Substrings + + When you slice a string in Swift 4 you do not get back a `String` you get a `Substring`. A `Substring` has most of the same methods as a `String` (it conforms to `StringProtocol`) which makes life easy. + + A `Substring` shares the storage of the original string. For this reason you should treat it a temporary object. From The Swift Programming Language (Swift 4): + + > substrings aren't suitable for long-term storage -- because they reuse the storage of the original string the entire original string must be kept in memory as long as any of its substrings are being used. -var template = "<<>>" + If you want to store it or pass it around convert it back to a `String`. + */ + +/*: + In Swift 4 you slice a string into a substring using subscripting. The + use of substring(from:), substring(to:) and substring(with:) are all + deprecated. + + To get a substring from an index up to the end of the string: + */ +let template = "<<>>" let indexStartOfText = template.index(template.startIndex, offsetBy: 3) // 3 let indexEndOfText = template.index(template.endIndex, offsetBy: -3) // 8 -let subString1 = template.substring(from: indexStartOfText) // "Hello>>>" -let subString2 = template.substring(to: indexEndOfText) // "<<>>" + +// Swift 3 deprecated +// let substring1 = template.substring(from: indexStartOfText) + +/*: + To get a substring from the start of the string up to an index: + */ +// Swift 4 +let substring2 = template[.. - + \ No newline at end of file diff --git a/Playgrounds/String.playground/timeline.xctimeline b/Playgrounds/String.playground/timeline.xctimeline index 7cd939d..8107b04 100644 --- a/Playgrounds/String.playground/timeline.xctimeline +++ b/Playgrounds/String.playground/timeline.xctimeline @@ -3,7 +3,19 @@ version = "3.0"> + + + + From 084e1e9abe77f45f4ff34aea6ff4548b199225cb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 24 Sep 2017 18:29:45 +0100 Subject: [PATCH 038/142] Moved Strings playground to new repository Easier if the playground is in its own repo. See https://github.com/kharrison/Playground-Strings --- Playgrounds/String.playground.zip | Bin 16944 -> 0 bytes Playgrounds/String.playground/Contents.swift | 421 ------------------ .../String.playground/Resources/lorem.txt | 1 - .../String.playground/contents.xcplayground | 4 - .../contents.xcworkspacedata | 7 - .../String.playground/timeline.xctimeline | 23 - 6 files changed, 456 deletions(-) delete mode 100644 Playgrounds/String.playground.zip delete mode 100644 Playgrounds/String.playground/Contents.swift delete mode 100644 Playgrounds/String.playground/Resources/lorem.txt delete mode 100644 Playgrounds/String.playground/contents.xcplayground delete mode 100644 Playgrounds/String.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 Playgrounds/String.playground/timeline.xctimeline diff --git a/Playgrounds/String.playground.zip b/Playgrounds/String.playground.zip deleted file mode 100644 index 6f83a46001afb3816dcb0a673ee8e51cc2663c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16944 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 P{EzqNA9rgUKY#rnYI=(~ diff --git a/Playgrounds/String.playground/Contents.swift b/Playgrounds/String.playground/Contents.swift deleted file mode 100644 index e9aabf1..0000000 --- a/Playgrounds/String.playground/Contents.swift +++ /dev/null @@ -1,421 +0,0 @@ -/*: -# Swift String Cheat Sheet - -A quick guide to using Strings with Swift. - - By Keith Harrison - [useyourloaf.com](https://useyourloaf.com) - - Last Update: **23 September 2017 for Swift 4 (Xcode 9)** - - See Also: [Swift String Cheat Sheet](https://useyourloaf.com/blog/swift-string-cheat-sheet/) -*/ - -//: ## Setup -//: Import Foundation if you want to bridge to NSString -import Foundation - -//: ## Initializing a String -var emptyString = "" // Empty String -var stillEmpty = String() // Another empty String -let helloWorld = "Hello World!" // String inferred - -let a = String(true) // from boolean: "true" -let b: Character = "A" // Explicit type required to create a Character -let c = String(b) // from character "A" -let d = String(3.14) // from Double "3.14" -let e = String(1000) // from Int "1000" -let f = "Result = \(d)" // Interpolation "Result = 3.14" -let g = "\u{2126}" // Unicode Ohm sign Ω - -//: ### Creating a String by repeating values -let h = String(repeating:"01", count:3) // 010101 - -//: ### Creating a String from a file (in the Resources folder) -if let txtPath = Bundle.main.path(forResource: "lorem", ofType: "txt") { - do { - let lorem = try String(contentsOfFile: txtPath, encoding: .utf8) - print(lorem) - } catch { - print("Something went wrong") - } -} - -/*: - ### Multi-line string literals (Swift 4) - Swift now allows you to create a multi-line String literals. You wrap the strings in triple double quotes (`"""String"""`). You do not need to escape newlines and quotes within the string: - */ -let verse = """ - To be, or not to be - that is the question; - Whether 'tis nobler in the mind to suffer - The slings and arrows of outrageous fortune, - Or to take arms against a sea of troubles, - """ -/*: -You can control the leading white space with the indentation of the text relative to the closing `"""`. In the last example there is no leading whitespace in the final string literal. In this next example we indent the text by two spaces: - */ -let indentedText = """ - Hello, this text is indented by - two spaces from the closing quotes - """ -/*: - Source code with overly long string literals can be hard to read. To split long lines in the source use a \ to escape the new line. - */ -let singleLongLine = """ - This is a much longer line split \ - over two lines by escaping the newline. - """ - -/*: - ## Strings are Value Types - Strings are value types that are copied when assigned - or passed to a function. The copy is performed lazily - on mutation. - */ -var aString = "Hello" -var bString = aString -bString += " World!" -print("\(aString)") // "Hello\n" - -//: ### Testing For Empty -let name = "" -name.isEmpty // true - -let title = String() -title.isEmpty // true - -/*: - ### Testing for equality - - Swift is Unicode correct so the equality operator - (“==”) checks for Unicode canonical equivalence. - This means that two Strings that are composed from - different Unicode scalars will be considered equal - if they have the same linguistic meaning and appearance: - */ -let spain = "España" -let tilde = "\u{303}" -let country = "Espan" + "\(tilde)" + "a" -if country == spain { - print("Matched!") // "Matched!\n" -} - -//: ### Order -if "aaa" < "bbb" { - print("aaa is less than bbb") -} - -//: ### Testing for suffix/prefix -let line = "0001 Some test data here %%%%" -line.hasPrefix("0001") // true -line.hasSuffix("%%%%") // true - -//: ### Converting to upper/lower case -let mixedCase = "AbcDef" -let upper = mixedCase.uppercased() // "ABCDEF" -let lower = mixedCase.lowercased() // "abcdef" - -/*: - ## Views - - In Swift 4 Strings are back to being collections of - characters. You can access different representations - of the string through the appropriate collection view. - */ -country.characters // characters -country.unicodeScalars // Unicode scalar 21-bit codes -country.utf16 // UTF-16 encoding -country.utf8 // UTF-8 encoding - -/*: - ### Strings Are Collections Of Characters (Swift 4) - - The `CharacterView` is now the default when you are - working with a `String`. The following two loops - are equivalent in Swift 4 - */ - -// Swift 4 -for character in country { - print(character) -} - -// Swift 3 (still works in Swift 4) -for character in country.characters { - print(character) -} - -/*: - ### Counting - - Count is implemented for each of the collection views - as it is dependent on the representation. The `count` - property of a String is the character count. - */ - -// spain = "España" -spain.count // Same as spain.characters.count -print("\(spain.characters.count)") // 6 -print("\(spain.unicodeScalars.count)") // 6 -print("\(spain.utf16.count)") // 6 -print("\(spain.utf8.count)") // 7 - - -/*: - ## Using Index to traverse a collection - - Each of the collection views has an Index - that you use to traverse the collection. - This is maybe one of the big causes of pain - when getting to grips with String. You cannot - randomly access an element in a string using - a subscript (e.g. string[5]). - - Each collection has two instance properties you - can use as subscripts to index into the collection: - - + `startIndex`: the position of the first element if - non-empty, else identical to endIndex. - + `endIndex`: the position just “past the end” of the string. - */ -let hello = "hello" -let helloStartIndex = hello.characters.startIndex // 0 - -//: If you do not specify a view you get the characters view -//: which most of the time saves typing -let startIndex = hello.startIndex // 0 -let endIndex = hello.endIndex // 5 -/*: - **Note the choice for endIndex means you cannot use it directly as a subscript as it is out of range.** - */ -hello[startIndex] // "h" - -/*: - Use index(after:) and index(before:) to move forward or backward from an index - */ -hello[hello.index(after: startIndex)] // "e" -hello[hello.index(before: endIndex)] // "o" - -//: Use index(_:offsetBy:) to move in arbitrary steps -hello[hello.index(startIndex, offsetBy: 1)] // "e" -hello[hello.index(endIndex, offsetBy: -4)] // "e" - -//: To avoid overrunning the end of the string -if let someIndex = hello.index(startIndex, offsetBy: 4, limitedBy: endIndex) { - hello[someIndex] // "o" -} - -/*: - To get the index of first matching element (but note that the - return value is an optional - */ -let matchedIndex = hello.index(of: "l") // 2 -let nomatchIndex = hello.index(of: "A") // nil - -//: Using the utf16 view -let cafe = "café" -let view = cafe.utf16 -let utf16StartIndex = view.startIndex -let utf16EndIndex = view.endIndex - -view[utf16StartIndex] // 99 - "c" -view[view.index(utf16StartIndex, offsetBy: 1)] // 97 - "a" -view[view.index(before: utf16EndIndex)] // 233 - "é" - -/*: - The indices property returns a range for all elements - in a String that can be useful for iterating through - the collection: - */ -for index in cafe.indices { - print(cafe[index]) -} - -/*: - You cannot use an index from one String to access a - different string. You can convert an index to an integer - value with the distanceTo method: - */ -let word1 = "ABCDEF" -let word2 = "012345" -if let indexC = word1.index(of: "C") { - let distance = word1.distance(from: word1.startIndex, to: indexC) // 2 - let digit = word2[word2.index(startIndex, offsetBy: distance)] // "2" - print(digit) -} - -/*: - ## Using a range - - To identify a range of elements in a String collection - use a range. A range is just a start and end index: - */ -let fqdn = "useyourloaf.com" -let tldEndIndex = fqdn.endIndex -let tldStartIndex = fqdn.index(tldEndIndex, offsetBy: -3) -let range = Range(uncheckedBounds: (lower: tldStartIndex, upper: tldEndIndex)) -fqdn[range] - -//: ### Alternate creation of range (... or ..< syntax) -let endOfDomain = fqdn.index(fqdn.endIndex, offsetBy: -4) -let rangeOfDomain = fqdn.startIndex ..< endOfDomain -fqdn[rangeOfDomain] // useyourloaf - -//: ### Returning a range of matching substring -if let rangeOfTLD = fqdn.range(of: "com") { - let tld = fqdn[rangeOfTLD] // "com" - print(tld) -} - - -/*: - ## Substrings - - When you slice a string in Swift 4 you do not get back a `String` you get a `Substring`. A `Substring` has most of the same methods as a `String` (it conforms to `StringProtocol`) which makes life easy. - - A `Substring` shares the storage of the original string. For this reason you should treat it a temporary object. From The Swift Programming Language (Swift 4): - - > substrings aren't suitable for long-term storage -- because they reuse the storage of the original string the entire original string must be kept in memory as long as any of its substrings are being used. - - If you want to store it or pass it around convert it back to a `String`. - */ - -/*: - In Swift 4 you slice a string into a substring using subscripting. The - use of substring(from:), substring(to:) and substring(with:) are all - deprecated. - - To get a substring from an index up to the end of the string: - */ -let template = "<<>>" -let indexStartOfText = template.index(template.startIndex, offsetBy: 3) // 3 -let indexEndOfText = template.index(template.endIndex, offsetBy: -3) // 8 - -// Swift 4 -let substring1 = template[indexStartOfText...] // "Hello>>>" - -// Swift 3 deprecated -// let substring1 = template.substring(from: indexStartOfText) - -/*: - To get a substring from the start of the string up to an index: - */ -// Swift 4 -let substring2 = template[.. - - - \ No newline at end of file diff --git a/Playgrounds/String.playground/playground.xcworkspace/contents.xcworkspacedata b/Playgrounds/String.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Playgrounds/String.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Playgrounds/String.playground/timeline.xctimeline b/Playgrounds/String.playground/timeline.xctimeline deleted file mode 100644 index 8107b04..0000000 --- a/Playgrounds/String.playground/timeline.xctimeline +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - From 3140b17964692df2ffbbd5d32e3689bd1fa9c216 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 16 Oct 2017 15:07:05 +0100 Subject: [PATCH 039/142] Added DynamicWebKit project --- .../DynamicWebKit.xcodeproj/project.pbxproj | 337 ++++++++++++++++++ DynamicWebKit/DynamicWebKit/AppDelegate.swift | 35 ++ .../AppIcon.appiconset/Contents.json | 93 +++++ .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../DynamicWebKit/Base.lproj/Main.storyboard | 47 +++ .../DynamicWebKit/HTMLViewControler.swift | 73 ++++ DynamicWebKit/DynamicWebKit/Info.plist | 45 +++ DynamicWebKit/DynamicWebKit/readme.html | 16 + DynamicWebKit/DynamicWebKit/stylesheet.css | 18 + DynamicWebKit/README.md | 9 + 10 files changed, 698 insertions(+) create mode 100644 DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj create mode 100644 DynamicWebKit/DynamicWebKit/AppDelegate.swift create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Base.lproj/LaunchScreen.storyboard create mode 100644 DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard create mode 100644 DynamicWebKit/DynamicWebKit/HTMLViewControler.swift create mode 100644 DynamicWebKit/DynamicWebKit/Info.plist create mode 100644 DynamicWebKit/DynamicWebKit/readme.html create mode 100644 DynamicWebKit/DynamicWebKit/stylesheet.css create mode 100644 DynamicWebKit/README.md diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6d742f6 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -0,0 +1,337 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 53A2B53B1F94DBE500095FAD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2B53A1F94DBE500095FAD /* AppDelegate.swift */; }; + 53A2B53D1F94DBE500095FAD /* HTMLViewControler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2B53C1F94DBE500095FAD /* HTMLViewControler.swift */; }; + 53A2B5401F94DBE500095FAD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B53E1F94DBE500095FAD /* Main.storyboard */; }; + 53A2B5421F94DBE500095FAD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B5411F94DBE500095FAD /* Assets.xcassets */; }; + 53A2B5451F94DBE500095FAD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B5431F94DBE500095FAD /* LaunchScreen.storyboard */; }; + 53A2B54D1F94DC9700095FAD /* readme.html in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B54C1F94DC9700095FAD /* readme.html */; }; + 53A2B54F1F94DD8200095FAD /* stylesheet.css in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B54E1F94DD8200095FAD /* stylesheet.css */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53A2B5371F94DBE500095FAD /* DynamicWebKit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicWebKit.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53A2B53A1F94DBE500095FAD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53A2B53C1F94DBE500095FAD /* HTMLViewControler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLViewControler.swift; sourceTree = ""; }; + 53A2B53F1F94DBE500095FAD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53A2B5411F94DBE500095FAD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53A2B5441F94DBE500095FAD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53A2B5461F94DBE500095FAD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53A2B54C1F94DC9700095FAD /* readme.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = readme.html; sourceTree = ""; }; + 53A2B54E1F94DD8200095FAD /* stylesheet.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = stylesheet.css; sourceTree = ""; }; + 53A2B5501F94F14800095FAD /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53A2B5341F94DBE500095FAD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53A2B52E1F94DBE500095FAD = { + isa = PBXGroup; + children = ( + 53A2B5501F94F14800095FAD /* README.md */, + 53A2B5391F94DBE500095FAD /* DynamicWebKit */, + 53A2B5381F94DBE500095FAD /* Products */, + ); + sourceTree = ""; + }; + 53A2B5381F94DBE500095FAD /* Products */ = { + isa = PBXGroup; + children = ( + 53A2B5371F94DBE500095FAD /* DynamicWebKit.app */, + ); + name = Products; + sourceTree = ""; + }; + 53A2B5391F94DBE500095FAD /* DynamicWebKit */ = { + isa = PBXGroup; + children = ( + 53A2B53A1F94DBE500095FAD /* AppDelegate.swift */, + 53A2B53C1F94DBE500095FAD /* HTMLViewControler.swift */, + 53A2B54C1F94DC9700095FAD /* readme.html */, + 53A2B54E1F94DD8200095FAD /* stylesheet.css */, + 53A2B53E1F94DBE500095FAD /* Main.storyboard */, + 53A2B5411F94DBE500095FAD /* Assets.xcassets */, + 53A2B5431F94DBE500095FAD /* LaunchScreen.storyboard */, + 53A2B5461F94DBE500095FAD /* Info.plist */, + ); + path = DynamicWebKit; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53A2B5361F94DBE500095FAD /* DynamicWebKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53A2B5491F94DBE500095FAD /* Build configuration list for PBXNativeTarget "DynamicWebKit" */; + buildPhases = ( + 53A2B5331F94DBE500095FAD /* Sources */, + 53A2B5341F94DBE500095FAD /* Frameworks */, + 53A2B5351F94DBE500095FAD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DynamicWebKit; + productName = DynamicWebKit; + productReference = 53A2B5371F94DBE500095FAD /* DynamicWebKit.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53A2B52F1F94DBE500095FAD /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53A2B5361F94DBE500095FAD = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 53A2B5321F94DBE500095FAD /* Build configuration list for PBXProject "DynamicWebKit" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53A2B52E1F94DBE500095FAD; + productRefGroup = 53A2B5381F94DBE500095FAD /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53A2B5361F94DBE500095FAD /* DynamicWebKit */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53A2B5351F94DBE500095FAD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A2B54D1F94DC9700095FAD /* readme.html in Resources */, + 53A2B54F1F94DD8200095FAD /* stylesheet.css in Resources */, + 53A2B5451F94DBE500095FAD /* LaunchScreen.storyboard in Resources */, + 53A2B5421F94DBE500095FAD /* Assets.xcassets in Resources */, + 53A2B5401F94DBE500095FAD /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53A2B5331F94DBE500095FAD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A2B53D1F94DBE500095FAD /* HTMLViewControler.swift in Sources */, + 53A2B53B1F94DBE500095FAD /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53A2B53E1F94DBE500095FAD /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53A2B53F1F94DBE500095FAD /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53A2B5431F94DBE500095FAD /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53A2B5441F94DBE500095FAD /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53A2B5471F94DBE500095FAD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 53A2B5481F94DBE500095FAD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "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 = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53A2B54A1F94DBE500095FAD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = DynamicWebKit/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicWebKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53A2B54B1F94DBE500095FAD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = DynamicWebKit/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicWebKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53A2B5321F94DBE500095FAD /* Build configuration list for PBXProject "DynamicWebKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53A2B5471F94DBE500095FAD /* Debug */, + 53A2B5481F94DBE500095FAD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53A2B5491F94DBE500095FAD /* Build configuration list for PBXNativeTarget "DynamicWebKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53A2B54A1F94DBE500095FAD /* Debug */, + 53A2B54B1F94DBE500095FAD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53A2B52F1F94DBE500095FAD /* Project object */; +} diff --git a/DynamicWebKit/DynamicWebKit/AppDelegate.swift b/DynamicWebKit/DynamicWebKit/AppDelegate.swift new file mode 100644 index 0000000..6420758 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/AppDelegate.swift @@ -0,0 +1,35 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1d060ed --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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/DynamicWebKit/DynamicWebKit/Base.lproj/LaunchScreen.storyboard b/DynamicWebKit/DynamicWebKit/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard new file mode 100644 index 0000000..afb9d6c --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift b/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift new file mode 100644 index 0000000..36538ef --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift @@ -0,0 +1,73 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright (c) 2017 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit +import WebKit + +class HTMLViewControler: UIViewController { + + private lazy var webview: WKWebView = { + let preferences = WKPreferences() + preferences.javaScriptEnabled = false + let configuration = WKWebViewConfiguration() + configuration.preferences = preferences + let webview = WKWebView(frame: .zero, configuration: configuration) + webview.translatesAutoresizingMaskIntoConstraints = false + return webview + }() + + override func viewDidLoad() { + super.viewDidLoad() + setupViews() + loadHTML("readme.html") + + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: NSNotification.Name.UIContentSizeCategoryDidChange, object: nil) + } + + private func setupViews() { + view.addSubview(webview) + NSLayoutConstraint.activate([ + webview.leadingAnchor.constraint(equalTo: view.leadingAnchor), + webview.trailingAnchor.constraint(equalTo: view.trailingAnchor), + webview.topAnchor.constraint(equalTo: view.topAnchor), + webview.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + } + + private func loadHTML(_ file: String) { + if let baseURL = Bundle.main.resourceURL { + let fileURL = baseURL.appendingPathComponent(file) + webview.loadFileURL(fileURL, allowingReadAccessTo: fileURL) + } + } + + @objc private func contentSizeDidChange(_ notification: Notification) { + webview.reload() + } +} diff --git a/DynamicWebKit/DynamicWebKit/Info.plist b/DynamicWebKit/DynamicWebKit/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/DynamicWebKit/DynamicWebKit/readme.html b/DynamicWebKit/DynamicWebKit/readme.html new file mode 100644 index 0000000..703c048 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/readme.html @@ -0,0 +1,16 @@ + + + + + + + + +

Dynamic Type With WebKit

+

Getting Started

+

An example of using dynamic type fonts with HTML content displayed in a WKWebView.

+

Changing the text size in Settings should also change the text in this web view.

+
+ + + diff --git a/DynamicWebKit/DynamicWebKit/stylesheet.css b/DynamicWebKit/DynamicWebKit/stylesheet.css new file mode 100644 index 0000000..59ff130 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/stylesheet.css @@ -0,0 +1,18 @@ +body { + font: -apple-system-body; +} + +h1 { + font: -apple-system-headline; + color: red; +} + +h2 { + font: -apple-system-subheadline; + color: blue; +} + +.footnote { + font: -apple-system-footnote; + color: green; +} diff --git a/DynamicWebKit/README.md b/DynamicWebKit/README.md new file mode 100644 index 0000000..188df97 --- /dev/null +++ b/DynamicWebKit/README.md @@ -0,0 +1,9 @@ +# Using Dynamic Type With Web Views + +An example of how to use the Apple system fonts in a CSS stylesheet so static HTML content in a web view respects the user's choice of content size. + +## Further Details + +For further details see the following blog post: + ++ [Using Dynamic Type With Web Views](https://useyourloaf.com/blog/using-dynamic-type-with-web-views/) From 8fa1d5d5e2a0bfa12a4e0ee2d21e35ca41c904cc Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 13:01:49 +0100 Subject: [PATCH 040/142] Update for Xcode 9 and Swift 3.2 --- .../Designable.xcodeproj/project.pbxproj | 36 +++++++++++++++++-- .../Designable/Base.lproj/Main.storyboard | 25 +++++++------ Designable/Designable/Info.plist | 4 +-- Designable/Designable/LevelView.h | 2 +- Designable/Designable/LevelView.m | 2 +- .../Base.lproj/Main.storyboard | 25 +++++++------ Designable/DesignableSwift/Info.plist | 4 +-- Designable/DesignableSwift/LevelView.swift | 20 +++++------ Designable/README | 11 ------ Designable/README.md | 14 ++++++++ 10 files changed, 93 insertions(+), 50 deletions(-) delete mode 100644 Designable/README create mode 100644 Designable/README.md diff --git a/Designable/Designable.xcodeproj/project.pbxproj b/Designable/Designable.xcodeproj/project.pbxproj index 894c6f2..9d8f6e5 100644 --- a/Designable/Designable.xcodeproj/project.pbxproj +++ b/Designable/Designable.xcodeproj/project.pbxproj @@ -40,7 +40,6 @@ 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 = ""; }; @@ -80,7 +79,6 @@ 538021EA1B20EC3900434436 = { isa = PBXGroup; children = ( - 5321CAA61B26506100CE5924 /* README */, 538021F51B20EC3900434436 /* Designable */, 53C515E91B2786EE0062905B /* DesignableSwift */, 538021F41B20EC3900434436 /* Products */, @@ -189,14 +187,16 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0630; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 538021F21B20EC3900434436 = { CreatedOnToolsVersion = 6.3.2; + DevelopmentTeam = LCC2J94N44; }; 53C515E71B2786ED0062905B = { CreatedOnToolsVersion = 6.3.2; + DevelopmentTeam = LCC2J94N44; }; }; }; @@ -310,19 +310,28 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_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; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -342,6 +351,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -354,13 +364,21 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -379,6 +397,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -388,8 +408,10 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = Designable/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -398,8 +420,10 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = Designable/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -408,14 +432,17 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); INFOPLIST_FILE = DesignableSwift/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -423,9 +450,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = DesignableSwift/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/Designable/Designable/Base.lproj/Main.storyboard b/Designable/Designable/Base.lproj/Main.storyboard index 80d939c..5fdf825 100644 --- a/Designable/Designable/Base.lproj/Main.storyboard +++ b/Designable/Designable/Base.lproj/Main.storyboard @@ -1,8 +1,13 @@ - - + + + + + - + + + @@ -14,30 +19,30 @@ - + - - + + - + - + diff --git a/Designable/Designable/Info.plist b/Designable/Designable/Info.plist index 8d07b46..084f30f 100644 --- a/Designable/Designable/Info.plist +++ b/Designable/Designable/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.2 CFBundleSignature ???? CFBundleVersion diff --git a/Designable/Designable/LevelView.h b/Designable/Designable/LevelView.h index 0f81b49..c547079 100644 --- a/Designable/Designable/LevelView.h +++ b/Designable/Designable/LevelView.h @@ -3,7 +3,7 @@ // Designable // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2015 Keith Harrison. All rights reserved. +// Copyright (c) 2015-2017 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: diff --git a/Designable/Designable/LevelView.m b/Designable/Designable/LevelView.m index a00237c..ee9f04d 100644 --- a/Designable/Designable/LevelView.m +++ b/Designable/Designable/LevelView.m @@ -3,7 +3,7 @@ // Designable // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2015 Keith Harrison. All rights reserved. +// Copyright (c) 2015-2017 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: diff --git a/Designable/DesignableSwift/Base.lproj/Main.storyboard b/Designable/DesignableSwift/Base.lproj/Main.storyboard index 1faad91..51b33f8 100644 --- a/Designable/DesignableSwift/Base.lproj/Main.storyboard +++ b/Designable/DesignableSwift/Base.lproj/Main.storyboard @@ -1,8 +1,13 @@ - - + + + + + - + + + @@ -14,30 +19,30 @@ - + - - + + - + - + diff --git a/Designable/DesignableSwift/Info.plist b/Designable/DesignableSwift/Info.plist index 8d07b46..084f30f 100644 --- a/Designable/DesignableSwift/Info.plist +++ b/Designable/DesignableSwift/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.2 CFBundleSignature ???? CFBundleVersion diff --git a/Designable/DesignableSwift/LevelView.swift b/Designable/DesignableSwift/LevelView.swift index 0b58733..8306ece 100644 --- a/Designable/DesignableSwift/LevelView.swift +++ b/Designable/DesignableSwift/LevelView.swift @@ -3,7 +3,7 @@ // Designable // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2015 Keith Harrison. All rights reserved. +// Copyright (c) 2015-2017 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -74,7 +74,7 @@ class LevelView: UIView { /** The color of the bar border. Default is black. */ - @IBInspectable var borderColor = UIColor.blackColor() { + @IBInspectable var borderColor: UIColor = .black { didSet { updateLayoutProperties() } @@ -83,7 +83,7 @@ class LevelView: UIView { /** The color of the bar when value >= threshold. Default is green. */ - @IBInspectable var fullColor = UIColor.greenColor() { + @IBInspectable var fullColor: UIColor = .green { didSet { updateLayoutProperties() } @@ -92,7 +92,7 @@ class LevelView: UIView { /** The color of the bar when value < threshold. Default is red. */ - @IBInspectable var emtpyColor = UIColor.redColor() { + @IBInspectable var emtpyColor: UIColor = .red { didSet { updateLayoutProperties() } @@ -109,8 +109,8 @@ class LevelView: UIView { super.init(frame: frame) setup() } - - required init(coder aDecoder: NSCoder) { + + required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setup() } @@ -121,12 +121,12 @@ class LevelView: UIView { } func updateLayoutProperties() { - let barRect = CGRectMake(bounds.origin.x, bounds.origin.y, bounds.size.width * value, bounds.size.height) + let barRect = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: bounds.size.width * value, height: bounds.size.height) let path = UIBezierPath(rect: barRect) - barLayer.path = path.CGPath - barLayer.fillColor = value >= threshold ? fullColor.CGColor : emtpyColor.CGColor + barLayer.path = path.cgPath + barLayer.fillColor = value >= threshold ? fullColor.cgColor : emtpyColor.cgColor layer.borderWidth = borderWidth - layer.borderColor = borderColor.CGColor + layer.borderColor = borderColor.cgColor layer.cornerRadius = 5.0 layer.masksToBounds = true } diff --git a/Designable/README b/Designable/README deleted file mode 100644 index 5a17a58..0000000 --- a/Designable/README +++ /dev/null @@ -1,11 +0,0 @@ -======================================================================= -Designable - live custom views in Interface Builder - -Version 1.1 10 June 2015 Added Swift version -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/08/ib-designable-custom-views-in-interface-builder.html diff --git a/Designable/README.md b/Designable/README.md new file mode 100644 index 0000000..a080e09 --- /dev/null +++ b/Designable/README.md @@ -0,0 +1,14 @@ +# Designable - live custom views in Interface Builder + +Example of how to use IB_DESIGNABLE and IBInspectable to preview custom views in Interface Builder. + +## Further Information + +See the following blog post: + ++ [IB_DESIGNABLE Custom Views In Interface Builder](https://useyourloaf.com/blog/ib-designable-custom-views-in-interface-builder/) + +## Version History + ++ Version 1.1 10 June 2015 Added Swift version ++ Version 1.0 07 June 2015 Initial version. From 207dfaf27aebdf7656ad737cbf672a6f50606585 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 13:37:38 +0100 Subject: [PATCH 041/142] Updated for Swift 4 @objc inference --- Designable/Designable.xcodeproj/project.pbxproj | 7 +++++-- Designable/DesignableSwift/Base.lproj/Main.storyboard | 2 +- Designable/README.md | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Designable/Designable.xcodeproj/project.pbxproj b/Designable/Designable.xcodeproj/project.pbxproj index 9d8f6e5..7250625 100644 --- a/Designable/Designable.xcodeproj/project.pbxproj +++ b/Designable/Designable.xcodeproj/project.pbxproj @@ -197,6 +197,7 @@ 53C515E71B2786ED0062905B = { CreatedOnToolsVersion = 6.3.2; DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 0900; }; }; }; @@ -442,7 +443,8 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -455,7 +457,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/Designable/DesignableSwift/Base.lproj/Main.storyboard b/Designable/DesignableSwift/Base.lproj/Main.storyboard index 51b33f8..831fac8 100644 --- a/Designable/DesignableSwift/Base.lproj/Main.storyboard +++ b/Designable/DesignableSwift/Base.lproj/Main.storyboard @@ -38,7 +38,7 @@ - + diff --git a/Designable/README.md b/Designable/README.md index a080e09..5baabe5 100644 --- a/Designable/README.md +++ b/Designable/README.md @@ -10,5 +10,6 @@ See the following blog post: ## Version History ++ Version 1.2 26 Oct 2017 Updated for Xcode 9 and Swift 4 + Version 1.1 10 June 2015 Added Swift version + Version 1.0 07 June 2015 Initial version. From 00566a52be113f3e2a44e31ae90b925123d6b22f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 14:26:09 +0100 Subject: [PATCH 042/142] Updated to Xcode 9 recommended settings --- .../DynamicText.xcodeproj/project.pbxproj | 27 ++++++++++++++++++- .../DynamicText/DynamicText-Info.plist | 2 +- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 754fba6..35a555a 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -145,7 +145,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; @@ -231,18 +231,30 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -269,18 +281,29 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; 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; @@ -301,6 +324,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; @@ -315,6 +339,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; diff --git a/DynamicText/DynamicText/DynamicText-Info.plist b/DynamicText/DynamicText/DynamicText-Info.plist index aa928e4..fce2f33 100644 --- a/DynamicText/DynamicText/DynamicText-Info.plist +++ b/DynamicText/DynamicText/DynamicText-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 3f5fba410d96663f9ea7de696c823fd00b6e57bb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 14:29:20 +0100 Subject: [PATCH 043/142] Update to Xcode 9 recommended settings --- GridView/GridView.xcodeproj/project.pbxproj | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index a28eca8..6e4a05a 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -143,7 +143,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 531CCB861EAA45D2008349F4 = { @@ -241,7 +241,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = LCC2J94N44; @@ -292,7 +292,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -300,7 +302,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -343,7 +349,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -351,7 +359,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; From 6ac0d5381795dc47697b40110faf7098846d084e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 14:49:56 +0100 Subject: [PATCH 044/142] Update to Swift 4 and Safe Area Layout Guides --- GridView/GridView.xcodeproj/project.pbxproj | 14 +++++++++---- .../Base.lproj/LaunchScreen.storyboard | 16 ++++++++------- GridView/GridView/Base.lproj/Main.storyboard | 20 +++++++++---------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index 6e4a05a..c194dfa 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -149,11 +149,13 @@ 531CCB861EAA45D2008349F4 = { CreatedOnToolsVersion = 8.3.2; DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; 5366BC611EA8DF80006A06E5 = { CreatedOnToolsVersion = 8.3.2; DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; }; @@ -254,7 +256,8 @@ PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridViewUI; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -276,7 +279,8 @@ PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridViewUI; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -399,7 +403,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -413,7 +418,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/GridView/GridView/Base.lproj/LaunchScreen.storyboard b/GridView/GridView/Base.lproj/LaunchScreen.storyboard index fdf3f97..0295d5f 100644 --- a/GridView/GridView/Base.lproj/LaunchScreen.storyboard +++ b/GridView/GridView/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -9,14 +14,11 @@ - - - - + diff --git a/GridView/GridView/Base.lproj/Main.storyboard b/GridView/GridView/Base.lproj/Main.storyboard index a2f2c4c..15a50e8 100644 --- a/GridView/GridView/Base.lproj/Main.storyboard +++ b/GridView/GridView/Base.lproj/Main.storyboard @@ -1,11 +1,12 @@ - + - + + @@ -15,7 +16,7 @@ - + @@ -31,10 +32,6 @@ - - - - @@ -60,11 +57,12 @@ - - - - + + + + + From 6e7b0953f040a1ff1f01125710fc78e9b913e61b Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 14:51:40 +0100 Subject: [PATCH 045/142] Update to Xcode 9 recommended settings --- KeyCommand/KeyCommand.xcodeproj/project.pbxproj | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/KeyCommand/KeyCommand.xcodeproj/project.pbxproj b/KeyCommand/KeyCommand.xcodeproj/project.pbxproj index dddde0f..0300efe 100644 --- a/KeyCommand/KeyCommand.xcodeproj/project.pbxproj +++ b/KeyCommand/KeyCommand.xcodeproj/project.pbxproj @@ -186,7 +186,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0810; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 5320051C1DD516C300EEFEE6 = { @@ -343,7 +343,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -351,7 +353,12 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -393,7 +400,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -401,7 +410,12 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; From b70fedf534d6b3135f9d53a976e51d6d34936098 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 15:03:08 +0100 Subject: [PATCH 046/142] Update for Swift 4 and @objc inference --- KeyCommand/KeyCommand.xcodeproj/project.pbxproj | 7 +++++-- KeyCommand/KeyCommand/OptionViewController.swift | 4 ++-- KeyCommand/KeyCommand/SegueHandlerType.swift | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/KeyCommand/KeyCommand.xcodeproj/project.pbxproj b/KeyCommand/KeyCommand.xcodeproj/project.pbxproj index 0300efe..15faefb 100644 --- a/KeyCommand/KeyCommand.xcodeproj/project.pbxproj +++ b/KeyCommand/KeyCommand.xcodeproj/project.pbxproj @@ -197,6 +197,7 @@ 5334D0761DD3B6250032CB00 = { CreatedOnToolsVersion = 8.1; DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; }; @@ -450,7 +451,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.KeyCommand; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -463,7 +465,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.KeyCommand; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/KeyCommand/KeyCommand/OptionViewController.swift b/KeyCommand/KeyCommand/OptionViewController.swift index 9f1e136..2dffee1 100644 --- a/KeyCommand/KeyCommand/OptionViewController.swift +++ b/KeyCommand/KeyCommand/OptionViewController.swift @@ -63,8 +63,8 @@ class OptionViewController: UIViewController { ] } - func performCommand(sender: UIKeyCommand) { - guard let key = InputKey(rawValue: sender.input) else { + @objc func performCommand(sender: UIKeyCommand) { + guard let key = InputKey(rawValue: sender.input!) else { return } switch key { diff --git a/KeyCommand/KeyCommand/SegueHandlerType.swift b/KeyCommand/KeyCommand/SegueHandlerType.swift index 3aada71..10cf53d 100644 --- a/KeyCommand/KeyCommand/SegueHandlerType.swift +++ b/KeyCommand/KeyCommand/SegueHandlerType.swift @@ -45,7 +45,7 @@ extension SegueHandlerType where Self: UIViewController, SegueIdentifier.RawValu func segueIdentifierForSegue(segue: UIStoryboardSegue) -> SegueIdentifier { guard let identifier = segue.identifier, let segueIdentifier = SegueIdentifier(rawValue: identifier) else { - fatalError("Unknown Segue Identifier \(segue.identifier)") + fatalError("Unknown Segue Identifier \(segue.identifier ?? "Missing")") } return segueIdentifier } From 417286c91a451510e0462c35c94607b99e5c6ed3 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 26 Oct 2017 15:14:15 +0100 Subject: [PATCH 047/142] Update for safe area layout guide --- .../KeyCommand/Base.lproj/Main.storyboard | 39 +++++++------------ KeyCommand/KeyCommand/Info.plist | 2 +- .../KeyCommandObjC/Base.lproj/Main.storyboard | 31 +++++++-------- KeyCommand/KeyCommandObjC/Info.plist | 2 +- KeyCommand/README.md | 5 ++- 5 files changed, 32 insertions(+), 47 deletions(-) diff --git a/KeyCommand/KeyCommand/Base.lproj/Main.storyboard b/KeyCommand/KeyCommand/Base.lproj/Main.storyboard index ea39f05..8ba27b8 100644 --- a/KeyCommand/KeyCommand/Base.lproj/Main.storyboard +++ b/KeyCommand/KeyCommand/Base.lproj/Main.storyboard @@ -1,11 +1,12 @@ - + - + + @@ -13,19 +14,15 @@ - - - - - + - - - - - - - + + @@ -73,10 +65,6 @@ - - - - @@ -92,9 +80,10 @@ - + + @@ -108,7 +97,7 @@ - + @@ -126,7 +115,7 @@ - + @@ -140,6 +129,6 @@ - + diff --git a/KeyCommand/KeyCommand/Info.plist b/KeyCommand/KeyCommand/Info.plist index f4b34c9..cf92535 100644 --- a/KeyCommand/KeyCommand/Info.plist +++ b/KeyCommand/KeyCommand/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.1 CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/KeyCommand/KeyCommandObjC/Base.lproj/Main.storyboard b/KeyCommand/KeyCommandObjC/Base.lproj/Main.storyboard index bdbb4d3..d5758bb 100644 --- a/KeyCommand/KeyCommandObjC/Base.lproj/Main.storyboard +++ b/KeyCommand/KeyCommandObjC/Base.lproj/Main.storyboard @@ -1,11 +1,12 @@ - + - + + @@ -13,19 +14,15 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BlastOff/BlastOff/Info.plist b/BlastOff/BlastOff/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/BlastOff/BlastOff/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/BlastOff/BlastOff/LaunchController.swift b/BlastOff/BlastOff/LaunchController.swift new file mode 100644 index 0000000..51718d4 --- /dev/null +++ b/BlastOff/BlastOff/LaunchController.swift @@ -0,0 +1,48 @@ +// Copyright © 2018 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class LaunchController: UIViewController { + + @IBOutlet private var abortButton: UIButton! + @IBOutlet private var startButton: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + } + + private func setupView() { + let startTitle = NSLocalizedString("Start", comment: "Start button") + startButton.setTitle(startTitle, for: .normal) + + let abortTitle = NSLocalizedString("Abort", comment: "Abort button") + abortButton.setTitle(abortTitle, for: .normal) + } +} diff --git a/BlastOff/BlastOff/Localizable.stringsdict b/BlastOff/BlastOff/Localizable.stringsdict new file mode 100755 index 0000000..f2f6b22 --- /dev/null +++ b/BlastOff/BlastOff/Localizable.stringsdict @@ -0,0 +1,30 @@ + + + + + Abort + + NSStringVariableWidthRuleType + + 20 + Abort + 25 + Abort Launch + 50 + Abort Launch Sequence + + + Start + + NSStringVariableWidthRuleType + + 20 + Start + 25 + Start Countdown + 50 + Start Launch Countdown + + + + diff --git a/BlastOff/README.md b/BlastOff/README.md new file mode 100644 index 0000000..8526a74 --- /dev/null +++ b/BlastOff/README.md @@ -0,0 +1,7 @@ +# Variable Width Strings + +An example of using a **localization strings dictionary** to create variable width strings. A `UILabel` or `UIButton` will automatically show the best string from the dictionary for the available screen width. + +For further details see the following blog post: + ++ [Variable Width Strings](https://useyourloaf.com/blog/variable-width-strings/) From dce80d2d03e87dc37c4d7efedc7ac236eb46dda6 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 19 Nov 2018 10:39:25 +0000 Subject: [PATCH 072/142] Update project format to Xcode 10 --- GridView/GridView.xcodeproj/project.pbxproj | 33 +++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index 0b421cd..b83306f 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ @@ -161,7 +161,7 @@ }; }; buildConfigurationList = 5366BC5D1EA8DF80006A06E5 /* Build configuration list for PBXProject "GridView" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 10.0"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( @@ -252,7 +252,11 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = GridViewUI/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridViewUI; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -275,7 +279,11 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = GridViewUI/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridViewUI; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -335,7 +343,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -388,10 +396,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -404,7 +413,10 @@ DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; @@ -419,7 +431,10 @@ DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; From d3430b4b783aa8e93b6c6ef30866a7dbb1d058e7 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 20 Feb 2019 17:39:51 +0000 Subject: [PATCH 073/142] Update container example for Xcode 10.2 and Swift 5 --- .../Container.xcodeproj/project.pbxproj | 22 ++++++------- .../Container/Base.lproj/Main.storyboard | 26 +++++++-------- .../Container-SB/Container/LocationCell.swift | 20 +++--------- .../Container/LocationDataSource.swift | 6 ++-- .../LocationTableViewController.swift | 6 ++-- .../Container/MapViewController.swift | 6 ++-- .../Container/MasterViewController.swift | 31 +++++++++++------- .../Container.xcodeproj/project.pbxproj | 32 ++++++++++++++++--- .../Container/Base.lproj/Main.storyboard | 26 +++++++-------- .../Container/LocationCell.swift | 16 ++-------- .../Container/LocationDataSource.swift | 6 ++-- .../LocationTableViewController.swift | 6 ++-- .../Container/MapViewController.swift | 6 ++-- .../Container/MasterViewController.swift | 29 +++++++++++------ 14 files changed, 130 insertions(+), 108 deletions(-) diff --git a/Container/Container-SB/Container.xcodeproj/project.pbxproj b/Container/Container-SB/Container.xcodeproj/project.pbxproj index 9d75c94..cd123e0 100644 --- a/Container/Container-SB/Container.xcodeproj/project.pbxproj +++ b/Container/Container-SB/Container.xcodeproj/project.pbxproj @@ -225,20 +225,20 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 534452EE1E61B9E600649AF9 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = LCC2J94N44; - LastSwiftMigration = 0900; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; TestTargetID = 5367B2471E608B79001744C8; }; 5367B2471E608B79001744C8 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = LCC2J94N44; - LastSwiftMigration = 0900; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; }; @@ -347,8 +347,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ContainerTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Container.app/Container"; }; name = Debug; @@ -362,8 +361,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ContainerTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Container.app/Container"; }; name = Release; @@ -381,6 +379,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -388,6 +387,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -437,6 +437,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -444,6 +445,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -482,8 +484,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Container; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -496,8 +497,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Container; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Container/Container-SB/Container/Base.lproj/Main.storyboard b/Container/Container-SB/Container/Base.lproj/Main.storyboard index d6ac4c2..caa390a 100644 --- a/Container/Container-SB/Container/Base.lproj/Main.storyboard +++ b/Container/Container-SB/Container/Base.lproj/Main.storyboard @@ -1,13 +1,13 @@ - + - - + + @@ -19,7 +19,7 @@ - + @@ -39,10 +39,10 @@ - + - + @@ -77,7 +77,7 @@ - + @@ -94,17 +94,17 @@ - - + + - diff --git a/DynamicContainer/DynamicContainer/Book.swift b/DynamicContainer/DynamicContainer-v2/DynamicContainer/Book.swift similarity index 100% rename from DynamicContainer/DynamicContainer/Book.swift rename to DynamicContainer/DynamicContainer-v2/DynamicContainer/Book.swift diff --git a/DynamicContainer/DynamicContainer/BookListTableViewController.swift b/DynamicContainer/DynamicContainer-v2/DynamicContainer/BookListTableViewController.swift similarity index 100% rename from DynamicContainer/DynamicContainer/BookListTableViewController.swift rename to DynamicContainer/DynamicContainer-v2/DynamicContainer/BookListTableViewController.swift diff --git a/DynamicContainer/DynamicContainer/Info.plist b/DynamicContainer/DynamicContainer-v2/DynamicContainer/Info.plist similarity index 100% rename from DynamicContainer/DynamicContainer/Info.plist rename to DynamicContainer/DynamicContainer-v2/DynamicContainer/Info.plist diff --git a/DynamicContainer/DynamicContainer v2/DynamicContainer/LibraryContainerViewController.swift b/DynamicContainer/DynamicContainer-v2/DynamicContainer/LibraryContainerViewController.swift similarity index 100% rename from DynamicContainer/DynamicContainer v2/DynamicContainer/LibraryContainerViewController.swift rename to DynamicContainer/DynamicContainer-v2/DynamicContainer/LibraryContainerViewController.swift diff --git a/DynamicContainer/DynamicContainer v2/DynamicContainer/MessageViewController.swift b/DynamicContainer/DynamicContainer-v2/DynamicContainer/MessageViewController.swift similarity index 100% rename from DynamicContainer/DynamicContainer v2/DynamicContainer/MessageViewController.swift rename to DynamicContainer/DynamicContainer-v2/DynamicContainer/MessageViewController.swift diff --git a/DynamicContainer/DynamicContainer/SegueHandler.swift b/DynamicContainer/DynamicContainer-v2/DynamicContainer/SegueHandler.swift similarity index 100% rename from DynamicContainer/DynamicContainer/SegueHandler.swift rename to DynamicContainer/DynamicContainer-v2/DynamicContainer/SegueHandler.swift From 9841f407151ad820336c0b5447a54178622627c6 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 1 Apr 2019 16:21:32 +0100 Subject: [PATCH 080/142] Migrate to Xcode.2 --- Restorer/Restorer.xcodeproj/project.pbxproj | 59 ++++++- .../MainStoryboard.storyboard | 113 ++++++------- Restorer/Restorer/Restorer-Info.plist | 6 +- Restorer/Restorer/UYLWebViewController.xib | 159 +++--------------- 4 files changed, 124 insertions(+), 213 deletions(-) rename Restorer/Restorer/{en.lproj => Base.lproj}/MainStoryboard.storyboard (74%) diff --git a/Restorer/Restorer.xcodeproj/project.pbxproj b/Restorer/Restorer.xcodeproj/project.pbxproj index 12d4818..55e9ed3 100644 --- a/Restorer/Restorer.xcodeproj/project.pbxproj +++ b/Restorer/Restorer.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 531447D1174EBE2400E1AE4F /* UYLWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLWebViewController.h; sourceTree = ""; }; 531447D2174EBE2400E1AE4F /* UYLWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLWebViewController.m; sourceTree = ""; }; 531447D4174EBE4B00E1AE4F /* UYLWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UYLWebViewController.xib; sourceTree = ""; }; + 5320FB202252630D00AADA00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 535CDCD1174C2E440021AE7F /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; 53844B3F16F7B2E0007B7561 /* countries.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = countries.plist; sourceTree = ""; }; 53844B4116F7B7F0007B7561 /* UYLCountryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryViewController.h; sourceTree = ""; }; @@ -57,7 +58,6 @@ 53EA99C116F7AE6F0005DF78 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 53EA99C316F7AE6F0005DF78 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 53EA99C516F7AE6F0005DF78 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 53EA99C816F7AE6F0005DF78 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 53EA99DF16F7B06A0005DF78 /* UYLTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTableViewController.h; sourceTree = ""; }; 53EA99E016F7B06A0005DF78 /* UYLTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTableViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -186,15 +186,21 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53EA99AB16F7AE6F0005DF78 = { + DevelopmentTeam = LCC2J94N44; + }; + }; }; buildConfigurationList = 53EA99A716F7AE6F0005DF78 /* Build configuration list for PBXProject "Restorer" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 53EA99A316F7AE6F0005DF78; productRefGroup = 53EA99AD16F7AE6F0005DF78 /* Products */; @@ -256,7 +262,7 @@ 53EA99C716F7AE6F0005DF78 /* MainStoryboard.storyboard */ = { isa = PBXVariantGroup; children = ( - 53EA99C816F7AE6F0005DF78 /* en */, + 5320FB202252630D00AADA00 /* Base */, ); name = MainStoryboard.storyboard; sourceTree = ""; @@ -268,28 +274,47 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -299,21 +324,39 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -323,9 +366,11 @@ 53EA99DB16F7AE6F0005DF78 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Restorer/Restorer-Prefix.pch"; INFOPLIST_FILE = "Restorer/Restorer-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -334,9 +379,11 @@ 53EA99DC16F7AE6F0005DF78 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Restorer/Restorer-Prefix.pch"; INFOPLIST_FILE = "Restorer/Restorer-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Restorer/Restorer/en.lproj/MainStoryboard.storyboard b/Restorer/Restorer/Base.lproj/MainStoryboard.storyboard similarity index 74% rename from Restorer/Restorer/en.lproj/MainStoryboard.storyboard rename to Restorer/Restorer/Base.lproj/MainStoryboard.storyboard index 3af4f0e..15bc2e5 100644 --- a/Restorer/Restorer/en.lproj/MainStoryboard.storyboard +++ b/Restorer/Restorer/Base.lproj/MainStoryboard.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -12,7 +17,7 @@ - + @@ -21,34 +26,33 @@ - + - + - - + + - + - + - - + + - - + @@ -63,25 +67,25 @@ - + - + - + - + @@ -92,18 +96,17 @@ - - + - + - + @@ -112,25 +115,25 @@ - + - + - + - + @@ -139,17 +142,17 @@ - + - + - - - + + + @@ -159,17 +162,17 @@ - + - + - - - + + + @@ -179,33 +182,11 @@ - + - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/Restorer/Restorer/Restorer-Info.plist b/Restorer/Restorer/Restorer-Info.plist index df7f6f2..02f9bcb 100644 --- a/Restorer/Restorer/Restorer-Info.plist +++ b/Restorer/Restorer/Restorer-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2 + 1.3 CFBundleSignature ???? CFBundleVersion - 2 + 3 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/Restorer/Restorer/UYLWebViewController.xib b/Restorer/Restorer/UYLWebViewController.xib index 1ec95a4..1e992c9 100644 --- a/Restorer/Restorer/UYLWebViewController.xib +++ b/Restorer/Restorer/UYLWebViewController.xib @@ -1,139 +1,22 @@ - - - 1552 - 12D78 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 2083 - - - IBProxyObject - IBUIWebView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - {240, 128} - - - - _NS:9 - - 1 - MSAxIDEAA - - WebViewID - IBCocoaTouchFramework - 1 - YES - - - - - - - view - - - - 6 - - - - webView - - - - 7 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 5 - - - - - - - UYLWebViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 7 - - - - - UYLWebViewController - UIViewController - - webView - UIWebView - - - webView - - webView - UIWebView - - - - IBProjectSource - ./Classes/UYLWebViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - YES - 2083 - - + + + + + + + + + + + + + + + + + + + + + From 5c19c585153cb36a3c3307a90c6cd26b0e12bc78 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 23 Apr 2019 13:40:35 +0100 Subject: [PATCH 081/142] Update for Xcode 10.2 and iOS 12 - UIWebView is deprecated so replace with WKWebView - manually store and restore URL of web view --- Restorer/Restorer.xcodeproj/project.pbxproj | 70 +++++++------- .../Base.lproj/LaunchScreen.storyboard | 29 ++++++ .../Base.lproj/MainStoryboard.storyboard | 86 +++++++++++------- .../Base.lproj/UYLWebViewController.xib | 30 ++++++ Restorer/Restorer/Default-568h@2x.png | Bin 18594 -> 0 bytes Restorer/Restorer/Default.png | Bin 6540 -> 0 bytes Restorer/Restorer/Default@2x.png | Bin 16107 -> 0 bytes .../AppIcon.appiconset/Contents.json | 53 +++++++++++ .../Restorer/Images.xcassets/Contents.json | 6 ++ .../first.imageset/Contents.json | 22 +++++ .../first.imageset}/first.png | Bin .../first.imageset}/first@2x.png | Bin .../second.imageset/Contents.json | 22 +++++ .../second.imageset}/second.png | Bin .../second.imageset}/second@2x.png | Bin Restorer/Restorer/Restorer-Info.plist | 6 ++ Restorer/Restorer/UYLAppDelegate.m | 4 +- Restorer/Restorer/UYLCountryViewController.m | 5 - Restorer/Restorer/UYLSettingsViewController.m | 10 +- Restorer/Restorer/UYLTableViewController.m | 5 - Restorer/Restorer/UYLWebViewController.h | 2 +- Restorer/Restorer/UYLWebViewController.m | 38 ++++---- Restorer/Restorer/UYLWebViewController.xib | 22 ----- 23 files changed, 282 insertions(+), 128 deletions(-) create mode 100644 Restorer/Restorer/Base.lproj/LaunchScreen.storyboard create mode 100644 Restorer/Restorer/Base.lproj/UYLWebViewController.xib delete mode 100644 Restorer/Restorer/Default-568h@2x.png delete mode 100644 Restorer/Restorer/Default.png delete mode 100644 Restorer/Restorer/Default@2x.png create mode 100644 Restorer/Restorer/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Restorer/Restorer/Images.xcassets/Contents.json create mode 100644 Restorer/Restorer/Images.xcassets/first.imageset/Contents.json rename Restorer/Restorer/{ => Images.xcassets/first.imageset}/first.png (100%) rename Restorer/Restorer/{ => Images.xcassets/first.imageset}/first@2x.png (100%) create mode 100644 Restorer/Restorer/Images.xcassets/second.imageset/Contents.json rename Restorer/Restorer/{ => Images.xcassets/second.imageset}/second.png (100%) rename Restorer/Restorer/{ => Images.xcassets/second.imageset}/second@2x.png (100%) delete mode 100644 Restorer/Restorer/UYLWebViewController.xib diff --git a/Restorer/Restorer.xcodeproj/project.pbxproj b/Restorer/Restorer.xcodeproj/project.pbxproj index 55e9ed3..ff2b595 100644 --- a/Restorer/Restorer.xcodeproj/project.pbxproj +++ b/Restorer/Restorer.xcodeproj/project.pbxproj @@ -3,29 +3,24 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ 531447D3174EBE2400E1AE4F /* UYLWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 531447D2174EBE2400E1AE4F /* UYLWebViewController.m */; }; - 531447D5174EBE4B00E1AE4F /* UYLWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 531447D4174EBE4B00E1AE4F /* UYLWebViewController.xib */; }; + 5320FB22225264E200AADA00 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5320FB21225264E200AADA00 /* Images.xcassets */; }; + 5320FB252252655800AADA00 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5320FB232252655800AADA00 /* LaunchScreen.storyboard */; }; 535CDCD2174C2E440021AE7F /* README in Resources */ = {isa = PBXBuildFile; fileRef = 535CDCD1174C2E440021AE7F /* README */; }; + 535EBE002252692700EEF01D /* UYLWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 535EBE022252692700EEF01D /* UYLWebViewController.xib */; }; 53844B4016F7B2E0007B7561 /* countries.plist in Resources */ = {isa = PBXBuildFile; fileRef = 53844B3F16F7B2E0007B7561 /* countries.plist */; }; 53844B4316F7B7F0007B7561 /* UYLCountryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53844B4216F7B7F0007B7561 /* UYLCountryViewController.m */; }; 53844B4616F7BE98007B7561 /* UYLSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53844B4516F7BE98007B7561 /* UYLSettingsViewController.m */; }; - 53844B9C16F7CFC4007B7561 /* first.png in Resources */ = {isa = PBXBuildFile; fileRef = 53844B9816F7CFC3007B7561 /* first.png */; }; - 53844B9D16F7CFC4007B7561 /* first@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53844B9916F7CFC3007B7561 /* first@2x.png */; }; - 53844B9E16F7CFC4007B7561 /* second.png in Resources */ = {isa = PBXBuildFile; fileRef = 53844B9A16F7CFC3007B7561 /* second.png */; }; - 53844B9F16F7CFC4007B7561 /* second@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53844B9B16F7CFC3007B7561 /* second@2x.png */; }; 53EA99B016F7AE6F0005DF78 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EA99AF16F7AE6F0005DF78 /* UIKit.framework */; }; 53EA99B216F7AE6F0005DF78 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EA99B116F7AE6F0005DF78 /* Foundation.framework */; }; 53EA99B416F7AE6F0005DF78 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EA99B316F7AE6F0005DF78 /* CoreGraphics.framework */; }; 53EA99BA16F7AE6F0005DF78 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53EA99B816F7AE6F0005DF78 /* InfoPlist.strings */; }; 53EA99BC16F7AE6F0005DF78 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EA99BB16F7AE6F0005DF78 /* main.m */; }; 53EA99C016F7AE6F0005DF78 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EA99BF16F7AE6F0005DF78 /* UYLAppDelegate.m */; }; - 53EA99C216F7AE6F0005DF78 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 53EA99C116F7AE6F0005DF78 /* Default.png */; }; - 53EA99C416F7AE6F0005DF78 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53EA99C316F7AE6F0005DF78 /* Default@2x.png */; }; - 53EA99C616F7AE6F0005DF78 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53EA99C516F7AE6F0005DF78 /* Default-568h@2x.png */; }; 53EA99C916F7AE6F0005DF78 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53EA99C716F7AE6F0005DF78 /* MainStoryboard.storyboard */; }; 53EA99E116F7B06A0005DF78 /* UYLTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EA99E016F7B06A0005DF78 /* UYLTableViewController.m */; }; /* End PBXBuildFile section */ @@ -33,18 +28,16 @@ /* Begin PBXFileReference section */ 531447D1174EBE2400E1AE4F /* UYLWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLWebViewController.h; sourceTree = ""; }; 531447D2174EBE2400E1AE4F /* UYLWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLWebViewController.m; sourceTree = ""; }; - 531447D4174EBE4B00E1AE4F /* UYLWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UYLWebViewController.xib; sourceTree = ""; }; 5320FB202252630D00AADA00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; + 5320FB21225264E200AADA00 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5320FB242252655800AADA00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 535CDCD1174C2E440021AE7F /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 535EBE012252692700EEF01D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLWebViewController.xib; sourceTree = ""; }; 53844B3F16F7B2E0007B7561 /* countries.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = countries.plist; sourceTree = ""; }; 53844B4116F7B7F0007B7561 /* UYLCountryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryViewController.h; sourceTree = ""; }; 53844B4216F7B7F0007B7561 /* UYLCountryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCountryViewController.m; sourceTree = ""; }; 53844B4416F7BE98007B7561 /* UYLSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLSettingsViewController.h; sourceTree = ""; }; 53844B4516F7BE98007B7561 /* UYLSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLSettingsViewController.m; sourceTree = ""; }; - 53844B9816F7CFC3007B7561 /* first.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = first.png; sourceTree = ""; }; - 53844B9916F7CFC3007B7561 /* first@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "first@2x.png"; sourceTree = ""; }; - 53844B9A16F7CFC3007B7561 /* second.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = second.png; sourceTree = ""; }; - 53844B9B16F7CFC3007B7561 /* second@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "second@2x.png"; sourceTree = ""; }; 53EA99AC16F7AE6F0005DF78 /* Restorer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Restorer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53EA99AF16F7AE6F0005DF78 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 53EA99B116F7AE6F0005DF78 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -55,9 +48,6 @@ 53EA99BD16F7AE6F0005DF78 /* Restorer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Restorer-Prefix.pch"; sourceTree = ""; }; 53EA99BE16F7AE6F0005DF78 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 53EA99BF16F7AE6F0005DF78 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; - 53EA99C116F7AE6F0005DF78 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 53EA99C316F7AE6F0005DF78 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; - 53EA99C516F7AE6F0005DF78 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 53EA99DF16F7B06A0005DF78 /* UYLTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTableViewController.h; sourceTree = ""; }; 53EA99E016F7B06A0005DF78 /* UYLTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTableViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -111,6 +101,7 @@ 53EA99DD16F7B0290005DF78 /* Resources */, 53EA99BE16F7AE6F0005DF78 /* UYLAppDelegate.h */, 53EA99BF16F7AE6F0005DF78 /* UYLAppDelegate.m */, + 5320FB21225264E200AADA00 /* Images.xcassets */, 53EA99B616F7AE6F0005DF78 /* Supporting Files */, ); path = Restorer; @@ -123,9 +114,6 @@ 53EA99B816F7AE6F0005DF78 /* InfoPlist.strings */, 53EA99BB16F7AE6F0005DF78 /* main.m */, 53EA99BD16F7AE6F0005DF78 /* Restorer-Prefix.pch */, - 53EA99C116F7AE6F0005DF78 /* Default.png */, - 53EA99C316F7AE6F0005DF78 /* Default@2x.png */, - 53EA99C516F7AE6F0005DF78 /* Default-568h@2x.png */, ); name = "Supporting Files"; sourceTree = ""; @@ -133,13 +121,10 @@ 53EA99DD16F7B0290005DF78 /* Resources */ = { isa = PBXGroup; children = ( - 531447D4174EBE4B00E1AE4F /* UYLWebViewController.xib */, - 53844B9816F7CFC3007B7561 /* first.png */, - 53844B9916F7CFC3007B7561 /* first@2x.png */, - 53844B9A16F7CFC3007B7561 /* second.png */, - 53844B9B16F7CFC3007B7561 /* second@2x.png */, + 535EBE022252692700EEF01D /* UYLWebViewController.xib */, 53844B3F16F7B2E0007B7561 /* countries.plist */, 53EA99C716F7AE6F0005DF78 /* MainStoryboard.storyboard */, + 5320FB232252655800AADA00 /* LaunchScreen.storyboard */, ); name = Resources; sourceTree = ""; @@ -195,7 +180,7 @@ }; }; buildConfigurationList = 53EA99A716F7AE6F0005DF78 /* Build configuration list for PBXProject "Restorer" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 10.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -218,17 +203,12 @@ buildActionMask = 2147483647; files = ( 53EA99BA16F7AE6F0005DF78 /* InfoPlist.strings in Resources */, - 53EA99C216F7AE6F0005DF78 /* Default.png in Resources */, - 53EA99C416F7AE6F0005DF78 /* Default@2x.png in Resources */, - 53EA99C616F7AE6F0005DF78 /* Default-568h@2x.png in Resources */, + 5320FB22225264E200AADA00 /* Images.xcassets in Resources */, 53EA99C916F7AE6F0005DF78 /* MainStoryboard.storyboard in Resources */, 53844B4016F7B2E0007B7561 /* countries.plist in Resources */, - 53844B9C16F7CFC4007B7561 /* first.png in Resources */, - 53844B9D16F7CFC4007B7561 /* first@2x.png in Resources */, - 53844B9E16F7CFC4007B7561 /* second.png in Resources */, - 53844B9F16F7CFC4007B7561 /* second@2x.png in Resources */, 535CDCD2174C2E440021AE7F /* README in Resources */, - 531447D5174EBE4B00E1AE4F /* UYLWebViewController.xib in Resources */, + 5320FB252252655800AADA00 /* LaunchScreen.storyboard in Resources */, + 535EBE002252692700EEF01D /* UYLWebViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -251,6 +231,22 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ + 5320FB232252655800AADA00 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5320FB242252655800AADA00 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 535EBE022252692700EEF01D /* UYLWebViewController.xib */ = { + isa = PBXVariantGroup; + children = ( + 535EBE012252692700EEF01D /* Base */, + ); + name = UYLWebViewController.xib; + sourceTree = ""; + }; 53EA99B816F7AE6F0005DF78 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -314,7 +310,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -356,7 +352,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -366,6 +362,7 @@ 53EA99DB16F7AE6F0005DF78 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Restorer/Restorer-Prefix.pch"; @@ -379,6 +376,7 @@ 53EA99DC16F7AE6F0005DF78 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Restorer/Restorer-Prefix.pch"; diff --git a/Restorer/Restorer/Base.lproj/LaunchScreen.storyboard b/Restorer/Restorer/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..a6e1b7e --- /dev/null +++ b/Restorer/Restorer/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Restorer/Restorer/Base.lproj/MainStoryboard.storyboard b/Restorer/Restorer/Base.lproj/MainStoryboard.storyboard index 15bc2e5..139c642 100644 --- a/Restorer/Restorer/Base.lproj/MainStoryboard.storyboard +++ b/Restorer/Restorer/Base.lproj/MainStoryboard.storyboard @@ -1,11 +1,13 @@ - + + + @@ -26,13 +28,13 @@ - + - + @@ -44,17 +46,17 @@ - - + @@ -67,7 +69,7 @@ - + @@ -77,25 +79,28 @@ - - - - - - - - - + + + + + + + + + @@ -115,7 +129,7 @@ - + @@ -125,15 +139,21 @@ - + + + + + + + @@ -142,7 +162,7 @@ - + @@ -162,7 +182,7 @@ - + @@ -182,7 +202,7 @@ - + diff --git a/Restorer/Restorer/Base.lproj/UYLWebViewController.xib b/Restorer/Restorer/Base.lproj/UYLWebViewController.xib new file mode 100644 index 0000000..d33cff2 --- /dev/null +++ b/Restorer/Restorer/Base.lproj/UYLWebViewController.xib @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Restorer/Restorer/Default-568h@2x.png b/Restorer/Restorer/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/Restorer/Restorer/Default.png b/Restorer/Restorer/Default.png deleted file mode 100644 index 4c8ca6f693f96d511e9113c0eb59eec552354e42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6540 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2OMlbkt;o0To@QwR5G2N13aCb6#|O#(=u~X z85k@CTSM>X-wqM6>&y>YB4)1;;ojbLbbV-W^iFB1wa3^zCog^LCAReC4K0-?R_2{6 zrP*)4+_uWUy3w5N52M3PW_}MFMP9a~>YLvVZ1D_k*IMQ2QT^fwzoOb(*3gH$%aYWC zkHmcab=va2<#X%jakpJ;<1@F;k__#bwtC&%^D0v(FBh9K&$sK+<}2RJS609D)17$w ztdQP8(eLM8Ka}m_IQ@3wyMKP)l=oM4-?`YS_*P?4V_ORLPxsj&7Ju#kH;>6^Kp?T7~ zl+q?{UOOqV==?+d{=)5s|M~T1mwtH@+Z^$G&eEO9JNP^AX@3jZ*J*!!>lc|1-W%fA z@AOQpXZ_Lt>rxFXrGp*zLPiW@uo_c7C{As>j zWeX)wi+LTp_)@KYZCX{j;H?|1yXT4DnlS(Fr8gyP5|uaX_gLvaW0ScZdnG7o+u{T6 zFI-%d{ls*WuCDa5UJ@|RXv&ejZe}*BMkiWY51&pnRPw(hlykSzvj6e%mYz-GdvzBD zF10?szF_~!jS=?2HyQuPCvARXAe}C}WP|yQ*>5~~=*Nxq8+HHW1~FMDRCP^TcacKuk$ z(U#REVv)D!PhJ*ecH-ELFUrfyV&*)Z)>UCOuS?yd^L@Afk>ihynYPc{^CRwu+JHX+#$@YsC4c|l0tGigsn@jy) zXD($Ouk>H+V(Mr6NQT0S9BFM~V6nkj;1OBOz`zY;a|<&v%$g$sEJPk;hD4M^`1)8S z=jZArrsOB3>Q&?x097+E*i={nnYpPYi3%0DIeEoa6}C!X6;?ntNLXJ<0j#7X+g2&U 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 diff --git a/Restorer/Restorer/Images.xcassets/AppIcon.appiconset/Contents.json b/Restorer/Restorer/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..19882d5 --- /dev/null +++ b/Restorer/Restorer/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Restorer/Restorer/Images.xcassets/Contents.json b/Restorer/Restorer/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Restorer/Restorer/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Restorer/Restorer/Images.xcassets/first.imageset/Contents.json b/Restorer/Restorer/Images.xcassets/first.imageset/Contents.json new file mode 100644 index 0000000..4c4d062 --- /dev/null +++ b/Restorer/Restorer/Images.xcassets/first.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "first@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Restorer/Restorer/first.png b/Restorer/Restorer/Images.xcassets/first.imageset/first.png similarity index 100% rename from Restorer/Restorer/first.png rename to Restorer/Restorer/Images.xcassets/first.imageset/first.png diff --git a/Restorer/Restorer/first@2x.png b/Restorer/Restorer/Images.xcassets/first.imageset/first@2x.png similarity index 100% rename from Restorer/Restorer/first@2x.png rename to Restorer/Restorer/Images.xcassets/first.imageset/first@2x.png diff --git a/Restorer/Restorer/Images.xcassets/second.imageset/Contents.json b/Restorer/Restorer/Images.xcassets/second.imageset/Contents.json new file mode 100644 index 0000000..044ce4b --- /dev/null +++ b/Restorer/Restorer/Images.xcassets/second.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "second@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Restorer/Restorer/second.png b/Restorer/Restorer/Images.xcassets/second.imageset/second.png similarity index 100% rename from Restorer/Restorer/second.png rename to Restorer/Restorer/Images.xcassets/second.imageset/second.png diff --git a/Restorer/Restorer/second@2x.png b/Restorer/Restorer/Images.xcassets/second.imageset/second@2x.png similarity index 100% rename from Restorer/Restorer/second@2x.png rename to Restorer/Restorer/Images.xcassets/second.imageset/second@2x.png diff --git a/Restorer/Restorer/Restorer-Info.plist b/Restorer/Restorer/Restorer-Info.plist index 02f9bcb..16c34dd 100644 --- a/Restorer/Restorer/Restorer-Info.plist +++ b/Restorer/Restorer/Restorer-Info.plist @@ -8,6 +8,10 @@ ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} + CFBundleIcons + + CFBundleIcons~ipad + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -24,6 +28,8 @@ 3 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile MainStoryboard UIRequiredDeviceCapabilities diff --git a/Restorer/Restorer/UYLAppDelegate.m b/Restorer/Restorer/UYLAppDelegate.m index e3b9085..8c9ed4c 100644 --- a/Restorer/Restorer/UYLAppDelegate.m +++ b/Restorer/Restorer/UYLAppDelegate.m @@ -37,7 +37,7 @@ @implementation UYLAppDelegate NSString *kUYLSettingsAmazingKey = @"amazing"; -#define BUNDLEMINVERSION 2 +#define BUNDLEMINVERSION 3 // Common initilisation code for backward compatibility with iOS 5 - (void)commonFinishLaunchingWithOptions:(NSDictionary *)launchOptions @@ -94,7 +94,7 @@ - (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:( UIUserInterfaceIdiom currentInterfaceIdiom = currentDevice.userInterfaceIdiom; if (restorationInterfaceIdiom != currentInterfaceIdiom) { - NSLog(@"Ignoring restoration data for interface idiom: %d",restorationInterfaceIdiom); + NSLog(@"Ignoring restoration data for interface idiom: %ld",(long)restorationInterfaceIdiom); return NO; } diff --git a/Restorer/Restorer/UYLCountryViewController.m b/Restorer/Restorer/UYLCountryViewController.m index fbddcc4..3877603 100644 --- a/Restorer/Restorer/UYLCountryViewController.m +++ b/Restorer/Restorer/UYLCountryViewController.m @@ -51,11 +51,6 @@ - (void)viewWillAppear:(BOOL)animated self.capitalLabel.text = self.capital; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - #pragma mark - #pragma mark === State Restoration === #pragma mark - diff --git a/Restorer/Restorer/UYLSettingsViewController.m b/Restorer/Restorer/UYLSettingsViewController.m index 7d46efb..c5b184f 100644 --- a/Restorer/Restorer/UYLSettingsViewController.m +++ b/Restorer/Restorer/UYLSettingsViewController.m @@ -51,11 +51,6 @@ - (void)viewDidLoad self.amazingSwitch.on = [defaults boolForKey:kUYLSettingsAmazingKey]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - - (void)didDismissPresentedView { [self.presentedViewController dismissViewControllerAnimated:YES completion:NULL]; @@ -70,7 +65,6 @@ - (IBAction)amazingAction BOOL amazingEnabled = self.amazingSwitch.isOn; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:amazingEnabled forKey:kUYLSettingsAmazingKey]; - [defaults synchronize]; } - (IBAction)pushMe @@ -78,8 +72,8 @@ - (IBAction)pushMe UYLWebViewController *wvc = [[UYLWebViewController alloc] initWithNibName:@"UYLWebViewController" bundle:nil]; wvc.restorationIdentifier = @"UYLWebViewController"; wvc.restorationClass = [UYLWebViewController class]; - [self.navigationController pushViewController:wvc animated:YES]; - [wvc showPage:@"http://useyourloaf.com"]; + wvc.urlString = @"https://useyourloaf.com"; + [self.navigationController showViewController:wvc sender:self]; } @end diff --git a/Restorer/Restorer/UYLTableViewController.m b/Restorer/Restorer/UYLTableViewController.m index 9d6e49f..50c6ffc 100644 --- a/Restorer/Restorer/UYLTableViewController.m +++ b/Restorer/Restorer/UYLTableViewController.m @@ -55,11 +55,6 @@ - (NSArray *)worldData #pragma mark === View Life Cycle Management === #pragma mark - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { static NSString *UYLSegueShowCountry = @"UYLSegueShowCountry"; diff --git a/Restorer/Restorer/UYLWebViewController.h b/Restorer/Restorer/UYLWebViewController.h index 15c82b6..8369e78 100644 --- a/Restorer/Restorer/UYLWebViewController.h +++ b/Restorer/Restorer/UYLWebViewController.h @@ -34,5 +34,5 @@ #import @interface UYLWebViewController : UIViewController -- (void)showPage:(NSString *)utlString; +@property (nonatomic, copy) NSString *urlString; @end diff --git a/Restorer/Restorer/UYLWebViewController.m b/Restorer/Restorer/UYLWebViewController.m index deef512..b4bef91 100644 --- a/Restorer/Restorer/UYLWebViewController.m +++ b/Restorer/Restorer/UYLWebViewController.m @@ -30,38 +30,38 @@ // (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 "UYLWebViewController.h" @interface UYLWebViewController () -@property (weak, nonatomic) IBOutlet UIWebView *webView; -@property (nonatomic) BOOL restoringState; +@property (strong, nonatomic) IBOutlet WKWebView *webView; @end @implementation UYLWebViewController +static NSString *UYLKeyURL = @"UYLKeyURL"; + #pragma mark - #pragma mark === View Life Cycle Management === #pragma mark - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; +- (void)setUrlString:(NSString *)urlString { + if (_urlString != urlString) { + _urlString = [urlString copy]; + [self loadPage]; + } } -- (void)viewDidAppear:(BOOL)animated +- (void)viewDidLoad { - [super viewDidAppear:animated]; - if (self.restoringState) - { - [self.webView reload]; - self.restoringState = NO; - } + [super viewDidLoad]; + [self loadPage]; } -- (void)showPage:(NSString *)urlString +- (void)loadPage { - NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; + NSURL *URL = [NSURL URLWithString:self.urlString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [self.webView loadRequest:request]; } @@ -69,10 +69,16 @@ - (void)showPage:(NSString *)urlString #pragma mark === State Restoration === #pragma mark - +- (void)encodeRestorableStateWithCoder:(NSCoder *)coder +{ + [coder encodeObject:self.urlString forKey:UYLKeyURL]; + [super encodeRestorableStateWithCoder:coder]; +} + - (void)decodeRestorableStateWithCoder:(NSCoder *)coder { [super decodeRestorableStateWithCoder:coder]; - self.restoringState = YES; + self.urlString = [coder decodeObjectForKey:UYLKeyURL]; } #pragma mark - diff --git a/Restorer/Restorer/UYLWebViewController.xib b/Restorer/Restorer/UYLWebViewController.xib deleted file mode 100644 index 1e992c9..0000000 --- a/Restorer/Restorer/UYLWebViewController.xib +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - From a9bce004bc01d27e7b10147133685d949d9c8f7e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 23 Apr 2019 15:06:17 +0100 Subject: [PATCH 082/142] Update README --- Restorer/README | 33 +++++++++++++-------- Restorer/Restorer.xcodeproj/project.pbxproj | 2 +- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Restorer/README b/Restorer/README index 09b20b8..7ddd65f 100644 --- a/Restorer/README +++ b/Restorer/README @@ -1,20 +1,27 @@ -======================================================================= -Restorer +# Restorer -Version 1.2 01 Jun 2013 Added checks for bundle version and user - interface idiom when restoring. -Version 1.1 23 May 2013 Added example of using a restoration class - with a UIWebView -Version 1.0 21 May 2013 Initial Version -======================================================================= - -The Restorer App demonstrates how to add support for State Preservation and -Restoration to an iOS 6 App. +The Restorer App demonstrates how to add support for **State Preservation and Restoration** to an iOS App. For further details see: -http://useyourloaf.com/blog/2013/05/21/state-preservation-and-restoration.html ++ [State Preservation and Restoration](https://useyourloaf.com/blog/state-preservation-and-restoration/ +) +## License The geographic data used in this App is from GeoNames and used under -the Creative Commons Attributions License (see www.geonames.org). \ No newline at end of file +the Creative Commons Attributions License (see [www.geonames.org](https://www.geonames.org)). + +## Version History + ++ Version 1.3 - 23 Apr 2019 + Update for Xcode 10.2, iOS 12 and WKWebView + ++ Version 1.2 - 01 Jun 2013 + Added checks for bundle version and user interface idiom when restoring. + ++ Version 1.1 - 23 May 2013 + Added example of using a restoration class with a UIWebView + ++ Version 1.0 - 21 May 2013 + Initial Version diff --git a/Restorer/Restorer.xcodeproj/project.pbxproj b/Restorer/Restorer.xcodeproj/project.pbxproj index ff2b595..c65f8ed 100644 --- a/Restorer/Restorer.xcodeproj/project.pbxproj +++ b/Restorer/Restorer.xcodeproj/project.pbxproj @@ -31,7 +31,7 @@ 5320FB202252630D00AADA00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 5320FB21225264E200AADA00 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 5320FB242252655800AADA00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 535CDCD1174C2E440021AE7F /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 535CDCD1174C2E440021AE7F /* README */ = {isa = PBXFileReference; explicitFileType = net.daringfireball.markdown; fileEncoding = 4; path = README; sourceTree = ""; }; 535EBE012252692700EEF01D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLWebViewController.xib; sourceTree = ""; }; 53844B3F16F7B2E0007B7561 /* countries.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = countries.plist; sourceTree = ""; }; 53844B4116F7B7F0007B7561 /* UYLCountryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCountryViewController.h; sourceTree = ""; }; From 7933786af6b0c6230662d7bc772295c2e0b7c835 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 26 Apr 2019 15:39:42 +0100 Subject: [PATCH 083/142] Update for Xcode 10.2 and Swift 5 --- .../TableHeaderObjC.xcodeproj/project.pbxproj | 23 ++++++++++++++-- .../TableHeader.xcodeproj/project.pbxproj | 27 ++++++++++++++++--- .../TableHeader/AppDelegate.swift | 1 - .../TableHeader/DataCell.swift | 3 +-- .../TableHeader/ListDataSource.swift | 8 +++--- .../TableHeader/ListTableViewController.swift | 13 ++++----- .../TableHeader/TextTableHeader.swift | 7 +++-- 7 files changed, 56 insertions(+), 26 deletions(-) diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj index 8b69e77..aed1668 100644 --- a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.pbxproj @@ -144,7 +144,7 @@ 5362BE8F1E7C042700204B31 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 5362BE961E7C042700204B31 = { @@ -156,7 +156,7 @@ }; buildConfigurationList = 5362BE921E7C042700204B31 /* Build configuration list for PBXProject "TableHeaderObjC" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -225,20 +225,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -273,20 +282,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -356,6 +374,7 @@ 5362BEB01E7C042700204B31 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj index 038edf7..6f20988 100644 --- a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj @@ -146,7 +146,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53F945931E780436002E1728 = { @@ -158,7 +158,7 @@ }; buildConfigurationList = 53F9458F1E780436002E1728 /* Build configuration list for PBXProject "TableHeader" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -228,20 +228,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -278,20 +287,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -327,7 +345,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TableHeader; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -341,7 +359,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TableHeader; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -364,6 +382,7 @@ 53F945A81E780436002E1728 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift b/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift index 6945ded..b76494e 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/AppDelegate.swift @@ -35,6 +35,5 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? } diff --git a/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift b/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift index e6d8880..b5a0bad 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/DataCell.swift @@ -34,8 +34,7 @@ import UIKit class DataCell: UITableViewCell, ReusableIdentifier { - - @IBOutlet fileprivate weak var title: UILabel! + @IBOutlet fileprivate var title: UILabel! override func awakeFromNib() { super.awakeFromNib() diff --git a/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift b/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift index b5e55c3..d59f1b2 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/ListDataSource.swift @@ -31,11 +31,10 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -import UIKit; +import UIKit -class ListDataSource: NSObject { - - fileprivate let tableView: UITableView +final class ListDataSource: NSObject { + private let tableView: UITableView init(tableView: UITableView) { self.tableView = tableView @@ -46,7 +45,6 @@ class ListDataSource: NSObject { } extension ListDataSource: UITableViewDataSource { - func numberOfSections(in tableView: UITableView) -> Int { return 1 } diff --git a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift index b16ef58..b1c620a 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift @@ -33,26 +33,23 @@ import UIKit -class ListTableViewController: UITableViewController { - +final class ListTableViewController: UITableViewController { private var listDataSource: ListDataSource? override func viewDidLoad() { super.viewDidLoad() listDataSource = ListDataSource(tableView: tableView) tableView.dataSource = listDataSource - tableView.rowHeight = UITableViewAutomaticDimension + tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 56 guard #available(iOS 10.0, *) else { - // Manually observe the UIContentSizeCategoryDidChange // notification for iOS 9. - NotificationCenter.default.addObserver(self,selector:#selector(contentSizeDidChange(notification:)),name: NSNotification.Name.UIContentSizeCategoryDidChange,object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(notification:)), name: UIContentSizeCategory.didChangeNotification, object: nil) return } - } @objc private func contentSizeDidChange(notification: NSNotification) { @@ -88,8 +85,8 @@ class ListTableViewController: UITableViewController { // Calculate the minimum height of the header view that allows // the text label to fit its preferred width. - let size = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize) - + let size = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) + if headerView.frame.size.height != size.height { headerView.frame.size.height = size.height diff --git a/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift b/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift index eaca78b..dfe5bde 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift @@ -33,16 +33,15 @@ import UIKit -class TextTableHeader: UIView { - - @IBOutlet private weak var title: UILabel! +final class TextTableHeader: UIView { + @IBOutlet private var title: UILabel! override func awakeFromNib() { super.awakeFromNib() if #available(iOS 10.0, *) { title.adjustsFontForContentSizeCategory = true } else { - NotificationCenter.default.addObserver(self,selector:#selector(contentSizeDidChange(notification:)),name: NSNotification.Name.UIContentSizeCategoryDidChange,object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(notification:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } } From 0d28371c31831f96e5911584fd987814f74da3c8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 26 Apr 2019 16:12:41 +0100 Subject: [PATCH 084/142] Update for Xcode 10.2 and Swift 5 --- .../TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj | 4 ++-- .../TableHeader/ListTableViewController.swift | 4 ++-- .../TableHeaderSwift/TableHeader/TextTableHeader.swift | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj index 6f20988..acbab84 100644 --- a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.pbxproj @@ -273,7 +273,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -326,7 +326,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift index b1c620a..aa980df 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/ListTableViewController.swift @@ -47,12 +47,12 @@ final class ListTableViewController: UITableViewController { // Manually observe the UIContentSizeCategoryDidChange // notification for iOS 9. - NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(notification:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) return } } - @objc private func contentSizeDidChange(notification: NSNotification) { + @objc private func contentSizeDidChange(_ notification: NSNotification) { tableView.reloadData() } diff --git a/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift b/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift index dfe5bde..24ff3f9 100644 --- a/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift +++ b/TableHeader/TableHeaderSwift/TableHeader/TextTableHeader.swift @@ -41,12 +41,12 @@ final class TextTableHeader: UIView { if #available(iOS 10.0, *) { title.adjustsFontForContentSizeCategory = true } else { - NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(notification:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } } // Still need to do this manually for iOS 9 - @objc private func contentSizeDidChange(notification: NSNotification) { + @objc private func contentSizeDidChange(_ notification: NSNotification) { title.font = UIFont.preferredFont(forTextStyle: .title3) } } From f185ee6a707eb38cd4e6e900f0e6015f1f1aa157 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 23 May 2019 11:18:23 +0100 Subject: [PATCH 085/142] Update for Xcode 10 and Swift 5 --- .../RefreshScroll.xcodeproj/project.pbxproj | 18 +++++++++++------- .../RefreshScroll/AdaptiveScrollView.swift | 6 +++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj index 1b685e5..5140eca 100644 --- a/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.pbxproj @@ -102,20 +102,20 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0810; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53C353911DEB6CA700E33073 = { CreatedOnToolsVersion = 8.1; DevelopmentTeam = LCC2J94N44; - LastSwiftMigration = 0900; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 53C3538D1DEB6CA700E33073 /* Build configuration list for PBXProject "RefreshScroll" */; compatibilityVersion = "Xcode 8.0"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -191,6 +191,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -200,6 +201,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -207,6 +209,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -248,6 +251,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -257,6 +261,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -264,6 +269,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -303,8 +309,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RefreshScroll; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -317,8 +322,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RefreshScroll; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift b/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift index b5efdd7..f885719 100644 --- a/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift +++ b/RefreshScroll/RefreshScroll/AdaptiveScrollView.swift @@ -38,7 +38,7 @@ class AdaptiveScrollView: UIScrollView { let defaultCenter = NotificationCenter.default defaultCenter.addObserver(self, selector: #selector(AdaptiveScrollView.keyboardDidChangeFrame(_:)), - name: NSNotification.Name.UIKeyboardDidChangeFrame, + name: UIResponder.keyboardDidChangeFrameNotification, object: nil) } @@ -53,12 +53,12 @@ class AdaptiveScrollView: UIScrollView { } @objc func keyboardDidChangeFrame(_ notification:Notification) { - guard let keyboardFrame = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue else { + guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue else { return } let keyboardSize = keyboardFrame.cgRectValue.size - let contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0) + let contentInsets = UIEdgeInsets.init(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0) adjustContentInsets(contentInsets) } From f039bc1b6ada2e8df893571c21bade593619e1f3 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 24 Jun 2019 14:34:31 +0100 Subject: [PATCH 086/142] Update for Swift 5 and Xcode 10.2 --- AutoLayout/AutoLayout.xcodeproj/project.pbxproj | 17 ++++++++++------- .../AutoLayout/AdaptiveViewController.swift | 12 ++++++------ AutoLayout/AutoLayout/AppDelegate.swift | 2 +- .../AutoLayout/LayoutGuideController.swift | 12 ++++++------ .../UIViewController+Constraint.swift | 2 +- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index 198db55..8b5d4c5 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -132,22 +132,23 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53D6A5EC1C53BF5200A81A14 = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0900; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 53D6A5E81C53BF5200A81A14 /* Build configuration list for PBXProject "AutoLayout" */; compatibilityVersion = "Xcode 6.3"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, + ar, ); mainGroup = 53D6A5E41C53BF5200A81A14; productRefGroup = 53D6A5EE1C53BF5200A81A14 /* Products */; @@ -228,12 +229,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -282,12 +285,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -324,8 +329,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AutoLayout; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -338,8 +342,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AutoLayout; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/AutoLayout/AutoLayout/AdaptiveViewController.swift b/AutoLayout/AutoLayout/AdaptiveViewController.swift index 893d555..1fd9fb2 100644 --- a/AutoLayout/AutoLayout/AdaptiveViewController.swift +++ b/AutoLayout/AutoLayout/AdaptiveViewController.swift @@ -67,18 +67,18 @@ class AdaptiveViewController: UIViewController { textLabel.textColor = .gray redButton.translatesAutoresizingMaskIntoConstraints = false - redButton.setTitle("No don't do it", for: UIControlState()) + redButton.setTitle("No don't do it", for: UIControl.State()) let redImage = UIImage(named: "redButton") - redButton.setBackgroundImage(redImage, for: UIControlState()) - redButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + redButton.setBackgroundImage(redImage, for: UIControl.State()) + redButton.contentEdgeInsets = UIEdgeInsets.init(top: 8, left: 16, bottom: 8, right: 16) let noAction = #selector(noAction(_:)) redButton.addTarget(self, action: noAction, for: .touchUpInside) greenButton.translatesAutoresizingMaskIntoConstraints = false - greenButton.setTitle("Start the Countdown!!!", for: UIControlState()) + greenButton.setTitle("Start the Countdown!!!", for: UIControl.State()) let greenImage = UIImage(named: "greenButton") - greenButton.setBackgroundImage(greenImage, for: UIControlState()) - greenButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + greenButton.setBackgroundImage(greenImage, for: UIControl.State()) + greenButton.contentEdgeInsets = UIEdgeInsets.init(top: 8, left: 16, bottom: 8, right: 16) let yesAction = #selector(yesAction(_:)) greenButton.addTarget(self, action: yesAction, for: .touchUpInside) diff --git a/AutoLayout/AutoLayout/AppDelegate.swift b/AutoLayout/AutoLayout/AppDelegate.swift index de5cca2..828bcfd 100644 --- a/AutoLayout/AutoLayout/AppDelegate.swift +++ b/AutoLayout/AutoLayout/AppDelegate.swift @@ -38,7 +38,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let splitViewController = self.window!.rootViewController as! UISplitViewController splitViewController.delegate = self return true diff --git a/AutoLayout/AutoLayout/LayoutGuideController.swift b/AutoLayout/AutoLayout/LayoutGuideController.swift index 22caae6..594ebb7 100644 --- a/AutoLayout/AutoLayout/LayoutGuideController.swift +++ b/AutoLayout/AutoLayout/LayoutGuideController.swift @@ -62,18 +62,18 @@ class LayoutGuideController: UIViewController { // Configure the buttons and add them to the superview noButton.translatesAutoresizingMaskIntoConstraints = false - noButton.setTitle("No", for: UIControlState()) + noButton.setTitle("No", for: UIControl.State()) let redImage = UIImage(named: "redButton") - noButton.setBackgroundImage(redImage, for: UIControlState()) - noButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + noButton.setBackgroundImage(redImage, for: UIControl.State()) + noButton.contentEdgeInsets = UIEdgeInsets.init(top: 8, left: 16, bottom: 8, right: 16) let noThanksAction = #selector(LayoutGuideController.noThanks(_:)) noButton.addTarget(self, action: noThanksAction, for: .touchUpInside) yesButton.translatesAutoresizingMaskIntoConstraints = false - yesButton.setTitle("Yes please!", for: UIControlState()) + yesButton.setTitle("Yes please!", for: UIControl.State()) let greenImage = UIImage(named: "greenButton") - yesButton.setBackgroundImage(greenImage, for: UIControlState()) - yesButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + yesButton.setBackgroundImage(greenImage, for: UIControl.State()) + yesButton.contentEdgeInsets = UIEdgeInsets.init(top: 8, left: 16, bottom: 8, right: 16) let yesPleaseAction = #selector(LayoutGuideController.yesPlease(_:)) yesButton.addTarget(self, action: yesPleaseAction, for: .touchUpInside) diff --git a/AutoLayout/AutoLayout/UIViewController+Constraint.swift b/AutoLayout/AutoLayout/UIViewController+Constraint.swift index a553a3a..8cb4f05 100644 --- a/AutoLayout/AutoLayout/UIViewController+Constraint.swift +++ b/AutoLayout/AutoLayout/UIViewController+Constraint.swift @@ -69,7 +69,7 @@ extension UIViewController { - Parameter identifier: A String identifier to aid debugging. */ - func addConstraintFromView(_ subview: UIView?, attribute: NSLayoutAttribute, multiplier: CGFloat, identifier: String) { + func addConstraintFromView(_ subview: UIView?, attribute: NSLayoutConstraint.Attribute, multiplier: CGFloat, identifier: String) { if let subview = subview { let constraint = NSLayoutConstraint(item: subview, attribute: attribute, From 311574e4c1c4ae96a78227a4ed83c6b26c745dc0 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 24 Jun 2019 16:15:38 +0100 Subject: [PATCH 087/142] Update for Swift 5 and Xcode 10.2 --- .../AutoLayout.xcodeproj/project.pbxproj | 3 ++ .../AutoLayout/AdaptiveViewController.swift | 13 ++++++-- Stacks/README.md | 10 +++--- Stacks/Stacks.xcodeproj/project.pbxproj | 28 +++++++++++++--- Stacks/Stacks/AppDelegate.swift | 8 ++--- .../AppIcon.appiconset/Contents.json | 30 ++++++++++++++++++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 56305 bytes .../AppIcon.appiconset/icon-20.png | Bin 0 -> 736 bytes .../AppIcon.appiconset/icon-41.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-42.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-60.png | Bin 0 -> 3017 bytes Stacks/Stacks/HiddenViewController.swift | 2 +- .../Stacks/ScrollingStackViewController.swift | 2 +- 13 files changed, 78 insertions(+), 18 deletions(-) create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-41.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-42.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-60.png diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index 8b5d4c5..d37e045 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -137,6 +137,7 @@ TargetAttributes = { 53D6A5EC1C53BF5200A81A14 = { CreatedOnToolsVersion = 7.2; + DevelopmentTeam = LCC2J94N44; LastSwiftMigration = 1020; }; }; @@ -325,6 +326,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = AutoLayout/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AutoLayout; @@ -337,6 +339,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = AutoLayout/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AutoLayout; diff --git a/AutoLayout/AutoLayout/AdaptiveViewController.swift b/AutoLayout/AutoLayout/AdaptiveViewController.swift index 1fd9fb2..e96eb39 100644 --- a/AutoLayout/AutoLayout/AdaptiveViewController.swift +++ b/AutoLayout/AutoLayout/AdaptiveViewController.swift @@ -89,7 +89,16 @@ class AdaptiveViewController: UIViewController { view.addLayoutGuide(middleGuide) view.addLayoutGuide(trailingGuide) } - + + private var firstTime = true + override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + if firstTime { + firstTime = false + enableConstraintsForWidth(traitCollection.horizontalSizeClass) + } + } + private func setupConstraints() { // ========================================= @@ -150,8 +159,6 @@ class AdaptiveViewController: UIViewController { compactConstraints.append(redButton.centerXAnchor.constraint(equalTo: view.centerXAnchor)) compactConstraints.append(greenButton.centerXAnchor.constraint(equalTo: view.centerXAnchor)) compactConstraints.append(greenButton.topAnchor.constraint(equalTo: redButton.bottomAnchor, constant: 8.0)) - - enableConstraintsForWidth(traitCollection.horizontalSizeClass) } private func enableConstraintsForWidth(_ horizontalSizeClass: UIUserInterfaceSizeClass) { diff --git a/Stacks/README.md b/Stacks/README.md index 1386fb1..232736c 100644 --- a/Stacks/README.md +++ b/Stacks/README.md @@ -7,14 +7,14 @@ Examples of using and sometime abusing stack views (requires iOS 9) 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/) ++ [Easier Auto Layout with Stack Views](https://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/) ++ [Adapting Stack Views with Size Classes](https://useyourloaf.com/blog/adapting-stack-views-with-size-classes/) #### Hiding Views in a Stack View @@ -22,21 +22,21 @@ 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/) ++ [Using Size Classes to Hide Stack View Contents](https://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/) ++ [Adding 3D Touch Quick Actions](https://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/) ++ [Scroll Stack Views](https://useyourloaf.com/blog/scrolling-stack-views/) #### Version History diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index 95ecb7f..9605874 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -104,7 +104,7 @@ 53DA13E21B32184500FEEE79 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53DA13E91B32184600FEEE79 = { @@ -116,7 +116,7 @@ }; buildConfigurationList = 53DA13E51B32184500FEEE79 /* Build configuration list for PBXProject "Stacks" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -193,18 +193,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -232,6 +241,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -240,18 +250,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -272,6 +291,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -286,7 +306,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -300,7 +320,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Stacks/Stacks/AppDelegate.swift b/Stacks/Stacks/AppDelegate.swift index 44d7e28..d0300c9 100644 --- a/Stacks/Stacks/AppDelegate.swift +++ b/Stacks/Stacks/AppDelegate.swift @@ -51,9 +51,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem { + if let shortcutItem = launchOptions?[UIApplication.LaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem { handleShortcut(shortcutItem) return false @@ -69,7 +69,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { completionHandler(handleShortcut(shortcutItem)) } - @discardableResult fileprivate func handleShortcut(_ shortcutItem: UIApplicationShortcutItem) -> Bool { + @discardableResult private func handleShortcut(_ shortcutItem: UIApplicationShortcutItem) -> Bool { let shortcutType = shortcutItem.type guard let shortcutIdentifier = ShortcutIdentifier(fullIdentifier: shortcutType) else { @@ -79,7 +79,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return selectTabBarItemForIdentifier(shortcutIdentifier) } - fileprivate func selectTabBarItemForIdentifier(_ identifier: ShortcutIdentifier) -> Bool { + private func selectTabBarItemForIdentifier(_ identifier: ShortcutIdentifier) -> Bool { guard let tabBarController = self.window?.rootViewController as? UITabBarController else { return false diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json index adeb159..1018f64 100644 --- a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,17 @@ { "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-42.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-60.png", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -36,6 +48,18 @@ "filename" : "icon-180.png", "scale" : "3x" }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-41.png", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", @@ -77,6 +101,12 @@ "idiom" : "ipad", "filename" : "icon-167.png", "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" } ], "info" : { diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1a9de7f6ad69ba2280fc5250c4368846b7921e GIT binary patch literal 56305 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 Y^-*HM%6=&H7sNNxH`Ob=>iF!x09e}G4*&oF literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-20.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-20.png new file mode 100644 index 0000000000000000000000000000000000000000..3c16adf7399bfbac2f393af203271775d21ea91d GIT binary patch literal 736 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 LNkvXXu0mjf{o2?p literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/HiddenViewController.swift b/Stacks/Stacks/HiddenViewController.swift index dfd0964..e099673 100644 --- a/Stacks/Stacks/HiddenViewController.swift +++ b/Stacks/Stacks/HiddenViewController.swift @@ -47,7 +47,7 @@ class HiddenViewController: UIViewController { configureView(newCollection.verticalSizeClass) } - fileprivate func configureView(_ verticalSizeClass: UIUserInterfaceSizeClass) { + private func configureView(_ verticalSizeClass: UIUserInterfaceSizeClass) { guard extraHeart != nil else { return } diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift index 39e3ea9..75d9665 100644 --- a/Stacks/Stacks/ScrollingStackViewController.swift +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -60,7 +60,7 @@ class ScrollingStackViewController: UIViewController { } } - fileprivate func scrollToEnd(_ addedView: UIView) { + private func scrollToEnd(_ addedView: UIView) { let contentViewHeight = scrollView.contentSize.height + addedView.bounds.height + stackView.spacing let offsetY = contentViewHeight - scrollView.bounds.height if (offsetY > 0) { From 54b4ee342887c924b21cc16342ab1250d8c653fb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 13 Sep 2019 14:13:54 +0100 Subject: [PATCH 088/142] Update for Swift 5 --- ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj b/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj index 030e70e..d35b6dd 100644 --- a/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj @@ -104,6 +104,7 @@ TargetAttributes = { 53FD5C2F2126C480008DA03A = { CreatedOnToolsVersion = 10.0; + LastSwiftMigration = 1100; }; }; }; @@ -293,7 +294,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScrollGuide; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -311,7 +312,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScrollGuide; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; From 582fa388da7348c805e573faee02cd75929f41bd Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 16 Sep 2019 20:48:00 +0100 Subject: [PATCH 089/142] Add Interface Builder version of using Scroll View layout guides --- ScrollGuide-IB/README.md | 9 + .../ScrollGuide-IB.xcodeproj/project.pbxproj | 345 ++++++++++++++++++ .../ScrollGuide-IB/AppDelegate.swift | 43 +++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Assets.xcassets/Contents.json | 6 + .../SkyBlue.colorset/Contents.json | 20 + .../Sun.imageset/Contents.json | 15 + .../Assets.xcassets/Sun.imageset/Sun150.pdf | Bin 0 -> 4444 bytes .../Base.lproj/LaunchScreen.storyboard | 51 +++ .../ScrollGuide-IB/Base.lproj/Main.storyboard | 107 ++++++ ScrollGuide-IB/ScrollGuide-IB/Forecast.swift | 49 +++ .../ForecastViewController.swift | 57 +++ ScrollGuide-IB/ScrollGuide-IB/Info.plist | 50 +++ ScrollGuide/README.md | 4 + 14 files changed, 854 insertions(+) create mode 100644 ScrollGuide-IB/README.md create mode 100644 ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.pbxproj create mode 100644 ScrollGuide-IB/ScrollGuide-IB/AppDelegate.swift create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Contents.json create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/SkyBlue.colorset/Contents.json create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Contents.json create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Sun150.pdf create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Base.lproj/LaunchScreen.storyboard create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Base.lproj/Main.storyboard create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Forecast.swift create mode 100644 ScrollGuide-IB/ScrollGuide-IB/ForecastViewController.swift create mode 100644 ScrollGuide-IB/ScrollGuide-IB/Info.plist diff --git a/ScrollGuide-IB/README.md b/ScrollGuide-IB/README.md new file mode 100644 index 0000000..5193288 --- /dev/null +++ b/ScrollGuide-IB/README.md @@ -0,0 +1,9 @@ +# Scroll View Layout Guides + +Xcode 11 adds direct support for the content layout guides of a `UIScrollView` to Interface Builder. See the following post for details: + ++ [Scroll View Layouts With Interface Builder](https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/) + +You can compare the Interface Builder version of the layout with the progammatic version described in this earlier post: + ++ [Easier Scrolling With Layout Guides](https://useyourloaf.com/blog/easier-scrolling-with-layout-guides/) diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.pbxproj b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5622ba2 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.pbxproj @@ -0,0 +1,345 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 537CC979232BD70800424444 /* ForecastViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537CC978232BD70800424444 /* ForecastViewController.swift */; }; + 537CC97B232BD80300424444 /* Forecast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537CC97A232BD80300424444 /* Forecast.swift */; }; + 53926B86232BD49B0070DCB1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53926B85232BD49B0070DCB1 /* AppDelegate.swift */; }; + 53926B8D232BD49B0070DCB1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53926B8B232BD49B0070DCB1 /* Main.storyboard */; }; + 53926B8F232BD49B0070DCB1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53926B8E232BD49B0070DCB1 /* Assets.xcassets */; }; + 53926B92232BD49B0070DCB1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53926B90232BD49B0070DCB1 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 537CC978232BD70800424444 /* ForecastViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastViewController.swift; sourceTree = ""; }; + 537CC97A232BD80300424444 /* Forecast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Forecast.swift; sourceTree = ""; }; + 537CC99C23301D1800424444 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53926B82232BD49B0070DCB1 /* ScrollGuide-IB.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ScrollGuide-IB.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 53926B85232BD49B0070DCB1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53926B8C232BD49B0070DCB1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53926B8E232BD49B0070DCB1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53926B91232BD49B0070DCB1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53926B93232BD49B0070DCB1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53926B7F232BD49B0070DCB1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53926B79232BD49B0070DCB1 = { + isa = PBXGroup; + children = ( + 537CC99C23301D1800424444 /* README.md */, + 53926B84232BD49B0070DCB1 /* ScrollGuide-IB */, + 53926B83232BD49B0070DCB1 /* Products */, + ); + sourceTree = ""; + }; + 53926B83232BD49B0070DCB1 /* Products */ = { + isa = PBXGroup; + children = ( + 53926B82232BD49B0070DCB1 /* ScrollGuide-IB.app */, + ); + name = Products; + sourceTree = ""; + }; + 53926B84232BD49B0070DCB1 /* ScrollGuide-IB */ = { + isa = PBXGroup; + children = ( + 537CC978232BD70800424444 /* ForecastViewController.swift */, + 537CC97A232BD80300424444 /* Forecast.swift */, + 53926B85232BD49B0070DCB1 /* AppDelegate.swift */, + 53926B8B232BD49B0070DCB1 /* Main.storyboard */, + 53926B8E232BD49B0070DCB1 /* Assets.xcassets */, + 53926B90232BD49B0070DCB1 /* LaunchScreen.storyboard */, + 53926B93232BD49B0070DCB1 /* Info.plist */, + ); + path = "ScrollGuide-IB"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53926B81232BD49B0070DCB1 /* ScrollGuide-IB */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53926B96232BD49B0070DCB1 /* Build configuration list for PBXNativeTarget "ScrollGuide-IB" */; + buildPhases = ( + 53926B7E232BD49B0070DCB1 /* Sources */, + 53926B7F232BD49B0070DCB1 /* Frameworks */, + 53926B80232BD49B0070DCB1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "ScrollGuide-IB"; + productName = "ScrollGuide-IB"; + productReference = 53926B82232BD49B0070DCB1 /* ScrollGuide-IB.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53926B7A232BD49B0070DCB1 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53926B81232BD49B0070DCB1 = { + CreatedOnToolsVersion = 11.0; + }; + }; + }; + buildConfigurationList = 53926B7D232BD49B0070DCB1 /* Build configuration list for PBXProject "ScrollGuide-IB" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53926B79232BD49B0070DCB1; + productRefGroup = 53926B83232BD49B0070DCB1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53926B81232BD49B0070DCB1 /* ScrollGuide-IB */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53926B80232BD49B0070DCB1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53926B92232BD49B0070DCB1 /* LaunchScreen.storyboard in Resources */, + 53926B8F232BD49B0070DCB1 /* Assets.xcassets in Resources */, + 53926B8D232BD49B0070DCB1 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53926B7E232BD49B0070DCB1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53926B86232BD49B0070DCB1 /* AppDelegate.swift in Sources */, + 537CC97B232BD80300424444 /* Forecast.swift in Sources */, + 537CC979232BD70800424444 /* ForecastViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53926B8B232BD49B0070DCB1 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53926B8C232BD49B0070DCB1 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53926B90232BD49B0070DCB1 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53926B91232BD49B0070DCB1 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53926B94232BD49B0070DCB1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "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 = 13.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 53926B95232BD49B0070DCB1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_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 = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53926B97232BD49B0070DCB1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = "ScrollGuide-IB/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.ScrollGuide-IB"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53926B98232BD49B0070DCB1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = "ScrollGuide-IB/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.ScrollGuide-IB"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53926B7D232BD49B0070DCB1 /* Build configuration list for PBXProject "ScrollGuide-IB" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53926B94232BD49B0070DCB1 /* Debug */, + 53926B95232BD49B0070DCB1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53926B96232BD49B0070DCB1 /* Build configuration list for PBXNativeTarget "ScrollGuide-IB" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53926B97232BD49B0070DCB1 /* Debug */, + 53926B98232BD49B0070DCB1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53926B7A232BD49B0070DCB1 /* Project object */; +} diff --git a/ScrollGuide-IB/ScrollGuide-IB/AppDelegate.swift b/ScrollGuide-IB/ScrollGuide-IB/AppDelegate.swift new file mode 100644 index 0000000..a95b2c1 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/AppDelegate.swift @@ -0,0 +1,43 @@ +// Copyright © 2019 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? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + if let navigationController = window?.rootViewController as? UINavigationController, + let forecastViewController = navigationController.topViewController as? ForecastViewController { + let forecast = Forecast(title: "Weather For Today", condition: .sun, summary: "Today will be hot and sunny. If you are going out you will need a hat and sunglasses. There is a small chance of a heavy thunderstorm in the afternoon that could cause severe flooding so you may also want to take a boat.") + forecastViewController.forecast = forecast + } + return true + } +} diff --git a/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "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" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Contents.json b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/SkyBlue.colorset/Contents.json b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/SkyBlue.colorset/Contents.json new file mode 100644 index 0000000..1f49b00 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/SkyBlue.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0.463", + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.835" + } + } + } + ] +} \ No newline at end of file diff --git a/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Contents.json b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Contents.json new file mode 100644 index 0000000..d73dd65 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Sun150.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Sun150.pdf b/ScrollGuide-IB/ScrollGuide-IB/Assets.xcassets/Sun.imageset/Sun150.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0715bf8a5ba81db547dabb71dc982f2ddae53fd2 GIT binary patch literal 4444 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScrollGuide-IB/ScrollGuide-IB/Base.lproj/Main.storyboard b/ScrollGuide-IB/ScrollGuide-IB/Base.lproj/Main.storyboard new file mode 100644 index 0000000..a0fc3ec --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Base.lproj/Main.storyboard @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScrollGuide-IB/ScrollGuide-IB/Forecast.swift b/ScrollGuide-IB/ScrollGuide-IB/Forecast.swift new file mode 100644 index 0000000..a36cd4d --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Forecast.swift @@ -0,0 +1,49 @@ +// Copyright © 2019 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 + +public struct Forecast { + public enum Condition { + case sun + // other conditions... + } + + let title: String + let condition: Condition + let summary: String +} + +public extension Forecast { + func icon() -> UIImage { + switch condition { + case .sun: return UIImage(named: "Sun")! + // other conditions... + } + } +} diff --git a/ScrollGuide-IB/ScrollGuide-IB/ForecastViewController.swift b/ScrollGuide-IB/ScrollGuide-IB/ForecastViewController.swift new file mode 100644 index 0000000..35e972a --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/ForecastViewController.swift @@ -0,0 +1,57 @@ +// Copyright © 2019 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class ForecastViewController: UIViewController { + @IBOutlet private var titleLabel: UILabel? + @IBOutlet private var summaryLabel: UILabel? + @IBOutlet private var imageView: UIImageView? + + var forecast: Forecast? { didSet { updateView() } } + + private func updateView() { + if let forecast = forecast { + titleLabel?.text = forecast.title + summaryLabel?.text = forecast.summary + imageView?.image = forecast.icon() + imageView?.sizeToFit() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + updateView() + } +} + +extension ForecastViewController { + @IBAction private func showInfo(_ sender: UIButton) { + print("Show Info") + } +} diff --git a/ScrollGuide-IB/ScrollGuide-IB/Info.plist b/ScrollGuide-IB/ScrollGuide-IB/Info.plist new file mode 100644 index 0000000..8f416d0 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB/Info.plist @@ -0,0 +1,50 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ScrollGuide/README.md b/ScrollGuide/README.md index 6bd1f9a..98da7ba 100644 --- a/ScrollGuide/README.md +++ b/ScrollGuide/README.md @@ -3,3 +3,7 @@ An example of using the two new layout guides added to `UIScrollView` in iOS 11. See the following post for details: + [Easier Scrolling With Layout Guides](https://useyourloaf.com/blog/easier-scrolling-with-layout-guides/) + +Starting with Xcode 11 the content layout guides are available in Interface Builder. See this later post for a version of this layout build entirely with Interface Builder: + ++ [Scroll View Layouts With Interface Builder](https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/) From 80e8d0af3ca6c88cc4638fc2c860e4e224914b36 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 16 Sep 2019 20:50:19 +0100 Subject: [PATCH 090/142] Fix typo in README --- ScrollGuide/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ScrollGuide/README.md b/ScrollGuide/README.md index 98da7ba..73909f2 100644 --- a/ScrollGuide/README.md +++ b/ScrollGuide/README.md @@ -4,6 +4,6 @@ An example of using the two new layout guides added to `UIScrollView` in iOS 11. + [Easier Scrolling With Layout Guides](https://useyourloaf.com/blog/easier-scrolling-with-layout-guides/) -Starting with Xcode 11 the content layout guides are available in Interface Builder. See this later post for a version of this layout build entirely with Interface Builder: +Starting with Xcode 11 the content layout guides are available in Interface Builder. See this later post for a version of this layout built entirely with Interface Builder: + [Scroll View Layouts With Interface Builder](https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/) From 9cd74600fc074d9765338ca61a69fbd09fdedcd2 Mon Sep 17 00:00:00 2001 From: kharrison Date: Fri, 4 Oct 2019 11:54:34 +0100 Subject: [PATCH 091/142] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. From 1117353e9a49fece65d3fdab8cbd821e0adf6242 Mon Sep 17 00:00:00 2001 From: kharrison Date: Fri, 4 Oct 2019 11:57:26 +0100 Subject: [PATCH 092/142] Update issue templates Customise issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 36 +++++++--------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dd84ea7..c929601 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,32 +7,14 @@ assignees: '' --- -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. +**Project** +This repo contains many projects, please state which project this issue is for. -**Screenshots** -If applicable, add screenshots to help explain your problem. +**Environment** +Please include at least the following details: +- Xcode version +- iOS version +- Device or simulator used to reproduce the bug -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. +**Describe the bug** +A clear and concise description of what the bug is. From 0ae7151853acf9e81f40993501e48a168b7059fc Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 4 Oct 2019 16:01:08 +0100 Subject: [PATCH 093/142] WorldFacts search controller updated for iOS 11 - when available put the search bar in the nav bar --- .../WorldFacts.xcodeproj/project.pbxproj | 14 +- .../WorldFacts/Base.lproj/Main.storyboard | 126 ++++++++---------- WorldFacts/WorldFacts/LaunchScreen.storyboard | 15 ++- WorldFacts/WorldFacts/UYLAppDelegate.m | 2 +- .../UYLCountryTableViewController.m | 8 +- WorldFacts/WorldFacts/WorldFacts-Info.plist | 4 +- 6 files changed, 82 insertions(+), 87 deletions(-) diff --git a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj index 74bc928..debcaf9 100644 --- a/WorldFacts/WorldFacts.xcodeproj/project.pbxproj +++ b/WorldFacts/WorldFacts.xcodeproj/project.pbxproj @@ -235,7 +235,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0920; + LastUpgradeCheck = 1100; TargetAttributes = { 531D960C1AB62FEF00913A78 = { CreatedOnToolsVersion = 6.2; @@ -247,7 +247,7 @@ }; buildConfigurationList = 538A7972157E567E0007B8A5 /* Build configuration list for PBXProject "WorldFacts" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -400,18 +400,21 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -452,18 +455,21 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -497,9 +503,11 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 12; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; + MARKETING_VERSION = 3.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -511,9 +519,11 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 12; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = NO; INFOPLIST_FILE = "WorldFacts/WorldFacts-Info.plist"; + MARKETING_VERSION = 3.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index 231a79f..2cdc686 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -1,9 +1,11 @@ - - + + + - - + + + @@ -11,8 +13,8 @@ + - @@ -26,115 +28,96 @@ - - - - - + - - + @@ -160,7 +143,7 @@ - + @@ -177,7 +160,7 @@ - + @@ -186,6 +169,7 @@ + @@ -236,41 +220,36 @@ - + - - + - + - + - @@ -284,8 +263,7 @@ - - + @@ -311,8 +289,8 @@ + - diff --git a/WorldFacts/WorldFacts/LaunchScreen.storyboard b/WorldFacts/WorldFacts/LaunchScreen.storyboard index 58daca0..fe2e48d 100644 --- a/WorldFacts/WorldFacts/LaunchScreen.storyboard +++ b/WorldFacts/WorldFacts/LaunchScreen.storyboard @@ -1,7 +1,10 @@ - - + + + - + + + @@ -13,9 +16,9 @@ - + - + @@ -29,7 +32,7 @@ - + diff --git a/WorldFacts/WorldFacts/UYLAppDelegate.m b/WorldFacts/WorldFacts/UYLAppDelegate.m index 28b25ed..d6fd8e0 100644 --- a/WorldFacts/WorldFacts/UYLAppDelegate.m +++ b/WorldFacts/WorldFacts/UYLAppDelegate.m @@ -107,7 +107,7 @@ - (NSManagedObjectContext *)managedObjectContext NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { - _managedObjectContext = [[NSManagedObjectContext alloc] init]; + _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.m b/WorldFacts/WorldFacts/UYLCountryTableViewController.m index 5a60765..8d0b389 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.m @@ -82,8 +82,12 @@ - (void)viewDidLoad NSLocalizedString(@"ScopeButtonCapital",@"Capital")]; self.searchController.searchBar.delegate = self; - self.tableView.tableHeaderView = self.searchController.searchBar; - + if (@available(iOS 11.0, *)) { + self.navigationItem.searchController = self.searchController; + self.navigationItem.hidesSearchBarWhenScrolling = NO; + } else { + self.tableView.tableHeaderView = self.searchController.searchBar; + } self.definesPresentationContext = YES; // The search bar does not seem to set its size automatically diff --git a/WorldFacts/WorldFacts/WorldFacts-Info.plist b/WorldFacts/WorldFacts/WorldFacts-Info.plist index b8734be..528a05a 100644 --- a/WorldFacts/WorldFacts/WorldFacts-Info.plist +++ b/WorldFacts/WorldFacts/WorldFacts-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.3 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion - 11 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS UILaunchStoryboardName From 57621481803347cc4cd70230d17ff1dba42ed246 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 4 Oct 2019 16:25:11 +0100 Subject: [PATCH 094/142] Update AnimatedConstraints for Xcode 11 --- .../project.pbxproj | 39 +++++++++++++++--- .../Base.lproj/Main.storyboard | 30 +++++++------- .../AppIcon.appiconset/Contents.json | 36 ++++++++++++++++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 56305 bytes .../AppIcon.appiconset/icon-167.png | Bin 0 -> 11276 bytes .../AppIcon.appiconset/icon-20.png | Bin 0 -> 736 bytes .../AppIcon.appiconset/icon-41.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-42.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-60.png | Bin 0 -> 3017 bytes .../AnimatedConstraints/Info.plist | 4 +- .../LaunchScreen.storyboard | 19 +++++---- AnimatedConstraints/README | 12 ------ AnimatedConstraints/README.md | 16 +++++++ 13 files changed, 114 insertions(+), 42 deletions(-) create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-41.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-42.png create mode 100644 AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-60.png delete mode 100644 AnimatedConstraints/README create mode 100644 AnimatedConstraints/README.md diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj index ff20624..1144619 100644 --- a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.pbxproj @@ -16,7 +16,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 5326FC411B0A8FF5003FF69D /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 5326FC411B0A8FF5003FF69D /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; 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 = ""; }; @@ -43,7 +43,7 @@ 53D8FD5B1B08B9E100265E63 = { isa = PBXGroup; children = ( - 5326FC411B0A8FF5003FF69D /* README */, + 5326FC411B0A8FF5003FF69D /* README.md */, 53D8FD661B08B9E100265E63 /* AnimatedConstraints */, 53D8FD651B08B9E100265E63 /* Products */, ); @@ -107,7 +107,7 @@ 53D8FD5C1B08B9E100265E63 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0630; + LastUpgradeCheck = 1110; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53D8FD631B08B9E100265E63 = { @@ -117,7 +117,7 @@ }; buildConfigurationList = 53D8FD5F1B08B9E100265E63 /* Build configuration list for PBXProject "AnimatedConstraints" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -175,23 +175,35 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_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; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -207,7 +219,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -219,17 +231,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -245,7 +268,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -257,8 +280,10 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 2; INFOPLIST_FILE = AnimatedConstraints/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -267,8 +292,10 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 2; INFOPLIST_FILE = AnimatedConstraints/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard index b93b4fa..ce347f7 100644 --- a/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard +++ b/AnimatedConstraints/AnimatedConstraints/Base.lproj/Main.storyboard @@ -1,8 +1,10 @@ - - + + + - - + + + @@ -14,31 +16,31 @@ - + - + - - + + - - + + - + @@ -75,7 +77,7 @@ - + diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json index 27575b9..6fe8d1f 100644 --- a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,17 @@ { "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-41.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-60.png", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -36,6 +48,18 @@ "filename" : "icon-180.png", "scale" : "3x" }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-42.png", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", @@ -71,6 +95,18 @@ "idiom" : "ipad", "filename" : "icon-76@2x.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" } ], "info" : { diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-1024.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1a9de7f6ad69ba2280fc5250c4368846b7921e GIT binary patch literal 56305 zcmY&<1y~ee7w#-6AfQsx7<4J!prUjLEJ&l$of1ndDk3Od(x7yQur#Z5Nr!YJx%2`H z>>c#~|9kH|56sN&%+7q@srS6+d?A|Z3Z%qz!~g)0Dk;iq0RSF&hzDH50e8Cr4I=4BD`AM#Vi2Qr4znb94OH7CCEBwQH7XQZUOi?TDt)G4KUz5__j5RF4q@ zBoQ88_PgJxEUsh6Ed;z#T_&s%F9bdClPWBRsCJY`bOerM@=Wnj@7Ehc@e5MfH=3Fn z(GngS@$Hh*4EfQ~wTV)uYRNrnj*e{l!TVW%ym_UtncwS%>G-wTk3wA#4EuA;3h_Z! zQXI9}yQ+S$j9HiG%JD3QsT&?77jv^+Xy>@&*n)k#rk8>Q;DiCdYV+S608szimz52T z)L0R@K`Ff07l?5p<_y}s)~xrdO=1$luC3@4{Y2QcYH1DHT30M3T+hgE3!#83|Gg9W z>Q+6^1DJ3oPMEEv^D}zOd7>j$5#4)vdh@*z(o1VLeHH?Y9^3<8=*Jk45!U>RS8@Zl zT?jlRk7ySHs4_7FzThce9;UpP(xKn4)Rjp-l+uD+cFP5}ENw5r+5OE)LVFe?-a0(oHtim z*1b-pg&_0=aCq69tT?j`gA8$T;%~(!2{0X|tQKEisZ*$$$ycRiL-EJQCLb=+SRcIE zAm-wmZTR-Itw%}r>*u$A1DjBF<;oX9j0wGFH+gm3Kya zt@=J4g>8^&$mY7bQ3!9D?Kg|+tr%|MA#u;r2xTr&_<-61RG@NMr_|sn?mMH{vmU%E zM<`Sxqw3nSKG0``ILsMpYS$F|Q3v|r{HsM!C_ za@hbN`lk%Hajc@}=T7WW-hqWdQD$*iNiYMK4djV!l2J{>pR+Pn7A zMW>`+`|QrC0lOlXz}ueHcimxm{J-dDN(kQh_*HqmOhhvk15N?!1w~t;mg|ks~ zG*1YuF(;n~pVNrAO9amw-3>n3r} z%hud|+IFi-dW^fDYu_SoMXGYOjZ29YsKO4U8au0=`O)wwt=puK4<}09=*;>h-!nse zXQfdsUcNXX-*H7VF=y(WII;$(m5QYV7`+epl zrTnHPYu7}0roZI#K|b}w7wB%;2@SiC<5dE}I!?UNnxD zZP~#H&v?e$Vs7K?GUD%!n4u!_Lmjl(CzVGwN?cJyV%80JggwZ;kbE28Dfma+t7f^n zCg-!K%AD9tyo+@+XZdBn3N_l*@%vBok!3w}J=t7PH*@)%oJjK(|8539q~_x8l7nJgHB3k+z7if=Qd= zd(WWQ7pKlc$3#p}PIrM@xqj^A#47#CqBGro>M8U2uTAD3>!Ck)HB3fIU|%OTwPKWs zQl27`??gyYl>NbsGc8j1<~$y5h`pOE^_@aa?RqN*rBK*DjibnGX874(6PE!hasDf4 zvt!ZmJurBgJrvbWs;77W944rE=WNhY!1O%;Ailhq{0-uIG#Zk|KFeaB6eK3!;ek55C;T=|KlGG0H64Sakjz$5aVeZ1vS7+Nk>T zMU#(2mzG8+-lQ@LQbj@w7WY%=PIY*s8hKID+S{fOEs3;ellb?rhO8=!5ULTaXhOPa zyr^z#o0+k!MfED`ni5{>rx-E8H@8xeY$)(Jrf|}Our60WzC8n>n0wVSRqd>4#;dpP;fQa8mFSRub51~3bp{FB;4bT~dC;g%K2Ucg zrU$1>`Qw6bP3MgNkz39PvPgX6D(?M_h2Y1R^LT#&N7>82mL_*w^IARfSNch6;3@76 zmp7k59Eij*BPR3Cnmj)8VYbCH(Urq^N;D2mvCZJ;#e3%4JVT%QosZ#>#B_Jg^|UEO z1`*{P9=*D`*Px0yCSGMkbbm*Lu2B`GOx&}baqE2cq4f8nk;of!M+=Kv0jaK!xq6~& z3?F7aNh1-Bs{8MPQv)ht&H8@~3lqjZQLyv zDQ;U%hc1MzPVIeA{!;aaa6Db8jk;tu)c*t|KTu1O8Zi< zA(_b^LvsP`J0T}$BU!XT#L;6CFAw)X`1W@LwHUzb^(eeL`7c z2w#O{FUMmg!xPkk#&p!SjUD$#X{>QGl`ZvS53mc{K!Xi&3qa!&a^hHebNvkS;c#lB8fj@*rojka^FUGu9IaNmY_=-o;o&`-Iw zecy;`<$H-gt2R{YAr(i^n2Ol3cyN{10E6T^S`)V(9!ak@MQr>RH@$-0$|3i`_WLC)GXr+Icvcc@D`--Fm6H^RM z=Iv{Ej^6-ty_9wvCl@saYI;eGpXwakc+a(`s2`TsyQ!n@9?kljBhQ6Y3vv?}6}TR~ zZ@ZlI+^n(MH2021ExL%c)ZV*TEURL%RZ_^ieJr1QBT?IwcxP#|NNTs&9_BvETv|U~ z!~W#vDT(m@dvZ7ikme|Mo-5L-eVi{`dhn92i*x$mu^GYH0`e*!5d$?{9l&Yqkk|No z3_5OP?eFU+Krid&ZTtV?SR%1Vq8h%vYv|GE^PX=8E{+p#Q1VDId3%N$irGbQ7d@Vm z3j93iAQ+aFTw)s>P?FSoPqT}zOJgx^%U`FjAZo+oiN2FnV#%E}1=fo?F1(?EF|r4; zE{g@9$w>ue7nBT#f2#i2G}^1rCDjV7I=z8Xw%aB$(NNZYu03oQ-fhqB7A1$7$|KDd z(u;|pw=`1TJF@qqa;N$dCLC5r6N;{TxVW8_O008eIATUqZu6x0xUoP;f~O`yri3 zZ?;_#jZWfsojKo%DU^mQoo$cbjTQgNNL6H-*zqzRoC5AE2AK!KNqJ%Jd;-Mv!i=%s zsumDB9oI>Yy9dR*ti|IgqY@r@8;VM&8Y0%S5F()?+>jo5ilXRe0v|{A`HIO&Jq&Is zNrr{+#Id5vj^JmI*=aHpO!|JJ2V0r{%85YJmf6#R7 zC*uD_3F-nA_4B(JGx&PD0ogeet5B!>66zx+{HSg>KfjAtE_Hry_B^Xv34SVfW5s=; z?dKYToMBd4pVRnBgSW;5*V@(FM;vMws>r>u(WcBdRCucO=F69B;$;2TEL_!E2luN_FXSfh(W7o1(T+z-^ zbCItOq#fz4dr@+K|G*g3^y=tww)>&W{qIV9v+h{rr~}@Yx{lF=g5a<9%T_q?$;tWa zA_dRli6&;q=+85`GaYxdEZnUX7#-WxW(b?E;cv?umzTss$*S0>BpRZNsYZJWQ^QFp z(WAfajJZo1SmNmZn$RiF9FrK>Y-c3rp~PLfJeiRnzHmN=`Ss>1886(WxXK^F%@^o4 zfrL6$E#k5yCg(?z!zWLHJi}zR7vZyna+A!@f3lO1E8Cwg>MY1 z1bv6}QvZ%x^~L$o8H<(pSlCr)Vlfe2Mw_=Lv!2A)oHc+-NP%P%eDl`g|fGjF25n%q%vyUP|3N ztJYD+DX}e9X`|$0o*PSVM;xrS*=G1qf#?ckO#x^8Yo|^j+;V^6$ko99OVrdnwMn0{ zkRu9gm0l+gY37T**Vx3h)Rk;*!^LhEVf95|1xwcYEf2b#b$iO#V7KJFx>2)E*+iP& z4CkrA)9p9WXgFcomjC$alR_JuKznzHfxb3uNNt>*axl-E{#vg_PGV_si=nFEeh|Bx z;6V#^HuS&fA`&XU**&opwLG;jnpN~|c~Lm>p0wNxWr(owivc}7Z3E>Bfa;f0EMtIr z9ELPZm5n==qv5b!Lr!h|>stYvn%Co4#*-GdK?SMJP6W~3yQIMdh?^s_CbbRP*F?E4 zyQv`~xgh$*ayiLT?_?pM^x}UUB$$Q%H%s|@@SYrLFl_gisgMB-|K%DlUVwtHsk%Ne zLdenxt5vOu&e6Dc=?)hpNBVFR+(_tY9{ejlwK?7*U zTT&Adf2kHiIa(Qj>4p+-i_TMC@7k|3bQFlUXN=!s7sxXnow>(J@*Y6$TF416z(MYcpoi(*U-HYG0n(1YpNNW+`XgJp{)z6|2QJk}$;J05uBPj$BMzuD=0)mftCv3`j<)oGvUQ@dL^U#}VPm)-3|8hv2V4ur8=FHW7S`L7Wkv8s zqAA)4atNbt;>Bue!a4h1Oj_Z*5r8oBg1S5tW`*6!HHG!O<41rp{hNYaS@Dg!h{@T1 zqD}L2T+&0Q+ga8hr=aO&D?EFyE-2g5!~L(|%`U-NC3KX&_`x17Tp2OFSBGJeoCSYP z3J81};`u3>EupIJmGrJ(B6Le;tQYn)e?$EZ8g__?AB`I`8)Tj!R@Uo=HCJ`19DSWj zRW)ClVsR%K_%)vZQVGjayl25Si)2zvnk!oVN3#yc>E4budOI`6h1gxWCS>s|a_u=n zv-2GW((sNJLZdzIlR&}1RT+Tph|L|7^NCyz^X>W-RX2~`@jaS}NE=8cn07r&NRt{{ zB?Ewy;fQn0UUr+#tB2!--#p2FvFd81m0yn`EVcEhF-)@X*?exfYQqemU)d_(WquJ0 z%Y51#y6vgb$mMi9Yjc*ESPpCpG>TX(A zDr$trC1euolGsX^b?(6K`5_pZ%(KZ3ryDZbIKNTs3djH^Zt0i1t1~DX386ghX7f;MvRZp;DNLNQ_SeS;?EThjdVoQl9N}68Y$qmwKxF=kMZCf(_8)xg zV5WsvCy=lu++FVUX-ny*vqKeKJGkk2n&kfvu))j**+<@VzJzY<7I{rYb(r|XjfoC4 z;mq?mG058_x2e7gGFGn07q_`383J9obu8(jb`6<@AkVh2%N{5j z_EpROX2tWRC$~Pfla~q!Gs6!bW)$74p^58{gZ0B4Z4~Cy6f{o$q?VpK^<$H5WdPgy z(+!XQ@S!k$yCaC^uZ*R!FEuZ74ArMz=NaVg9r*!2!)ep*IIt3QK#YBia0mE#9t z255W5gM{D){D|}{(dj99q=OfKe@qG?Ka5q{u(rhjzEXu0vfzN zlccAqnIT9D`U0;0{SQZ66k4P|Ao+Ce{;+?SQQh~Jx`R7kSyXrFPPrX{Vz`s*_x{H> z$}-Nr&y~a00^OJb&J1}XWSdcOqS9VN*|}1d!Xct4ceeTJCoiI`>Q;*@6?rO|v0tbg& zVSVb^x?QmYCzZ>Qdsvxy+y`e2Sp{PazVHqQvmoAV^t;9sXR3)~#n|j31Mg>5akaX- z1<{Ts)~6-CeYd{Q(GO1lxe4{_F3A2zns<8)BVzZ+ZWlq%|< z|D(vI^L{smYZt=pi?5!tAr{Uzc|zNcsj zG>63R7oyXg6uR70rmEH&5Em`SyC5uzbleP3p4GxzcUk|eC3wh-ss8;Lbm*kX!T?Yf`X^vM zFvfvnoKXs6*Wb{(3Ia)0ArzNv*x=asGV|=wKV81fnLblP;2I20%=sTzw%&T z+`G2LYN#&jA!M@xG)0?xREMSCc2o<)yi>Oqz(NB z=m*7&=|hY@W)VxPgc@fjex((+ou&eI`UA#O`Hgvs=UQ6nUK+`yF{Ld9by!`e$ZR5) zL*H|*^;L{ZLIw5ls`$Z};pekj*%m{yge*mGNt5}(VY~I8Qm zEmr0ZuaR2`P$i33k1D5-@#(P9eOrjO$1w9>^nNI0k0Gd6{@=xvA#eMsGDwp-!SK5> z>(I|zd<}hxwF?=ayvqK+0w5#+qth`iB1PX-{AQ!t2onHw_Tz2EsIbxX-@C2+YTUxq zw9Z@mc}|shi^u>gFPdh}*R$VaKua~+Wuz%J>-k_b#bx%zc~YF4_oRerf=>d0mtC_3 zwi-$qz}@i!^b`je(^EeyDWP9Qh&`^SIaimqJ7ocf|Pevmh7Q5gS&JF7#f2d#a*njQ>1&`!%#d;9_Djzbc#k_TdJg@?X zh4ZG*Vs>Yhb|+lxfs_vW^;#`H#(iN_yRC1b0FAo@b>T*S;V6U9<7zm_pR(40H?jG4Ra}m%smUj;U+Ao;u$bsrD0S1_h}WWvSbf^AjC;&N;Gih(m4rlKS8TbKJ*s-5 zu$Iyqx6hLe1hmP8{SJi^5VXZDPlW>lb>t5w%S&}+dJQ&CRK_`abghoQ|1`m=X1g`P zf7sBT7afp`eV~;sRyp~5`=NEcu{04LiQX$K_XhUR*`Nuc!@A;O0*|k{kMUi8SKp?q zyQb*68TB!4WVJIJ3yWt5Qb1Ki5`i3S3b3_RjoqvWeR#G>`0Jt#RXYQi#a<9OrYXSAMY%8zpICwYjn(y~e*H0vfp4%N(uXn82?&AC*%#t7Es%3ztQ#%&GQl z{69wYBdgL}OQzj^XjNP4?md%r?XU}2e%mi>8%S4N&m&qprFKWC$^V6=jG|^zns8U| z#!PgF*7sR_xGQD$=cIa-QCZMjO}e*?^%squXqI#d+6pK;hTleaL*-sqnoz-d{R9`d zDzj=7jr6m*H!ZlbvZZi6^>J246)n?VI!pX?NP*h>+x>{EM_@Zo)2sG5%rr^$f&>l( z@M{TtL%7d4!*po#Jcm)kWrWhX7%fieE($#VwI&MV%&Sk5`m_ICt8*$0Y$eJM@Hy(%S=UL{qp*LE1IL7(=w^4D`JwN^*f+C(@d zGGRTRQrjXJ$CQTmPq(zBee9Jf_%DrB`fpU!N6cHX@>?{R*e<*9XR-AQFei|oc~Nbm zjCAq5%Q@e>3Kh$XYWrT-SSWcMa|g<>r1P>NFT%I@U4yD{n4I?tM@F}PI{3m!uEk4* z9kIUlZebXLKjz6@FlWKL4q77mlF0eXHg;Pj%*$_of{6L_&<3Ag5Z)VmA}#vYcglHo ztb)N)_>8riESVBa@c@nv8d+b)eABn=`^ik@IBA%=6-)e%F7k}6xRv;b2JRozl)I01 zP2#@Zm#NhKV;ZmkIg)xd!rcvf8dRL`Z}!?LZNuElFuLuUzH+W(RhZMk*u|Rc!Sq8B zM@OGOSrK!d-RSgFxl`Ri#PIABrk!9CUCAjSsy|abPk)d{NTx~e92RjlN6##o=ot}z zRtt1?K5{8kIg%RQ%XFp=xhAy>d+7j4^k%U+{(NUT)u0N(!zXE)MEYRXI;C%uEKM?s zBU=)O1b!P(y}hBwlE!HQG&gA3Ud117+e9!}ZQEEA%N476#FEWfi`NAM(|CZ&d$ngDE2Vh6NAHXQ1EVLB6V znWYuCeKH?$o(*Oc>OjVaBx>r6z3qnrxp!xgUjtHd@16h*kXs_nSZ%9PDY%1#?_v1x zj^Eb%N)4Z{70(a-0GtOmT6ZPJme=RD6Z8I|&^$E!jM1KveLh@s!NqAZFpnS6YGbA9 zh#PyWc&H{7zO<~uS-)Z(Dg1~%+jmNdi?x|IOjk|i6bh@J%6ieQdsC(KVxf_`jo#gd z>MZ8i*yv(UqPXVx$;&$QjPRVQQ{T5X2mv!Th&w{1$^W{7w2JROULu9iZ5{gUaJYmSNnFgb=M z9_OMw?+x62Tqv!*c=N5*7z;$++7T!(Tvw(r_KyP5H1M&gIrPO@{NCvm^@20sRswVl zd1Z3TRWM}T(Sv9Gp~|?|q|wOhjFJ{#o*wRVRd0zC3uU||+){t5*YvztKYjJ0V`yzD z+SVkvmxyIWK{M1d{#Badi%c~VHHGJqhO{~xLwRVXXuHT%pCEcay0Mn5cl;x3{V3U$ z`FHG7LbW^X2bbfb(`OY4GW6DQM5#H~C1=*VbOgtOt)#NeZ?lNve-__;_=w6Yo>-M@ zL@(jw?3^qA)fUSr@%;%IrerII>q^D14^JCtfGTh}RJ0jycA7dTZ}uDS{=!|m=t0#A zKgh#rwL$}XZJ#Rv;O&mWkZ^B|*NCkzaE7!+VJXn*ue4W-G5jZ|sJe@ZHa7ww^2@2} z5FuFVO@R+vh#dMBh#++QNDI2!<8nEC zoTsB|hD-jpBMh8Cc>U?qn#v~vtbVs8($7@HnkqGvj*-Ay_+s=1_| z+l_CWIIX&Rpr?FMdJx(*=zD88bF5|h>)sw~XD{?#rKg_*7nrGzt0KW&22DIffOQhy zz9#*3EC_bRU`TE=;$H4f~%>I&kpV>)t4pV>QX;#Qf}`8@T^D2@#)+@Si!i;&u8R z@PjM7sV^v*N#b+~oqBd*CG$YLaO=w_VVf`mO&BhrFZ&SKAAr1Sk#oV%yK4kF+Yp>{ zoe7(=H#zU#`Q%Fde-oMeB|y-JS|SOMDMd<>+Z#R|KzQ%bq)V@~H^&WvwbhR}AW7KI zAhGH&ZffRczP9tpp$7+SBLJp*DVh;?K?s!8ybn~1@54OP-t@m_rvn}Y2bP}#^QVuz z@RC~baP0=%{g~7|Ih%b@K_c4m72If}lVj%DnOUvd*G}Z*9L;gUmrUAuEF9JLqT_UO zct$*##kn>?^aVEgV7XFh-0_*C3zvm3A8r;#1^84N#4U=H)P(T@Fghl z)d5?1sxqM+TghKN(q~oc&qY<0u+P>-4kZ?A~ZKv+br6p?wZC-YLS)ya$xQ;l*yXxmba!Fij zRcF_rxY^Hl7;~``$C#pbsar-SClm^f5KdulV+=8H(e)ExhK~WrC#Kjj@>!qbc%x&Z z?<>?-yfbhGZ{|Uwq4ew0)Y#H$u=-hLf5RjQ;W*^B9@;a4(C20V70p~V7sy^6nx-DL zReAVQ;iaj+x=s#^WZEHgmcbod{#L_c+wXNj(dqG%=5U-sdoQU)~3Mo6r?FK#!_!$V`SF`C0D=kZIq zWP-%~R{C!iu*u+AUUh7I0CrOZ4RIFq_W8B(j(dYtN3$V%M}GnE-4a-zd_1{2S!m-M zNCN%-q3MH@H%RC?O*PL{i+}??&t%4&0Q5XoA7qMTLm~~FIEzE;Pjsw zKB6tv-r4k>kS|2=3CG|R-wn^rTHcV3*DJ_%Uz~~2?kEgGljE5A5aFG1ViEgkD z_?>#G1O7{^Zn`)39PAFt>(%Sm$|?HA*9)(bCe4?9rOrJe&Fc3g{}sHEgc&!1-D%gQ zjYgWg!P)jJM7ws_Kcx=s0B{2z#O%7yclFA5Nqc47r+$;m>=lcEne5+07FwS^cNuI& z?qF2u6g&zBL26w7@6r+NG#&SLxE5A>;4!e4Je&%=@}Gt`N|z7K7dQOfzj%|X*pzmk z<%PRaC7fbmbA?Vmf6QSJFSOd!@PJ({_JB73Ca`*=VRZSwd=$`uVwl!$t9g^rM>bvR8rO~+su@TBj za&0N_8QulFX?^7vYL3~vcPfNysUDYP;Z4V$t*U?TCNqfQEA0QJVe*R6Ohf7*+LJ*H zYudQ5YVx9T;`0v*R*&Mlva>1|iZAHKvbkvYo>l*R$7qle@8o8a3U$>hT^_m574RZK zxfe;%TZ?Zu;;O_Cq&f<(6u$1}vpxwkxzo>QdnGa5x{bgMe zJMfDL$r685ly9HwIUlHZzG7u+!B0@q=#Sy|MdyYaOVMa*v)u0}(f}42>6~$Hi1d1u zvHh0+aRoNsY&W&~AQRH1cKk%s?c8wwC0x@76FvUel3{zn`J_gg;;-K(?ZK=943R)R zXo|58#M9UlqGq=aT3u35f)n;E^eKkdZ`qCaKOpH;J06IcJ4;5SIVimSlSgxL5{? z)25D>)7Fl$D(r_AMXytRBuJ{POyTp!$>7>2;4HoAl}TONeWzFq@*-I{zu`m-k~g>R zceL*0J^tf>msEX-hK(BNr_UhPZ(KWK-;f@go*wb(UZh>+G2}LBLmG!vkRXV|P2Fx31+L2Pk{KHM&oc)F znEs-32;>^>hW@v5oz9)c4Dz@S;y-*$K2sO>iTCt0s+6Pzhvvzp#^RJ{L=k`H{}ZL^ zt>JB1`0<{1brKiHaG%AhO=Dh0dr$2B#5GU$W?08M+HVCNuJ^MXk z&*E}u4VB>T>^-e=HWb%rYOPWu>yL~yW&Ckgu2=J2WV`_!4960pVGkUY9E{u9eKwDO z9>d#46W6_KA7l_)zbwhKX?SZxsPtanMv95-=dA^n)yy1jG}Do#h!o6vDalXr62&|r z`iwin>9CLOy<_ps;s7%hy}OhAE8u+H=^+4o835@+07Q_j z1dzhKe3V$(OgA{`B!*xe$LG03$BkL;GA`q!6bO~rF47a!eU0)=WYsw8BnZ`XG|`rM zF8?TQN=eUBh{olD*j*zYX56Yi9E1*dGMq!Nsg3H=r$|sb_c*mRc)`F@>vQhti8(C4 zp{<RQ;Nytam;>oL|;^8sjK~vN8#%@1teQ9`4!g&bpfxTGP@Y>+caD z`A(#)3>ZM_w0{=xq2-@U8ZE&9%q(swx(4sBKdfw~$Au-%<_Y}zU-M%w>eUgqo%?1# z1#DDEM*MzZ5CKoR>*aX5%{^abN^|Lp`cOOj>F!%|t*H1nIQ`fe)N70eo5+!_7iO=} zKTnz8DQ(?lY<%siP+kAVv?3Ni5W_6H;JG6<41U54sBf}Wk^i_ta$VD^j*gbZMv(49 z$VXF1=ouh&(u(lg)n0o+G+!_S8s{-=b^VIE>g`oaZtDCtBNG$a#MRh9F4r8fEi0bD zEw^+GMkKd`zEPdO<^0(S>`&-@7&l~kf0z66aP}`B{kM0c=<9g%=KQHH*+lKyEqbt~ z4^kWw{RV6eLOFr^5xMnqQNAS?Qey_Nk9VAWdN*)!rrJhEE;GarG=)oc=;%;|Y;$R5|P;=cyk#d7hNy_if7ld(hi;vvFmjVy~IBVy#HXG9Ezm~dpD`vSX zw5R*IB7Pceji$|Lmr&lAK)_z}MsW`a0KO<9c$VXzCHi-Tj9Ki6+wQ+l!f~*3u1yP{ z;gO;E%d}C~TiPEh z6mE2L{`i!t=A>4G|+>&o44_P@Ehn2V$7$-59jHb$nj5S{s@L1`^UUl=fQf2g! zcsqLcj>7mVh~dlJ8gS3cZyK#70564uS(d1C{Mfsz*588PuDI2h%9m-l#3^Rs z3~j%xmb7qK{Ru}XrGGkpuqCeci@V$sENxs_h$&{p5FoB0`=jKX)8wOi8o8Pnp(MV3r`B1nqOj?FJXiZ{*le`vAcWn zt1@zzK|aRhu@sKtd&)U3$%LQORcl>T8erXik6$S(JpZ$MDh?rR^7MBtv^)rfCA_(Q zt8^`4pq*ew)i`utr$-InBeJ)zw-V+JE)i5)Z!CPNT)Pm6Iw|Z=wLJ>7bDG#A!L}85 z@RCtY3PHEi?q1eaC2ZLhYFT{=-d;S@HuN}%go{VGaBMY~aH|g1dia-4VLitKo%pg# zII?Br15Z6U?kYA%?|Hdb4Bk-(#t1=JROW`xuBJAlvN&oKO-EOjHqU@8$Y~3a+!;*# zs>H^0-R@EbsD+S9QgRY9!{6WkX8V(nWtOOQa3;bZ)3GBlGlp+eiT;}2v=#nZMpYov&dWbe}f}+>Zqba%3umOnzCZoAl^^c=M-rQuW&_#Hld!v;*pV)I_4Ux9-r0 zEGADqXGb?3qtY)<2i-B<`)W3FQ=hlG%X4gw%Za~-hE!3Yy6)>bJyfxuXyI|yS*%@Z zph^17VfQLAh^sGnx*MF_u;*9{IuWI#BEB3mVK-r>(&)livgK}@*|hNn3(i;}pTzpa zji>hqJ0+aD(rHjj8qJ3@qQ+*taN~OZQ;e0Li1in{G(Vpr<%Nho-wS~Y+I@58Z%Cm! zn>@Be?G*{ecRH$J2^kJG z_pyT%EtZ&I+w=^sXIzoY84;E?!vG#*D6R&x#OmY)je(@u+D?!EW;5m<7`KJ57S1DGh#9{#1ZPr`LM*xK=LCj zhm&QNpbPspDCWLEcx~Gia*oCS14+C80y6tJv=Jhjejgz`CV*Gp4 z-x(N|E}SojJAFglJ|1%cY`7#bLu~Ac=+J8TAijZMZ2H8hgmx_ZZ0FkK{T&2l36Q2-`fE)*p^!22m0I1B+XeZi!*ny_V@an$W8b;N_g`^G3O~Ek2zd z&GDB0hqGKJokTBa_4peL&4bLRa6d&;J${l3e`1<&y!#R6sl4hqDIeEZO=-`5sy42+ z5u&b3o^8IE>e@ouR6w5|?CT8kv0cRTMStVRUIorQ$oN*{axQ=U#g{M(CwmDT@r`a8zJITQ4uJ~@%M|>4;&H>MGy-g9cpDL zXQIMj$ehN{=1S-53jSTh3l>{L zI>3CmXBZ<;NABq+sI6CK|JlTiYox_1L<5r;;WvkAuN%IOI(53-Vt+F&Xoh7AXD=3? zOkN>N*dre^@FZUD-Z@+x=0GrHDVNhs_dJ!*{;C`@{yiz6a6h(qEZ)L5N3WS7hLiug zb%~~{#jUw#Gq;Px3+Zg{7zFM>$lXmB96JdEQh5~5@mOZ!acqf&W{3^xdejO>0*oKW z&_D55)Wxr@Rh3z%0DA<*E=8Rr$J>dGs@8_mCtN(syW|+4pVpQ{?#1I0yxk>|OR-p| zRq-YIeq9JBLrq=UUid`+n0Y4pgoGuR)by^~jIX%@z2P{CT!D7$VlCq*#z0KQapB%X5 zQgr{VgDwj_KUiUpsN@6!oYA0d?7LpUg{uZhFUMM!qgfS)yYS@}a!?chCWokLmt!kt z*})uK-;-*$=94O?O7N>P@N&>&uvcG@&-pqoC0!_#3jh20D;;;FGM>#LXjq%aFYGKH z123DH3sV01cLP?4p zc0sPxtS+K5qVF!`nO}%O;phugRpS*(=6WYH=sq-@^Pm4}>c2!vx*w+7vpyxlZ}YL{ zV?&aCT%?jb&Jvxc)WEXup@WiuXp9!sKn=ayB`$8&dcW@}4R4t1{<59fz1?PLczyOD z65GXn+*iTl3y%fY+iFAlPb9qSoX0Z~Y(5f5l`n2gYBhUlC@FcXjSD7~2p@?qJZP^ z*#$e5Q1<^eLI+;Fy`@!9w_2@cnk!6pL%DjUZ!;HJS4LfM96W1(tzRz&lR*Jr<1Gr- zlKz}9^=)*Jj1z>WjxqR5r|mAN#`W{`#>KH)&vNxs0I&9I(Xs}$*@Jl+fVm}w7_JS! z(t*^=g1Y-lG`bdh7fRpM2`!gg|+;RG!cGgJjZ)J)f#_Z+?o9=a>Q!GKp zU0qg%19XSc58fUzH}&3_@MNBLbc4Lvu03y-S#ujDZFo2<@ly@9CsKNBq%&ZmR-B#n z>;tU=E)Dqb-Edr*lCPapMsN-P%TY}8ZUM@t?@7p>>!o#UHUz8#TN43D?O^J0lYo#u zGBQXJ$XtQNG+?(Wng2yw1i~8vYCf%}jBB*VKTQTI*W&3xzcyk?sQ3#U3GydFWTKZU z>Hfy3@<(2hNafbe6=L+`F0zEg?(M<~V?!-P?Y+a^ql>d{tIsk}Tnz(uwjrCL4^mImGr`Rb%b(}*I2X;rtVP_|5G#CcmQM$tja65g)Z^LgxD}OL>T4-wUt&Pt zgJowv?+`JaKXE!;oxv_jvooR(71hfcr@ud55t*0XYaC9tYK!P-WQU+XOIVvtE2p`8oBhp`t7Jy7mbOC0(rPFKNP&+U zh96;RMjL1S?#GrW!5Y{_k1k7@q;q@V%T}JL6$dJ6h#31?Z|nlZl_@SMlpZyZGxg9z zcze2$wHmuH=){0YORmOFQ;AN+;{(@l!R5Jy*Y-dSNvsxz+Z`MGSg#WR;L1F{LZ}8CK~FH_0Lu{Hjb z);lsipWFi>j?|PgG7e^njiH$pCT2I&kEUJS4(SipaV%InViOMHnit&Dk=cr#Qr7RL zOo6xkYrgpWcfm}J&zuD~`sz6N6qC$p#E$eu@UKfAb^sEyhR33*bcIxI7g9LqMt)Jq zAak;kh}Lw$nf*UReRWt>-4pIUga}Bdv`Dvvbci6`-Q7xe9z;n&q#L9|y89p{-QC^Y zeK+6l-sk?q!{O{;uQfC8JMYX|dpCPdO4PPeT_uyoCR*yNv~{RV#u}pn>0MgD+?PU; z?ZqjKRG-!XP~8Hj_8ct*){IK7XdWOg`dJA#UdJ$TTrL)_r~)QXLHNMVB`bZhx!}i? zAJe-x=gq~dw=##J+Z2jsr-O05zNN5m^A!kMStydLnfm0zqrEK4%GW>Ma z$xH@tJBPGSS*J3`Y3T6p^Iwqz2BjEKc5h&QK;Sp-5Kg0N7PnHb;BYdNW%Ia+tup0T z)z*}cGOgxEW;Nd-J#Gih`wf2gc^uO$_GiCy3y)Kz{8!lDMQ(&m4d^HcjiGPoJ6IF5 z(&|SteGe^=T5M4Jr)rIm+<^>;+#>)P56Cb(zuS2=0r$CCSdiV^XiDujkUKDo%21D8 z#lBwil7AX+FJ%KNuSlAXcQF(*qs0y6x5jZd$HVO$Fk_#P7QhlZU#*v zVv#C+TJJ~}-Zt6shn{saGsTZwSTtFVNwOF*V?3s!0V&5t+ebx&$Cq%x)S`XQ)4iMB z{bam1hoJ)&yxp$Hh7M1BYXkWO?W+rZdpovLRJxL{Tm?xne?-|g-Fbzm29E!(f1KNP zcT_J5%UqN2lWKQ*)ebgpW|wq;`3S-7pm8Xej^I%emD zr{Z5|HIG`~T2HSfw^5x^yJUaDu-ZsU23<%Ob~#!~IdwC*6B$zOC9KuhH;w0I`D(6j z-l5(=w}J9WYb=11VFImB)iUNJiEOG+dpsk_D?~}?Nsb{?I+2#)wH5qC*J>5m7xrwJ z-fPLM_3v3{a3ZM=g&(euX0rdc$Ifyy_mTTKakmx<^l2-N7pfj|3=fB!0uv}}qbXgCg_6&fwiE6;#W{w2FC}aK%qEgeJ8`rn2budQyiiGPj zHAP!c*m;P=em@IjMWw}-jUVT{sK%yD%nJCRyUc#n;k>cP$V3cP`vVT;w4U%a0gjve zsc%Ju$kS_gKSo*xGxP}dBMm(X-Xe$S{^ps_9cGSBv1wBqLdW-W8xu6IdNHNTqE34B z-*DYzgrxQ{>0MKr55;bNl+O7vSQ^E?$o&T{O$kCh9usVhnfZt!CPlm-tHWe3j-rKL){}3x=cN z&3HN&)%)6SsxR${BAaxE)a^@~EL>E;`@Z-%MNw+eTz^VU`Hfol_bA`SWbz#3e4M{w zBT6z-wzeB_QfYMFe6&E)2r^Xp%q|h71j2cS19eB6O$Vy5!2Xj)SHC<`YM>~%9AsiU zPnXSJUotx^T&-g8y0i~&dCU+6F@hXQ-~WsK)5SQM32bKT8#^Uz2x3l+94CGgcU=skRD=I}}#SmT|Mg!*EAKSaMMeBZLkH`YsDm)x zLvBXD`RY`S(=7~Qe-|&WFCO)Pv^CG&8KLd;+Rc0Lt&*2_RqPLpRUD;g9U?h9h@#&} zdZg?G>Gwm3g4F=AYK8U+PBYy2Bb@9#iekg@C3dimN?Cq)8sDWL5^DuE*v{tEDa^CQ zk<|)U_39%1fO~l@^?sBnYtpM3Tu@oLBY%(^mpn6lHnj>)-|;0ei(aQgEqL1FebLqZ zK*4)((a&>|`Nz1{z^gq+9eWwm5dFjy0^BFEKArUvAV~B69B+n*Ui^PsZIUP7kcKlEMaRi zL+gyx2C+0}`8f8oNxM-ssT~|-JPgvlN2pKF&|%PNTRRH;Nt#Svs=BLY^;-4NxirNc z^j+H2A^w37o*(BlMW5^l2=N7^P>;TD0n9b24p@=F4VVSkzZpmRk^X(C(BzMgJ*V8 zF(fBSfP&#jZ3c?!26c_9slDEPg0x9HRcVJgsioW~)wMb_hoDN&jKA@!TvJD{F9$bL^I4{X`88mNT|n&70KAN=E(j2*xLPlUE>-wP1Wp_)TKnw>qjX3iOF>DOh^~<6xp0Dj zy4R(KLG#lY23ccy*C>z9O79YYVi-I&-Utgu$z5&yzaT1ys6a?xp#))#|Mhl6aTK%(sjj6gHwwi;rhdYyn=J6NWIi_mP zcb>M~oiE!F0T_5cK-rw1fB2$EeWdK1wpz3nX-r6xEjgSdURa=>YdUg(L_^wj#s$}% zEC6p{P>$T>57?vf7kwc8yH?2$1a-Iw7j)rrTrd82bp#8DFS(_u3VPvC%SlL)^`viX z&~8aFwOTaVR>TZX8^lb=^w&d?+)j^qn)Mk8Cy~c|(QQ0sZb*-PMQz{4#To@{S;2{^@~27FgS#`Grq0Jsnfs^q zzMMaCNQMu!iCfJ-i!N)cO~N|n&zOg&$e0Z!j}UwE?mJShB7?TuCUqYW<_d8hBzyY! zy&xh3wlbYkZl*4|Sh9%Y92;Y!Cfsnh)$2`Jx3qWYqijf{?T{%a3YmjC7SbNoX)+!d zF63#K#)~qFdg@|0)1KRKNf866)}jXH z`ffIH}9j$-ITf~>9!?c9b<>jBgQF^V`xNU|1E-~Pgeb9P~0X|=RWPGs) zi=XFhb6a4dv)hD07Ho(vf5QTO)f5f&k(=fQ8jtwi*8z{lo{nZwMXH+huiMYAX*`^R z8XjjY0pJ)^>+b8Umdc#l4O{s|<9VzFr89wb*KEGcte=^gKR?F`(zW zTNstHWAm#{+HjwRbC7^~wL3t^tKtoG*r}pu=54K)xN~9To#qx3=c-qS1@0tVh8%-( zw=u#H>*{G|rO~Ihsx`X&c&@$yj+(v*&3PpX^Q?_8h;(K941&Lg;pHJ;LjDOO$T`xp zNBJfq*w#-6fn9K8k8iuHN{Qoyf@hZmo4)>n08|m}wztWoseQ;2ZTE|o`-tDg?eF3&b8!9jwe_Fpav z#0v`xuh7*MO{Dff_ZaQPD#K?(JANB% zi)Wq4*#-}Yq&NbYN=V+3@FE?7xjx(<-3BJ#6Y+w+1W-`%dpYSoo_c$ftw=Yx)oQZt zsn3LyI_BgKxW-sA{R3NQkm;mI)Z*bOBKOmVNx(=wTiTHOz*YO0J2!k8VK@t#LL!Mv zUJC~o3%$uU9o>M-ye=FI7i-V8>+dw=UrM0N@;b!DHI~Mw@&j$G!Y!gJ;wmcEoHet% zkwD+I(AAv)qKzqlLwvW$3b)gNe`6-puW#O zQuoCjNVsCgyrg~ky{Uup4(pYsD*5$xdTI;~GMA#4#F$#+HqnKP1}DowmZtD?HAKSS zXjk_W_x6m>l9J)sk#tXsUcOl_T~clAldW{VI!>%|TTFjc%ui^qmG&o5EV7$nO{pbW zPx&GHT3q|!vpg$~joaG$)JicSd9lxxI}!(TK4XvSPLNzs{H_BuQ)gOjb+_16eMX)0 zmibVmpT*Eu?};7U zo!sWCIJa82KM!1d@EXh6eM3QYtdhisdegfIxJG41b`*EnU(iR=??}*|GeGfP0FaGB zf>Nq8(N`IJyyqOOXG7!#tfN|f!2|L^!CyF?7BjU2vkv!4tc0&F!HWVgrDH>rkiPsZ zC=#lgv(3a6wyLx`{T#9?;c7hmaM(fFTO^Tf_BTkta(mxyX`=ST<+#s+m5%n7dp|#D zBmfDbn#>w|!-u{@uX=TWk8;A zX;6jF#txoJ6S|Q2;OO*x^JVpx!}Zr*eR1^;Vj5d~iWmSs9K4~ocF>q^t6S&T#f60H zJDTTt0AuxWEq44;PT*@q@hPR{(2Y*?1^UUnF}+t)ok3CW7Wx!J5nmKk+H29hIn$-7 z`9>VQNd5b-Si7FmwGH~%<0lgb%UL&~S(#^_0H{K>EiUbnWprNO zE3RJ>^0+jVgf#Y6?b4;4>)`0WNn8Fqa!}sw>fe_)(HMaCeda;BM}MNYVso6T*z!`Z zc#{_;80VKGrv6B#W|!ZXdzKg+Nkn-mX;N-%IYc zs;8zj?iaf)1t*t9djCCzuKw;_9uJD`CUI<3_3RMG`+3Qr%%zW)zxZ>zNZYpZQVWx~&n_9v50>D*8P?Qj(&%32zMn zb6e!v<>Ee&vP)sYe8u-4$yiI)YVt?Dr*gG#;LZ$S?J|liXL1jbC0&qjg^unjp1Ja{ zo=Zx@*^6cYZG6w0Stdsa|5bGS)pB}p9rnf%gOMjGZL~3!T>@Q-tzg3KzbWmT!=-blK9kR;PMT3QS%`0pNIm?YPc(OtC1b@%9sXoRH_H*vS#311!x z42JH?USFThdnL!oiKt_By0rN$QGX52VCtQftKB1{wTtUXmRjujp(T{q)MF7Pb!tvr zi6ZJYwovhwzsu5?GpR$6#X-+_9uwhlVD zhwAgv&hC9wOSt!G@+G#wpF#ek#AfYBzH*veVMY4oMBxntIf4`oks;? zGVH3WxOH<~0&%(<0r*$2;MwVTR0P)py4mqSxp3pjc@V&5`?$6>%hMGf_d^_ji=HNW+R_+l%Gfu~*>8sd zwHVccDP^ALjDQs*{s(9P+)Dwbk>p5NuW zEgFGRJ)m%%F0kd#>bp&bg?Ic?v5Lwt!=iI=Lv6r<>^vz3tc@T4v=F+!c;|+)3@*mL zES;}+R6nEtxEP}h@`n=si(f}S^jOOQ93bP!mtTE~lT_F;AchP~*qlb!xD9GPO&~}L zAi{G75CYcgcKi3tG{P{{YuzaF}86UUph;6Zc_TdKagSK2&NTY~L#l zO&HWyVN%{&AVTq=DPoAP=KT5^X1f9|mne5YOClhDG(M~9TsZv#MDnz)aTI$SA_X>c}puC7@9jkY(@fUwJX4o30s}$L}zlTx3nu%{BgcQHdTI zv;$fUUng;wXpJlm6Ra>{vB?NwYbGfekqTzc2)k{23x&G^Vc7YID(7`9VhFPRtiRo# zeCw8`0#6wkZmCzGoiI3-6n@#C@(H4%e!v49G$E4tGg624OZxq%YP=yB_LpVC%tZ~w z65>Tv;N3_T{ML4px*!X+GW38H42FpG@s2w3xhW6*>T;>*3(33_*iFR-0X~sm zj(**Fck~Io5Bg4{hu)U}jW87w01<1?yCg8UQx#2Km8r(DO^IE&pKlg(9#VqFhV!#k zfoUYE7ahsXvMonKV2aa4YGSpZan^AayvnN!>*J|G;ku#C1o#(c56dx2HcFKEVZ3b= z+tm0cKk#$=%YwCo;d#4V%*pSU@9u!_k;t9DDkxNC#kjWD3N(*r792|!i0O@2XMu@` zEGt^pGM&MYkL`NOv$P}+pBG~LtmAcOCQDX9({tzIp3+;e*IaTFAE!4wPUwrzA2fKp zrA4O6Yza)1CfpT{e__XGI=e%-AjC7>5@3q=?p?T1mkBmY8K=_119or%o)2hffI7e@ z%X?X%L$mQ@bhGXnZ3%je#uukAa%)Nti&*69fH%{!H~k-=Domk)5#W`=R`mIM;{b;d#Q> z1Lba#;2knFYW4cSe2p&|n=yle0dn7iumUzv%tu%A-@rx7SHAr6V-etRSdOGW=rcI+ zX%JJH751I9bFIP`dOB0W1~2Ze#ucy5mCmuRhP+&66U>S<_1#O8K(^fnKf0941y1*bQry>vv07CL7J9 zh9qmo^qH;>@mdM zqjLy$Jp1p1MY&@JtHt*|Beo;Li~vJgojJiDU_HAI%BtslMLXmn;tfhsZ|uTV@VzcL zb5fvGhRed;^C!PJ{Am3^dtY}_ck7G_>AwHaivhy_((A^<1{LzSCoo(%GE~wsC-bdJ z(aV71P5vwfi;m!4cJ~fg8dp6C!cljh;Gp&p`JfE9K5m;>W~^ajyAlnq#D4+6+`5aK zFV`gyLiQn9zap~!090`Qwr02V%Ri648s0jRhaGGwkrO-{VS}0D%S&F>CoU@&oa0P%D$( zGgk0EwIs9DNl0T!!l|F|sQ!@oU8svvl?5Tn#Vq}(#O)TRIbn-Kuz=dwRI!CaWaIm= z%SLYlqTuR2QVaX8Jn}M|KGHX}4PvoG9!YNN3-a#Ye2&8iu&+89G`TJ2yrxD-W%h1O zFZ!jT+^e*zoX=Ky?zoq>vqpYv0= zGPtTD!F3*|R#rDnC7R`hDqKw_6W`1ttpxs>)Rm(wPC5dSVTeAQpTgl;`rj+)_ol-D zFIzpGIkw!xU4r))(cpf@hNB~X3H%;XLKZE*%PLLEr2@ZWV91I(34i7H%ih9#xc$pu zz{#t(vVaS#0kJN7d+hha*D`()q>4Xh3$7(AI+x|iPj3&@!sEFon_4TA zW2it)hPcYepN!eXj$xOb%IoyJ`?ZR~ zTq!xOIaj>w4lqGeeG0cRpFrDhStt-uxNL`aOImmMa}FmQy-FV(Xcy&YMOjV)Jn1ll zKRF!CGAVOcN1ESfto762>jISZ{4)I9Dpe7EIW3K_czDB*b>N!V<9BV=-~L?sfeC(X zRAo`HDyX}4psy#KJ*AF?$~|w@jq0=F?|1+HB7AkQ=wwG_B*IYkDha;K3v(k4-VmF> zWeB3Ugw?(Q{zx0t2WTbK>G`TyzWs$k%V(Xf2w$^5AxFk`YEupfZet zc2Y$f-qmeU%2ml#n6JK57)owh-!)U2n^jW=i^~~lI#ZK_{7p-rf|MryO2i=uAL=D3 z+b{>#MTi>0s@Br#%vLK>q!|EUd&wl3;DLO>FAEn5h5#hEteObd-MgwquY#AE+jDY} zYt|@Mu7IaAElNQkL0O1(GWxYA?~$ETecV$WFI5gUv-z3z^=e&!#7XZ_`t5if8lAe@ zBrhqbk&f`nDWNdV zLV1LCsAWk9>H4o8flL(mzbTD0n3|8(x9cPS>fIrCog@9^9R+PinGS4SPb#*eh7^?& z`rkhG3_X2{MK@ZkE``sGZvN)S`=pUheuMf<$L{d72?i{Qc<-s{5uf=L!KcLszrj`w zY!Ibty>-s2=0H;Q)f8Vbl2SRyESfFHy83L34NoDI%eESq;Xo@!#&8v9w^Wtd!Qk~p zW!&Wb6&a7jDyV?HSz2T>8>xGn9!;2-pWxn4FoS?r$e>*nq{=w~>k^ciYEG@$68jRi zw`Q}hYINW{UI>D_gQbcioDGo<(}E3TVSSMn|5~Uz!PcSLo;&o#JlzV5f5`V_n#A@e zb$Ow3^S=sY0v|!*BqC&SR-(B-kv_xx<0aWcxH0IC^0s3b>h75JM9BLI<=?gewV*_pWHyMI=zF92vtuL2Fr zUht!dSt@Y^&t_Vay{ZnQ?AE72=DM+e< zKz27eF_n5+W(o(I42ZRRC7J>|+j%)>AZ`}QdREiq`~VOOtwQ2%RNUy+XNmKeQfkUP z56&c{K`!O(F`oM5eE9$u6s{8`U7Q`y3!U$K5J%*pfXekG$9%GYpXkQ zILS6g9%gm>IN*^&M~kdKnq=6+pQ+05T<5_fW%AQPxo;J0fmM zni6uFn`ZU~IS$pB%=W~WtsiGU2&hcuJsl>SOi9mx_W^EIYyK1#3R@i$ zSMY-=An%P)X+(C+YbY{cFLHGNMy7DWvJZUVC_Xz>ihW}tGVFbZF^z)~J&hbo@)T3a zkd3vns(Qal!I+EVkY~k}=zu*KkR}bd zu9k(8bBf>qUC)lnvplB!f3-3i07#I~cg_xPXX}wJ7b*2H0K@U$tn=@Sdx{9?0UT%v zJWtaS|00Q@{m@koxPhsz`#+g5i~cJHaTF13`#=tECjSlynwI%YjxmS$owBR*Q!N;y znzJ8oYilneL6~2j_^!)W*;a(5HNJvfW`C0R4)XGKr>Cm-JR@^Z-(YQiC2n7rp5|o) zah;LNK$8q{$-*K|YN~Ne z6}_bQdl8B7YI#1uK#R}G_h+a&Ju9e=-`eTwIPJm6=GN^XvLMuxJdS22npLwR0Lx`9 z$xXLE1H779fkxns@-HqwbrCJ*7YvjPPX=2Yv+&CUu)K`4b3t3 z6*aug-OW$THOSCT$AbQq8t|=Cx~F$8iBwd#tR=Ct5@S%Av}i>zlcx1^i~8tHlTMOivk?WjLi-SyB6>ILMf0z-nuNcG`KFF1T01k!h!U> z?r|KcmBTjH6fC7Z^~T{}%%-P5&?%^y zvIkxh!q&rf<OwCz@NW+BKL`u*)qC>1?&HuzwPy?-xc!JwyLeA%xpS zYdNI=Fu{|hEb6D1k*>Qj0&weB^{9u7HI=K$S9)|Hi5O;HniOc>S#3`{B0OPg{|TJD zjP!aH{U8A)nH9sfpNE!4=s$&2`Z9yNDJ%Y~<<_mY2eY1+P%0WwRpWIX2vT?|21Owd zV4P@K)4cbiqe#H;1wHzy<1o;JAqB3X+VDp!7jUt9)DDoj*T)|rQLO= z3fogEewp|;$==v@H`z&iI%FbBHc7pjTuyUxG|kTU-c$;N$qCz*`^(vAGUV8?97-B| zPSZlMJmoaiRns?L>F|VQ-c757{9EO3d2yAj9jsVMVT>-AQSgADAiggn$A-vNE~JEZ z@(I-q$vWS0%SiKU{SAJF#^_QIL*9Ff)hNBaGi2!O)=J=WJ z@>JVZf+FeUG)F$zku?%pTiA)il4x?Fc}2A>iKd8E?k*os5hQ3&xggK*#xi)ZCZowR zRuRRR!Jp}Z$}s#sYB_RPOpFx8Cg=zo?MvMRT%70xrWqhxVl(T&aiU=!ERdpy2V)fB=-z`1mlOIyqf{mwAj@;R)4+(o z?sNbLMTVt0c{BMJ}v;5+X`93yJn znC%cnqbMYDQTWuF?JB}e&%k)vrW!U!Cs&vpO1RV6yw*|4>D(PS zfkcq!05+wrI(2baqf&tm8uN0@n^Lc=*~eJs3R(b)gVbDJ=&7IHOB(eGK6`1d8nse)x&>LI-y#;Deu+E9eP^&QoF&Js&8 zIWU!*8F#bYJ1^FW{9FdLJ8dWbH0OgPo zm)-E8Cx_nFKiU^QQ&%pmeCBnt!sw7#lEb|T|J*6}p9JIFQ8Q5XBpxY>+@6r?*Wc7Q zmRx61e$0xs#JCoINy3h%hbKmATUXTpd)mU#&c{OEAnd*&#`M+6IPMp`zu>00SyGFZ zc@9BHv@*FV}8)TQ4Bc zyMf&9<9ViEDU0;=yFselkr^>De!urqF0c^|*BFY1QfNQB(yyh{WopFIL5aS}6Qb!AcEa&~!ZLC$vRI{}%XP zOkbZ6iBW~nNovw`W`-R0<|}*t>9}Qn=r_YbqW9GgKl6TiXRarsv$DCA#yEoneE0Th zkClrjzo|;N4$=00t1$dqHS0_AfgSWy|6G+|vovX!)>O8I+SqbHVhH}b(-B;Bym34H zok_KkYh$di90ine*OD&WDXUoyOd0wLx1+i!6Ju&&aF^cHsQXqKjhdH=HXY(I_mp7hjcK`U1+=?($%fpO*El?3)0xn z*X10(UqXJclloQdi!mMkNEm=Xj9$Kxn>L_|d) z0s3+u?f6Y9sU%+aiFK?F3a|9|_M1mh!u?G#MG}FeB64j0WVnIj1MJ7X3qRGK9YtXS z(Elr_up5Z_o%G*^gikHrb+0H#0n6z_4;%49=N!neXCdX=c-(KtD0;wC9o%S2@aj*% zBV7&>Amq7O+Uk0u9fAe8Lg0oQ=LYd6oD@h;lfVbP4jS`4J1A#F1bJ*H`k&k1&vm?^ zhKr~`V&A7pLwYd%Q)9kwyWS|I(R%?yfJO1gPNH0Dq9$fAL@kdI6pMn z>F98H$vy<7`+8+$qX2~we*1Yi1V!4q@DQeOr}|n6YIsG(cgV(_%^J+3znNR;X8txa z)Ub@K%1idYfs>;_)>JW|WkWV)$mvpjap~>%<$&2_*Vg+m^${F^V+Opzv?`I#{`**{ z3CUk3MuRu?mDjuVNlERmRY+KvH+o{Uz2AIOddVbDaYBxCIa|?knU}R^>%Fr8pS=w% zpJt_(v}P7W+QhE{&mb3Y>1XG2ux|unlmi4d-JWihG^+W_F5dV#v4??c7bm9{*|Vqc z!N^p%JxqWvn{JS37b^=<#C&J48R)XQC3d4g^!CZ3CvZ7z)sgN>-?0E;a~R0G>v(WJ z40k>{etY}n926vX?YwPl6r>1&6u;v>8S`bCIR z9V1})T!DJhbl;5>_Hg;iYSZK^Ba_pC0>~4dcNJdL#TX&Rx|z5nkZN97XW^vv9KeTx?!`WAhgIAMRP^tzn3pwJaYDVtg0(9%-XGbg9@~$-B%^8 zyKzQ$cJg!(Z1o6}X#Tf`GEARXG`(9JiN=1*uCCp==Nf4n9{MOh;t8mr`V7CY3!8hsV~glfZXEM&c$Lwk`73ZdRpP=iOw%7L$yTo?R$jg zir)~K;9Jd4*z*E4M;{A<6Qp5$A}M#|p)}Z?R>yU5_n|?b9w`dZ^FlG%H1j2)(l8+R zhr97$_IKV`c?k4_;F5s`{~d_#()92m=>Lr}taSHUqFEM7tReeO1sN1(+(1%iepwE` zID2<%*Z46+#qoc~MbWQh`~mI}p*HfK$D4g|MM(${Xv^If12vBBxeJ3{QWy%9_dbPA z=CLg9FU>i+aWmcKsLYOmG(L%F1(Xd;b z>9D0hrD8t~-rr4z{Eu9D(2qG~%O68#e*8A9?5yFuE$29#D=#{>bBl-pq^Am!YgUFcKX-oE9@j?>Y}DWt{uiW(HAjth}k z(s+l8s0fD=ioA#g`?-1YHQ_c?4@y6p(ih`s)>%b8KKR|?8=cedNW;ux`j^uRfB$NE zSG8a;hQ+a$mJFs!&~iAC?Tl(dUb>DUx*b?Ddmm_IWy1rin>x+A{#ocg`rhm<;31$Y z_Rkj`{d|4{P)YHYg(6~}%VP^F^XKnH&_%ooI72{zti|_a z_h*_1`2#?a&QWT-ydfb-4dlZ^Pt%&vd!6HNarum)f(5>MD+?XlnK4?)c*wF&{Nm%v*rD4EKBb|F30nP^ zIw=YqRBn8m{5B>2Ryaec7x0hE679u6LdPc)qHQ^*^2vl&aU)9_3k7_d;81rNTmyzv5p{A>+N;mFSM^Y=&?)1EcavXjful?&5&1fS+ z@qll*_*pYQnwG`iW`7_Gk2HVZ#DqyKLQyUb=lYTgKNwAt3DXbI5h)W9B|<~}_6?za zVak=}je{ing3lUHgpZGp-4h%BDOnce4-M%t>?%}yAAtOWkLk|4N( z^R)W|4BY#otC{o?9;_8CAMnRtVFZDH`Sk4(z5}T8`l<7}@N>?hy|H*oEWix6+^oQ| z;OBgKkBXGD7~VVksi&WS5N&ULHaA?ika_e73?5NDEey=wFq7--Ro92D#hB5xTb*KJ2TC6WWaUowq6#3cP zA+>)|-41;LQkX6|yH%UUeV+vyt(y@dk}*g+#=G=UP-gUU;ylMyru}0#}F`u>>>lTNBZ~YE4+J109X|Si;fvcWmbZS zk#N_&Z6mMuh@oJAKqgQe50H?d*$(Pgrvc9s2v*d8;hzZ3q0sweu3xw@Z ziU%x1B#2sQDSzM}UJcK$4!+uyNs(q^!JSf; zH*6;VJ|SDUzSlrbZe_DP`7bT8LW%ZIh&u^_H|G^cK)qQ;)W8qX*3;?ut<@1-f4v0C z#*Zkt^vzldOG*Q}xt*TjEe$~Ip;|UR%*^vLqVKa|t}f{dt-{<$#)}rSHy>+V?HS<| zTgio2p8x>?q86X6)4lk-NsKB&D7kD)^nsT8xyI;F9-hn&mWf&C4^^MyBOEu>U$~W5 z)%A?Jw}#9;NtM(Ff9|BGMs+1ocBWS0elH!|vd2Hp72O$0oR_ zS=V4M*dw~$GU$+$Ja>A=U)Va^_C=hb0)dWH2HHD*G|x0AU3`pbX-hreG#DOealV$aoV#nYdq#uYdMeb#SBq5x6A?g#gS;w!JMOLNs?*qMm+$`O<5m%Clf`Amv5P%Y z@0>>is3=@s8r*JI4t>$Tt{Q*;u#>#VLMCRG6!-}>x&D@5bX6NgWzbg5-OD_dA&Okq z@0~B}uCuKXd$A`K#^F9`ZXKn22}-1n$g&PHlJpzKe{1CaY{CWfQHfG%TP{21Huq66 zy4k|_@pg|rS1m>g08IFy*Wj@~-nOgt9QUlo)d|%}rGKY_q2uivCkBZyN7`9m3Yx$I~QXoZqFS%{P6H8yr+TPlKSK)+uVPx zOKkANG;0=a5O@*F409l|QYL!%>$fLM?cYA;FERqEISssN#`s?CU{s>uTNwh=h_8Tt zS96^gP(o-4-0`;M@nm=DtO`&z7tdpu%A*4zZB1z?;KR6Qu!osg^-waOs>#>7D-B!> z{^XA!V9f4as@rsi-=hXd7jd4ydI}1kqpTj`K>;I zY7~;Z0)63~Fvm05M5#495)PmrV1tLfg1I-Cp@JJU=fD2%qlm;ic(yWHplq4|aOJzn z0|_?(^lxx`VuLFr#6+Hr$bD-t_M!c^AS&>wQqBemJYd|LP4KK$q~;}y-J^}y;CAX7 zB^0u}@E>?g@}a?o}NP+vuTldqN#O>#k{PMh5e`S|A(x^9J5S`L8QY#~-t7vWqzclVR`*ws`Tu(Sy*>YI z&}4JGjS1UV2nsKJ;9qmpI_Dqx5LeT}3A1tJih0YOmU9}WWjGuK%x8U)lqq-+2I zy14r>fRqsU|!h-u3)SF{m()M-`rc9^qEXY+pwuLDst-O#3C4 zvJqK&_NY!!VY9I~(ix|E{QjZHr|m)D@kCGHIdE{dMcLx*mh|v3x+_vAf@S1(q0(Lp z$>7kuUyoteq_$Njq6~S&D+7KR_n=vcUyhfCkdX{ZO+&6lcTV8h`0l=EAM-hx=~azE zu{nRdMoX++93X_#eq=R34HyE3kWH4xmcL<+nhEATjU?`8xG***QHskU(D zm2ic_i_1UP?D41zUe{}=pa^~iaO@pfy@LK`14PlOfCD1NhNfaJ*Q%Z0zs-g^zWlM4 z8DCgPQWzd>lryWmgqXZ?qRH>B`V;~HFzn%07uYxun{c#eta7*fdD-YN=$7aNp0%(nOuMkqg{)PYOP&2_WWy_5Z77|d zp7pLTc(-ZMXgvTxPro^ycP_@%b_$jDoov}LnTLQptfeiWQg1d)Nzdbbd0LY_*LNhy z)Ap%8iE}cDH42q|C_L0wtpKX%W>5)0ET|tHhqnGZv=buEZ*N*I5~%6DTfAS#66_3O zLN$^g7GE=VCg}!&e<2V+R160os^P*W0>EU(@UY?L%TqP5CF?Jp#&5V!5B*P8gFVxq zHj5*G`PP4&r((817QR>ZLly^aqgs%2(KH*XGy6i|UNOXFVQ9nD*;@7dmBFuD*V-?# zVDF?Oz2>UNHBgSn$QQ?-j2GQbf$gGVMNEe<)F=6se$Kz}apHGU80Jvnb~|4s_TEdE zHK<8R`yEHpAA#N;G8Lq;Z{o=yN6P( zK#R9+ndS7b5wL3}FMXkZ>X>z>-Hh++xVNfo-oy=xUKQ$RpM|eWJ%`SFVn^mY&FM*%*T7gZ8ZX8@62)0&j8l=U(y61yT{F)2mEJJC#)zs!f(#gYZ)(4J6Vrq3OTbR63h11Ug`)ks zy7u!&{Yvck;jlOf@dZFj`Khke`LNCUd($?0ZOnj}uFd<`1L9i+ElDSl6J=d&QvEOS z_HDFWyR|vBC@AV1&^FRG#RLtIaWsYkGsl@M8aWX;!VA8~4FcH)ByWLJoM!nxOkscv z5vmS6O_IGBC=`ek>PjU3nXrrg%oV^&K2Zp!>}yH&1Nd1h zGzq6fYD)F-ds$l$DDTf{V^131227y=Kacb|k+Uh2`RF2k^t^Cd`GJsgZndnUy2z}- z+ME~5FSHv?>B!6`_%e;*XkjQTid!pgqM^s^dJLX9ZJO1WO9!T7G%U}|dm69bt0i&N zS$%fIW>N`yahFQ%y(7yVhQ(xF_Hh-ZxV20BOpeW{{!EusXY;3d)2B+^$0U(T#nN%BXN`NZq+0#j( zT=ForeQXv&23YBlII7VV4Zk$V`MV@Y@Fi(1rqrN9b*e(MZdL{jZBqT{MLw$9W@FW- zrr{##{=}4>3X(+H85sKH;6Ji%Q>pUtkk5fHD^^}-F)R=mhO~pquuixY9?L?BTnWT( z5-3(nah}V4IbX=k*G$Xm@gUJ;Po*#1>#LD!n>P%d&4BS(YdmRAiVqY8^-){-o z^3fM41QQG|m}(-2$@>?o|s5o{nAQLHo60XvW;9+auR^1gRKzN%SPn3WPbYCHZ{)F08 z`KQ&cf804}auKn;0RfQJ{2WgEs2rV!x<$~B1hjtkD@DS+zsWe0&Q}ZI_D2V>zVgwm;5oyTz zadm_;*V0{QP=1YE2=v9Yk!o02jz$~ZnIPz)kcdKV7!cc_ zP`W=-&V|SOGnS@>HPk1}(`rd&$b8i;Gq=S2*0~uP0%nhb*wpR5M#qd`+S{!(&VXlR z8vmK2Tbe^t$;ZU|qBxCKcJOn*G1lCI5=Rb=*_|_j3Z@N*v-(6qSupw84oA zDG<`rPaj+WPm3;j-Z3_iao+;faC`jL=e{51G9!wxL$M_3!kt3q3vu;4W7i_%6&yhXd%YqGed9Z(Q;!4+gX-bx7 zmHX{@7w?G8>*#dXH=N+sWwO@3&!cA5mF)wmZ;x{GQ5kB1P@`PAC{vF({S(#8x;gdS zZB^m`s>|c(I1x%xkL3QIZOD@ia5Y`pV$3%BtvzJ3_sXu5F!jukH@pBzV)NQwLM^v$ zrQq4Kf6DH;ZM_G+=r1$wFribth#3n$TA+FN78XPd9kUvcL4b}u;s6PdlM_s6;qd=V z9e2>Q;kZSzdYZ z<3&YJfwX^kaWth$&P&b~_kbI@KSi-j`is1pHXL-*ZQx1pi)4M~VD7`=%!AC%tN-PL~%2tcxNzv|5X zF@T|2^U1(U!6bLonk0dmd4cU!gS03-8h`misO2=TAA1ht9PSw=5mke;;aq>|i;YL9-sC{c<(BHpT{Ge!K z8-f`4xdQzkGZIT}|BjUeb9IZ%t^V!O*Am2FsrMDwj8s%css+I*_(&K|Vo@A4L{Wk; z+8By5S;w@LnrVHH^z++?NCgCsvX-l)Y453Hw>5+NXwO)|ZzK$MN0JIHeTDXmKW~HU%X1B5WY(9Z@A>0MA` zAPzjm+UpZ7#Ny59#3p1b8$iYdtiu+)dfd(>J&!~GW`4Sb;`J3a|K7ILaAHeqypzN! zIfR+2iF@G#s;Z{eOS6S4A=c7DoqvsX#cf|Zn+!M-P5X43H9XUThN@xRwqmS)yVsTs z)~wL4KlrY!vt-9-%?51zLjW+K_mRZqbsaa5m{#KvZH`jdKo8HIGMdHIb;#}Q$m_j| z>!~ikE%Eb2=`R2-+rStP(1;8bvxHD-0-flrz$j>7e4>Dk!|pTtT+$zPKVPzEc~w<1 zpx%#Et}YkjpipH;qC$Y@vAJNP2obb1ItxZPd^88AF%=zY#vwE~-*+2(YwLAiIV2#j zC<#z)jqW`IpoCOl`%ynh+j*B}egyE%Z+<_uV_$Z*K94-}eV@AQ4QrhDaqM`@mUN&| z1K=w6fDVknpw5}Ls{MBRzh*F?0koQTJ#NA2b1qVYSDr;=RTkPD+{{htg&c?M`z`+v zCdv=pv`%0W%IbwcX+&w0KO{tXK&WwY9XFUCom^10ff2(k6>I;kQ(Q$s<#qWoI#f&$O@^~>gq76XR9%); zBfAW{d6Q0&?wNs+pP01(6y@)q#?tycLz^Z0CRK+S&kMc+t=&P{N50zaqIE*OinXjT zW)(=qSqk=$j2Z%f;{??!8|700eZQP~^Z_li3n zy=1n!aeiV_Nxp*s0J|svwQw_&{}Z@-JBTCirSQ&Fak~yB4Gs%f+H+YZB|PMFtwv`C z_Gkcr2e>=z{PFd$P0Al=_kGOaXQw}0vpebf{qu1lwS*I86rLdDlJdCFd(1Y}U#K3O zz30=C8bW1l`0uhKmiNl@a<6pYSV#EeH!sFpIZ8~0jAC(+=|q@nV7h{7fx-xe+B%B& zV>Qa!|5u!G8l-YElLK|zM6Ot!(TnA)F}zi^=)!b5lS0V*F18+#^5ew&=u@p_ee5ZPK^)+2I7-_d$Q^i*Px&_!B;q;-X zDofHt_t%wNp#sxO$jR`C6K*p)MDf%hf!9bW}HqrS?p-1D&l zm>8nkTzbR#c7hqp(qq>>m&Y{^c^&a;ZI>No242exn&I=DRNfrFfH{=*0%U*yv15#+B5l4byly`d3U6<;*=uonLk?Qb?O#iiWJ!tXMa85e91@#DOQ zJBs)s*T0jlJ1_!D@A$kfI!=(1XsZiSDEn-u8n=S*OvXStQA~{T zF1oZ!#c~~0L-nI7A7pI2dC8i0^%-s$u=*?_1Br|bg5L6sh}tj^`U+ucfP=)0P*f4# zZ49TFK9RL1GB4r&sfLtNjm2ww)>Zvb^>LfM)%tYh-En{dCFVvJu6R4}jHHU4+VB{T z38aj}f$~1)!otQ5)K#w554#>PH^+IN$(Yt7c-VYi%0H{y!S^^_SP1xQ@Rjl|9F&T2 zvh`4EjN?vK1ZX{Pg|`MjSQrD?qh=WV?62Tw+`-lJI@Alt^b|L^_p6$-(dYE+pNPM2 zi%yO&YS640hye1wY9ihM?!`yO`h&0BckQv;2~YVT1W0?$=f zAb{&@1Qe*s%jPI&f&Nhc=0_Q*k0KB)Aae2-Ga5SM#J)Pa&Cd!r_qq3ORm4n*kI227v%+E%F zQqO>A_n;|Q?&LC1e`@|3$$(YvSgcpuy&tvyJ9==!4Uo6ocuSCfX(lqz?)R#FSe4^BKb1aJo zMU6YGQkKHIiHZ+y=o!wZN&JQEUG`*&2|A5BtA*@=TD2iLwq3o;yT3JVD<+91T?87e zgPHzx48#iJkmOl&1!VURpElqugypc(`%PFxz7QqzA&YEsltB(*P#SI(?=XbX)V?-D zq{`(!QEauHo{w48ApSl-a0ZxKbK%wM!}1N2RzMI;7|II zb?bTin|_y!3opZV{C#hpn>Be`rfoov((_7oY;1ik>euygzkw)Ms#O$V2zr!6F%5BD zY#kiS2(u*CgWXwwA@Sw1_u5n*f5%97g~6rcQ?~Z$v8UIygXeo}q`%u|%|9rM5gsiZCt~x8U5_Ee$y`Y*)VHP!ITDbA+ zhF-Y8?khbP$?w3%D&`@QG- zwT=hOfM0M0@kKSi`>_v}E9X#5>nQ5-_}!f>fwE{9-Z&yM$Y@r%O4xB%<$Xr`j)4?PpnIap4*SJR;1C{OYbQuUMj=2nX?!7 zj4?O=#^#Pq&1N*#d|jiRRJ~Km^X;+KSb_vz2Ty1yFr}zDPNiG(h>>$XYi9YHk76;T zL$*5UDOxqqA1)Aj&hO2^2hR^CU-$VKB%K@-UH3vcSUS>wiEf8}i#$5&Q@(gG7QzD9 zn(ER_(@^VPx~P9IO7)19Nt8>uGF1P*chgqtw&Q56b(4aJM`XPe}T@Fj!mi^O+28$$AZ z&WqyQBFOhzjS$=eT`aM_0p;bn zF0Ca!H8#jP=OCM5QuI+>oR$RT;$=QrAF4oK4^zOoQ?LP_X6*yL-*JbN#_{7~lk%Fu zzLX4$z8m5+4_XQwA(568>gcH#VUNzDN{vD3C+?Ivo$G1JGy=#<3Y~w8p<-e>_yeE! zL~=R5Z@+sdJ;cS^<~(^kjj2ch%HTX0!Qca2%je7vHr!9zJB-V49L>5roSE0B{+R8# zHc;66i(4e2_VWs8v#=PqHxKyS{!w|f8C47wHhfdH<3@3*M=#S_YBKfuY&fl#)(xMM z4d`@2ndkbq<7teh81*9oSpfG{j8)z5zy#zb0!JzY6ad|j(QEyU7sGpSJD=3+`-Hq) z)Qx#8Y!D{;i$I)-1VFJsDuK_>Ct$W?naMpDu9uJ97s!E>f*p1rp7FRIfqsssD+~=J zvch3p8kea5$sTQyuM7XYM|Qlu0lu7@?GbD@!(DFJ#o%JGGC~Z}k}w(&7{MJY#6ov@ zO(WNbmx*Ucpi5vUbt|FScDCoNC=(|B41SwruB`v5qEgUI`4TB*UYNhcZVOymFST0Y zOFkIZq|jAURhrasEhQ_Z{dDnV%aN|OtrrL5Y$T1Hf$2(E=c}nHF&ROD2;^lGZSGmU z8FB(V+&smov>JR)9r45uPO7EfDL>q>;v2n9O}^*1Ti%zBu6~wF4eJ%a2{5}q^hW)> z#Ml?|bxu)T1Vdow-&$4uI4o*n>TB$Z;gPv1bp2<){$L?1AuNc&*bzrE+rVX$m<82I zOTc)@=btPkrZc4=Ji2Apt>;iGrZqf-2TzsXBae-41P;bkl6@j#&4Xx>KWqf;zbS3` zg++FT_Hi+r+K~EtuevO?DT7MNT-~cengZKHgTG(CLZJVH=?<|(Pg*h+R7V(H=J!V6 z<5cgnw7pIgn%EjVW-~-e_FeLsWzm4K%7tr`cCfPX|G>Q_xI&7+huzzODuZ7H_v4`G z%E0lqYhNF}=&(}(%bLN265LP14Pv`Z4)^&w-g?*78Zrg|KhLA5y!MXYD!9nFN?=V3 z5i;9c_Gg_X<8?liC|tyF~)Q>Nc>kz0%>;&o$B4}rYC zV5(eUpTd3CLzB^~1RQspBBo3+kgML99ucWi5!ME;z! z3+FMidJkRg%qrjHc2yjNpt!oZNI>43P{nDyApY7Cz7lNTvK4-C1sCFmuXL8}`MsYd z?1`h~%aw?3NyC~vo8+-CG$_$h&|lN<-ugDgBl&8o{}V!AQ}azxkl}mg?411NL0{dV zvp#(u+Y&AGjrGj0!S#CDb3O#bCY+7{nZ6TwOsm8V20bj1P-Nd$H5y14x+u^%xvZ0j z7Q(^49vJax6|`Sf8?iko#S=w|n1}t<>}3NE{vzN$;QY`;E4Rb|@{&QYg(f>e{TPm34su(|sQ+hM9%kp~8>4Ye@ASPz>MtRH1s07bs=5nCY z2$i?T4ULcNVz8*s5YZ5KhJ8WIs)&RhqoQn+LznW|l7@C{)K|{l@vT&A=0a*_nlD=T z6D~*jN8Cy+GaRh>MS){yRs)~LoKd*Y4Q-=F#7hNi{}lIws?>^e)fop4*Fq4C3#A z63;7JIhRUDY{%GWD1o;sq=WfaRwgh@@$b=mvo2CG#;VF#XY}UWD}iMBHF2-##hTok zjP-9@#+z?V7%=_@RreaQnC2w$#MBPS<_2d*eP`3304cke(6B>0Yegkb2}}u1B{F!PL3F%$;Q5 zV?mpHb`Sq{da`*5x*4U?TarNM$nd61AQ^wACljq(5)R7RhGd~(3u1j-z=kLyRY|U* zHi*ccgaB02%_f)0i(SNPGR9Xshn?6{CIDG90-_06u^z||E%BK59;=&V3-f8uT@^Qf zdY{tqBqTsFprPYv0YE<}wKaDeskulk<7Z94MP`MzKWq{KSkMMxK6THb!>XlYubwED z+5?-|Hxw8SBmK8j|40A}AOq|=(Jll)HNT|w1M=3VvoXF}@hP<*{Rw~!oG=upW(0ss z5ybuNa-;)}KE8EU(@=6t-dy@lr7o*&{tHF#K_2Zc$O)@RU?0H0%D&CR zpe9mOY^p7x4EX>U*2KBY}$CyFra%!hS@KwoS!$a z;lps7`1a!NXAJ`G%x)x8d!~2%1PZH-_m9+3i>N~@v6-F^yGMJm3GSwH+98s#z$Rb7 z?fdRcUMVnVf^O-eL)BdmpVep~2VNZ_;qRwppD9Q4^sL-Mg|AcUg z)5<02P|Js~1OH%eG!ijcsNq)N7W1x1LJK!33_F)u?2z(FNTF0LUdL>%@bO{GmsJSD z@M^l3tibcf>tCCGjm1e7TLBa5y3MyMV_&$w59OP4!X-|Tn9~Yp?6oUX%Y?;t51;p^(21Dg^x8>XmWB|TGjQHSb{2+@@ zXu#bDIt^AdsSe{nO`%go740(S`z{o_AR?zcBPb^I2eK0-dm_F_DsqKc@*9%6L(9^4 z*f>UV%igC6t)>K74(LUq<8z1K)^LGQy4YM%aVPov!h1b_+`sXQC@ z?hQ|gPw04j%o;AQUc34LK~DC*pT@8H!(9@ulhKkU?Lyp2H}n1eufbd^nD|x7?QhXC zqQfG_jjWT!tXAI^c3cT9;C-t+ceb+AI4KIU_Tl^&eKsNY%C*UY@5A0V{>%$*3x>6? zQ84jz5w`g^aHbm~%Z}y1v=D?!Vnnn?K4un?X|sw3&PX zzQA1%&%{aq$e4({?pP=I`GHbbS^u#D1Ay`YV0t)e*lcUtmy_7mE*cw;wQ*D|^+y1x z5O%$`4%fR2SaGSt>Tom!f#5L=nF0%qMH4kjcevbm*hP|kP1^ZbvPU1<3IjwEu0al)A&npe_tUPgnu*7 zI6F;0Op!BKu-F^im+aiR5gRw&T~4LItQ|-CFGJ!MRLyS-Z+(-h9$3rho%x}TE1vg} zZEx{+!)bfYb8df>sN?5FITDy=C}n@{e0T2czSZdwr}vOo$DUt|o?`SUYWjz*NhfvT z;QXW^!nA6BkdWH~s4ZwA z=o*tI%LuscAbz7#k0a#()i>DZP3euteKkU994l`kyPDyI9 zzA|moa=0YFX-JL%OR}C6c{!rZ*_xSsrdv1BRx6|a@v20i3>oRy>I&%6C@;JM+O>;Dd82*Jq*ZSxe)IpTJ{NfnBF{nVDOVqvCXJSTJp5?t zrY0sBwV@mR&~&WRp957S&+Fad-j!1VaSva)%6fNXHOT@3c2d>gTpayxH7s6s3lh5w z9y(y47YD$$C_KD2kMTIeFXi+s4OyE23fc$8Xk@xzS4^kUGX>Z#@Q547&DBzJG;F&@r_o!X>s zCq;k^`;F0S$E_|K#>UnjUnzB`TsH({K>VN}N4k`_x-9T*JYRxYyWst|&O`;g((Txz zSf?jR!^Qa>Ap=`*56*A^=v7*-HqR!*f9`G) zDe6l{>ai*1r?q1CzR$DCUglV~PrTjpFCl&i+4C(Go;E;1%-Pz;5<&`02$_GFl=iAyo zU;oHkI`-I(GJ0HC93Qus%F|Q*^3;kJ4E+K7&gWsX^J&Cn;kzC>Lwk=bphCgX7uow+ z&j8I0#jdwU0;^)5oXEe6OQvO(C6`-l4l;&|{_!FJP~m#mf<+_@L>F$AV_=FLDCjc4 zct9@sJAEcETYgLLVv9l0ZgN#skA;J@HyM*-9$+w_&A?@%UEVTQQe5`@1sDMUlmi1^ z|3YL9!2E2`)J^*>pR~7Ju%s4Wh-tmss+4}Vy6TgJnmDoJ&2Cp4v+G{AS-R}9?2=38 z4Ex6EGWjLF+iX-*q!#wO{ox>tnT~%MrlOiFSF+N>ps|zcadU4EI!64bo9}1)wg>=% zSkY^b=&+&orL6&GH-T3eUOgQrn_~Dw?)2oJJRP2w--}gf#ur;TF{r0?yrNtmoL1vc z`I>HipV*0+0Fyg&r{}0kfZ1qpmYlHL=akuhR|&SXRJI}CEPpQq7w|9d@Lm#>WF<}P z3+YSfLL?y$XE@_&uiX0N`(3O_TM;39#&Cw0k?wusg>{?vX78y&*|A4JqVV;)5Zjd+ zmvHIo`<$$VPPo&ry9=6Oka5pNyk&RF$ANbC$QL=9HPU>akw-@}X_|fCG(#wiY1TSZ zT20tHHxe0&OaK(NAw#ip-5gft+3(qaGv&`686OZZ05CpK{+sI(tDR|fKKF&-bI`c$ zGbN3Dyp@hK;Y=X_c$PFb^Q`2?0DB`Jfd7Paq$B}wL;V_E3qXtts=w2ehKe^?l9#S@U^MV&r8B6Vutdq9 zq{ZQ0(FJ+xGHD`LU-(@-m*deWVjPMm(zkQ;gf)4yVgV-W(OcMqcjuWtl!h2B6=SXOFRfkdz-B zOyqiI!(ioWrFCSuKE3xYbe4+PJVI`wi-{nakTPgfT6)QU_5-;}v7iFpgo{kadO&RJ z;8y4WS#1K}>{q#?SBE(F3UM#dE9^s~HCsl)^!Otku<|q~Xs?TVr|1#b^UC16esu@@ ztA=W{rF2rik@@p^qwergyOSh7h8y7!68N%KIO)~8O&fhj#QQQqhtVoCbo8q?0HSbb zTh7@oMvrAkIRQ!e-bKo0ty4Gd;*f40(%AMQB3~aQCG?Z@_E{~9!}4-n^p91;`p2s@ z1WtLGX~t*>ROnJt z$+||Pw~DqeJ0~_LqbN}I>PvnGFMSTD(Y?!`IO8Zfd>^-#xj4Dw#~m$e*%*i~r@bn| z)=LIk%p;@qhzzUa$zPmQK1{c%({6DaU$pZ-!Au?WZ(-_T&8A!M^CMl(gRHV0KjWOk z>K-(_Z=x23ePT<0W2tQ!UUfAO415Q*$;oW%RueWw*4K9pH?_Cu>oUu+*&v|}fP1R8 ztmmK=zlN$|aAE6ZSKXY7P6{NTrpF-}(^D>zi7VTozG|7#9cLYhy0e!PuJ4s9z|+dl z!0G>~q8eec-Z6I@wQEnv<7sr({JTd+K~=_-cZs**xGJl$ZGo{U>Rk@kY_B{0@fYpj zjh3MB54&~Aj18$jX4^jnjs2#Ya_GbBp>w*VuQbA%reu&B*NUSJHx_y?lKk3Dm42{q zAlqJj^T(2-q_d7IY@FrsZWuY)dE+l#XCw+M(c77ZlHuZ{L2`>6^-l+jDe@GtqycZu zaHYc}PTN@MD&`F3`!d@5c<@-sFFKh(@3d!q)#Xgpwq!^!m{lXDdszgs?SZzb$lc0g zS(EbtRAp(Y`2&VM=!6D$21n+6CW>mw_%pCq))*>ILs=5(ovjBfid7&?*K%gMCZUr% zy04Ido9j`F$?}#}3@pKalfMIGzlMNXz&{H$%NH6gB~u(i zw|M-xJCZtPbsNrYcYCQ6HlTs}!d;QOWxD&%I|q^}HyA@-N&?2c*$R=@&ilCk@YkAZBofFVZ2K!q4ZLqe3|w@Hn!M=_F1hd#zBG}Ky7du8U_ z8x8vo4W^9=*#_(o%9E=O76BG_l{Picre*<#1q+5ejcDr3DzY{{h-1IH4zEZ(Ma>-8 zSk-oJCSgFW;N7&6+_de^yevj%G?U6O-8|EPEiw@>Yh_Rvk|WiT|y6n$g}Rq=)%gDn!AR3++_=5`OXB2NMy zxH2W_v}_x1oEGzQ3*eL4-L=ObZNJu{`^?pgly$1HAO$3gu)!Gc_T)+(hF`z(r^Gba zqc3=zsI;W1s$vlk1H*>rY|=QlK_uix%VMFZ-Ou;*neWZ*(<0&VjFLgjHhKZ?=~@md z8hl}W?1C2gtnwEhwd%8(V-3^gYT9?`o}H1&VX+6jUtB^xT)8jF6>UuQ;|$)(RG04( z1bp45yjU|&k+*8R{bE1GRix%>-E%P)ca9E#yxzb?xWPvs#-bHiBkTmCR19|AgCa^v;-%gTeW<~R+HoIauv(|c-OIysO);J z^N##?d69zbvg3j+L-0;$(~xtdPo}rWVF zv*VH1^b$YBw7fTWy|~MUifMBUyykCWxnJ_@iO{s(R|pErU7|@SL!|wd@m?`V)JN3( zF{oQ&$BzxD_hypT!NIp@w4qa6eeO~g&f$Jd_fd=bo0lj~Yb~=hbX~aS*>pEqtbpw! zr0{p>ryGW-r5IiJsj?6EH+QcPjXmwC&x6jQpzh>$y(%8=RZdTgAy3SthX3ylE(^^~qJE39ZaG%gKdg~|-XcS{@{RA*X~BQq2p65OvtmQ}9!_zleGO;Xd`^CJ z0e^=&$e0$}S0W^^v9WhquF298Wixr$e|djByQ1TJMgsE%O3+}@OZGQRZO(VGA2got zXsoAXy9=K!eS0()R{B=aShM&1;q^LU7F}{@<|V+U3sF@5WPUExb`H;AZu9#~ zzoW7FiUs)l-y#`;vFZQsBE@&3yyY5(?fz)jUsbt3@%0`J@oAAefCLryXw*N)Sk5^t z6OoImNdNQP-bbh^tMi_%lhD@d(rHjOYKmeqyFjlX65vYzblIW8fa89TUFu{GTsEDb z{v#v6{=(q(tC1ZC1EKZ|pXJ+Q0{<9^8&?7gqQ#>wqCZ*dnI<86yzfjuc_BqL%n{9X z$1SO!QsP!p$VZ;2R7}HIeO!?=y4}N8hQ{V)8jr$2c>EW^{p0vr_0$sA)T40?97)Gl zm7nm#NA+@+=ojz#qj+2*PR$q%?m{(n0<P?>_2K@Fb9lz*wET<2npT2m|N9irJ`o|$A(Wi;Y19HxP zMssXC8)GNwdYYqoGMWl88dTeU`}0xY=C91yFL550QiF8^-c0y=CZUKp$1}YB$d$9l zJ-`~OEHlU=o#)dg??p~N>|MiWOEBp1W1M+M!&Kz&+KJh0x{j+s!y#o$a(utR-w-E1 z3I*cR=B3D9cezNK&)P?t5XCdt&Hb!>in|0OTBuEqXz-7zI8osYE24?XGQNNZ&Tgil zJb9aVRnxb5Nt)-(-eM)M?-gg0kDA@{x2;fQdl|RwR z;JxWa2mB~lfEZd9;L~3KN(5F}1%idfh9aMV6B}!R2YJ;x>h12{yCI>R<>bA|7_j@4 z0_Y0?!K8rv(_{k8)Vd;q7Owe$)C-}ved|5*A=h5_y$ntEODbjPck$xx8hinNZh5g3 z3J@Moq(ur5BwLv0U!>_K9DQ5b7i+D<=VpFgc6#8pc<^XM7Y)57IVLHt4K_k7Etm|V+OwOy(FZ%hHqbxroaWnx|iKX9V`8#%AG zlX`T;_xBm@buty`GrVzrC9-$cZ+_uMl=$et8T#n(sz`BRq;;nMw1~L1zho)y{7v5L zvYZEL!khO5ZfeY(Q8JRF3qpNqF_Nza-UO58&7`uH`Fh*sQJYH^KEz17dEl0#)9uwjeq`Epn@b@Lu6w4`=N6)mWWrP@??#3yk7sBosqg{1u zqOm2PDQ@igZSqbMQH@$?-Z*27HjQpB61n{!ShCKlH^NZF0E^PV@jrk>h0@-)EC5zL zA%NU;0wez5E{O&G1-BrT? zZFiIXYTt3e;sk^0e0(~xjOU_r|2kqqUa)lHRzp_w_k7KQ>-W=U7iD){HMr8togetF zo=v5Ne;y!$Rel0jy#}NPBMF@!P~AlKhWF?)3~1(rI0YOiE}T}#e~0^oUf!y+Q)tA> z<3;Qcls(*r`}n9!!Kwo&czA^@WYiCnbIiTQqT;ZIrde|gqNW+nnKkcr+Vo^&c~-KK zgeMMuRy8nBhfg(l3-o!YJUZ)a*FBUwuRUX8pSNSuo9f}V9lEXQUQdc{G%(tm+z^{n zlZ}~nHveSBmt0smQdPy1gPr0ze~5KX5)*Duez&=Heg-ynYG~83gzQ`>lbD={oLlzmq0~L~Q1BbOU zZnnAu=gp;is93|Vy+!g}<3D!iM4eVmG!-{9s}U0)^lAp9d-S41)$R)}Q;PxJN48|# zW*<%YgbwCGrHi}mZCG=eg`-SCS`(}#FosV0E|(iD>q}zhecf8bL7sP(CA{0_Evq)Z zT{VAb`_9dqd`uHE!`JO@WbFLoy3a@Lb#*!Kq?-}K3yZ=2D=L(ybI=YtKtaO(d3daC z5%0s&%cs8ptN%&iV30Dm6h(%@!fk5Bbxkk-MHyDzWY+u_N9iNmrH9N3;c5;`8;v4i zW6=HwhYs}Vw*0AqHP9Z;{&w}9TBL@EHp{DLhf8cgbc z->>gmipK;$(IH!vScHwCq92>-VBWHZo9)G1un#R(@Q*t3cPz^2u(vuRDSu)SP9nZF zxiT$=@cvYd36bE#JEClIrR{(BZtyHlTHy-7xLZv{>nQa}@SM!)qtt7Grs18it2DBimAN+NQ1fzb`F!2a1{3Rz1S(32M|!;Y?ZU75$S38?T49Kv?Xz0 z!}y=g4y-fW^qXu&RwZ&OV zk3Zk`y!i*tevWXN92s5k`c6PV;FN~V@Sn=!1D+y~^cc$=R;KIo|EcTB!VPp#t*^LTgDa#<4vV=0DN3vuMQ$3!fkR^mdhG8sYUq_TJOJ=fU-!gV%pRvvG z-tzq3Pw(e_-}A@(G24BgbKTcD-}61^a~&PlxUcpd3>eU%aVB^~fmf8MB$NHi++x8QX zF7RzYo}n0itvUEg!xlru=~Mo-uR^OvYZ|_R8S1zOT<>)olD6Gy9I*YSR46ROf@`%d z`KPUBbt3nb23F-!PjP??=LJayT_~Lmq%`i3m+@d~1E&aqu2hXo=*|YK>x6R}x`>NM zwoH8I^Q&CU81q@Q)_uwZpn=1yud?%2_*RuwHib1KB8M2!IYnuIF_eg5hUTTZI>1%~ z4<^y^3w`J-w^6hdcZL!>H(mjCnLBDz4(;c>)qph_IwQI`3$_c*snDJuEO~wH+8I7D z)KoECNLt;a<|gvQn-jNDn^Ki0pio^jOeo`)B~H+*xN>`Ac@a);e($Yz7s`EsT+UJ10&Iz1o6cjL>~sza?0`dBa)m3 z`*@ciy@)dE@CV4mj!Okd;!q(j=IdM+uQar_nYqAum{V=)jE~=n6m_{F)`u9-1lV|xn|r?V&2{m%i&4+>Zp zWd=5XMLoEeLoe6OkI~CML{+4FYVM&tzS4rsGQ&onYTaynOTYUq#gmZcM~ZRc(ex@* zp21@f_f&Rj(n@2WjKi`GzJJ43qS+S&){^uV2=xceOV7l9j$oPYDlN6*j7@EVIk-hiR^No~V&GQVDTO?#OeQ*wWn6pzGM5b@nr zMR+|~eo^|vt{g1l_0ru@bsBPm32FXVWIYZ|`np~Bs3OC_47pjQ194+bwuq-Ic>=Xe zAggvfCVHSEpO_C?dWQGfQ_hi_-$hXq+AtE*^IcHi&JfL0iXgv3oBSSTCdwZkjO^Sl zAF`N@3V*M81Gi^tf(nw8R2bXXxoJ+Z>-f;8xWT+hQN0cAmSM4Zii7OdjVPyP2-@C$Q;B_IHOx? zC;IeBrB_#W`ufWvrl(gs346`1rw+m(Ab`WINTCFaB`*Z4&p)|}(BIIjKf41@3 zU0BA5AVJNjfh8i9SD?e>IZ6)NZp=-TlHeP9x#Vx?y#SkpaTT3-`|%MeUe*8YGnD&5 z;6GW5zI0JX=m!u7yT@bqbc@M;cN}#Ibj_X+tO(j zTpRDgi*0aj|2Bn%MWiMQ_utR`E_=Gr$4ZVPKH(OF{~SG_$1nOFrkJrvL>4p_EFDZ? z*A3mw@m_JJgV!G9oG4XNl~?iSVYDW)I{mT>aC|f%M@DMMD-PQPIu8!5b>p@Cs97!0 zX;IJTxW3nC^zk}=T_gV7RGXg-L*zSN&`@fZN$gKhnSxMH5<&1iC1$6)l{fP(+A~nw z&D_uF6XspxvwH7z*eq4pM>B+t*qJ?r+qOTPRs_iJVCV>naxpLQ8`z)AaWZ4qD%F;$ zho2ijL`pjZc{9JO&>P+CaCcuOJ-y)?q|&EU`sU1;r$Q1#qdw)!zU+LEs{9)AfQbd^ z&&Tt|ytiESa%YZj)uDI;i859l;rU_D^P#-Bf_K4QlU$gbH$v5Lk9Gvm{;^v);VBe= z>fhI7JYUM19nolHSIef|+@tj1pZ4Z0Cr6S1^nc&0e=`6FKn*0vVD_7keY!XA909Vg zq7;?2HWkP(Tkz!+OT{{^EygQ{c&k9%Azvtu@Q+(lheBpxF$I#XT|Rmc&%-(J0Gsac zu+$54t36srQYG0^JO=uBmClQ~Rv%TZ_+?3GQ_NNSIx2}PAN}(4M%3BJfUiS!&bkB- z(}%sTwG4+0Px{CkAA}YObIiWI?b)}ym{jR*j`?4+E=0S+?MSCYQunsq--8C-}P=!%zLDZJP}KIu*?*ZXsWsMzH0!R@=2*8x^23l|Bg2_=3-=ZF{5K(3s&}8 zq(VeQbT(;ajc**Xitsd;8IwQQv-HL!U5#X3BHz<+BX+niO7A_e3{%qRcwHD{=`pt7_~c(qG6GTodTTJMQ~|Q1-Dde^gd-3=!8`d=Y4Hc|b-qOX z-Q#n(H2F`X1RE;n;?xS;WBIZ1FltWWxb2tSmrGlWt(Q$@JR6;S>N))P$*HvW;9SpI zrpt2Z;MQW@`ef?HrV?_%CPn^-SADC{de~=?L4>x89{KzPP3jxwTZ*$TZyFP7F8-O@*AVjnf`9iz#W9FjV}Tc9CshUc*THIoxtGicQ@%zDh^c z>1A6+yEJ=*(WdAiMA`a3ZU%@TDC z8dVdNFU0J$IbJTDt|FTAI#=CHKFcF9zsGS-yc6B}!fNq`@K&D*;REe#+11IHlH$1+ zPXdF5MPM4~ZALg+%ddnF;Pw760Zz3L+H(diyaco8rtvYYMm0t8qiC1hnn380yegeT zQo=vf{vBfIJksXJ$CnIqIBc|V4JD-+gjYX?0BRE;5YAwmn(ImIS)ZG(>^RWLPNqsK zDRjyeJaAwX?8$KO99#9))NNhzT4JpLP4hrel|R7H+_{bA>3~z8#+l63yu2#wHTWvrJZ`;f1G3^*A7 z7gu3hgK?qH=UrPtc!&b2;d>7*yT@sv9>OwFX36trtBUhA186R(gXI>0-VWu+8yz{t zbjZQR0W_?oNlnu$*0_H#@P3NyOY_$qZS9v}cd*9&%h}sk;|Wef zON4n*MCm%tRWBdYt8WNVWwsIo`#FDx_h>URhF zpN*gixCFJUw&7WY(Hv0Z;x5KX=a(Mls(x0h?l2ah&>c>SIB=F^@BeVCY-<-YR_tuKV@(#-(6DJ>XUF^ zihahmGJJ5cygIFFt!jYgZkCtQgvM8YPxReL;9l9t+$k{lHpK&l#rr=vE4WR=VEJ5s zXu`L43R)s!@I}vMWvGOnGOXVUtu5*3X+Kiq$Ugq3FRpYh!v4I^{zy*?;bkM+H(8gv zZ)%)oZX6&cV75zk8G2=*A{OKMq_vZhXH<^uZOJE#09Dq_YsL87_$Txp5#d}55rGPD z?gx|&DLo9M2U=j2dOx0`T(Bd+0@B#xv%FF0lTpj%eLI<|y!=IteP|D8d}39srAc6o{pD>4>*}e`C+(4jVW$ z6+?w@_TjRlzZrh&Sf!COvhvBZp4!cl@v)f&kPoRu#ZiQ0a7eG|6J3?>=80Qd;16it z-D$P!_QtH#Q_wH9ailA!LHaNI!|H0!$e<+^ulY_|pmU15S5GPESnBRflMRgmRKhZ^ zUfQTwNqrjP=S4j}UHS@ceSaY_us0?Df*Ua+oCc#PyRCT_jsr99CON%A)FA@+@=f9& zFT}q@E~i$ml6-9su!P&oiQRZLi$om@<7%fYLm4#mj7btu9DMTQM;MhvC@yr9;J8G z-#bbMj~*ZUQ#ulkf+F=EO{^{?l%DBzN!?ave(F;jmqSnCv|Ep46n&=1X-+vgdH1g5~TSAwrbT+Cka=+brS23#@}%;e{JPsUjh0PvhJxTb@CunS;e#lOjuGJvdzEOTYt|`{zoD9|NUT} Y^-*HM%6=&H7sNNxH`Ob=>iF!x09e}G4*&oF literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-167.png b/AnimatedConstraints/AnimatedConstraints/Images.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5ec66a8746d77c19afa4db06b0e9e27145e92d GIT binary patch literal 11276 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 LNkvXXu0mjf{o2?p literal 0 HcmV?d00001 diff --git a/AnimatedConstraints/AnimatedConstraints/Info.plist b/AnimatedConstraints/AnimatedConstraints/Info.plist index 8d07b46..bd1ead3 100644 --- a/AnimatedConstraints/AnimatedConstraints/Info.plist +++ b/AnimatedConstraints/AnimatedConstraints/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.useyourloaf.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard b/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard index 76ed3d1..8d412a2 100644 --- a/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard +++ b/AnimatedConstraints/AnimatedConstraints/LaunchScreen.storyboard @@ -1,7 +1,10 @@ - - + + + - + + + @@ -13,17 +16,17 @@ - + - + @@ -41,7 +44,7 @@ - + diff --git a/AnimatedConstraints/README b/AnimatedConstraints/README deleted file mode 100644 index e00a98d..0000000 --- a/AnimatedConstraints/README +++ /dev/null @@ -1,12 +0,0 @@ -======================================================================= -AnimatedConstraints - -Version 1.1 21 May 2015 Switch to changing priorities rather than - adding/removing constraints. -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: - -[http://useyourloaf.com/blog/animating-autolayout-constraints/](http://useyourloaf.com/blog/animating-autolayout-constraints/) diff --git a/AnimatedConstraints/README.md b/AnimatedConstraints/README.md new file mode 100644 index 0000000..cdbb29f --- /dev/null +++ b/AnimatedConstraints/README.md @@ -0,0 +1,16 @@ +# AnimatedConstraints + + +An example on how to animate changes made to autolayout constraints. +For further details see the post: + ++ [Animating Autolayout Constraints](https://useyourloaf.com/blog/animating-autolayout-constraints/) + +## Version History + ++ Version 1.2 - 04 Oct 2019 + Minor refresh for Xcode 11. ++ Version 1.1 - 21 May 2015 + Switch to changing priorities rather than adding/removing constraints. ++ Version 1.0 - 18 May 2015 + Initial Version From 6275b08a928f6c8ab741c0b31a5f699284974c20 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 11 Nov 2019 10:46:19 +0000 Subject: [PATCH 095/142] RevealStack Update for Xcode 11, Swift 5 --- .../RevealStack.xcodeproj/project.pbxproj | 16 ++++++++++++---- RevealStack/RevealStack/AppDelegate.swift | 1 - .../RevealStack/Base.lproj/Main.storyboard | 11 ++++------- .../RevealStack/RevealViewController.swift | 8 +++----- .../RevealStack/UIView+UYLExtensions.swift | 5 ++--- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/RevealStack/RevealStack.xcodeproj/project.pbxproj b/RevealStack/RevealStack.xcodeproj/project.pbxproj index 371049c..ee2d5f6 100644 --- a/RevealStack/RevealStack.xcodeproj/project.pbxproj +++ b/RevealStack/RevealStack.xcodeproj/project.pbxproj @@ -96,7 +96,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 535B22581E915D1C002F6D4C = { @@ -108,7 +108,7 @@ }; buildConfigurationList = 535B22541E915D1C002F6D4C /* Build configuration list for PBXProject "RevealStack" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -174,6 +174,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -184,6 +185,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -191,6 +193,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -223,6 +226,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -231,6 +235,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -241,6 +246,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -248,6 +254,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -272,6 +279,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -286,7 +294,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RevealStack; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -299,7 +307,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RevealStack; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/RevealStack/RevealStack/AppDelegate.swift b/RevealStack/RevealStack/AppDelegate.swift index 5bd45f7..62ee578 100644 --- a/RevealStack/RevealStack/AppDelegate.swift +++ b/RevealStack/RevealStack/AppDelegate.swift @@ -35,6 +35,5 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? } diff --git a/RevealStack/RevealStack/Base.lproj/Main.storyboard b/RevealStack/RevealStack/Base.lproj/Main.storyboard index d28c0af..ea10869 100644 --- a/RevealStack/RevealStack/Base.lproj/Main.storyboard +++ b/RevealStack/RevealStack/Base.lproj/Main.storyboard @@ -1,12 +1,9 @@ - - - - + + - - + @@ -23,7 +20,7 @@ - + diff --git a/RevealStack/RevealStack/RevealViewController.swift b/RevealStack/RevealStack/RevealViewController.swift index 8a59386..73eaeed 100644 --- a/RevealStack/RevealStack/RevealViewController.swift +++ b/RevealStack/RevealStack/RevealViewController.swift @@ -34,10 +34,9 @@ import UIKit class RevealViewController: UIViewController { - - @IBOutlet private weak var rootStackView: UIStackView! - @IBOutlet private weak var imageStackView: UIStackView! - @IBOutlet private weak var revealSwitch: UISwitch! + @IBOutlet private var rootStackView: UIStackView! + @IBOutlet private var imageStackView: UIStackView! + @IBOutlet private var revealSwitch: UISwitch! private lazy var coverView: UIView = { let view = UIView() @@ -81,4 +80,3 @@ class RevealViewController: UIViewController { view.pin(to: stackView) } } - diff --git a/RevealStack/RevealStack/UIView+UYLExtensions.swift b/RevealStack/RevealStack/UIView+UYLExtensions.swift index fe04753..25b5b9e 100644 --- a/RevealStack/RevealStack/UIView+UYLExtensions.swift +++ b/RevealStack/RevealStack/UIView+UYLExtensions.swift @@ -33,13 +33,12 @@ import UIKit public extension UIView { - - public func pin(to view: UIView) { + func pin(to view: UIView) { NSLayoutConstraint.activate([ leadingAnchor.constraint(equalTo: view.leadingAnchor), trailingAnchor.constraint(equalTo: view.trailingAnchor), topAnchor.constraint(equalTo: view.topAnchor), bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) + ]) } } From 1d60dbbacc897ef05ee13c71fc940ee8f42a343e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 30 Dec 2019 14:04:00 +0000 Subject: [PATCH 096/142] Update for Swift 5 and iOS 13 trait collections --- AdaptType/AdaptType.xcodeproj/project.pbxproj | 5 +++-- AdaptType/AdaptType/SettingsViewController.swift | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/AdaptType/AdaptType.xcodeproj/project.pbxproj b/AdaptType/AdaptType.xcodeproj/project.pbxproj index 17b4070..5390100 100644 --- a/AdaptType/AdaptType.xcodeproj/project.pbxproj +++ b/AdaptType/AdaptType.xcodeproj/project.pbxproj @@ -98,6 +98,7 @@ TargetAttributes = { 53ED33A02165588D005E895D = { CreatedOnToolsVersion = 10.0; + LastSwiftMigration = 1120; }; }; }; @@ -293,7 +294,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AdaptType; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -311,7 +312,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AdaptType; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/AdaptType/AdaptType/SettingsViewController.swift b/AdaptType/AdaptType/SettingsViewController.swift index 029323b..c2a4310 100644 --- a/AdaptType/AdaptType/SettingsViewController.swift +++ b/AdaptType/AdaptType/SettingsViewController.swift @@ -28,8 +28,7 @@ import UIKit -class SettingsViewController: UIViewController { - +final class SettingsViewController: UIViewController { @IBOutlet var stackView: UIStackView! let backgroundView: UIView = { @@ -42,6 +41,7 @@ class SettingsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupView() + configureView(for: traitCollection) } private func setupView() { @@ -51,7 +51,7 @@ class SettingsViewController: UIViewController { backgroundView.topAnchor.constraint(equalTo: stackView.topAnchor), backgroundView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor), backgroundView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor) - ]) + ]) } } From 8d552311d4cae788000af0407246ca7e856d665a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 30 Dec 2019 14:23:11 +0000 Subject: [PATCH 097/142] Update for Xcode 11 and Swift 5 --- StackMargin/StackMargin.xcodeproj/project.pbxproj | 5 +++-- StackMargin/StackMargin/Base.lproj/Main.storyboard | 14 +++++++------- StackMargin/StackMargin/CodeViewController.swift | 7 +++---- StackMargin/StackMargin/IBViewController.swift | 3 +-- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/StackMargin/StackMargin.xcodeproj/project.pbxproj b/StackMargin/StackMargin.xcodeproj/project.pbxproj index 02c18b3..ad65d2c 100644 --- a/StackMargin/StackMargin.xcodeproj/project.pbxproj +++ b/StackMargin/StackMargin.xcodeproj/project.pbxproj @@ -101,6 +101,7 @@ TargetAttributes = { 5315FB282145A86800E81704 = { CreatedOnToolsVersion = 10.0; + LastSwiftMigration = 1120; }; }; }; @@ -297,7 +298,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StackMargin; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -315,7 +316,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StackMargin; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/StackMargin/StackMargin/Base.lproj/Main.storyboard b/StackMargin/StackMargin/Base.lproj/Main.storyboard index 46b305f..966a3c5 100644 --- a/StackMargin/StackMargin/Base.lproj/Main.storyboard +++ b/StackMargin/StackMargin/Base.lproj/Main.storyboard @@ -1,10 +1,9 @@ - - - - + + - + + @@ -93,7 +92,7 @@ - + @@ -111,6 +110,7 @@ + @@ -130,7 +130,7 @@ - + diff --git a/StackMargin/StackMargin/CodeViewController.swift b/StackMargin/StackMargin/CodeViewController.swift index 1c35ff6..a580386 100644 --- a/StackMargin/StackMargin/CodeViewController.swift +++ b/StackMargin/StackMargin/CodeViewController.swift @@ -29,7 +29,6 @@ import UIKit final class CodeViewController: UIViewController { - private let chapterLabel: UILabel = { let label = UILabel() label.font = UIFont.preferredFont(forTextStyle: .headline) @@ -69,7 +68,7 @@ final class CodeViewController: UIViewController { stackView.topAnchor.constraint(equalTo: readable.topAnchor), stackView.trailingAnchor.constraint(equalTo: readable.trailingAnchor), stackView.bottomAnchor.constraint(equalTo: readable.bottomAnchor), - ]) + ]) return view }() @@ -108,7 +107,7 @@ final class CodeViewController: UIViewController { scrollView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), scrollView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), - scrollView.widthAnchor.constraint(equalTo: containerView.widthAnchor) - ]) + scrollView.widthAnchor.constraint(equalTo: containerView.widthAnchor), + ]) } } diff --git a/StackMargin/StackMargin/IBViewController.swift b/StackMargin/StackMargin/IBViewController.swift index a02ef44..b7dc7b9 100644 --- a/StackMargin/StackMargin/IBViewController.swift +++ b/StackMargin/StackMargin/IBViewController.swift @@ -29,7 +29,6 @@ import UIKit final class IBViewController: UIViewController { - @IBOutlet var stackView: UIStackView! @IBOutlet var chapterLabel: UILabel! @IBOutlet var textView: UITextView! @@ -63,6 +62,6 @@ final class IBViewController: UIViewController { backgroundView.topAnchor.constraint(equalTo: stackView.topAnchor), backgroundView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor), backgroundView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor) - ]) + ]) } } From 9b4739fb9aea7a0385c74943882acacc98142c60 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 16:55:57 +0000 Subject: [PATCH 098/142] Update for Swift 5 and Xcode 11 --- .../DynamicWebKit.xcodeproj/project.pbxproj | 11 ++++++++--- .../DynamicWebKit/HTMLViewControler.swift | 17 ++++++++--------- DynamicWebKit/DynamicWebKit/readme.html | 8 ++++---- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index 6d742f6..f0255cc 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -99,11 +99,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53A2B5361F94DBE500095FAD = { CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1120; ProvisioningStyle = Automatic; }; }; @@ -187,6 +188,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -194,6 +196,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -244,6 +247,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -251,6 +255,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -290,7 +295,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicWebKit; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -305,7 +310,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicWebKit; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift b/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift index 36538ef..779671d 100644 --- a/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift +++ b/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift @@ -30,8 +30,7 @@ import UIKit import WebKit -class HTMLViewControler: UIViewController { - +final class HTMLViewControler: UIViewController { private lazy var webview: WKWebView = { let preferences = WKPreferences() preferences.javaScriptEnabled = false @@ -41,15 +40,15 @@ class HTMLViewControler: UIViewController { webview.translatesAutoresizingMaskIntoConstraints = false return webview }() - + override func viewDidLoad() { super.viewDidLoad() setupViews() loadHTML("readme.html") - - NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: NSNotification.Name.UIContentSizeCategoryDidChange, object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } - + private func setupViews() { view.addSubview(webview) NSLayoutConstraint.activate([ @@ -57,16 +56,16 @@ class HTMLViewControler: UIViewController { webview.trailingAnchor.constraint(equalTo: view.trailingAnchor), webview.topAnchor.constraint(equalTo: view.topAnchor), webview.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) + ]) } - + private func loadHTML(_ file: String) { if let baseURL = Bundle.main.resourceURL { let fileURL = baseURL.appendingPathComponent(file) webview.loadFileURL(fileURL, allowingReadAccessTo: fileURL) } } - + @objc private func contentSizeDidChange(_ notification: Notification) { webview.reload() } diff --git a/DynamicWebKit/DynamicWebKit/readme.html b/DynamicWebKit/DynamicWebKit/readme.html index 703c048..5055016 100644 --- a/DynamicWebKit/DynamicWebKit/readme.html +++ b/DynamicWebKit/DynamicWebKit/readme.html @@ -1,9 +1,9 @@ - - + + - + - +

Dynamic Type With WebKit

From 4884522cb841eaf3aea3c666492af6926182ddf2 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 17:28:07 +0000 Subject: [PATCH 099/142] Update for Swift 5 --- Vector/Vector.xcodeproj/project.pbxproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Vector/Vector.xcodeproj/project.pbxproj b/Vector/Vector.xcodeproj/project.pbxproj index 694c0d8..2589db3 100644 --- a/Vector/Vector.xcodeproj/project.pbxproj +++ b/Vector/Vector.xcodeproj/project.pbxproj @@ -95,6 +95,7 @@ TargetAttributes = { 53D182741F669CBB001F1840 = { CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1120; ProvisioningStyle = Automatic; }; }; @@ -282,7 +283,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Vector; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -297,7 +298,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Vector; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; From 51d2f32fba5dcfb43741a8a4c3ed583e445f091c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 17:43:15 +0000 Subject: [PATCH 100/142] Formatting --- ScaledFont/ScaledFont/AppDelegate.swift | 1 - ScaledFont/ScaledFont/ScaledFont.swift | 5 ++--- ScaledFont/ScaledFont/ViewController.swift | 25 +++++++++++----------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/ScaledFont/ScaledFont/AppDelegate.swift b/ScaledFont/ScaledFont/AppDelegate.swift index 130fe68..6420758 100644 --- a/ScaledFont/ScaledFont/AppDelegate.swift +++ b/ScaledFont/ScaledFont/AppDelegate.swift @@ -31,6 +31,5 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? } diff --git a/ScaledFont/ScaledFont/ScaledFont.swift b/ScaledFont/ScaledFont/ScaledFont.swift index 0936799..09b8b81 100644 --- a/ScaledFont/ScaledFont/ScaledFont.swift +++ b/ScaledFont/ScaledFont/ScaledFont.swift @@ -66,7 +66,6 @@ import UIKit /// font. public final class ScaledFont { - private struct FontDescription: Decodable { let fontSize: CGFloat let fontName: String @@ -80,7 +79,7 @@ public final class ScaledFont { /// - Parameter fontName: Name of a plist file (without the extension) /// in the main bundle that contains the style dictionary used to /// scale fonts for each text style. - + public init(fontName: String) { if let url = Bundle.main.url(forResource: fontName, withExtension: "plist"), let data = try? Data(contentsOf: url) { @@ -105,7 +104,7 @@ public final class ScaledFont { public func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { guard let fontDescription = styleDictionary?[textStyle.rawValue], let font = UIFont(name: fontDescription.fontName, size: fontDescription.fontSize) else { - return UIFont.preferredFont(forTextStyle: textStyle) + return UIFont.preferredFont(forTextStyle: textStyle) } let fontMetrics = UIFontMetrics(forTextStyle: textStyle) diff --git a/ScaledFont/ScaledFont/ViewController.swift b/ScaledFont/ScaledFont/ViewController.swift index ddd1857..315a7fd 100644 --- a/ScaledFont/ScaledFont/ViewController.swift +++ b/ScaledFont/ScaledFont/ViewController.swift @@ -30,7 +30,6 @@ import UIKit class ViewController: UIViewController { - // private let fontName = "Default" // private let fontName = "Noteworthy" private let fontName = "NotoSerif" @@ -38,7 +37,7 @@ class ViewController: UIViewController { private let defaultSpacing: CGFloat = 8.0 private lazy var scaledFont: ScaledFont = { - return ScaledFont(fontName: fontName) + ScaledFont(fontName: fontName) }() override func viewDidLoad() { @@ -48,43 +47,43 @@ class ViewController: UIViewController { } private lazy var title1Label: UILabel = { - return label(forTextStyle: .title1, text: "Title 1") + label(forTextStyle: .title1, text: "Title 1") }() private lazy var title2Label: UILabel = { - return label(forTextStyle: .title2, text: "Title 2") + label(forTextStyle: .title2, text: "Title 2") }() private lazy var title3Label: UILabel = { - return label(forTextStyle: .title3, text: "Title 3") + label(forTextStyle: .title3, text: "Title 3") }() private lazy var headlineLabel: UILabel = { - return label(forTextStyle: .headline, text: "Headline") + label(forTextStyle: .headline, text: "Headline") }() private lazy var subheadlineLabel: UILabel = { - return label(forTextStyle: .subheadline, text: "Subheadline") + label(forTextStyle: .subheadline, text: "Subheadline") }() private lazy var bodyLabel: UILabel = { - return label(forTextStyle: .body, text: "Body") + label(forTextStyle: .body, text: "Body") }() private lazy var calloutLabel: UILabel = { - return label(forTextStyle: .callout, text: "Callout") + label(forTextStyle: .callout, text: "Callout") }() private lazy var footnoteLabel: UILabel = { - return label(forTextStyle: .footnote, text: "Footnote") + label(forTextStyle: .footnote, text: "Footnote") }() private lazy var caption1Label: UILabel = { - return label(forTextStyle: .caption1, text: "Caption 1") + label(forTextStyle: .caption1, text: "Caption 1") }() private lazy var caption2Label: UILabel = { - return label(forTextStyle: .caption2, text: "Caption 2") + label(forTextStyle: .caption2, text: "Caption 2") }() private func label(forTextStyle textStyle: UIFont.TextStyle, text: String) -> UILabel { @@ -120,6 +119,6 @@ class ViewController: UIViewController { scrollView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor), scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor) - ]) + ]) } } From ddcf1f24d6f876b79a5a1378d04acb35e6092c3a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 17:51:15 +0000 Subject: [PATCH 101/142] Update for Swift 5 --- Swiper/Swiper.xcodeproj/project.pbxproj | 11 ++++++--- Swiper/Swiper/AppDelegate.swift | 32 ------------------------- Swiper/Swiper/ViewController.swift | 9 ++++--- 3 files changed, 12 insertions(+), 40 deletions(-) diff --git a/Swiper/Swiper.xcodeproj/project.pbxproj b/Swiper/Swiper.xcodeproj/project.pbxproj index d413463..1b441bf 100644 --- a/Swiper/Swiper.xcodeproj/project.pbxproj +++ b/Swiper/Swiper.xcodeproj/project.pbxproj @@ -91,11 +91,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53AF5D051F2B662A00BBF2B8 = { CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1120; }; }; }; @@ -176,6 +177,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -183,6 +185,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -233,6 +236,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -240,6 +244,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -278,7 +283,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Swiper; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -292,7 +297,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Swiper; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Swiper/Swiper/AppDelegate.swift b/Swiper/Swiper/AppDelegate.swift index 73948c9..6420758 100644 --- a/Swiper/Swiper/AppDelegate.swift +++ b/Swiper/Swiper/AppDelegate.swift @@ -31,37 +31,5 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - } - diff --git a/Swiper/Swiper/ViewController.swift b/Swiper/Swiper/ViewController.swift index 265d9ad..877487b 100644 --- a/Swiper/Swiper/ViewController.swift +++ b/Swiper/Swiper/ViewController.swift @@ -30,11 +30,10 @@ import UIKit class ViewController: UIViewController { - @IBOutlet private var fullScreenConstraints: [NSLayoutConstraint]! @IBOutlet private var halfScreenConstraints: [NSLayoutConstraint]! - @IBOutlet private weak var modeSwitch: UISwitch! - @IBOutlet private weak var countDisplay: UILabel! + @IBOutlet private var modeSwitch: UISwitch! + @IBOutlet private var countDisplay: UILabel! override var prefersStatusBarHidden: Bool { if #available(iOS 11.0, *) { @@ -44,8 +43,8 @@ class ViewController: UIViewController { } } - override func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge { - return fullScreenMode ? [.bottom,.top] : UIRectEdge() + override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge { + return fullScreenMode ? [.bottom, .top] : UIRectEdge() } private var count = 0 { From 9b11a3fbd60ac179d173ff283b156863d17d3dcf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 22:35:42 +0000 Subject: [PATCH 102/142] Update for Xcode 11, Swift 5 and iOS 13 --- .../Sources/MarginViewController.swift | 4 +-- Margins/Margins.xcodeproj/project.pbxproj | 26 ++++++++++++++++--- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++ Margins/Margins/Base.lproj/Main.storyboard | 17 +++++------- 4 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 Margins/Margins.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Margins/Margins.playground/Sources/MarginViewController.swift b/Margins/Margins.playground/Sources/MarginViewController.swift index f05d54a..892fbba 100644 --- a/Margins/Margins.playground/Sources/MarginViewController.swift +++ b/Margins/Margins.playground/Sources/MarginViewController.swift @@ -51,7 +51,7 @@ public class MarginViewController: UIViewController { private func setupViews() { view.addSubview(redView) NSLayoutConstraint.activate([ - redView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor), + redView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), redView.leadingAnchor.constraint(equalTo: view.leadingAnchor), redView.trailingAnchor.constraint(equalTo: view.trailingAnchor) ]) @@ -77,7 +77,7 @@ public class MarginViewController: UIViewController { NSLayoutConstraint.activate([ stackView.topAnchor.constraint(equalTo: redView.bottomAnchor), - stackView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor), + stackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor), stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor), diff --git a/Margins/Margins.xcodeproj/project.pbxproj b/Margins/Margins.xcodeproj/project.pbxproj index 672ef9a..d330e67 100644 --- a/Margins/Margins.xcodeproj/project.pbxproj +++ b/Margins/Margins.xcodeproj/project.pbxproj @@ -90,7 +90,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1030; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53E307711EB33A650055FFCB = { @@ -102,7 +102,7 @@ }; buildConfigurationList = 53E3076D1EB33A650055FFCB /* Build configuration list for PBXProject "Margins" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -166,21 +166,30 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -217,21 +226,30 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -266,7 +284,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Margins; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -279,7 +297,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Margins; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Margins/Margins.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Margins/Margins.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Margins/Margins.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Margins/Margins/Base.lproj/Main.storyboard b/Margins/Margins/Base.lproj/Main.storyboard index bc78122..17351d7 100644 --- a/Margins/Margins/Base.lproj/Main.storyboard +++ b/Margins/Margins/Base.lproj/Main.storyboard @@ -1,12 +1,12 @@ - + - - + + @@ -14,10 +14,6 @@ - - - - @@ -56,14 +52,15 @@ - + - + + @@ -77,7 +74,7 @@ - + From ff553b49a2bfae4a0301477c614d8819ff48aa6a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 22:54:18 +0000 Subject: [PATCH 103/142] Update for Xcode 11 and Swift 5 --- GridView/GridView.xcodeproj/project.pbxproj | 18 ++++++++++-------- GridView/GridView/GridView.swift | 3 +-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index b83306f..8324803 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -143,26 +143,26 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0930; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 531CCB861EAA45D2008349F4 = { CreatedOnToolsVersion = 8.3.2; DevelopmentTeam = LCC2J94N44; - LastSwiftMigration = 0900; + LastSwiftMigration = 1120; ProvisioningStyle = Automatic; }; 5366BC611EA8DF80006A06E5 = { CreatedOnToolsVersion = 8.3.2; DevelopmentTeam = LCC2J94N44; - LastSwiftMigration = 0900; + LastSwiftMigration = 1120; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 5366BC5D1EA8DF80006A06E5 /* Build configuration list for PBXProject "GridView" */; compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -261,7 +261,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -288,7 +288,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -298,6 +298,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -357,6 +358,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -420,7 +422,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -438,7 +440,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.GridView; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/GridView/GridView/GridView.swift b/GridView/GridView/GridView.swift index 8167594..ad3349d 100644 --- a/GridView/GridView/GridView.swift +++ b/GridView/GridView/GridView.swift @@ -36,7 +36,6 @@ import UIKit @IBDesignable public class GridView: UIView { - /// The number of horizontal rows - default is 1. @IBInspectable public var rowCount: Int = 1 { didSet { setNeedsDisplay() } } @@ -49,7 +48,7 @@ public class GridView: UIView { /// The grid line width - default is 1 point. @IBInspectable public var lineWidth: CGFloat = 1.0 { didSet { setNeedsDisplay() } } - override public func draw(_ rect: CGRect) { + public override func draw(_ rect: CGRect) { lineColor.set() rowPath?.stroke() columnPath?.stroke() From bb3b5e075ab25dd92edd4730ce53d57de805c9a4 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 31 Dec 2019 23:11:40 +0000 Subject: [PATCH 104/142] Update for Xcode 11 --- RevealStack/RevealStack/Base.lproj/Main.storyboard | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/RevealStack/RevealStack/Base.lproj/Main.storyboard b/RevealStack/RevealStack/Base.lproj/Main.storyboard index ea10869..d3bf493 100644 --- a/RevealStack/RevealStack/Base.lproj/Main.storyboard +++ b/RevealStack/RevealStack/Base.lproj/Main.storyboard @@ -1,9 +1,10 @@ - + + @@ -11,16 +12,12 @@ - - - - - + @@ -46,9 +43,10 @@ - + + From 938710b9a6983de9da58e247babb14d6159ed093 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 1 Jan 2020 12:50:10 +0000 Subject: [PATCH 105/142] Update for Xcode 11, Swift 5 --- .../TableHeaderObjC/Base.lproj/Main.storyboard | 17 +++++++---------- .../TableHeaderObjC/ListTableViewController.m | 2 +- .../TableHeader/Base.lproj/Main.storyboard | 15 ++++++--------- .../TableHeader/ListTableViewController.swift | 2 +- 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard b/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard index 52b3d33..dec5842 100644 --- a/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC/Base.lproj/Main.storyboard @@ -1,12 +1,9 @@ - - - - + + - - + @@ -14,7 +11,7 @@ - + @@ -43,14 +40,14 @@
- + - +
diff --git a/Motion/Motion/Motion-Prefix.pch b/Motion/Motion/Motion-Prefix.pch deleted file mode 100644 index 82a2bb4..0000000 --- a/Motion/Motion/Motion-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Motion/README b/Motion/README index 8fae223..3ae9ee8 100644 --- a/Motion/README +++ b/Motion/README @@ -7,4 +7,4 @@ This is a example project showing how to add motion effects to a view to create a sense of depth. For further details see the following blog post: -http://useyourloaf.com/blog/2014/01/03/motion-effects.html +https://useyourloaf.com/blog/motion-effects/ diff --git a/SelfSize/README b/SelfSize/README index f2cf08d..9a6664e 100644 --- a/SelfSize/README +++ b/SelfSize/README @@ -7,9 +7,9 @@ Example of using self-sizing table view cells and universal storyboards introduced in iOS 8. This is a reworking of the Huckleberry project removing code that is no longer required. The full details are in the following post: -http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html +https://useyourloaf.com/blog/self-sizing-table-view-cells/ The original post can also be found here: -http://useyourloaf.com/blog/2014/02/14/table-view-cells-with-varying-row-heights.html +https://useyourloaf.com/blog/table-view-cells-with-varying-row-heights/ diff --git a/SelfSize/SelfSize.xcodeproj/project.pbxproj b/SelfSize/SelfSize.xcodeproj/project.pbxproj index 28d9945..f6033cc 100644 --- a/SelfSize/SelfSize.xcodeproj/project.pbxproj +++ b/SelfSize/SelfSize.xcodeproj/project.pbxproj @@ -3,10 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ + 5325894A23C91363008ABE63 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5325894923C91363008ABE63 /* LaunchScreen.storyboard */; }; 5351AA8A19845210006179CA /* README in Resources */ = {isa = PBXBuildFile; fileRef = 5351AA8919845210006179CA /* README */; }; 53EDDFCA19819CC40064D44A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDDFC919819CC40064D44A /* main.m */; }; 53EDDFCD19819CC40064D44A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDDFCC19819CC40064D44A /* AppDelegate.m */; }; @@ -18,6 +19,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5325894923C91363008ABE63 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 5351AA8919845210006179CA /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; 53EDDFC419819CC40064D44A /* SelfSize.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SelfSize.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53EDDFC819819CC40064D44A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -71,6 +73,7 @@ 53EDDFF119819E1C0064D44A /* UYLTextCell.h */, 53EDDFF219819E1C0064D44A /* UYLTextCell.m */, 53EDDFD119819CC40064D44A /* Main.storyboard */, + 5325894923C91363008ABE63 /* LaunchScreen.storyboard */, 53EDDFD419819CC40064D44A /* Images.xcassets */, 53EDDFC719819CC40064D44A /* Supporting Files */, ); @@ -113,7 +116,7 @@ 53EDDFBC19819CC40064D44A /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0600; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53EDDFC319819CC40064D44A = { @@ -122,8 +125,8 @@ }; }; buildConfigurationList = 53EDDFBF19819CC40064D44A /* Build configuration list for PBXProject "SelfSize" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -147,6 +150,7 @@ 5351AA8A19845210006179CA /* README in Resources */, 53EDDFD319819CC40064D44A /* Main.storyboard in Resources */, 53EDDFD519819CC40064D44A /* Images.xcassets in Resources */, + 5325894A23C91363008ABE63 /* LaunchScreen.storyboard in Resources */, 53EDDFF519819FFC0064D44A /* SourceData.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -183,24 +187,37 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; 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", @@ -225,17 +242,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -243,6 +271,7 @@ 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; @@ -261,9 +290,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = SelfSize/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -272,9 +304,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = SelfSize/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/SelfSize/SelfSize/Base.lproj/Main.storyboard b/SelfSize/SelfSize/Base.lproj/Main.storyboard index 6bfa106..03be3d6 100644 --- a/SelfSize/SelfSize/Base.lproj/Main.storyboard +++ b/SelfSize/SelfSize/Base.lproj/Main.storyboard @@ -1,7 +1,10 @@ - - + + + - + + + @@ -9,23 +12,25 @@ - + - + + + - + @@ -64,7 +69,7 @@ - + diff --git a/SelfSize/SelfSize/Images.xcassets/AppIcon.appiconset/Contents.json b/SelfSize/SelfSize/Images.xcassets/AppIcon.appiconset/Contents.json index 91bf9c1..d8db8d6 100644 --- a/SelfSize/SelfSize/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/SelfSize/SelfSize/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,18 +1,53 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "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" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", "scale" : "2x" }, { @@ -44,6 +79,16 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/SelfSize/SelfSize/Images.xcassets/Contents.json b/SelfSize/SelfSize/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/SelfSize/SelfSize/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/SelfSize/SelfSize/Images.xcassets/LaunchImage.launchimage/Contents.json b/SelfSize/SelfSize/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index 6f870a4..0000000 --- a/SelfSize/SelfSize/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SelfSize/SelfSize/Info.plist b/SelfSize/SelfSize/Info.plist index cab5273..95c9575 100644 --- a/SelfSize/SelfSize/Info.plist +++ b/SelfSize/SelfSize/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -22,6 +22,8 @@ 1 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/SelfSize/SelfSize/LaunchScreen.storyboard b/SelfSize/SelfSize/LaunchScreen.storyboard new file mode 100644 index 0000000..883d763 --- /dev/null +++ b/SelfSize/SelfSize/LaunchScreen.storyboard @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpeakEasy/README b/SpeakEasy/README index 02b311d..96d071a 100644 --- a/SpeakEasy/README +++ b/SpeakEasy/README @@ -8,4 +8,4 @@ text to speech synthesis. Makes use of custom voices, pitch, rate and text highlighting. For further details see the following blog post: -http://useyourloaf.com/blog/2014/01/08/synthesized-speech-from-text.html \ No newline at end of file +https://useyourloaf.com/blog/synthesized-speech-from-text/ diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.pbxproj b/SpeakEasy/SpeakEasy.xcodeproj/project.pbxproj index 1fd4ccd..07fa233 100644 --- a/SpeakEasy/SpeakEasy.xcodeproj/project.pbxproj +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.pbxproj @@ -3,10 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ + 530D9CF023C926AC0087DFA0 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 530D9CEF23C926AC0087DFA0 /* LaunchScreen.storyboard */; }; 5329C82318785C4F00B91692 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5329C82218785C4F00B91692 /* Foundation.framework */; }; 5329C82518785C4F00B91692 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5329C82418785C4F00B91692 /* CoreGraphics.framework */; }; 5329C82718785C4F00B91692 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5329C82618785C4F00B91692 /* UIKit.framework */; }; @@ -19,6 +20,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 530D9CEF23C926AC0087DFA0 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 5329C81F18785C4F00B91692 /* SpeakEasy.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpeakEasy.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5329C82218785C4F00B91692 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5329C82418785C4F00B91692 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -26,7 +28,6 @@ 5329C82A18785C4F00B91692 /* SpeakEasy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SpeakEasy-Info.plist"; sourceTree = ""; }; 5329C82C18785C4F00B91692 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 5329C82E18785C4F00B91692 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 5329C83018785C4F00B91692 /* SpeakEasy-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SpeakEasy-Prefix.pch"; sourceTree = ""; }; 5329C83118785C4F00B91692 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 5329C83218785C4F00B91692 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 5329C83518785C4F00B91692 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -86,6 +87,7 @@ 5329C83118785C4F00B91692 /* UYLAppDelegate.h */, 5329C83218785C4F00B91692 /* UYLAppDelegate.m */, 5329C83418785C4F00B91692 /* Main.storyboard */, + 530D9CEF23C926AC0087DFA0 /* LaunchScreen.storyboard */, 5329C83718785C4F00B91692 /* UYLViewController.h */, 5329C83818785C4F00B91692 /* UYLViewController.m */, 5329C83A18785C4F00B91692 /* Images.xcassets */, @@ -100,7 +102,6 @@ 5329C82A18785C4F00B91692 /* SpeakEasy-Info.plist */, 5329C82B18785C4F00B91692 /* InfoPlist.strings */, 5329C82E18785C4F00B91692 /* main.m */, - 5329C83018785C4F00B91692 /* SpeakEasy-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; @@ -132,12 +133,12 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0510; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 5329C81A18785C4F00B91692 /* Build configuration list for PBXProject "SpeakEasy" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -159,6 +160,7 @@ buildActionMask = 2147483647; files = ( 5329C83B18785C4F00B91692 /* Images.xcassets in Resources */, + 530D9CF023C926AC0087DFA0 /* LaunchScreen.storyboard in Resources */, 5329C82D18785C4F00B91692 /* InfoPlist.strings in Resources */, 5329C83618785C4F00B91692 /* Main.storyboard in Resources */, ); @@ -203,22 +205,37 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -231,7 +248,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -241,29 +258,43 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; 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; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -273,10 +304,9 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "SpeakEasy/SpeakEasy-Prefix.pch"; INFOPLIST_FILE = "SpeakEasy/SpeakEasy-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -286,10 +316,9 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "SpeakEasy/SpeakEasy-Prefix.pch"; INFOPLIST_FILE = "SpeakEasy/SpeakEasy-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/SpeakEasy/SpeakEasy/Base.lproj/Main.storyboard b/SpeakEasy/SpeakEasy/Base.lproj/Main.storyboard index fc9f909..bf0a3b5 100644 --- a/SpeakEasy/SpeakEasy/Base.lproj/Main.storyboard +++ b/SpeakEasy/SpeakEasy/Base.lproj/Main.storyboard @@ -1,10 +1,13 @@ - - + + + - + + + - + @@ -13,12 +16,11 @@ - + - - + @@ -26,8 +28,7 @@ - - + @@ -39,8 +40,7 @@ - - + @@ -51,26 +51,24 @@ - - + - + @@ -97,11 +95,7 @@ + - - - - - - \ No newline at end of file + diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/Contents.json b/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/Contents.json index 80689ca..19882d5 100644 --- a/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,22 +1,49 @@ { "images" : [ { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", "size" : "29x29", + "scale" : "2x" + }, + { "idiom" : "iphone", - "filename" : "icon58.png", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", "scale" : "2x" }, { + "idiom" : "iphone", "size" : "40x40", + "scale" : "3x" + }, + { "idiom" : "iphone", - "filename" : "icon80.png", + "size" : "60x60", "scale" : "2x" }, { - "size" : "60x60", "idiom" : "iphone", - "filename" : "icon120.png", - "scale" : "2x" + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/icon120.png b/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/icon120.png deleted file mode 100644 index 0077715e84c6014c0cad9cf02c3e1da4bf1dc33e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmV+r0`L8aP)$PO+=tum$NK&Erq_1l^VPcGmHz(y-0#V(+J5u;?ZM-q%IB`7*LA|=p{v<_ z?DyiU+I_?1qU`qJ^!o4A?7ZXh)b#r9_4@D2=&sc4z4`q1{{Q`?)^g?a*Tm(dr`UJH z5a z-syuMjgEVBReo02#HD9bVn4VtH%0cujYXM-3%ydNcEk+|4TL31B}8RPWkfYfHAEFk z6+|6M9Yj&gv17-M9XodH*s){BjxRWN?D$aX*PeYGNeDnO5S0>O2JhE9euihNjnbq}Ow)*?Q>p+r8nLvD}BV-HN5x zbo>4J*zLme`t8r^wd(fY>Gj;X;F9R|+_&G5)9bsV)^hOp=;`&{$L6WO$%D2tgG67{Qmp+{Pm~UciivD)9bpk-HHAF{H)r4=JeRy@XDyzdGGk=$L6Sq z38mTq008GnL_t(|0qxbtZo@DT1kf2$qD0xIOM36Um;e8^2!<~KMQgc85FpUIFZMvr zECz$$)Ob@ne&cH68}zA4CX^M{8QX$Mg&iYl61Y~FBzFe(2&ui6y(~Ia1$z}0x|9?s z(V?M8gP5m?N6b*fAXZbPM$A#fAx5G9FzP6>p?{pMpZyY^BHM_~C^FZFP9OC>b-`?^ zYi)O=Ez_NMWrfo&l!s&gKy$8Ihcje3I_Am=a-DMJ47o<Sp!GS0)&hgS@daV43wEqJptJx0002ovPDHLkV1hHc B0WSam diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/icon80.png b/SpeakEasy/SpeakEasy/Images.xcassets/AppIcon.appiconset/icon80.png deleted file mode 100644 index 8f906ac356787ec22a3c806528bdeefcc093e32f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)i_@#=k(gx?!&d-jn3(_=JeV7{rIHUbFtip==IyA)^e%YdaT-h-0;f!{rJG+ zp3dpC{Qml<*mttsh~x6q#^$Ki?7sg0{;S!2xZjfL_1^3D;P?CU&FQk+@5r#+hQH#R z@c8Ja*LC~-`P1yY;_}kB-;l-SruO^sqty9Lb)uBK7-{Mqz+2n;Ba$TP>n3Yi zsm+?Y*J@S48j4EGb!E<4^0Lzs^MSPub4}_7A`G3Tltd{tp~{JpR|+eLR4Aw?TCb3r zXthEbqBRQ1h?Xg&C0eTx;*kPV;1Ve?1*X83Xj}G9vA3SRm+i~Jy>0C4%e@cn3)a1{ z-7moYQ~XaV-bT*CraaDB*p|l*BX;-XvCoJDxnztE<#GhT@rhhc0XUP*>;m9YK34$O z^0@(SWpsBB4{~~hCpkUy@+zmd_YZk}e#z_mM_x1iKS}Zn7cdb9A#bX!00000NkvXX Hu0mjfG*t*S diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/Contents.json b/SpeakEasy/SpeakEasy/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/SpeakEasy/SpeakEasy/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/Contents.json b/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index a195255..0000000 --- a/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "filename" : "Default.png", - "scale" : "2x" - }, - { - "extent" : "full-screen", - "idiom" : "iphone", - "subtype" : "retina4", - "filename" : "DefaultR4.png", - "minimum-system-version" : "7.0", - "orientation" : "portrait", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/Default.png b/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/Default.png deleted file mode 100644 index d66b897c194499fef271e2174afaa4f09ecbc6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU_QXe3>2BK6SV_KF$egBxc>kDfB6yV6F_c~ xr;B4qMcmtihKxYop#@+4bGh{w0GZSR6%zXA85nmc__u&e^mO%eS?83{1OSWB8rlE= diff --git a/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/DefaultR4.png b/SpeakEasy/SpeakEasy/Images.xcassets/LaunchImage.launchimage/DefaultR4.png deleted file mode 100644 index 804499ceee04996ef771df748f940b6aae704ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU@2f^28uX1mOBF}<^Z1%*Z=?jFFzuE0>~}! xba4!+h + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpeakEasy/SpeakEasy/SpeakEasy-Info.plist b/SpeakEasy/SpeakEasy/SpeakEasy-Info.plist index 23cd2c3..bc8f3ff 100644 --- a/SpeakEasy/SpeakEasy/SpeakEasy-Info.plist +++ b/SpeakEasy/SpeakEasy/SpeakEasy-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,6 +24,8 @@ 1.0 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/SpeakEasy/SpeakEasy/SpeakEasy-Prefix.pch b/SpeakEasy/SpeakEasy/SpeakEasy-Prefix.pch deleted file mode 100644 index 82a2bb4..0000000 --- a/SpeakEasy/SpeakEasy/SpeakEasy-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif From ff0edded2c2ae5f550fad42afcc0c351f3ed83fb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 10 Jan 2020 22:10:29 +0000 Subject: [PATCH 120/142] Update for Xcode 11 and Swift 5 --- RemindMe10/RemindMe.xcodeproj/project.pbxproj | 28 ++++++++++++++++--- RemindMe10/RemindMe/AppDelegate.swift | 2 +- .../RemindMe/UNMutableNotification+UYL.swift | 4 +-- .../RemindMeObjc/UYLNotificationDelegate.m | 2 +- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/RemindMe10/RemindMe.xcodeproj/project.pbxproj b/RemindMe10/RemindMe.xcodeproj/project.pbxproj index d17847a..f91d866 100644 --- a/RemindMe10/RemindMe.xcodeproj/project.pbxproj +++ b/RemindMe10/RemindMe.xcodeproj/project.pbxproj @@ -176,7 +176,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 539D5EB81DC4DBF500130F2F = { @@ -193,7 +193,7 @@ }; buildConfigurationList = 53BA9AF01DB283D7000BD07D /* Build configuration list for PBXProject "RemindMe" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -324,20 +324,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; @@ -367,6 +376,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -375,20 +385,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; @@ -410,6 +429,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -424,7 +444,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -437,7 +457,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift index b57cf86..85e52f5 100644 --- a/RemindMe10/RemindMe/AppDelegate.swift +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -40,7 +40,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let notificationDelegate = UYLNotificationDelegate() - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { let options: UNAuthorizationOptions = [.alert, .sound]; registerForLocalNotifications(options: options) let center = UNUserNotificationCenter.current() diff --git a/RemindMe10/RemindMe/UNMutableNotification+UYL.swift b/RemindMe10/RemindMe/UNMutableNotification+UYL.swift index 58cf0df..8ab4d29 100644 --- a/RemindMe10/RemindMe/UNMutableNotification+UYL.swift +++ b/RemindMe10/RemindMe/UNMutableNotification+UYL.swift @@ -42,9 +42,9 @@ extension UNMutableNotificationContent { /// - body: The message displayed in the notification alert. /// - title: A short description of the reason for the alert. /// - sound: The sound to play when the notification is - /// delivered. Defaults to `UNNotificationSound.default()`. + /// delivered. Defaults to `UNNotificationSound.default`. - convenience init(body: String, title: String, sound: UNNotificationSound = UNNotificationSound.default()) { + convenience init(body: String, title: String, sound: UNNotificationSound = UNNotificationSound.default) { self.init() self.title = NSString.localizedUserNotificationString(forKey: title, arguments: nil) self.body = body diff --git a/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m b/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m index 776c88a..011b8d5 100644 --- a/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m +++ b/RemindMe10/RemindMeObjc/UYLNotificationDelegate.m @@ -40,7 +40,7 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNot completionHandler(UNNotificationPresentationOptionAlert + UNNotificationPresentationOptionSound); } -- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { +- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { completionHandler(); } From cff31734e06a840e2c1ca799bef9abce80f64f86 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 14:32:40 +0000 Subject: [PATCH 121/142] Update for Xcode 11 and minimum of iOS 9 --- .../DynamicText.xcodeproj/project.pbxproj | 22 +++-- .../DynamicText/Base.lproj/Main.storyboard | 79 +++++++----------- .../DynamicText/DynamicText-Info.plist | 5 +- .../AppIcon.appiconset/Contents.json | 60 +++++++++++++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 56305 bytes .../AppIcon.appiconset/icon-167.png | Bin 0 -> 11276 bytes .../AppIcon.appiconset/icon-20.png | Bin 0 -> 736 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 821 bytes .../AppIcon.appiconset/icon-29@2x-1.png | Bin 0 -> 2535 bytes .../AppIcon.appiconset/icon-40@2x-1.png | Bin 0 -> 4680 bytes .../AppIcon.appiconset/icon-41.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-42.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4136 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17726 bytes .../DynamicText/UYLTextStyleViewController.m | 5 -- DynamicText/README.md | 3 +- 16 files changed, 111 insertions(+), 63 deletions(-) create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 7055b4a..8707dce 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 48; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -145,12 +145,12 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0940; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -227,6 +227,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -269,7 +270,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -279,6 +280,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -314,7 +316,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -324,13 +326,15 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1.3; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -339,13 +343,15 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1.3; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/DynamicText/DynamicText/Base.lproj/Main.storyboard b/DynamicText/DynamicText/Base.lproj/Main.storyboard index ff01357..f069627 100644 --- a/DynamicText/DynamicText/Base.lproj/Main.storyboard +++ b/DynamicText/DynamicText/Base.lproj/Main.storyboard @@ -1,10 +1,13 @@ - - + + + - + + + - + @@ -13,59 +16,52 @@ - + - + @@ -103,9 +99,9 @@ - + - + @@ -114,60 +110,53 @@ - + - + @@ -205,7 +194,7 @@ - + @@ -214,8 +203,9 @@ + - + @@ -224,16 +214,11 @@ - + - - - - - - \ No newline at end of file + diff --git a/DynamicText/DynamicText/DynamicText-Info.plist b/DynamicText/DynamicText/DynamicText-Info.plist index fce2f33..2348c0a 100644 --- a/DynamicText/DynamicText/DynamicText-Info.plist +++ b/DynamicText/DynamicText/DynamicText-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion - 1.2 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS UILaunchStoryboardName @@ -37,6 +37,7 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown
diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json index f60b56f..1120389 100644 --- a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json @@ -47,6 +47,66 @@ "idiom" : "iphone", "filename" : "icon-180.png", "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-41.png", + "scale" : "2x" + }, + { + "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-42.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" } ], "info" : { diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1a9de7f6ad69ba2280fc5250c4368846b7921e GIT binary patch literal 56305 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 Y^-*HM%6=&H7sNNxH`Ob=>iF!x09e}G4*&oF literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5ec66a8746d77c19afa4db06b0e9e27145e92d GIT binary patch literal 11276 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3c599a552c33fae613e1ab51f03e7e7434bbcb81 GIT binary patch literal 2535 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..afcf538b066551cf9098ace98b82019a45999e07 GIT binary patch literal 4680 zcmV-O61VM%P)9ay4`%ycl0og!NlJSl5+ zJ1vRwOy)xXR#BmUbvgqX`L6$82`CLIGjrF!fBgvWSEiz&jZaOT|esffKQuG zxT!UYQ0@E*(cR=|452M^tas>~4fwkV>vhA+M5;^AOf7Jo=;UxhK}x0TWxR0ZM3M#g9)C=hP-qmSS6!tk|J0g$7S11$$RmQ*XajdLk~D({y7 zLV_)QGmNJXbb%1wXEZhz5ClEg+`8Z48+z6A=C+;nRa1#&Wc$;3@77PsCL2RQ!XmiU zCmy&~evR!cp?GNnkVa0kHm2}Repte^TnZVl24d8<5i21<{-DIlyg4dq*=3qOJThEZ zOaeKh<*yG9{0!R^2?94zLf6n%hqFbwe#151Sicsfr5nU$u_QjnrX|ZE1q9fyE8<~( z{gM{%)Q2%J$HhpCLwmoIVlRJBV zdU3lSzyd&5C{bB89F)>`Kw4ysv_xM+F81$DzlyjFROL$umu^m+Y6&TB*0fB+=6v1! zoR7Q8zNBV_>~-hAQnFYf(-u)p(QJY-;Cw8*#ixfK_!S<$0k;r6iBKy|HAqWm0#4D# zpl!8R6jX>pU0DaeM6hw;2e?~gg`TfHQuaz&E4@yl{ur@uk!i#!%2Gv!HOGpa91hnto{iXTDcSaOO zLh>Jw*0ukdJK^PurShzsSB=w$CEgJbkLjq7QG0WP6Q4?}jCuWsdrCY9X_HC^nn$}UiNSz}{cdYYwB2ce5cJ9LkLQpBJ2()TBw{=rZyM@{GBtEMiR z{CrBey+|hUdd(U`n^?(-vd3`xWFsN18JL0trK!479yROh7U#_!d{lI9RwaG$M!r8BJhB>C|#+FY_=p!~biC^=)vlsPpk>>&<<($NO41Z+X* zNH-!TKYg-=|G9VVX^tS~`d8$^PdZ$^q@Vm-Qm@kXrBi3uskqBO^rry|cVB`?f=g#i zROYYBK|Q9Id^S$A9e1qidh?22a^$6U#T`qh%&wob!!7t!{K*1ucUzN}KEbU=6t#Gp zb9I1&4^3h>E$emX>TYr*rAGPPOQ+0il#=D|Lj4Laxw9WwMGTMEuUug>D|fdw9Ytx| z=&Hs2AN;J-5o3{imQ0!1tV)KjqVHc7zc*lPG=|5CMM=l4bj2rMxTUA%=EVyJJ@G|* zNwlPt$yq#U=5f`x`EzD|2=ls9CjzIahsR=F)o`n8@7hw?7!vUA*vC0@htK||jU-Mg zmCl_%X=aNWe|sq=E()Q*95<){v$E=L-P!RD}gHQ>{>a7iWzIcu# zPTJMpx?=icNDt}{wKx`Z|M?)sWFjwPICdmV9_> zp51yC;+EY=F9t8_GUE(|p~+7h$P;kxrocHU(@18gZgX&VxOA0!?~_E!S*=z)((et` z$S)h*X=i_eT+hs73a9rcRD^xcCbCyZQ8(9f_Qa zbb~0js#XA6y>P4vck)Rr*MVGP0vQP%qV>b52R`k4XsyN#UF)xZ?DHPG^UBB}$hJ!_ zNG_Ah|dT5`0R{RRw5ViSSDv%J(cFET;rx!lb7BZO1X0)Iz!G>gY6-FLY|vfJn7z<79@qG zWGMgKHjA(B_+C<(Tx0PMk0MxEv9;DBMZ)?S z5K*X;pVm=$+{l?fra>upY81Y;2y^p&YTZ_|?+{N$AN%R;-CwJplz|EZRgF%NV>CQs zU;44r4a>*;xvR3c(x>5fA5FLy@k)~x7^|=h&^j2$k&XRWkk+1NQc#Dull9oRhz}lY z#)Dq}vHj%t&KHvQb=KY2>!mieH!1alkpPO!gsctFA)Hs@p)Us9vu4O1!n6NX%-D4P z`GHfwW1%pDOy5#593KGVcph#;`IRX(OvhUUZqfleOp!-DbLZ+2=%l9J-t(1_%|GKH z0I(CN@OipBIF-Jq;w>vj&-%7!5uO>b+b^G5wp5rW^zi^KP?;V$qx(vbO*9X;atBu6 z2JO7-_@9WI`ix$Wee2S9*R@M7v*)@_Z=T(9LGfaRJR7G;+>Jv^ps&;y?)WvM)|E>p z&)wKcL_V8wWs91dol*hepb%z|u{68jf$_}|Q@Dk|yo6334P{Er^aN)zt!CZVv;Gg) zbbK?ZOb*Ne+`}xb-x9+qkL(LQ;z}*wa{T2>rd`Hn5T{Ph$JZP&lEQ)*Yp za&R5Y!7qn`*U{^OZK^rbh`UR*|Q9kExpa?c-4+L`ZNKc5)FB*}NU_M@a-zp}s|vT?I)U&Ga_Q&pI}}|DPtyWoD4kn0pC)=W3TO;v_b!}Lyp#OPu+(N0#23r3)Oc_A!oaC zAK~I|am-cNbUqTXUb?j!wv572JQ;^Y3`~kBefp%GV(f#K9sdLM#GtQ75sJ?M0000< KMNUMnLSTa7Rs$~p literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png b/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png new file mode 100644 index 0000000000000000000000000000000000000000..c663546f40b42b9e41523fc6182d8a6b4b99090d GIT binary patch literal 1328 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 Date: Sat, 11 Jan 2020 14:43:00 +0000 Subject: [PATCH 122/142] Archive Collection project (bug was resolved in iOS 9.3) --- .../Collection.xcodeproj/project.pbxproj | 528 ++++++++++++++++++ .../Collection/Base.lproj/Main.storyboard | 129 +++++ .../Collection/Collection-Info.plist | 41 ++ .../Collection/Collection-Prefix.pch | 16 + .../AppIcon.appiconset/Contents.json | 20 + .../AppIcon.appiconset/icon-29.png | Bin 0 -> 859 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.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4166 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17774 bytes .../Collection/Images.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 8 +- .../Default-Landscape@2x~ipad.png | Bin 0 -> 1001 bytes .../Default-Landscape~ipad.png | Bin 0 -> 593 bytes .../Default-Portrait@2x~ipad.png | Bin 0 -> 1784 bytes .../Default-Portrait~ipad.png | Bin 0 -> 338 bytes .../Collection/Collection/UYLAppDelegate.h | 39 ++ .../Collection/Collection/UYLAppDelegate.m | 44 ++ .../Collection/UYLCollectionViewController.h | 38 ++ .../Collection/UYLCollectionViewController.m | 124 ++++ Archive/Collection/Collection/UYLSimpleCell.h | 40 ++ Archive/Collection/Collection/UYLSimpleCell.m | 51 ++ .../Collection/Collection/UYLViewController.h | 38 ++ .../Collection/Collection/UYLViewController.m | 50 ++ .../Collection/en.lproj/InfoPlist.strings | 2 + Archive/Collection/Collection/main.m | 43 ++ .../CollectionTests-Info.plist | 22 + .../CollectionTests/CollectionTests.m | 34 ++ .../en.lproj/InfoPlist.strings | 2 + Archive/Collection/README | 16 + 31 files changed, 1287 insertions(+), 4 deletions(-) create mode 100644 Archive/Collection/Collection.xcodeproj/project.pbxproj create mode 100644 Archive/Collection/Collection/Base.lproj/Main.storyboard create mode 100644 Archive/Collection/Collection/Collection-Info.plist create mode 100644 Archive/Collection/Collection/Collection-Prefix.pch rename {Collection => Archive/Collection}/Collection/Images.xcassets/AppIcon.appiconset/Contents.json (69%) create mode 100644 Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 Archive/Collection/Collection/Images.xcassets/Contents.json rename {Collection => Archive/Collection}/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json (100%) create mode 100644 Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png create mode 100644 Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png create mode 100644 Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png create mode 100644 Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png create mode 100644 Archive/Collection/Collection/UYLAppDelegate.h create mode 100644 Archive/Collection/Collection/UYLAppDelegate.m create mode 100644 Archive/Collection/Collection/UYLCollectionViewController.h create mode 100644 Archive/Collection/Collection/UYLCollectionViewController.m create mode 100644 Archive/Collection/Collection/UYLSimpleCell.h create mode 100644 Archive/Collection/Collection/UYLSimpleCell.m create mode 100644 Archive/Collection/Collection/UYLViewController.h create mode 100644 Archive/Collection/Collection/UYLViewController.m create mode 100644 Archive/Collection/Collection/en.lproj/InfoPlist.strings create mode 100644 Archive/Collection/Collection/main.m create mode 100644 Archive/Collection/CollectionTests/CollectionTests-Info.plist create mode 100644 Archive/Collection/CollectionTests/CollectionTests.m create mode 100644 Archive/Collection/CollectionTests/en.lproj/InfoPlist.strings create mode 100644 Archive/Collection/README diff --git a/Archive/Collection/Collection.xcodeproj/project.pbxproj b/Archive/Collection/Collection.xcodeproj/project.pbxproj new file mode 100644 index 0000000..84347c5 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.pbxproj @@ -0,0 +1,528 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + 53A5F89517E3BA57000DB6B5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89417E3BA57000DB6B5 /* Foundation.framework */; }; + 53A5F89717E3BA57000DB6B5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89617E3BA57000DB6B5 /* CoreGraphics.framework */; }; + 53A5F89917E3BA57000DB6B5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89817E3BA57000DB6B5 /* UIKit.framework */; }; + 53A5F89F17E3BA57000DB6B5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F89D17E3BA57000DB6B5 /* InfoPlist.strings */; }; + 53A5F8A117E3BA57000DB6B5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8A017E3BA57000DB6B5 /* main.m */; }; + 53A5F8A517E3BA57000DB6B5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8A417E3BA57000DB6B5 /* UYLAppDelegate.m */; }; + 53A5F8A817E3BA57000DB6B5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F8A617E3BA57000DB6B5 /* Main.storyboard */; }; + 53A5F8AB17E3BA57000DB6B5 /* UYLCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8AA17E3BA57000DB6B5 /* UYLCollectionViewController.m */; }; + 53A5F8AD17E3BA57000DB6B5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F8AC17E3BA57000DB6B5 /* Images.xcassets */; }; + 53A5F8B417E3BA57000DB6B5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F8B317E3BA57000DB6B5 /* XCTest.framework */; }; + 53A5F8B517E3BA57000DB6B5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89417E3BA57000DB6B5 /* Foundation.framework */; }; + 53A5F8B617E3BA57000DB6B5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89817E3BA57000DB6B5 /* UIKit.framework */; }; + 53A5F8BE17E3BA57000DB6B5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F8BC17E3BA57000DB6B5 /* InfoPlist.strings */; }; + 53A5F8C017E3BA57000DB6B5 /* CollectionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8BF17E3BA57000DB6B5 /* CollectionTests.m */; }; + 53A5F8CB17E3BFFB000DB6B5 /* UYLSimpleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8CA17E3BFFB000DB6B5 /* UYLSimpleCell.m */; }; + 53A5F8CE17E3C692000DB6B5 /* UYLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8CD17E3C692000DB6B5 /* UYLViewController.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 53A5F8B717E3BA57000DB6B5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 53A5F88917E3BA57000DB6B5 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 53A5F89017E3BA57000DB6B5; + remoteInfo = Collection; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 53A5F89117E3BA57000DB6B5 /* Collection.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Collection.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53A5F89417E3BA57000DB6B5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 53A5F89617E3BA57000DB6B5 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 53A5F89817E3BA57000DB6B5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 53A5F89C17E3BA57000DB6B5 /* Collection-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Collection-Info.plist"; sourceTree = ""; }; + 53A5F89E17E3BA57000DB6B5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 53A5F8A017E3BA57000DB6B5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 53A5F8A217E3BA57000DB6B5 /* Collection-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Collection-Prefix.pch"; sourceTree = ""; }; + 53A5F8A317E3BA57000DB6B5 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; + 53A5F8A417E3BA57000DB6B5 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; + 53A5F8A717E3BA57000DB6B5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53A5F8A917E3BA57000DB6B5 /* UYLCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLCollectionViewController.h; sourceTree = ""; }; + 53A5F8AA17E3BA57000DB6B5 /* UYLCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLCollectionViewController.m; sourceTree = ""; }; + 53A5F8AC17E3BA57000DB6B5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 53A5F8B217E3BA57000DB6B5 /* CollectionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CollectionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 53A5F8B317E3BA57000DB6B5 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 53A5F8BB17E3BA57000DB6B5 /* CollectionTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CollectionTests-Info.plist"; sourceTree = ""; }; + 53A5F8BD17E3BA57000DB6B5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 53A5F8BF17E3BA57000DB6B5 /* CollectionTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CollectionTests.m; sourceTree = ""; }; + 53A5F8C917E3BFFB000DB6B5 /* UYLSimpleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLSimpleCell.h; sourceTree = ""; }; + 53A5F8CA17E3BFFB000DB6B5 /* UYLSimpleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLSimpleCell.m; sourceTree = ""; }; + 53A5F8CC17E3C692000DB6B5 /* UYLViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLViewController.h; sourceTree = ""; }; + 53A5F8CD17E3C692000DB6B5 /* UYLViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLViewController.m; sourceTree = ""; }; + 53D5C7E617F62BD50077FB0D /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53A5F88E17E3BA57000DB6B5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A5F89717E3BA57000DB6B5 /* CoreGraphics.framework in Frameworks */, + 53A5F89917E3BA57000DB6B5 /* UIKit.framework in Frameworks */, + 53A5F89517E3BA57000DB6B5 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A5F8AF17E3BA57000DB6B5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A5F8B417E3BA57000DB6B5 /* XCTest.framework in Frameworks */, + 53A5F8B617E3BA57000DB6B5 /* UIKit.framework in Frameworks */, + 53A5F8B517E3BA57000DB6B5 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53A5F88817E3BA57000DB6B5 = { + isa = PBXGroup; + children = ( + 53D5C7E617F62BD50077FB0D /* README */, + 53A5F89A17E3BA57000DB6B5 /* Collection */, + 53A5F8B917E3BA57000DB6B5 /* CollectionTests */, + 53A5F89317E3BA57000DB6B5 /* Frameworks */, + 53A5F89217E3BA57000DB6B5 /* Products */, + ); + sourceTree = ""; + }; + 53A5F89217E3BA57000DB6B5 /* Products */ = { + isa = PBXGroup; + children = ( + 53A5F89117E3BA57000DB6B5 /* Collection.app */, + 53A5F8B217E3BA57000DB6B5 /* CollectionTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 53A5F89317E3BA57000DB6B5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 53A5F89417E3BA57000DB6B5 /* Foundation.framework */, + 53A5F89617E3BA57000DB6B5 /* CoreGraphics.framework */, + 53A5F89817E3BA57000DB6B5 /* UIKit.framework */, + 53A5F8B317E3BA57000DB6B5 /* XCTest.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 53A5F89A17E3BA57000DB6B5 /* Collection */ = { + isa = PBXGroup; + children = ( + 53A5F8A317E3BA57000DB6B5 /* UYLAppDelegate.h */, + 53A5F8A417E3BA57000DB6B5 /* UYLAppDelegate.m */, + 53A5F8A617E3BA57000DB6B5 /* Main.storyboard */, + 53A5F8CC17E3C692000DB6B5 /* UYLViewController.h */, + 53A5F8CD17E3C692000DB6B5 /* UYLViewController.m */, + 53A5F8C917E3BFFB000DB6B5 /* UYLSimpleCell.h */, + 53A5F8CA17E3BFFB000DB6B5 /* UYLSimpleCell.m */, + 53A5F8A917E3BA57000DB6B5 /* UYLCollectionViewController.h */, + 53A5F8AA17E3BA57000DB6B5 /* UYLCollectionViewController.m */, + 53A5F8AC17E3BA57000DB6B5 /* Images.xcassets */, + 53A5F89B17E3BA57000DB6B5 /* Supporting Files */, + ); + path = Collection; + sourceTree = ""; + }; + 53A5F89B17E3BA57000DB6B5 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 53A5F89C17E3BA57000DB6B5 /* Collection-Info.plist */, + 53A5F89D17E3BA57000DB6B5 /* InfoPlist.strings */, + 53A5F8A017E3BA57000DB6B5 /* main.m */, + 53A5F8A217E3BA57000DB6B5 /* Collection-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 53A5F8B917E3BA57000DB6B5 /* CollectionTests */ = { + isa = PBXGroup; + children = ( + 53A5F8BF17E3BA57000DB6B5 /* CollectionTests.m */, + 53A5F8BA17E3BA57000DB6B5 /* Supporting Files */, + ); + path = CollectionTests; + sourceTree = ""; + }; + 53A5F8BA17E3BA57000DB6B5 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 53A5F8BB17E3BA57000DB6B5 /* CollectionTests-Info.plist */, + 53A5F8BC17E3BA57000DB6B5 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53A5F89017E3BA57000DB6B5 /* Collection */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53A5F8C317E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "Collection" */; + buildPhases = ( + 53A5F88D17E3BA57000DB6B5 /* Sources */, + 53A5F88E17E3BA57000DB6B5 /* Frameworks */, + 53A5F88F17E3BA57000DB6B5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Collection; + productName = Collection; + productReference = 53A5F89117E3BA57000DB6B5 /* Collection.app */; + productType = "com.apple.product-type.application"; + }; + 53A5F8B117E3BA57000DB6B5 /* CollectionTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53A5F8C617E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "CollectionTests" */; + buildPhases = ( + 53A5F8AE17E3BA57000DB6B5 /* Sources */, + 53A5F8AF17E3BA57000DB6B5 /* Frameworks */, + 53A5F8B017E3BA57000DB6B5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 53A5F8B817E3BA57000DB6B5 /* PBXTargetDependency */, + ); + name = CollectionTests; + productName = CollectionTests; + productReference = 53A5F8B217E3BA57000DB6B5 /* CollectionTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53A5F88917E3BA57000DB6B5 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = UYL; + LastUpgradeCheck = 1120; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53A5F89017E3BA57000DB6B5 = { + DevelopmentTeam = LCC2J94N44; + }; + 53A5F8B117E3BA57000DB6B5 = { + TestTargetID = 53A5F89017E3BA57000DB6B5; + }; + }; + }; + buildConfigurationList = 53A5F88C17E3BA57000DB6B5 /* Build configuration list for PBXProject "Collection" */; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53A5F88817E3BA57000DB6B5; + productRefGroup = 53A5F89217E3BA57000DB6B5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53A5F89017E3BA57000DB6B5 /* Collection */, + 53A5F8B117E3BA57000DB6B5 /* CollectionTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53A5F88F17E3BA57000DB6B5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A5F8AD17E3BA57000DB6B5 /* Images.xcassets in Resources */, + 53A5F89F17E3BA57000DB6B5 /* InfoPlist.strings in Resources */, + 53A5F8A817E3BA57000DB6B5 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A5F8B017E3BA57000DB6B5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A5F8BE17E3BA57000DB6B5 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53A5F88D17E3BA57000DB6B5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A5F8A117E3BA57000DB6B5 /* main.m in Sources */, + 53A5F8A517E3BA57000DB6B5 /* UYLAppDelegate.m in Sources */, + 53A5F8CB17E3BFFB000DB6B5 /* UYLSimpleCell.m in Sources */, + 53A5F8AB17E3BA57000DB6B5 /* UYLCollectionViewController.m in Sources */, + 53A5F8CE17E3C692000DB6B5 /* UYLViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A5F8AE17E3BA57000DB6B5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A5F8C017E3BA57000DB6B5 /* CollectionTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 53A5F8B817E3BA57000DB6B5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 53A5F89017E3BA57000DB6B5 /* Collection */; + targetProxy = 53A5F8B717E3BA57000DB6B5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 53A5F89D17E3BA57000DB6B5 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 53A5F89E17E3BA57000DB6B5 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 53A5F8A617E3BA57000DB6B5 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53A5F8A717E3BA57000DB6B5 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53A5F8BC17E3BA57000DB6B5 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 53A5F8BD17E3BA57000DB6B5 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53A5F8C117E3BA57000DB6B5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + 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_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; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = 2; + }; + name = Debug; + }; + 53A5F8C217E3BA57000DB6B5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + 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; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = 2; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53A5F8C417E3BA57000DB6B5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = "iPhone Developer"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; + INFOPLIST_FILE = "Collection/Collection-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 53A5F8C517E3BA57000DB6B5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = "iPhone Developer"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; + INFOPLIST_FILE = "Collection/Collection-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 53A5F8C717E3BA57000DB6B5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Collection.app/Collection"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "CollectionTests/CollectionTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 53A5F8C817E3BA57000DB6B5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Collection.app/Collection"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; + INFOPLIST_FILE = "CollectionTests/CollectionTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53A5F88C17E3BA57000DB6B5 /* Build configuration list for PBXProject "Collection" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53A5F8C117E3BA57000DB6B5 /* Debug */, + 53A5F8C217E3BA57000DB6B5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53A5F8C317E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "Collection" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53A5F8C417E3BA57000DB6B5 /* Debug */, + 53A5F8C517E3BA57000DB6B5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53A5F8C617E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "CollectionTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53A5F8C717E3BA57000DB6B5 /* Debug */, + 53A5F8C817E3BA57000DB6B5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53A5F88917E3BA57000DB6B5 /* Project object */; +} diff --git a/Archive/Collection/Collection/Base.lproj/Main.storyboard b/Archive/Collection/Collection/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f255ba7 --- /dev/null +++ b/Archive/Collection/Collection/Base.lproj/Main.storyboard @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Archive/Collection/Collection/Collection-Info.plist b/Archive/Collection/Collection/Collection-Info.plist new file mode 100644 index 0000000..f1c66e4 --- /dev/null +++ b/Archive/Collection/Collection/Collection-Info.plist @@ -0,0 +1,41 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Archive/Collection/Collection/Collection-Prefix.pch b/Archive/Collection/Collection/Collection-Prefix.pch new file mode 100644 index 0000000..82a2bb4 --- /dev/null +++ b/Archive/Collection/Collection/Collection-Prefix.pch @@ -0,0 +1,16 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#import + +#ifndef __IPHONE_5_0 +#warning "This project uses features only available in iOS SDK 5.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/Collection/Collection/Images.xcassets/AppIcon.appiconset/Contents.json b/Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 69% rename from Collection/Collection/Images.xcassets/AppIcon.appiconset/Contents.json rename to Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/Contents.json index 55b6e38..8279c03 100644 --- a/Collection/Collection/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", @@ -35,6 +45,16 @@ "idiom" : "ipad", "filename" : "icon-76@2x.png", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29.png b/Archive/Collection/Collection/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/Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7759c83f4b10efb32e7c54af86c6cfd0adc14e64 GIT binary patch literal 2561 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 QR{#J207*qoM6N<$g437vy#N3J literal 0 HcmV?d00001 diff --git a/Archive/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/Archive/Collection/Collection/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/Archive/Collection/Collection/Images.xcassets/Contents.json b/Archive/Collection/Collection/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Archive/Collection/Collection/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json b/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json similarity index 100% rename from Collection/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json rename to Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json index 2d612de..bc976a6 100644 --- a/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -3,33 +3,33 @@ { "orientation" : "portrait", "idiom" : "ipad", + "filename" : "Default-Portrait~ipad.png", "extent" : "full-screen", "minimum-system-version" : "7.0", - "filename" : "Default-Portrait~ipad.png", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", + "filename" : "Default-Landscape~ipad.png", "extent" : "full-screen", "minimum-system-version" : "7.0", - "filename" : "Default-Landscape~ipad.png", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", + "filename" : "Default-Portrait@2x~ipad.png", "extent" : "full-screen", "minimum-system-version" : "7.0", - "filename" : "Default-Portrait@2x~ipad.png", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", + "filename" : "Default-Landscape@2x~ipad.png", "extent" : "full-screen", "minimum-system-version" : "7.0", - "filename" : "Default-Landscape@2x~ipad.png", "scale" : "2x" } ], diff --git a/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png b/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..534be4d6ec459e583ea037755f4bf174f974aa73 GIT binary patch literal 1001 zcmeAS@N?(olHy`uVBq!ia0y~y-~ck&7?_xW)ckJ_|9}){fKQ0)|NsAg{P?kH)22=b zWl07G=GmSujv*C{Z!aiC=dgEakt!T9!up<{9 literal 0 HcmV?d00001 diff --git a/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png b/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..30876cb6121ccadd832a619951d6ef1e748ae39a GIT binary patch literal 1784 zcmeAS@N?(olHy`uVBq!ia0y~yU;{Ea7+9Erl+gdDtUyXMz$e7@|Ns9#e*D<9Y18-b z-`~G~|KY=j0|yRF_PwzHsAHa|i(^Oyby7{7 z4GaoEGnueZAGBE*7#$b{7?7xj%R2=U?#|;v7e`e^77xuPvdqA6FUXXJTLNoh<^)?fw-QoelF{r5}E)bC`9Z4 literal 0 HcmV?d00001 diff --git a/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png b/Archive/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..e18280803869e944264c47643ba389bd704d2431 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUTNn zBm)B@i>HfYNX4zU=N&m27&urqXlHr`OC6lAki$EzN{@*&kiB3&H_)D;2E^I+w-prb S65442a=E9gpUXO@geCyyRUyRy literal 0 HcmV?d00001 diff --git a/Archive/Collection/Collection/UYLAppDelegate.h b/Archive/Collection/Collection/UYLAppDelegate.h new file mode 100644 index 0000000..7a6a4ae --- /dev/null +++ b/Archive/Collection/Collection/UYLAppDelegate.h @@ -0,0 +1,39 @@ +// +// UYLAppDelegate.h +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface UYLAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/Archive/Collection/Collection/UYLAppDelegate.m b/Archive/Collection/Collection/UYLAppDelegate.m new file mode 100644 index 0000000..9398d93 --- /dev/null +++ b/Archive/Collection/Collection/UYLAppDelegate.m @@ -0,0 +1,44 @@ +// +// UYLAppDelegate.m +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLAppDelegate.h" + +@implementation UYLAppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + return YES; +} + + +@end diff --git a/Archive/Collection/Collection/UYLCollectionViewController.h b/Archive/Collection/Collection/UYLCollectionViewController.h new file mode 100644 index 0000000..2f910e6 --- /dev/null +++ b/Archive/Collection/Collection/UYLCollectionViewController.h @@ -0,0 +1,38 @@ +// +// UYLViewController.h +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UYLCollectionViewController : UICollectionViewController + +@end diff --git a/Archive/Collection/Collection/UYLCollectionViewController.m b/Archive/Collection/Collection/UYLCollectionViewController.m new file mode 100644 index 0000000..eddfe0b --- /dev/null +++ b/Archive/Collection/Collection/UYLCollectionViewController.m @@ -0,0 +1,124 @@ +// +// UYLViewController.m +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLCollectionViewController.h" +#import "UYLViewController.h" +#import "UYLSimpleCell.h" + +@interface UYLCollectionViewController () + +@property (nonatomic, strong) UIPopoverController *uylPopoverController; + +@end + +@implementation UYLCollectionViewController + +static NSString *UYLStoryboardViewControllerID = @"UYLViewController"; +static NSString *UYLSimpleCellID = @"UYLSimpleCell"; + +#pragma mark - +#pragma mark === UICollectionViewDataSource === +#pragma mark - + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section +{ + return 100; +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath +{ + UYLSimpleCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:UYLSimpleCellID forIndexPath:indexPath]; + cell.cellLabel.text = [NSString stringWithFormat:@"cell %d",indexPath.row]; + return cell; +} + +#pragma mark - +#pragma mark === Gesture Recognizer Action === +#pragma mark - + +- (IBAction)doubleTappedCell:(id)sender +{ + CGPoint tappedPoint = [sender locationInView:self.collectionView]; + NSIndexPath *tappedCellPath = [self.collectionView indexPathForItemAtPoint:tappedPoint]; + + if (tappedCellPath) + { + UYLSimpleCell *cell = (UYLSimpleCell *)[self.collectionView cellForItemAtIndexPath:tappedCellPath]; + [self.collectionView selectItemAtIndexPath:tappedCellPath animated:YES scrollPosition:UICollectionViewScrollPositionNone]; + + if (self.uylPopoverController == nil) + { + UYLViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:UYLStoryboardViewControllerID]; + self.uylPopoverController = [[UIPopoverController alloc] initWithContentViewController:viewController]; + self.uylPopoverController.delegate = self; + } + + [self.uylPopoverController presentPopoverFromRect:cell.frame + inView:self.collectionView + permittedArrowDirections:UIPopoverArrowDirectionAny + animated:YES]; + + } +} + +#pragma mark - +#pragma mark === UIPopoverControllerDelegate === +#pragma mark - + +- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view +{ + if (self.uylPopoverController == popoverController) + { + NSArray *selectedItems = self.collectionView.indexPathsForSelectedItems; + NSIndexPath *itemPath = (NSIndexPath *)[selectedItems lastObject]; + if (itemPath) + { + UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:itemPath]; + if (cell) + { + CGRect requiredRect = cell.frame; + *rect = requiredRect; + } + } + } +} + +- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController +{ + for (NSIndexPath *indexPath in self.collectionView.indexPathsForSelectedItems) + { + [self.collectionView deselectItemAtIndexPath:indexPath animated:YES]; + } +} + +@end diff --git a/Archive/Collection/Collection/UYLSimpleCell.h b/Archive/Collection/Collection/UYLSimpleCell.h new file mode 100644 index 0000000..7dc2973 --- /dev/null +++ b/Archive/Collection/Collection/UYLSimpleCell.h @@ -0,0 +1,40 @@ +// +// UYLSimpleCell.h +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UYLSimpleCell : UICollectionViewCell + +@property (nonatomic, weak) IBOutlet UILabel *cellLabel; + +@end diff --git a/Archive/Collection/Collection/UYLSimpleCell.m b/Archive/Collection/Collection/UYLSimpleCell.m new file mode 100644 index 0000000..4660dff --- /dev/null +++ b/Archive/Collection/Collection/UYLSimpleCell.m @@ -0,0 +1,51 @@ +// +// UYLSimpleCell.m +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLSimpleCell.h" + +@implementation UYLSimpleCell + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; + backgroundView.layer.borderColor = [[UIColor lightGrayColor] CGColor]; + backgroundView.layer.borderWidth = 2; + self.selectedBackgroundView = backgroundView; + } + return self; +} + +@end diff --git a/Archive/Collection/Collection/UYLViewController.h b/Archive/Collection/Collection/UYLViewController.h new file mode 100644 index 0000000..f774f70 --- /dev/null +++ b/Archive/Collection/Collection/UYLViewController.h @@ -0,0 +1,38 @@ +// +// UYLViewController.h +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UYLViewController : UIViewController + +@end diff --git a/Archive/Collection/Collection/UYLViewController.m b/Archive/Collection/Collection/UYLViewController.m new file mode 100644 index 0000000..da2ab3e --- /dev/null +++ b/Archive/Collection/Collection/UYLViewController.m @@ -0,0 +1,50 @@ +// +// UYLViewController.m +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLViewController.h" + +@interface UYLViewController () + +@property (weak, nonatomic) IBOutlet UILabel *contentLabel; + +@end + +@implementation UYLViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + self.contentLabel.text = @"Content"; +} + +@end diff --git a/Archive/Collection/Collection/en.lproj/InfoPlist.strings b/Archive/Collection/Collection/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Archive/Collection/Collection/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Archive/Collection/Collection/main.m b/Archive/Collection/Collection/main.m new file mode 100644 index 0000000..840edb6 --- /dev/null +++ b/Archive/Collection/Collection/main.m @@ -0,0 +1,43 @@ +// +// main.m +// Collection +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2013 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +#import "UYLAppDelegate.h" + +int main(int argc, char * argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([UYLAppDelegate class])); + } +} diff --git a/Archive/Collection/CollectionTests/CollectionTests-Info.plist b/Archive/Collection/CollectionTests/CollectionTests-Info.plist new file mode 100644 index 0000000..169b6f7 --- /dev/null +++ b/Archive/Collection/CollectionTests/CollectionTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Archive/Collection/CollectionTests/CollectionTests.m b/Archive/Collection/CollectionTests/CollectionTests.m new file mode 100644 index 0000000..96f9b2c --- /dev/null +++ b/Archive/Collection/CollectionTests/CollectionTests.m @@ -0,0 +1,34 @@ +// +// CollectionTests.m +// CollectionTests +// +// Created by Keith Harrison on 13/09/2013. +// Copyright (c) 2013 Keith Harrison. All rights reserved. +// + +#import + +@interface CollectionTests : XCTestCase + +@end + +@implementation CollectionTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown +{ + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample +{ + XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); +} + +@end diff --git a/Archive/Collection/CollectionTests/en.lproj/InfoPlist.strings b/Archive/Collection/CollectionTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Archive/Collection/CollectionTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Archive/Collection/README b/Archive/Collection/README new file mode 100644 index 0000000..9975405 --- /dev/null +++ b/Archive/Collection/README @@ -0,0 +1,16 @@ +======================================================================= +Collection - A Simple Collection View + +Version 1.0 27 September 2013 Initial version. +======================================================================= + +**THIS BUG WAS RESOLVED IN iOS 9.3** + +This is a example project to reproduce a bug in the way that iOS 7 +repostions popovers when a view is rotated. + +For further details see the following blog post: + +https://useyourloaf.com/blog/uipopover-arrow-not-repositioned-correctly-on-rotation/ + +You can also view the bug report on Open Radar at https://openradar.appspot.com/14995477 From 0351f8276f5ef669cd6a10f8b36097e93ab3efcd Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 14:43:27 +0000 Subject: [PATCH 123/142] Archive Collection project --- .../Collection.xcodeproj/project.pbxproj | 499 ------------------ .../Collection/Base.lproj/Main.storyboard | 129 ----- Collection/Collection/Collection-Info.plist | 41 -- Collection/Collection/Collection-Prefix.pch | 16 - .../AppIcon.appiconset/icon-29.png | Bin 859 -> 0 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 2561 -> 0 bytes .../AppIcon.appiconset/icon-40.png | Bin 1362 -> 0 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 4710 -> 0 bytes .../AppIcon.appiconset/icon-76.png | Bin 4166 -> 0 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 17774 -> 0 bytes .../Default-Landscape@2x~ipad.png | Bin 1001 -> 0 bytes .../Default-Landscape~ipad.png | Bin 593 -> 0 bytes .../Default-Portrait@2x~ipad.png | Bin 1784 -> 0 bytes .../Default-Portrait~ipad.png | Bin 338 -> 0 bytes Collection/Collection/UYLAppDelegate.h | 39 -- Collection/Collection/UYLAppDelegate.m | 44 -- .../Collection/UYLCollectionViewController.h | 38 -- .../Collection/UYLCollectionViewController.m | 124 ----- Collection/Collection/UYLSimpleCell.h | 40 -- Collection/Collection/UYLSimpleCell.m | 51 -- Collection/Collection/UYLViewController.h | 38 -- Collection/Collection/UYLViewController.m | 50 -- .../Collection/en.lproj/InfoPlist.strings | 2 - Collection/Collection/main.m | 43 -- .../CollectionTests-Info.plist | 22 - Collection/CollectionTests/CollectionTests.m | 34 -- .../en.lproj/InfoPlist.strings | 2 - Collection/README | 14 - 28 files changed, 1226 deletions(-) delete mode 100644 Collection/Collection.xcodeproj/project.pbxproj delete mode 100644 Collection/Collection/Base.lproj/Main.storyboard delete mode 100644 Collection/Collection/Collection-Info.plist delete mode 100644 Collection/Collection/Collection-Prefix.pch delete mode 100644 Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29.png delete mode 100644 Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29@2x.png delete mode 100644 Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-40.png delete mode 100644 Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-40@2x.png delete mode 100644 Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76.png delete mode 100644 Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76@2x.png delete mode 100644 Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png delete mode 100644 Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png delete mode 100644 Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png delete mode 100644 Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png delete mode 100644 Collection/Collection/UYLAppDelegate.h delete mode 100644 Collection/Collection/UYLAppDelegate.m delete mode 100644 Collection/Collection/UYLCollectionViewController.h delete mode 100644 Collection/Collection/UYLCollectionViewController.m delete mode 100644 Collection/Collection/UYLSimpleCell.h delete mode 100644 Collection/Collection/UYLSimpleCell.m delete mode 100644 Collection/Collection/UYLViewController.h delete mode 100644 Collection/Collection/UYLViewController.m delete mode 100644 Collection/Collection/en.lproj/InfoPlist.strings delete mode 100644 Collection/Collection/main.m delete mode 100644 Collection/CollectionTests/CollectionTests-Info.plist delete mode 100644 Collection/CollectionTests/CollectionTests.m delete mode 100644 Collection/CollectionTests/en.lproj/InfoPlist.strings delete mode 100644 Collection/README diff --git a/Collection/Collection.xcodeproj/project.pbxproj b/Collection/Collection.xcodeproj/project.pbxproj deleted file mode 100644 index 83cd935..0000000 --- a/Collection/Collection.xcodeproj/project.pbxproj +++ /dev/null @@ -1,499 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 53A5F89517E3BA57000DB6B5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89417E3BA57000DB6B5 /* Foundation.framework */; }; - 53A5F89717E3BA57000DB6B5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89617E3BA57000DB6B5 /* CoreGraphics.framework */; }; - 53A5F89917E3BA57000DB6B5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89817E3BA57000DB6B5 /* UIKit.framework */; }; - 53A5F89F17E3BA57000DB6B5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F89D17E3BA57000DB6B5 /* InfoPlist.strings */; }; - 53A5F8A117E3BA57000DB6B5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8A017E3BA57000DB6B5 /* main.m */; }; - 53A5F8A517E3BA57000DB6B5 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8A417E3BA57000DB6B5 /* UYLAppDelegate.m */; }; - 53A5F8A817E3BA57000DB6B5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F8A617E3BA57000DB6B5 /* Main.storyboard */; }; - 53A5F8AB17E3BA57000DB6B5 /* UYLCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8AA17E3BA57000DB6B5 /* UYLCollectionViewController.m */; }; - 53A5F8AD17E3BA57000DB6B5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F8AC17E3BA57000DB6B5 /* Images.xcassets */; }; - 53A5F8B417E3BA57000DB6B5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F8B317E3BA57000DB6B5 /* XCTest.framework */; }; - 53A5F8B517E3BA57000DB6B5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89417E3BA57000DB6B5 /* Foundation.framework */; }; - 53A5F8B617E3BA57000DB6B5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53A5F89817E3BA57000DB6B5 /* UIKit.framework */; }; - 53A5F8BE17E3BA57000DB6B5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53A5F8BC17E3BA57000DB6B5 /* InfoPlist.strings */; }; - 53A5F8C017E3BA57000DB6B5 /* CollectionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8BF17E3BA57000DB6B5 /* CollectionTests.m */; }; - 53A5F8CB17E3BFFB000DB6B5 /* UYLSimpleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8CA17E3BFFB000DB6B5 /* UYLSimpleCell.m */; }; - 53A5F8CE17E3C692000DB6B5 /* UYLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A5F8CD17E3C692000DB6B5 /* UYLViewController.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 53A5F8B717E3BA57000DB6B5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 53A5F88917E3BA57000DB6B5 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 53A5F89017E3BA57000DB6B5; - remoteInfo = Collection; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 53A5F89117E3BA57000DB6B5 /* Collection.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Collection.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 53A5F89417E3BA57000DB6B5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 53A5F89617E3BA57000DB6B5 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 53A5F89817E3BA57000DB6B5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 53A5F89C17E3BA57000DB6B5 /* Collection-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Collection-Info.plist"; sourceTree = ""; }; - 53A5F89E17E3BA57000DB6B5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 53A5F8A017E3BA57000DB6B5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 53A5F8A217E3BA57000DB6B5 /* Collection-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Collection-Prefix.pch"; sourceTree = ""; }; - 53A5F8A317E3BA57000DB6B5 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; - 53A5F8A417E3BA57000DB6B5 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; - 53A5F8A717E3BA57000DB6B5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 53A5F8A917E3BA57000DB6B5 /* UYLCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLCollectionViewController.h; sourceTree = ""; }; - 53A5F8AA17E3BA57000DB6B5 /* UYLCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLCollectionViewController.m; sourceTree = ""; }; - 53A5F8AC17E3BA57000DB6B5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 53A5F8B217E3BA57000DB6B5 /* CollectionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CollectionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 53A5F8B317E3BA57000DB6B5 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 53A5F8BB17E3BA57000DB6B5 /* CollectionTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CollectionTests-Info.plist"; sourceTree = ""; }; - 53A5F8BD17E3BA57000DB6B5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 53A5F8BF17E3BA57000DB6B5 /* CollectionTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CollectionTests.m; sourceTree = ""; }; - 53A5F8C917E3BFFB000DB6B5 /* UYLSimpleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLSimpleCell.h; sourceTree = ""; }; - 53A5F8CA17E3BFFB000DB6B5 /* UYLSimpleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLSimpleCell.m; sourceTree = ""; }; - 53A5F8CC17E3C692000DB6B5 /* UYLViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLViewController.h; sourceTree = ""; }; - 53A5F8CD17E3C692000DB6B5 /* UYLViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLViewController.m; sourceTree = ""; }; - 53D5C7E617F62BD50077FB0D /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 53A5F88E17E3BA57000DB6B5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 53A5F89717E3BA57000DB6B5 /* CoreGraphics.framework in Frameworks */, - 53A5F89917E3BA57000DB6B5 /* UIKit.framework in Frameworks */, - 53A5F89517E3BA57000DB6B5 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 53A5F8AF17E3BA57000DB6B5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 53A5F8B417E3BA57000DB6B5 /* XCTest.framework in Frameworks */, - 53A5F8B617E3BA57000DB6B5 /* UIKit.framework in Frameworks */, - 53A5F8B517E3BA57000DB6B5 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 53A5F88817E3BA57000DB6B5 = { - isa = PBXGroup; - children = ( - 53D5C7E617F62BD50077FB0D /* README */, - 53A5F89A17E3BA57000DB6B5 /* Collection */, - 53A5F8B917E3BA57000DB6B5 /* CollectionTests */, - 53A5F89317E3BA57000DB6B5 /* Frameworks */, - 53A5F89217E3BA57000DB6B5 /* Products */, - ); - sourceTree = ""; - }; - 53A5F89217E3BA57000DB6B5 /* Products */ = { - isa = PBXGroup; - children = ( - 53A5F89117E3BA57000DB6B5 /* Collection.app */, - 53A5F8B217E3BA57000DB6B5 /* CollectionTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 53A5F89317E3BA57000DB6B5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 53A5F89417E3BA57000DB6B5 /* Foundation.framework */, - 53A5F89617E3BA57000DB6B5 /* CoreGraphics.framework */, - 53A5F89817E3BA57000DB6B5 /* UIKit.framework */, - 53A5F8B317E3BA57000DB6B5 /* XCTest.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 53A5F89A17E3BA57000DB6B5 /* Collection */ = { - isa = PBXGroup; - children = ( - 53A5F8A317E3BA57000DB6B5 /* UYLAppDelegate.h */, - 53A5F8A417E3BA57000DB6B5 /* UYLAppDelegate.m */, - 53A5F8A617E3BA57000DB6B5 /* Main.storyboard */, - 53A5F8CC17E3C692000DB6B5 /* UYLViewController.h */, - 53A5F8CD17E3C692000DB6B5 /* UYLViewController.m */, - 53A5F8C917E3BFFB000DB6B5 /* UYLSimpleCell.h */, - 53A5F8CA17E3BFFB000DB6B5 /* UYLSimpleCell.m */, - 53A5F8A917E3BA57000DB6B5 /* UYLCollectionViewController.h */, - 53A5F8AA17E3BA57000DB6B5 /* UYLCollectionViewController.m */, - 53A5F8AC17E3BA57000DB6B5 /* Images.xcassets */, - 53A5F89B17E3BA57000DB6B5 /* Supporting Files */, - ); - path = Collection; - sourceTree = ""; - }; - 53A5F89B17E3BA57000DB6B5 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 53A5F89C17E3BA57000DB6B5 /* Collection-Info.plist */, - 53A5F89D17E3BA57000DB6B5 /* InfoPlist.strings */, - 53A5F8A017E3BA57000DB6B5 /* main.m */, - 53A5F8A217E3BA57000DB6B5 /* Collection-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 53A5F8B917E3BA57000DB6B5 /* CollectionTests */ = { - isa = PBXGroup; - children = ( - 53A5F8BF17E3BA57000DB6B5 /* CollectionTests.m */, - 53A5F8BA17E3BA57000DB6B5 /* Supporting Files */, - ); - path = CollectionTests; - sourceTree = ""; - }; - 53A5F8BA17E3BA57000DB6B5 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 53A5F8BB17E3BA57000DB6B5 /* CollectionTests-Info.plist */, - 53A5F8BC17E3BA57000DB6B5 /* InfoPlist.strings */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 53A5F89017E3BA57000DB6B5 /* Collection */ = { - isa = PBXNativeTarget; - buildConfigurationList = 53A5F8C317E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "Collection" */; - buildPhases = ( - 53A5F88D17E3BA57000DB6B5 /* Sources */, - 53A5F88E17E3BA57000DB6B5 /* Frameworks */, - 53A5F88F17E3BA57000DB6B5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Collection; - productName = Collection; - productReference = 53A5F89117E3BA57000DB6B5 /* Collection.app */; - productType = "com.apple.product-type.application"; - }; - 53A5F8B117E3BA57000DB6B5 /* CollectionTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 53A5F8C617E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "CollectionTests" */; - buildPhases = ( - 53A5F8AE17E3BA57000DB6B5 /* Sources */, - 53A5F8AF17E3BA57000DB6B5 /* Frameworks */, - 53A5F8B017E3BA57000DB6B5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 53A5F8B817E3BA57000DB6B5 /* PBXTargetDependency */, - ); - name = CollectionTests; - productName = CollectionTests; - productReference = 53A5F8B217E3BA57000DB6B5 /* CollectionTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 53A5F88917E3BA57000DB6B5 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = UYL; - LastUpgradeCheck = 0500; - ORGANIZATIONNAME = "Keith Harrison"; - TargetAttributes = { - 53A5F89017E3BA57000DB6B5 = { - DevelopmentTeam = LCC2J94N44; - }; - 53A5F8B117E3BA57000DB6B5 = { - TestTargetID = 53A5F89017E3BA57000DB6B5; - }; - }; - }; - buildConfigurationList = 53A5F88C17E3BA57000DB6B5 /* Build configuration list for PBXProject "Collection" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 53A5F88817E3BA57000DB6B5; - productRefGroup = 53A5F89217E3BA57000DB6B5 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 53A5F89017E3BA57000DB6B5 /* Collection */, - 53A5F8B117E3BA57000DB6B5 /* CollectionTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 53A5F88F17E3BA57000DB6B5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53A5F8AD17E3BA57000DB6B5 /* Images.xcassets in Resources */, - 53A5F89F17E3BA57000DB6B5 /* InfoPlist.strings in Resources */, - 53A5F8A817E3BA57000DB6B5 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 53A5F8B017E3BA57000DB6B5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53A5F8BE17E3BA57000DB6B5 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 53A5F88D17E3BA57000DB6B5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53A5F8A117E3BA57000DB6B5 /* main.m in Sources */, - 53A5F8A517E3BA57000DB6B5 /* UYLAppDelegate.m in Sources */, - 53A5F8CB17E3BFFB000DB6B5 /* UYLSimpleCell.m in Sources */, - 53A5F8AB17E3BA57000DB6B5 /* UYLCollectionViewController.m in Sources */, - 53A5F8CE17E3C692000DB6B5 /* UYLViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 53A5F8AE17E3BA57000DB6B5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53A5F8C017E3BA57000DB6B5 /* CollectionTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 53A5F8B817E3BA57000DB6B5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 53A5F89017E3BA57000DB6B5 /* Collection */; - targetProxy = 53A5F8B717E3BA57000DB6B5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 53A5F89D17E3BA57000DB6B5 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 53A5F89E17E3BA57000DB6B5 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 53A5F8A617E3BA57000DB6B5 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 53A5F8A717E3BA57000DB6B5 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 53A5F8BC17E3BA57000DB6B5 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 53A5F8BD17E3BA57000DB6B5 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 53A5F8C117E3BA57000DB6B5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; - 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__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - 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; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = 2; - }; - name = Debug; - }; - 53A5F8C217E3BA57000DB6B5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; - 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__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - 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; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = 2; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 53A5F8C417E3BA57000DB6B5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; - INFOPLIST_FILE = "Collection/Collection-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 53A5F8C517E3BA57000DB6B5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; - INFOPLIST_FILE = "Collection/Collection-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - 53A5F8C717E3BA57000DB6B5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Collection.app/Collection"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = "CollectionTests/CollectionTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 53A5F8C817E3BA57000DB6B5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Collection.app/Collection"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Collection/Collection-Prefix.pch"; - INFOPLIST_FILE = "CollectionTests/CollectionTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 53A5F88C17E3BA57000DB6B5 /* Build configuration list for PBXProject "Collection" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 53A5F8C117E3BA57000DB6B5 /* Debug */, - 53A5F8C217E3BA57000DB6B5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 53A5F8C317E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "Collection" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 53A5F8C417E3BA57000DB6B5 /* Debug */, - 53A5F8C517E3BA57000DB6B5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 53A5F8C617E3BA57000DB6B5 /* Build configuration list for PBXNativeTarget "CollectionTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 53A5F8C717E3BA57000DB6B5 /* Debug */, - 53A5F8C817E3BA57000DB6B5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 53A5F88917E3BA57000DB6B5 /* Project object */; -} diff --git a/Collection/Collection/Base.lproj/Main.storyboard b/Collection/Collection/Base.lproj/Main.storyboard deleted file mode 100644 index f255ba7..0000000 --- a/Collection/Collection/Base.lproj/Main.storyboard +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Collection/Collection/Collection-Info.plist b/Collection/Collection/Collection-Info.plist deleted file mode 100644 index 6614037..0000000 --- a/Collection/Collection/Collection-Info.plist +++ /dev/null @@ -1,41 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Collection/Collection/Collection-Prefix.pch b/Collection/Collection/Collection-Prefix.pch deleted file mode 100644 index 82a2bb4..0000000 --- a/Collection/Collection/Collection-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29.png b/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29.png deleted file mode 100644 index b257b07226846aca036ccff246e65d2e730a5e0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-29@2x.png deleted file mode 100644 index 7759c83f4b10efb32e7c54af86c6cfd0adc14e64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2561 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 QR{#J207*qoM6N<$g437vy#N3J diff --git a/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/Collection/Collection/Images.xcassets/AppIcon.appiconset/icon-76@2x.png deleted file mode 100644 index 7bdbed3bcd25858e35e136552a11675defee0c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17774 zcmV(!K;^%QP)0ssI2m!P+H002cbNkl7|M%iK+@6xS|+CP8)6finW zc$%%X2VvPR(ijoe+R|)ZwltD$4JdR>j z=iar)R<^XA{rl_3vt1!;>25vShx2N-EzHnktf|Imylt5f6o z+7!+3Y(2w)+VtkE*%Qs_wVfqNXGq&#Ha*)Ky;->v-dZETRtAdODMn#5+SEX{UK?#I zvE|*C>9yU{Sl*gb%{INdyIzfLy_$9Q*23cQZhC9KfBi5^r)Tqp2%JUhT1&7A+S93R zywOgUj=uKvS$J-}-MzZ@yzQ!~9q+p2?Cq_oHa4YYcNJ@`wARREgRo5+C2g~LS~9lj zwUbS(*RUm=CA6)#tw;avb>ooYdc(rYmchqY)Sv|WEquRD=05Qz$g}05k zUc2SZMvRJSu?u_NTHE4UTMsyCrybD=pc8kus8-x2?qDRNHE&x82kF ztV?dZ8kVk68^qf7nIHz-GEfB3Y~| za&p=H78^x-eSDYk(qo1Oo=NuVyuTn7m?U3vRrj{uK07eYTZxc_!9ik=?1SO-2|!*a zGRu4ENIp3`07g$LHEFuGflQ^6oUi&}DMTfug&ff|M1ju0($FU4zE;5*>kaiL3$@kd z2$OAN!Y&m1G8+NGayEALJAKqG1PYUO_r} zq16oDeSLhZLl|;dQyWm4&--A-B<7MgNJ&m#m+=H3Ipp8GfD%>_YSUVaQxCMwjtM4=$Jd|eyT=cHdgUO@~Y;HXSQvCkrtP>UEVypq5D)L?5l(NKmk;cd!?j) z{ZV_D2H$Kprn6%H&~gP_dZCsFw5-oL@*7`~gPIzXqb>gCKf$YnOr4T&?8@HP0D{6r z%Ry6s336mOQdO4Rqd}-9@_$N5U8(JR-i?35Sm=8JZ|}&7q@3oV z;UTJhN&ofZZ=Jw28XPmFq_Pg;r=q%boPcOIlsQdEquV{J4?YWey0l8WJcp?B@KP&p zIo8xMhyob;5<9L$l@4CJS~3i;qWZ8rGhJ$gp*T(0h%S<^9ho^90}W(xBS(>{8uf5s z(ztaFQpWNw-3NNGs`3V;5BMOVb2aiWxSUX@d_k!aH{KIk&oM&R2cBj3-b|des856x zp0g37%u7m9$Gf!s9^v}HM52Lmdxp~IRl;3bnA4$pzJk)vGnB@u zmW{1?(^1l~fV20;G8DZ=xs3Ie1_#GF zOuv#r)&XJfwUS2pj|`DTV^b47IUzW=sw%2BnoV~?CZtz_-PtLzlxRBK$4MrS zv~v=b#!FDKv1nwU%t9i_ceQ46Q{SVteU8*+sjM}->Dlr;90%;f)QWC8@iOb=aAjJA z;d_lMiO~ngHM~ClkjvJXNulJ-irJRS@orvDbaMer1Ys2--Ee{o&KikeD32J6FXch- zW06QFI7iQ@3yzm};Q~-W$bH8w!|kI; z&hO5+_`Fh{+c0bP{iQI@s6)_{r&y?4VCMrz88ikefta-;Vgfnech|ddRG3z$W0jzw zU6cZbbDEp+T=B&TL%cMMpr;jGudxSDAl2ZW4+u;{SnL#JaZhZ#Pf?0VX6^X)i4`1pbj#a$G3W>b{t6`+UUnlO$(o>-5 z=fp%$iw&z4IVN0MQpb#>(5?|UHkG;<8O;tiA^gdUbk?F+9xf4*6jO?GMdqH3q<(VY zKA#==`v4j^!tCJ1#x;)OA+>g zK9DNe_}2LSd*qiZghUS7sHDn{q&=FXen@X-tvVXF7 zCQy1+RleWnB+NrX0thJDpoGXEf{GGoF$9nVZ6JUkNdOU?kVX+uwCy~2kB2@HwNcv! zR0N`pGIh(K$Pg5y9RnI91eru6p{hc{l&XZB`zrVT_ivxdTKb~U>lNZzhE-W9zxwJs z_w2Lxf7n~6hu}jNz`4?mLoD&XGy#^y!&jqNDt^VCq(*eR(oAjF*|%+X%IChJar|p ze3ri5qc{bcK3DzKvu!dw2lT|{NSstb!lJ230WBdwA-V-_R-czb9YD3Jhf|lc16xf^ zwB)AgJ~G9)mNc|EkB**j!CP-T_WE76SQN+xuNFZLLOU579qB}5LDmFf9fc3y=EALp zVgtC8V?|=Dts|AnZHO<0`khS{)tpNzH6Ir2V1MtK-J6YcxI1;)EvGLc@kzY0OJ4|= zLiFOaMXuCvnyISDbqqw9kf!|soQyI+8EMF5puk=7p|AB=Ouu}OD}J-()a@Rgb;zy$ z;cx@N2MQDzTBLL_I=2OrBRC{*Rg#baa?GOkCx8LCaM>vF^a`5LZ4RgEtw?*7Q!Ccf zuhn=J2p?)~*4lffBjv=8h;#w&L^{QJ77E4%5Zu3!!Hc?t0`sgfLo^Y4LwAO7W(Zm% z9+8-@oQNv~m7TV+G-mfbzTr+^dV6~b+nvW>{mL;3SeTKMD7lN z5knCZ*&tO2OtwG^gW*+0;m6W-0U>qk!0=3@sACvE*`cD`oyh+MFRO^;ID__uC!UC! z3Ri)u!8QqRuLSOPAsxwJb(3)doD&saC3u(Pt`J;2?P-EE<99)K$@UY}8=k@sT>Zwc z&v})#>s`D2_RDYkiGH`p1B@FYZhlJt#18@twjxeAG)11CQ8Y9{Lv;^wwEWW17V2Ot zm-DPmL5NEkPAteN?NrdiEkt)lg~((*$-piOKgA%tJ&P~W;xI)jVSX@ymGVk2iiAJ)Iku$ zt<|ws4iPt~cj_%!HO(bN_`%kL>G`F0tvX9o2@SUdV3JM*7i$R}YU$FJOabEhr=^1% zX$B2ii&G7PNe{aaJJr@Y{QAMva<0>)pcI=Y(E_JGWh?AjML&2@M~398okq_jn3)zz zxva|F^QBMRu*>IuyuDTHq}}g2bFVo(qoM}Ty%_;Fp-v=O2BT37^ zDvsE4mmskqR)R#3kk;@Z+$XWlMS6;P{k{J~_q@Wbzh#|J$;RQSTbx%Xlzg(T4y^ih zT?<&h`&!&*x{V~QFo)=i-@#F2XEd39g$QS^u?yrq$)4z6bDJ+rePUn@tJa2VEua6P z%SWxbJfsRrVw_wCISwY?Z}%uSxbP_EizDtxE%Y#V@PKj{a##!iR0_&81W<6>>LnaY zQO*Qnm3RzRZsh5Tg;8(^ClG>qApN*)xsHvJB`{stcTh9~EM@eVjw&OqFytA=8f(2-e6e2t=!2g@k6 zFtfxtG0}?L$^xgq|?b03uq1R>9kot(M3=5CrL0?rMvYzdC2z6Rvra{gHL<{>{otSB@a|qnzMw@^sxwlVE>MoShV(D&>`Vf;1~2S#4O!Nf%m?@LKG9 zdz5$+jf4UXmt`}U?98-M5+H<9P%I7*GK#g5DT!h-r?6BRq0$7Ch7Iro8`6@{CL_`XFO*dJMg)#R@~aJh>0@X(1y@18&jWRsjK zUA#6ltl9%r4*~?kh?0`NLy#wTCnSWTcplfg?plLcN>_9WmK7^V1emA8Q*LrrG%`=(TpcKJBNat9NH-eys8c( z@LV=`tLay~#s1{Fc{0u zE$|@CO7YbvjK{fYAF6gc1hcpM8%{#~WC_ZZt~D6pl0|*MWh)bgGH)=>T=|Yv7osBR zC>2zv{)9n;D-S@KnXYFUJv96x}y-8a=GDLsU1h`vs65)@7plzs?ENHGk z^&w*#s{uByVsz=~HA02cm?2u~jHR7%Aq#}nwJrt`nNb?({Y3W-%C_{~o+C<|AZ30P zmt_|X0#h!^jtzrH^K=yZQveibnBhjt5G8&MYbtn`lvTz_2UXfon2UL_HTmKxH$Sk2 zt;U+T)gP{%ajj4g&{3?Gq|forArNZuIK)LWR7m)>k1$m{7Sfnl z=uyB+ji{-@Y-#Vu(%^zdgAv5`qJ6KVO@=ca2|W@~R~}We6AMufXorp~_@!yvy{?eP zOS&}bQ=S@tT-Y^B_VY(K-s6IUY_->|$6dM0WOd6poinnT3p!JnH$siLha|%_6`Nnjgfp97ZMs_ppihZv5&DOTsYwC6n z%$jM+6K5Y?7PUkz@u}A>sipmNZGmcl=14K@j!!}N$L&7XDG4?z%fID8s`Pl zouiNjdOikeAlx7j8VnuMb{M(7v$=dfr`K&^-0)&K;lT7KivA`V3gD^peHVz-WW_Q$ zw+yHn%>B2EHhRsM4=atW_UgE;OSc)b*gR9Sf<;N!0(d>pw;o$K?@GD^Cp7e2N36D#e$4wfU8+R(*3Yyv@maJAp zsrp1W4)cc5q6vK-V#PpXr3uo$i=@zof8e`s{`#C(+n>4Kwe#Iye)|vg)4E7$QT|nX z3Ix=;#gz0RQ5L3!v;vE&KGN*Ei<%+}9?a3s0??q1k4(K#TC04>jdnyuT7U1U7A0pW zQsqX%{UdG|&>r#y@}C|ZMWPO9E~+ok85VY_7#WB=n-v`WFovtL7%1T=#ln-~TY*eeSQ7L| zXUmS~9-y6jj=WzF2Y2j1@5!q?A)(V$iGh8nlErG@D!Qdm=&8n}p^r{2Z;tvOb~2I! zI-Fo@5auDX12;JZO1nOO({AV7wzK_3>!b;D&fNRQQknVgbZ9G3b~IH`vKq1y9%mQS zf#Lu_I+yPz?oc6Xb5R^uhH1W{Z-p?lZV@Jh45j{_lOtJ)q#Lzg#V~lA3N<^x_!}(< zQXzXQ36)7k_)im=$X8*nRb`suGe0#RMl`7WU%C|S@qx9*ec{L_2G+DcZ^3OXn}6a( zqu1*9nigu(Q%zAFblp*wB3(nukoRO>7$aT4h|a%N;P~yJ2n2>EKBMu%j3X6lXs<*i z$BzCa{XHKUA|N2ng-bW|+Gu&mrhyDaU1k^el;T~m@Yo@mG%rZ$BO`yQ#5_X(RB`I> zp;A-C^(d9jzIB&R-n5%NhxI=v{?{pc{M;NS?M{JfyOT+e8{FGd%?Z%SVno_o&C7Ue}((+H}2V?m6MY zb=D|J^hFDZ>D+gefUX7-7TyagA=DeSE1bIn&1eSXQ2M8)B*H(@7)w{9TiKaGollkJ zjd%KJv(^u19>Q#1@lY{|i8R$3zVJq=Z07t{iW~Sjgz&Ip2*iuhTL+>+Cdp+io*1Q% zCS`j2(O&S&9ZtArqCJ--ZtLdbcAgs+UI7}E9AxRLH^Ws_!gVS}xh_Rfw#DV;zb&>` z-ybj(C9aSn1|C|qHBkRP=OFs~PUKR?^QKRjG@~hz=(sNxQihaAYC^f@U946VHMkJF ze^C0O?m})ecQ(vuC{)6RZCGPH05*;7@TDW~e|(fZ=e6}lOXhyy;t^>@qeP4Q!DP0i zF9K+Z7IH@rM(u^DXV3XvF{{=rO%ZmES0?9RX31*BXS!ZSuMA~@)^wonL+)gJ(DNuc9U$QOx#Wh;%u z6kU)as6ar|TBUiOxTiqs}h&F6k4sKszM? zRaXI=Ba)G%3FjX%XThfSTo>HdW49moO%a6pQA&6a7?TblR_xxYa!#e{A*66uX+~!c zO-28*5_0-bw8d=#q9BZ=5;dhn2AukPKA5ta1fp&i`KS^c#4KREZn0x5{_cU73I^pe z(sh==49p7rRzhjJs1q$eI^B!ic>gQ*pLMW3uj`s=SM0s@gN^HJljwmK4DV{h+_Lbc zlx*UTb!ur-Q`9{tTsD+Ykkd0i9# z?%``^eA_B|oB+Zt7*-RI94%!lDCcz@qB06%vUchNri9~<23q8lbo7jiD@=NRBE<#) z_C#_70}bDg;gI(q{xYs&9eMy75;bjy2-(o~LBHvG#C(xJ1{H(+TYs@&)7{UXVgC*5 z$H!i>%jOHsP~93(SXDJ<5>Q`QHE=o8=7#4YS3qY|SHswA8|9LYykes@a{xlPC-6<_ zKAwTz<5MGWs!D|9?%Rd;k5={|s}CSrKzltHafA7(A*)dZf2eMGVjbi^yXTx*wEze1#T* zSghJyXb9P-GleQemh~JTO;S`(s41@ggrLfgyGmH`z6H`sPeXXa)KQzpB9H`%A#O*G z4j)1J)dkgpr`Ma`H|CzcF@yh|-#d1G-$oBC9;JZue6N(6twukw?byC;Ht8ETX7RRT z7Hzvp-zMumopDiy12iHA>}cI%5`+)KOOrVTLU|l!<<_HS;Br;wqLa>5R%Os#*82X& zYK|%b0_brE(Sw*$-b3pn&Wn-~yK;i!2rj_5R( z<}K-8%l^NvQELy38@p)S*uHUNA0PZ;+p)c`8na~05i9DJ7+_Frr}-Y1ghJnp9X<^a83H*gwhe+e%st79IzpE}Pvn zdEry*&hOi}J!%{Mwr|Y5-mwoY8C4n^{wpVY#i%9YH}2a;8@y=SjTddY{!_V*mLzzQ zyi(Q)a0vr6GJI|sD!9NBoNwU1k@k3{`09NYi4Z!3%BhC&HA*S=6u2h7b`7np9|%YK zpB;JMQ|k{NvUxol-`h84 z@PG6A#{6!{=+fAWZRKPyAGNsM)J20EJa~e~jp^Hby(gO_b4QMV3GbCVxX!|wN%2Cz zR&;c};r%`D;SmUXGGc)+^3|sk*pI7D=l%Cf)}MamL3cg2$*?|Z!{FdHD|Utq@=b z3H3B>a7W>{=5BY)RR;`%Ksro=?N<-D>WCfhc9^zQozW`3Vbv}fuxOzr34>T!Sx3HG z|8L(VR}D$Mr)v@Nh8hpZIQk%lH2lIlc6#5{Qz-TRwkT4+vi~(l?fffig8c|hp}fFw zyMd{~xS)<1&_KH=Ia_P15j*ORY3 z?)7u5Snh~%LY>+cJ5C1e3MoDSJWni~xA-ZFtIh)^xt}61hRJ1p+1ZN!tS+Uvk zWVLEL_h-9)TM=EK*Q;887D!Vsb$+i3L4(U6wQ+Gnwyb=w}N&z@*6;x%*6 zn@`*0RyX)&IXoSZ&n1_({Pqh|P#7Ml7?9cVX#otV-*?AH9>w$xVkh$_94OX#q>rjl zdHGqWQ*oRWT;yH4^v|;=efrit>_xdgy8DmLn0S->2BJP_tRm>5(;XR&HWeGL!f$4t zNwhiWke#CyYw-q294f}rnzjm`1**ft}w|{!? z??>P7ZV(T1PEvLSY>5Vov=9IiFsymWPi3PfCg>xV^&Y9TNIp_|%!a1D^36&R4iqf0 zq~uYI+LKVv8BH$C4}EX)zy5qzd(o`-zu~8!f9tiLWM+wQhWHYd>G1JN{z_|xC{OAs z$39LWa@&>3&Wz+QJY<%po0A3RLcFNPko7xwIpE+TQC`<+CR}Q%G-bpGuHFA@b6#gJ zf_2Q!zxdMRYx0N{P0>A9HP($?AW+f=i#bU8_G(U%{QoV#)U_On!Bxw8W`xSk8aniY z9?|9)aL45vsOH^0sGHiAx-q-Yof^4mR-|LEK4{jjcCx?fHEqW`&VT!rIRmS~MrBVb zA!+HzR0-@6S#~rg#g0R!eDl?~F!rX@NUF&qJ=j(p0ZfPdgvlo3Hkuq3P^` zM%IgzF2Q}aN$(cleQ!&nr(01L{S!?DF#0!+5!7^Z z*n9$IqvJtZ_SlSM^}M_2shc}v4J&e6+J?z|r>9FjiyD=ZA^z}W%3JL%Ut!ZOKm0%L zdA0r3tpmp2J?r30*T@Z%7NxDIXU$SWo4vXbaD}-tuw8@rfGT4bSyoQ z2rFe0+pkcLg0@sGj5R$#yW1sH)-o>ERNZIDxcxuRt{8dfciws3z2oe!XieT`{=klSq-i)mEv`=#AC}u5g)#X^q`wbO^eV5(gLmX~8`5$DtX#2C8>~ia zb^jcUt%1j@lOhU`6rD&**jZ#z9W)qEy>$8w_rKEqD%Rdx-*?5~m#mdnv{zxtt|N6F zlxLzHAmgY`QMWjyu8sy66EKi>=Z=tM3|;3Q!q+v>djyn}lbn`uWO)lrrCqtRA`d;2 z63UmlFM3mO@kqj8T;A~@HqR^@dBDFPdCNmv*$aHV`4tcR=iwKvy~gtP3Q|(925)Xv zr&(aPVThZ_R(1L5jv`gX;pLWE^;giQ>GTcs9FdU274z#A)0X}oZA2NzLhB{Q8moUO z3NNKPf?@>|iAkXq!jsF_c>An(-TwP6?FGAbd)dR+O#9lpBbVotXvd&t6%vZeX78=Z zv3vmSz*~e8M{}Nl&g8#P%vHGcakFW8&pW$~L71-o>l%xyD#PDa=>P*X)s73IltUKg z7p9DIDwl-L>-v@b>xqH2C(kf~4Be1%-c121OWu zItJlW;|3MwE6lAlb!QN!l8QTSH}Z(0V@od?=oO4K5l1x|8A7=p{)nnaRsn>(^6Q2& zp=fi9x0YVizxIB!j=f{S=JtYGuifm??@#;c=yjJWjgc3R)*3$T7J^AUAvJ=R?54JX z-W)y4KgArGth^QgHN*nBSSwIILY+t*MN-|G1c+l!Mb1a-w9@6uxzWFxmW(;U*%VtrfpgkV&~}B`Oi%f`5wOv2F>F8% z4q@+=nN>ia(z}JvY_Ru5$IkED#D@JEH@4@-8RxxZy{8(^hbnpDqg4}-;%(~i<9FKkUU94W9nBZ3R`>BUWWTH0HZAWtth0YNj*23AC#a?l16P`oLEM!V8~r$nyJCeu zkQ|8|WeSbq!`D?narNjEqxZV#xceU;W5aRbQ(tt`k>_o({u52oT?8EI!8B|X?3mR1 zdXTaH2vUtMtvb7c+B@DcYi2cL^Hv#Sxf0nq%s6n3scMLpN*e#D1MF>@GMWN)omH>G z=<8(eSaHWLA~3Zokk(Soz_QVi%Lb*)lP-GiLrX^6uv{-6z4*o>zw+`87ds%@i0yTM zb7tR^;OUbhz4s#9Omwkh(@+{z2|Ne7gROCn38!fH^Hy%8HxbjAwBocQgZtZCFj8G5 z!v5Yxb*jHpJ#fHOfzoiYQlfM>XyvPmwxPr&jNrzIcW_Yk9#jxcrE3vQ>n$1dHQ{0}HU@iK`sLjMc&mrE{N~8x8 zSdcrx;L2N7TOi+3Gijo&GGj*QSYaG}X}ob$%mY^q3stR}IURKA(bwEN>`?Xnx4HYu z!!9hU+N+ki=m+T{p{iNsvgfniOp6j8ah`m-!>^KKfP*T7VPo(#rViOTRJIX48>r;; zw|ZP<2kC=^JG#qVUsU!}ar&v_EP~83e@?Q#KxpNN9sk9TKCpPqFidmi9ei!9}&>)NwKZ*06pj=Iv7t)Dz`%P6%q2^&Db#OryyN&VPxPxnvtv z_IgPgc>~mG%OJ&^#F8kB&I6zb*cxcKxOBycjXrf&X@;ZVf6+%jKIoJayww%Kw8D+H z@(rDJIbz5%a^vVJvlGn%zD9p8#Lo@pfNY!w`f9aC*Mk$sJTNz$@8Ht|4BBQm`8{LmX!v24mLCC(h2a9gkTTq5>=>Cum|k)4m%+D z(C&KnkmG5DGpgk z8c43Yl5+?|K&uz(keRnkKI_(fY*?<3zxn!^Z~mS)(q)#LJ{M)Ag$LXkmCvBr9`a0@ zW2fD%EitlGQ}rj~v$vufh;_OdbBW_h(ELEr#nI-_VwMqnnhou92?|7ia)HJ5P{hch zg&U~oQ5!5w>!hseVr%*E%Z|Eo-fL`FuBqdH^{qoMG-jz1Uzzb9@sipiAaeZ&T~(!eqyyLxR4H@uQ_43x%@f2f=VxS5sJwpje3SB!9 zQvc-VQd_W!ZWVp{N)_D!21aYNw>KyEN z?XyiD{prsxUy*HCu0cu8;!{svBd_qVl*Rbg9|WSRDi<|!P!fBHLa|@ergZn|UN+%ad)r7_N+ts~#2 zEmB%Smo=|py%>#|*6_ltm@ZIMH%S=X(3M#tS2Je|GCe0$ddLTuue@i+!!A44hVi=e zkgp!J?VTQ##0)AvQII1|Bi505=&B4`4d^8~qEG>#xS7e5H4fzI6+i_UBI4suRh{y7 zW4M&>mXqV=mjEv!>q9q4jG^F1{m0SYn)`Yi#_OFs{QMgSd>x5uo!udAQLkJ8QUJ{e zi*fwGXbYgNEBQ$=J%ETJoG@^6<(>PoR*7+#p;q{xQbQ zB2gyS$!*0{O2ZKU=%csm1*hG)@MXhWs`LAw9QUcz6b#$K#`OzZG~1K}hbh_6`)t2* zREI2eLfUU7Mq(cqGE_H%kk?~b@8ncrMJc$&+Mke1XUcM-lMf&42obH~JRlNDxkg*2 znAfjaP`ZCTB^ojMQ=eP<>>4(V*E%DYFFy4{ITvjAnY0GBH>Sb)zeWQpgCojWvZ%mSVoK!1JWdWUTV?p8fnYE){M_!3p6H$EjOeJ)65cO?-XG6VU4c@2JZ% zNmcPgJm0@$=>ccz0 z2N}Pzj@;L%2dh?uXx{x{2|_HJ(X_rhRmH+J8B*2`Y9gt_P*CMuJT&M5KXd!OAHVTn z8}{o{dtdh9H(ehH2?$I`fh7*;wxcv1^)8}7txuHWsgp{KmW~1y=sJ>I$52algGlR- z?Ag05UVX4c%cF4ZNvBm$4`n=JP6aBbU8NMBub8$4GvF6SU9gaPyTLiV=etLLv$1jFu*}t|!jw5SWjR)&9aiQwb<5 zsmTN?0BbeO?o+R4I;6qSI!VI)TESsn%A?LilNwwMg}m|}#)H(u45FZ-zjE{~jS8C4 zo_~MgCw}_K*7kg?Ek`|m`oznpZ~xP#1>(Os_l+}WAN25&=SOw$#+TjqqodCvqhnGE zV6)Valop|=izW?}b17wcy}e;;scJ`a&x}JpDtpLjJN9E@g*wQ;8aiTl#wc90jqL_tES>Wx_QddeaZq%+Ds*hUJv{ zm#^`;pY410ZBqu_CeOJ!_R^k{j|ae}u&PxaI&~sAl&Q-b7jyy7G_#6T^cQagk#ht_ zz>^x9FL~u1IZ;Ab-I2;%Bcc)wK$@~O?eT`bGSI**VG+F`Oeb3xxOfonGoW@C`kb5J zKQU&jFPv@9VT~M7j@jvlGxxk=<8_}FkVO&Tyh86Y8=U^b1HX31p3govT>ilmPuhI_ z#YtjuZCwx*AnGn6uEjI#Iz+N^3LH8u0U3k&C0drRBZk+vd*5ZPdp15_$&lKi0CQ+G z;lFJ-*W1S3an@d!j@x(vVqo{| zwue$qQzc>ZdpA4n#>1|j|62P?*LBlAv-j4&(G^3;G$=>KTa;-HVKGM0nyZ}*M%E>H z*_2*t=#MIIL3m{PoiJo2ME7RLhcu_vm>pDN&I)4(m46O}`eO!|0C6Pn5p;5sY-2X^R0<5zZ*|jWW;oa>{tegbahDk)L-Ro}lktJNl5e2@$SO3e?qt#1hK>Vf4c#{b;Z!VK*7Ns@4a%?t zz-6yjK@+MBTWyAF}mwWx08O@^8-*VaX?QcuT zhfvU5kvqlj|HK%es;NaO>6>>=_~h(EfB$FZLC3xB<}XeDx>df&!krmIi)dQTIB?Yk zdeB*Jenl?qVsdrdiIfse7sI(*K5~!f!5S^;>sFNT`oWJmX+ffs8da{`u(~r#hu){m zl}kK-WdtM9 z82!gV7a%Y}+Da+gyvqdibdBFw@*SeZi}qRGX!(4?3s9rP+!vsbJfYoPw#7OB+Vji? ztC!K-Jo7Ez*>s(!Y8Bd0>x6D|y*;H>6u5XaqVh?W7Cy7#89$u*wLA7&ojhohb)S6X z!|zWp84<-H6A3}){x9ql=q5ukPZ{D{bUePmf_D_!m!&%e};tevW6E=}|ct#2z6Vr~- z6r%wNe1c*(^3=fLAYn+&9d{I-mJ|OtjMzaVZ6J9< z)D|^%R8BQXr>@3GjC7D9@m#uMjnDsN%4dFj(36e_u};|ax^woqP*Q%E`a1?5V>OT{ z*7yX`gB&bGXqd(cqrorIMAFim2%+G39(b^_2mh#O^)C$YZz7h&n0ii57*hD~ zqSQC*SvvZR+3)!3os;T3XrEW!dF|n62Kvw~&^jJr;B@4KAlsxgWQesSgp-2!(8Tgb zW$K{$>)m9GPDHwJBwD-y4?}oYB_Shv5=s2WV;{k6MAA#fu1P*yo%?Tt5S?c;#EaiLBb%@{n?}29Cq0$XS`+B^c{ZK?hMTg+$CSVBvJ_f{EL6omS{Gu zX)aHZgG!eMY*(xP9zrQ zCdIDQ;cOnR$zo~#PspixKrc+a-f*-ayogO(e!SN8?4nov20|lZ*?b@`+h<&}rSKSu zXCu}}spE!v3<-Q}>M*hJ$JN@6X?tizl9H|1htKI+>MhHf*V$p(D@cz#<$s>^1NNs<795H{ix;s7J zs~Bxyi)0%64SbK2I#oMJ(ZKYaNe z;G440|4?h+vzhuraZ{<_-YjFOU{1^M?A2C2uUWmLQWoRJK$J6q&tlD$(qo>uNhYJ# z*-=AoN!G*{*L_UcOKdkhyb#MHetrB;Rkq&WQ|5*v9#Mp_h%{{uR0eD?GiDjV^WPf& z?)Iwn_Cd zQa|RpB>N*+84(O7J$l&{XeVFLYsAUlL?O?d9k>g zq(Vg7{GeW4VdhwBK(*2LCtc5cM>_78x5zY3a_1U#wsVNeSKl_`NH0DFi?6TGznvVA z6N4eIuAZsy|d3dYY-nb_XjP=nfb;<=r zDfGE^Ba@&$Xt?{hHmxgAXIX1?qS0oDMIDe6P%5haAjg4igx7GHv56o1=)OPybFCq7 zj#yfnmPX7o2=W-#soCvVsV{x}N0?3$97U?g`&%lJ?jUe~RNVf7S{GW&Ru0Ly||%2m&!v~k|+ z(g#0@53^26gU^2c*4B>6`TqRt!Y)czu_F{)I_TzZtm=(1a9HYj`677C8F_K&gySgjImLl0!yKeQ~2(GO{N0Ma~FYUrCk zFj<*iMo9rjjxNzwGe;wvj^FoNGwVi&b;R9}EcVX3gZtdV@R#`NKQiE6REqx{)==Ke z;o+v0ha8ZULI-8}o3msFChN%`B0X6ZQY>A1p7^R5_?*be*sZM$uJ?8X6R;9Twzz2U zC1_^&%&^h%3O?Ks?jN(xS2A}#G|2U@{LC{u#9DB{D%m-rM& z7x+Pu5KS5?D@TCEIl;oyP;2&*w1vW~H=zn;5UkWw9yhj2nCUH`y=sg}9Oq<4J5TmA z1_Qj+k$(b0`ugK9Ah=Ooj#BNU5d=RSLeK|l1MKsDLzO)}2IKf-37RH8(FO1rWKH9r zH>i1tgUvM9TN>I@l$Dwxa!IH;JI!Ybo;2SOBf^7bEk1+^ZU1*xNvVRuKJiPz&!BN} zpOADVH0&C0iTGEL6%n&cb)@3W(B?eHx=LBGO=wuEz(8!M$a!4!T6b*l{(996zhu$Z z>64qwkc%kAS$CvAFQJxy2hUsCw8Y2uTvMv75EqcS`vMi_s)UvEYkhtEdGHjz=u)aQ zZmKTuVlA>p-J8pjm{+o+Httt#Nsi!YvGnvV0hu8ocZ1uY=*YGLQ{OgnyP7pb;+@x9 ziC}ZqE&IEeTa91WP04p4H!xJNvss|o6O|Q&UY%_^K#a*>RVrmQz_rTZy(A-G9Bb4G z9^$Ys*7wJs?VX_BYSKP0RsI_t14tZ@rQV!0Fh*gWrfi`p@VaE~rj|20ziUb5q#4WW z!6M{7M3-F`Eqn*A32lbOI^Gnq<|fxQ-55mBVY*Mbooa4>(@Qm~_fPG&6uaq#3_q{y z$MTF`y(;ahQyS}CfcK3h@C^0+`ET2#86xBJAO2sFyKkF6?&k|QpY1 z#83X}yTCjdoOeL|NN69?z~n+}^y@gZM4Vcy`3I0<$IJzVxB~g6^6j`84!S0ywPRdr zj_MVP+dYCDL!L|pE0;@#F63w%p=nv~fVrUhI;u9-`mbYhp()i8h9ea1Py@2xv}{Sp z3p2!gc=&$1`EHo#NTMDzNxyB@t_Mx9J%d?GG)%TDY1&OAGv3X+-I+?j%e%fL;*a^Z z25b3kLG~uya1jk|Mc<)LaG(&FzQsvcbz+D#u_fIOprCv-M*b8+=7)TL{(k#4)cAcr z=cVK3T+LqyZ*Oz5_pL7bf5I?-51>j5`dfUvMmzpl*v>xtoq!;Vy^hHH%f}_bO+_)_ zQZdssREJ<>5LTJ&I$a}D1>-$|q}nqFg}401cRC2`y!Z}E^@Ll!S(!keHzY13E3fs8 zF#rDe{XCVP4G-i9@U_v_?`-a+6_?`=JED?ivRqBN1Zv)ExNfx{E-He)l|oCHavM|z zhs~3BUrw+V%KfLi7=fJEa(MCXVd=%x2|A`1%1qLAfS0s;zIuB;1MDc|pmLNR_vMHn z+cBY230z_ghEb3Gcwc|~4suc7Cb{PNl;j8eo$9mX5y8ar8Ob-@KX#PhH29Ky%DUHo z&4=&Z8A*cOHRS8C5(LP^LaRg4;9kLoEaJgdj_yah;@eJHmQSpif9tNMFC-S@{otA`jn z370!z+g7i2YUCN~X7{VE^Ya1nf1p?!qR6}6^4n)Dz*dVA5040TAnu62o+2Afo%EB( z!Yp%`fjEIDnaG(8$p6p39J7-R=U&tVy7NQE0XW;aks+VuXQQ}FIrdH+a<)%<(X^!C z9@I_OzCZrSbw2cBTCUQNJS87lc6ZO~ zq$feRs~A^mg8b*tWu(Yszw42e@rp{tBfCyc?It>`bg2t_m~yo#e-0ngG-On3%O2%l zak#R4zh8YdbnN(aR_vb^qiZ=b6-Cn1=viNFN_~C&R+m6}IfI-bl)&;jvN*xOVwO!m z#Mxe*>zqBt?6ACY%+;5daE0ChqN`FUQm;>)^(SZRqXyWQMd?kI$7k$C@Ti?mw0%3L z3_k9$g5aE^I4N<@G3zv7+yN$oxsuBwcS28DQpeMD*QG}2A*yR0S}IdN=kV6v))2qg zBHF(ox_@;3tX68DT?X#Kl!PkW<)quC@b1dnn5Icv??np3AWMf?hE(<5IiHM}-aVNs zFb?Ek?fW(=FAg@e2GVHTtJVmA33@tC)td5X(AN<8-tw|~&Do=8&z>?J$th)>ABC<@ z%jvm;k@G!WuZgMHda)6MUq_rZMt%SB+i6zqnkSEF_tlhoi8mV=C-dpG;23*kK`Ay2~AQTqcrrw$-4ftip?Ah-*}jo)6wp2h?@Sk$Z8Ryv;Lb=jser zlzIB2ubAi3FdJVxgSm(}IJCZD$*;3PyC5Vrb3tG?afzP-uNBDo_?>ij#FE!t^%?kY z*m@O@DM7EV&%YnbzOB=BqQsYqh|?-jwD?&a(q0G?7$lV2k$AaeQ2}!TALV9swlP9> zfMLvI&e`2u`>yxqNhk>#aecE!OE>6jjFeXKt2uo?YITLpi$(UXd?yk@s%EzMuOg@i z+)>qFMibHd9ZRvDHMC-`Q74m9c|B%c5P diff --git a/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png b/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png deleted file mode 100644 index 534be4d6ec459e583ea037755f4bf174f974aa73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmeAS@N?(olHy`uVBq!ia0y~y-~ck&7?_xW)ckJ_|9}){fKQ0)|NsAg{P?kH)22=b zWl07G=GmSujv*C{Z!aiC=dgEakt!T9!up<{9 diff --git a/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png b/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png deleted file mode 100644 index 30876cb6121ccadd832a619951d6ef1e748ae39a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1784 zcmeAS@N?(olHy`uVBq!ia0y~yU;{Ea7+9Erl+gdDtUyXMz$e7@|Ns9#e*D<9Y18-b z-`~G~|KY=j0|yRF_PwzHsAHa|i(^Oyby7{7 z4GaoEGnueZAGBE*7#$b{7?7xj%R2=U?#|;v7e`e^77xuPvdqA6FUXXJTLNoh<^)?fw-QoelF{r5}E)bC`9Z4 diff --git a/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png b/Collection/Collection/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png deleted file mode 100644 index e18280803869e944264c47643ba389bd704d2431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUTNn zBm)B@i>HfYNX4zU=N&m27&urqXlHr`OC6lAki$EzN{@*&kiB3&H_)D;2E^I+w-prb S65442a=E9gpUXO@geCyyRUyRy diff --git a/Collection/Collection/UYLAppDelegate.h b/Collection/Collection/UYLAppDelegate.h deleted file mode 100644 index 7a6a4ae..0000000 --- a/Collection/Collection/UYLAppDelegate.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// UYLAppDelegate.h -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface UYLAppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/Collection/Collection/UYLAppDelegate.m b/Collection/Collection/UYLAppDelegate.m deleted file mode 100644 index 9398d93..0000000 --- a/Collection/Collection/UYLAppDelegate.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// UYLAppDelegate.m -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLAppDelegate.h" - -@implementation UYLAppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - return YES; -} - - -@end diff --git a/Collection/Collection/UYLCollectionViewController.h b/Collection/Collection/UYLCollectionViewController.h deleted file mode 100644 index 2f910e6..0000000 --- a/Collection/Collection/UYLCollectionViewController.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// UYLViewController.h -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@interface UYLCollectionViewController : UICollectionViewController - -@end diff --git a/Collection/Collection/UYLCollectionViewController.m b/Collection/Collection/UYLCollectionViewController.m deleted file mode 100644 index eddfe0b..0000000 --- a/Collection/Collection/UYLCollectionViewController.m +++ /dev/null @@ -1,124 +0,0 @@ -// -// UYLViewController.m -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLCollectionViewController.h" -#import "UYLViewController.h" -#import "UYLSimpleCell.h" - -@interface UYLCollectionViewController () - -@property (nonatomic, strong) UIPopoverController *uylPopoverController; - -@end - -@implementation UYLCollectionViewController - -static NSString *UYLStoryboardViewControllerID = @"UYLViewController"; -static NSString *UYLSimpleCellID = @"UYLSimpleCell"; - -#pragma mark - -#pragma mark === UICollectionViewDataSource === -#pragma mark - - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section -{ - return 100; -} - -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath -{ - UYLSimpleCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:UYLSimpleCellID forIndexPath:indexPath]; - cell.cellLabel.text = [NSString stringWithFormat:@"cell %d",indexPath.row]; - return cell; -} - -#pragma mark - -#pragma mark === Gesture Recognizer Action === -#pragma mark - - -- (IBAction)doubleTappedCell:(id)sender -{ - CGPoint tappedPoint = [sender locationInView:self.collectionView]; - NSIndexPath *tappedCellPath = [self.collectionView indexPathForItemAtPoint:tappedPoint]; - - if (tappedCellPath) - { - UYLSimpleCell *cell = (UYLSimpleCell *)[self.collectionView cellForItemAtIndexPath:tappedCellPath]; - [self.collectionView selectItemAtIndexPath:tappedCellPath animated:YES scrollPosition:UICollectionViewScrollPositionNone]; - - if (self.uylPopoverController == nil) - { - UYLViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:UYLStoryboardViewControllerID]; - self.uylPopoverController = [[UIPopoverController alloc] initWithContentViewController:viewController]; - self.uylPopoverController.delegate = self; - } - - [self.uylPopoverController presentPopoverFromRect:cell.frame - inView:self.collectionView - permittedArrowDirections:UIPopoverArrowDirectionAny - animated:YES]; - - } -} - -#pragma mark - -#pragma mark === UIPopoverControllerDelegate === -#pragma mark - - -- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view -{ - if (self.uylPopoverController == popoverController) - { - NSArray *selectedItems = self.collectionView.indexPathsForSelectedItems; - NSIndexPath *itemPath = (NSIndexPath *)[selectedItems lastObject]; - if (itemPath) - { - UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:itemPath]; - if (cell) - { - CGRect requiredRect = cell.frame; - *rect = requiredRect; - } - } - } -} - -- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController -{ - for (NSIndexPath *indexPath in self.collectionView.indexPathsForSelectedItems) - { - [self.collectionView deselectItemAtIndexPath:indexPath animated:YES]; - } -} - -@end diff --git a/Collection/Collection/UYLSimpleCell.h b/Collection/Collection/UYLSimpleCell.h deleted file mode 100644 index 7dc2973..0000000 --- a/Collection/Collection/UYLSimpleCell.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// UYLSimpleCell.h -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@interface UYLSimpleCell : UICollectionViewCell - -@property (nonatomic, weak) IBOutlet UILabel *cellLabel; - -@end diff --git a/Collection/Collection/UYLSimpleCell.m b/Collection/Collection/UYLSimpleCell.m deleted file mode 100644 index 4660dff..0000000 --- a/Collection/Collection/UYLSimpleCell.m +++ /dev/null @@ -1,51 +0,0 @@ -// -// UYLSimpleCell.m -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLSimpleCell.h" - -@implementation UYLSimpleCell - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - self = [super initWithCoder:aDecoder]; - if (self) - { - UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; - backgroundView.layer.borderColor = [[UIColor lightGrayColor] CGColor]; - backgroundView.layer.borderWidth = 2; - self.selectedBackgroundView = backgroundView; - } - return self; -} - -@end diff --git a/Collection/Collection/UYLViewController.h b/Collection/Collection/UYLViewController.h deleted file mode 100644 index f774f70..0000000 --- a/Collection/Collection/UYLViewController.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// UYLViewController.h -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@interface UYLViewController : UIViewController - -@end diff --git a/Collection/Collection/UYLViewController.m b/Collection/Collection/UYLViewController.m deleted file mode 100644 index da2ab3e..0000000 --- a/Collection/Collection/UYLViewController.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// UYLViewController.m -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLViewController.h" - -@interface UYLViewController () - -@property (weak, nonatomic) IBOutlet UILabel *contentLabel; - -@end - -@implementation UYLViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - self.contentLabel.text = @"Content"; -} - -@end diff --git a/Collection/Collection/en.lproj/InfoPlist.strings b/Collection/Collection/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/Collection/Collection/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/Collection/Collection/main.m b/Collection/Collection/main.m deleted file mode 100644 index 840edb6..0000000 --- a/Collection/Collection/main.m +++ /dev/null @@ -1,43 +0,0 @@ -// -// main.m -// Collection -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -#import "UYLAppDelegate.h" - -int main(int argc, char * argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([UYLAppDelegate class])); - } -} diff --git a/Collection/CollectionTests/CollectionTests-Info.plist b/Collection/CollectionTests/CollectionTests-Info.plist deleted file mode 100644 index 6dd5353..0000000 --- a/Collection/CollectionTests/CollectionTests-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Collection/CollectionTests/CollectionTests.m b/Collection/CollectionTests/CollectionTests.m deleted file mode 100644 index 96f9b2c..0000000 --- a/Collection/CollectionTests/CollectionTests.m +++ /dev/null @@ -1,34 +0,0 @@ -// -// CollectionTests.m -// CollectionTests -// -// Created by Keith Harrison on 13/09/2013. -// Copyright (c) 2013 Keith Harrison. All rights reserved. -// - -#import - -@interface CollectionTests : XCTestCase - -@end - -@implementation CollectionTests - -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testExample -{ - XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); -} - -@end diff --git a/Collection/CollectionTests/en.lproj/InfoPlist.strings b/Collection/CollectionTests/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/Collection/CollectionTests/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/Collection/README b/Collection/README deleted file mode 100644 index 54a5631..0000000 --- a/Collection/README +++ /dev/null @@ -1,14 +0,0 @@ -======================================================================= -Collection - A Simple Collection View - -Version 1.0 27 September 2013 Initial version. -======================================================================= - -This is a example project to reproduce a bug in the way that iOS 7 -repostions popovers when a view is rotated. - -For further details see the following blog post: - -http://useyourloaf.com/blog/2013/09/27/uipopover-arrow-not-repositioned-correctly-on-rotation.html - -You can also view the bug report on Open Radar at http://openradar.appspot.com/14995477 \ No newline at end of file From 2de8ac53c0f334c882efdbabe26abfd395b6be59 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 15:10:56 +0000 Subject: [PATCH 124/142] Archive TwitterSearch project --- .../TwitterSearch.xcodeproj/project.pbxproj | 0 .../AppIcon.appiconset/Contents.json | 0 .../Images.xcassets/AppIcon.appiconset/Icon2-29.png | Bin .../AppIcon.appiconset/Icon2-29@2x-1.png | Bin .../AppIcon.appiconset/Icon2-29@2x.png | Bin .../AppIcon.appiconset/Icon2-29@3x.png | Bin .../Images.xcassets/AppIcon.appiconset/Icon2-40.png | Bin .../AppIcon.appiconset/Icon2-40@2x-1.png | Bin .../AppIcon.appiconset/Icon2-40@2x.png | Bin .../Images.xcassets/AppIcon.appiconset/Icon2-76.png | Bin .../AppIcon.appiconset/Icon2-76@2x.png | Bin .../AppIcon.appiconset/Icon2-835@2x.png | Bin .../AppIcon.appiconset/Icon@2x-1.png | Bin .../Images.xcassets/AppIcon.appiconset/Icon@2x.png | Bin .../Images.xcassets/AppIcon.appiconset/Icon@3x.png | Bin .../AppIcon.appiconset/icon2-1024.png | Bin .../Images.xcassets/AppIcon.appiconset/icon2-20.png | Bin .../AppIcon.appiconset/icon2-20@2x-1.png | Bin .../AppIcon.appiconset/icon2-20@2x.png | Bin .../AppIcon.appiconset/icon2-20@3x.png | Bin .../TwitterSearch/Images.xcassets/Contents.json | 0 .../TwitterSearch/LaunchScreen.storyboard | 0 .../TwitterSearch/NSString+URLEncoding.h | 0 .../TwitterSearch/NSString+URLEncoding.m | 0 .../TwitterSearch/RootViewController.h | 0 .../TwitterSearch/RootViewController.m | 0 .../TwitterSearch/SearchViewController.h | 0 .../TwitterSearch/SearchViewController.m | 0 .../TwitterSearch/Storyboard.storyboard | 0 .../TwitterSearch}/TwitterSearch/TweetCell.h | 0 .../TwitterSearch}/TwitterSearch/TweetCell.m | 0 .../TwitterSearch/TwitterSearch-Info.plist | 0 .../TwitterSearch/TwitterSearchAppDelegate.h | 0 .../TwitterSearch/TwitterSearchAppDelegate.m | 0 .../TwitterSearch/en.lproj/InfoPlist.strings | 0 .../TwitterSearch}/TwitterSearch/main.m | 0 .../TwitterSearchUnitTests/Info.plist | 0 .../NSStringURLEncodingUnitTests.m | 0 38 files changed, 0 insertions(+), 0 deletions(-) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch.xcodeproj/project.pbxproj (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-835@2x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-1024.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x-1.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@3x.png (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Images.xcassets/Contents.json (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/LaunchScreen.storyboard (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/NSString+URLEncoding.h (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/NSString+URLEncoding.m (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/RootViewController.h (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/RootViewController.m (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/SearchViewController.h (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/SearchViewController.m (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/Storyboard.storyboard (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/TweetCell.h (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/TweetCell.m (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/TwitterSearch-Info.plist (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/TwitterSearchAppDelegate.h (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/TwitterSearchAppDelegate.m (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/en.lproj/InfoPlist.strings (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearch/main.m (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearchUnitTests/Info.plist (100%) rename {TwitterSearch => Archive/TwitterSearch}/TwitterSearchUnitTests/NSStringURLEncodingUnitTests.m (100%) diff --git a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj similarity index 100% rename from TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj rename to Archive/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-835@2x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-835@2x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-835@2x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-835@2x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-1024.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-1024.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-1024.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-1024.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x-1.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x-1.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x-1.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x-1.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@2x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@3x.png b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@3x.png similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@3x.png rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/icon2-20@3x.png diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/Contents.json b/Archive/TwitterSearch/TwitterSearch/Images.xcassets/Contents.json similarity index 100% rename from TwitterSearch/TwitterSearch/Images.xcassets/Contents.json rename to Archive/TwitterSearch/TwitterSearch/Images.xcassets/Contents.json diff --git a/TwitterSearch/TwitterSearch/LaunchScreen.storyboard b/Archive/TwitterSearch/TwitterSearch/LaunchScreen.storyboard similarity index 100% rename from TwitterSearch/TwitterSearch/LaunchScreen.storyboard rename to Archive/TwitterSearch/TwitterSearch/LaunchScreen.storyboard diff --git a/TwitterSearch/TwitterSearch/NSString+URLEncoding.h b/Archive/TwitterSearch/TwitterSearch/NSString+URLEncoding.h similarity index 100% rename from TwitterSearch/TwitterSearch/NSString+URLEncoding.h rename to Archive/TwitterSearch/TwitterSearch/NSString+URLEncoding.h diff --git a/TwitterSearch/TwitterSearch/NSString+URLEncoding.m b/Archive/TwitterSearch/TwitterSearch/NSString+URLEncoding.m similarity index 100% rename from TwitterSearch/TwitterSearch/NSString+URLEncoding.m rename to Archive/TwitterSearch/TwitterSearch/NSString+URLEncoding.m diff --git a/TwitterSearch/TwitterSearch/RootViewController.h b/Archive/TwitterSearch/TwitterSearch/RootViewController.h similarity index 100% rename from TwitterSearch/TwitterSearch/RootViewController.h rename to Archive/TwitterSearch/TwitterSearch/RootViewController.h diff --git a/TwitterSearch/TwitterSearch/RootViewController.m b/Archive/TwitterSearch/TwitterSearch/RootViewController.m similarity index 100% rename from TwitterSearch/TwitterSearch/RootViewController.m rename to Archive/TwitterSearch/TwitterSearch/RootViewController.m diff --git a/TwitterSearch/TwitterSearch/SearchViewController.h b/Archive/TwitterSearch/TwitterSearch/SearchViewController.h similarity index 100% rename from TwitterSearch/TwitterSearch/SearchViewController.h rename to Archive/TwitterSearch/TwitterSearch/SearchViewController.h diff --git a/TwitterSearch/TwitterSearch/SearchViewController.m b/Archive/TwitterSearch/TwitterSearch/SearchViewController.m similarity index 100% rename from TwitterSearch/TwitterSearch/SearchViewController.m rename to Archive/TwitterSearch/TwitterSearch/SearchViewController.m diff --git a/TwitterSearch/TwitterSearch/Storyboard.storyboard b/Archive/TwitterSearch/TwitterSearch/Storyboard.storyboard similarity index 100% rename from TwitterSearch/TwitterSearch/Storyboard.storyboard rename to Archive/TwitterSearch/TwitterSearch/Storyboard.storyboard diff --git a/TwitterSearch/TwitterSearch/TweetCell.h b/Archive/TwitterSearch/TwitterSearch/TweetCell.h similarity index 100% rename from TwitterSearch/TwitterSearch/TweetCell.h rename to Archive/TwitterSearch/TwitterSearch/TweetCell.h diff --git a/TwitterSearch/TwitterSearch/TweetCell.m b/Archive/TwitterSearch/TwitterSearch/TweetCell.m similarity index 100% rename from TwitterSearch/TwitterSearch/TweetCell.m rename to Archive/TwitterSearch/TwitterSearch/TweetCell.m diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist b/Archive/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist similarity index 100% rename from TwitterSearch/TwitterSearch/TwitterSearch-Info.plist rename to Archive/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist diff --git a/TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.h b/Archive/TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.h similarity index 100% rename from TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.h rename to Archive/TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.h diff --git a/TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.m b/Archive/TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.m similarity index 100% rename from TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.m rename to Archive/TwitterSearch/TwitterSearch/TwitterSearchAppDelegate.m diff --git a/TwitterSearch/TwitterSearch/en.lproj/InfoPlist.strings b/Archive/TwitterSearch/TwitterSearch/en.lproj/InfoPlist.strings similarity index 100% rename from TwitterSearch/TwitterSearch/en.lproj/InfoPlist.strings rename to Archive/TwitterSearch/TwitterSearch/en.lproj/InfoPlist.strings diff --git a/TwitterSearch/TwitterSearch/main.m b/Archive/TwitterSearch/TwitterSearch/main.m similarity index 100% rename from TwitterSearch/TwitterSearch/main.m rename to Archive/TwitterSearch/TwitterSearch/main.m diff --git a/TwitterSearch/TwitterSearchUnitTests/Info.plist b/Archive/TwitterSearch/TwitterSearchUnitTests/Info.plist similarity index 100% rename from TwitterSearch/TwitterSearchUnitTests/Info.plist rename to Archive/TwitterSearch/TwitterSearchUnitTests/Info.plist diff --git a/TwitterSearch/TwitterSearchUnitTests/NSStringURLEncodingUnitTests.m b/Archive/TwitterSearch/TwitterSearchUnitTests/NSStringURLEncodingUnitTests.m similarity index 100% rename from TwitterSearch/TwitterSearchUnitTests/NSStringURLEncodingUnitTests.m rename to Archive/TwitterSearch/TwitterSearchUnitTests/NSStringURLEncodingUnitTests.m From 30f1048f52d23e83e23db7e3fc76105ffdb855b0 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 15:56:16 +0000 Subject: [PATCH 125/142] Update for Xcode 11 --- BUG TableView State Restore/README | 2 +- .../restore.xcodeproj/project.pbxproj | 52 ++++++++++++++++--- .../MainStoryboard.storyboard | 44 +++++++--------- .../restore/restore-Info.plist | 2 +- Refresh/README.md | 5 +- Refresh/Refresh.xcodeproj/project.pbxproj | 24 ++++++++- .../AppIcon.appiconset/Contents.json | 5 ++ 7 files changed, 97 insertions(+), 37 deletions(-) rename BUG TableView State Restore/restore/{en.lproj => Base.lproj}/MainStoryboard.storyboard (60%) diff --git a/BUG TableView State Restore/README b/BUG TableView State Restore/README index 7a1ba94..e463f6e 100644 --- a/BUG TableView State Restore/README +++ b/BUG TableView State Restore/README @@ -22,7 +22,7 @@ as expected. For further details see the following blog post: -http://useyourloaf.com/blog/2013/04/07/bug-table-view-state-not-restored-when-embedded-in-navigation-controller.html +https://useyourloaf.com/blog/bug-table-view-state-not-restored-when-embedded-in-navigation-controller/ ************************************************************************** *** This bug has been tested and reproduced for iOS 6.0 and iOS 6.1.3. *** diff --git a/BUG TableView State Restore/restore.xcodeproj/project.pbxproj b/BUG TableView State Restore/restore.xcodeproj/project.pbxproj index a3364b9..f3bb7b1 100644 --- a/BUG TableView State Restore/restore.xcodeproj/project.pbxproj +++ b/BUG TableView State Restore/restore.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5334608723CA275700BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 53370CBD16F62D8D0090DFC5 /* restore.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = restore.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53370CC016F62D8D0090DFC5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 53370CC216F62D8D0090DFC5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -36,7 +37,6 @@ 53370CD216F62D8D0090DFC5 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 53370CD416F62D8D0090DFC5 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 53370CD616F62D8D0090DFC5 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 53370CD916F62D8D0090DFC5 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 53370CE316F62FF70090DFC5 /* UYLTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UYLTableViewController.h; path = ../UYLTableViewController.h; sourceTree = ""; }; 53370CE416F62FF70090DFC5 /* UYLTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UYLTableViewController.m; path = ../UYLTableViewController.m; sourceTree = ""; }; 537C3B7517121F9100FA27ED /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; @@ -140,15 +140,16 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0460; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 53370CB816F62D8D0090DFC5 /* Build configuration list for PBXProject "restore" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 53370CB416F62D8D0090DFC5; productRefGroup = 53370CBE16F62D8D0090DFC5 /* Products */; @@ -202,7 +203,7 @@ 53370CD816F62D8D0090DFC5 /* MainStoryboard.storyboard */ = { isa = PBXVariantGroup; children = ( - 53370CD916F62D8D0090DFC5 /* en */, + 5334608723CA275700BE943E /* Base */, ); name = MainStoryboard.storyboard; sourceTree = ""; @@ -214,28 +215,47 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -245,21 +265,39 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -272,6 +310,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "restore/restore-Prefix.pch"; INFOPLIST_FILE = "restore/restore-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -283,6 +322,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "restore/restore-Prefix.pch"; INFOPLIST_FILE = "restore/restore-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/BUG TableView State Restore/restore/en.lproj/MainStoryboard.storyboard b/BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard similarity index 60% rename from BUG TableView State Restore/restore/en.lproj/MainStoryboard.storyboard rename to BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard index e233416..39f83d9 100644 --- a/BUG TableView State Restore/restore/en.lproj/MainStoryboard.storyboard +++ b/BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard @@ -1,33 +1,37 @@ - - + + + - + + + - - + + - + - + - - + + - - - + @@ -39,17 +43,7 @@ - + - - - - - - - - - - - \ No newline at end of file + diff --git a/BUG TableView State Restore/restore/restore-Info.plist b/BUG TableView State Restore/restore/restore-Info.plist index e20c6df..36d8600 100644 --- a/BUG TableView State Restore/restore/restore-Info.plist +++ b/BUG TableView State Restore/restore/restore-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Refresh/README.md b/Refresh/README.md index 270b6b7..793948c 100644 --- a/Refresh/README.md +++ b/Refresh/README.md @@ -1,5 +1,6 @@ ## Refresh - Pull-to-refresh control for a table view controller + Version 1.2 11 Jan 2020 Update for Xcode 11 Version 1.1 25 Nov 2016 Update for Xcode 8 and general clean-up. Version 1.0 18 June 2013 Initial Version @@ -10,8 +11,8 @@ control for table views by adding a UIRefreshControl to a table view controller using Interface Builder. This project uses Objective-C and has been updated for compatibility -with Xcode 8.1. +with Xcode 11. For further details see the following post: -+ [UIRefreshControl Fun and Games](http://useyourloaf.com/blog/uirefreshcontrol-fun-and-games/) ++ [UIRefreshControl Fun and Games](https://useyourloaf.com/blog/uirefreshcontrol-fun-and-games/) diff --git a/Refresh/Refresh.xcodeproj/project.pbxproj b/Refresh/Refresh.xcodeproj/project.pbxproj index 7f7b858..a6839d5 100644 --- a/Refresh/Refresh.xcodeproj/project.pbxproj +++ b/Refresh/Refresh.xcodeproj/project.pbxproj @@ -133,12 +133,12 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 530A6028176F8FBF004F85D9 /* Build configuration list for PBXProject "Refresh" */; compatibilityVersion = "Xcode 8.0"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -205,15 +205,24 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -246,15 +255,24 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -286,6 +304,7 @@ INFOPLIST_FILE = "Refresh/Refresh-Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -300,6 +319,7 @@ INFOPLIST_FILE = "Refresh/Refresh-Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json b/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json index b8236c6..19882d5 100644 --- a/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Refresh/Refresh/Images.xcassets/AppIcon.appiconset/Contents.json @@ -39,6 +39,11 @@ "idiom" : "iphone", "size" : "60x60", "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { From f5ad5ae96ec000cfcc76aa0eb8b56aa3922fbd90 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 15:56:58 +0000 Subject: [PATCH 126/142] Archive BUG TableView State Restore --- .../BUG TableView State Restore}/README | 0 .../UYLTableViewController.h | 0 .../UYLTableViewController.m | 0 .../restore.xcodeproj/project.pbxproj | 0 .../restore/Base.lproj/MainStoryboard.storyboard | 0 .../restore/Default-568h@2x.png | Bin .../restore/Default.png | Bin .../restore/Default@2x.png | Bin .../restore/NavStoryboard.storyboard | 0 .../restore/UYLAppDelegate.h | 0 .../restore/UYLAppDelegate.m | 0 .../restore/en.lproj/InfoPlist.strings | 0 .../BUG TableView State Restore}/restore/main.m | 0 .../restore/restore-Info.plist | 0 .../restore/restore-Prefix.pch | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/README (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/UYLTableViewController.h (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/UYLTableViewController.m (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore.xcodeproj/project.pbxproj (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/Base.lproj/MainStoryboard.storyboard (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/Default-568h@2x.png (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/Default.png (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/Default@2x.png (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/NavStoryboard.storyboard (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/UYLAppDelegate.h (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/UYLAppDelegate.m (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/en.lproj/InfoPlist.strings (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/main.m (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/restore-Info.plist (100%) rename {BUG TableView State Restore => Archive/BUG TableView State Restore}/restore/restore-Prefix.pch (100%) diff --git a/BUG TableView State Restore/README b/Archive/BUG TableView State Restore/README similarity index 100% rename from BUG TableView State Restore/README rename to Archive/BUG TableView State Restore/README diff --git a/BUG TableView State Restore/UYLTableViewController.h b/Archive/BUG TableView State Restore/UYLTableViewController.h similarity index 100% rename from BUG TableView State Restore/UYLTableViewController.h rename to Archive/BUG TableView State Restore/UYLTableViewController.h diff --git a/BUG TableView State Restore/UYLTableViewController.m b/Archive/BUG TableView State Restore/UYLTableViewController.m similarity index 100% rename from BUG TableView State Restore/UYLTableViewController.m rename to Archive/BUG TableView State Restore/UYLTableViewController.m diff --git a/BUG TableView State Restore/restore.xcodeproj/project.pbxproj b/Archive/BUG TableView State Restore/restore.xcodeproj/project.pbxproj similarity index 100% rename from BUG TableView State Restore/restore.xcodeproj/project.pbxproj rename to Archive/BUG TableView State Restore/restore.xcodeproj/project.pbxproj diff --git a/BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard b/Archive/BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard similarity index 100% rename from BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard rename to Archive/BUG TableView State Restore/restore/Base.lproj/MainStoryboard.storyboard diff --git a/BUG TableView State Restore/restore/Default-568h@2x.png b/Archive/BUG TableView State Restore/restore/Default-568h@2x.png similarity index 100% rename from BUG TableView State Restore/restore/Default-568h@2x.png rename to Archive/BUG TableView State Restore/restore/Default-568h@2x.png diff --git a/BUG TableView State Restore/restore/Default.png b/Archive/BUG TableView State Restore/restore/Default.png similarity index 100% rename from BUG TableView State Restore/restore/Default.png rename to Archive/BUG TableView State Restore/restore/Default.png diff --git a/BUG TableView State Restore/restore/Default@2x.png b/Archive/BUG TableView State Restore/restore/Default@2x.png similarity index 100% rename from BUG TableView State Restore/restore/Default@2x.png rename to Archive/BUG TableView State Restore/restore/Default@2x.png diff --git a/BUG TableView State Restore/restore/NavStoryboard.storyboard b/Archive/BUG TableView State Restore/restore/NavStoryboard.storyboard similarity index 100% rename from BUG TableView State Restore/restore/NavStoryboard.storyboard rename to Archive/BUG TableView State Restore/restore/NavStoryboard.storyboard diff --git a/BUG TableView State Restore/restore/UYLAppDelegate.h b/Archive/BUG TableView State Restore/restore/UYLAppDelegate.h similarity index 100% rename from BUG TableView State Restore/restore/UYLAppDelegate.h rename to Archive/BUG TableView State Restore/restore/UYLAppDelegate.h diff --git a/BUG TableView State Restore/restore/UYLAppDelegate.m b/Archive/BUG TableView State Restore/restore/UYLAppDelegate.m similarity index 100% rename from BUG TableView State Restore/restore/UYLAppDelegate.m rename to Archive/BUG TableView State Restore/restore/UYLAppDelegate.m diff --git a/BUG TableView State Restore/restore/en.lproj/InfoPlist.strings b/Archive/BUG TableView State Restore/restore/en.lproj/InfoPlist.strings similarity index 100% rename from BUG TableView State Restore/restore/en.lproj/InfoPlist.strings rename to Archive/BUG TableView State Restore/restore/en.lproj/InfoPlist.strings diff --git a/BUG TableView State Restore/restore/main.m b/Archive/BUG TableView State Restore/restore/main.m similarity index 100% rename from BUG TableView State Restore/restore/main.m rename to Archive/BUG TableView State Restore/restore/main.m diff --git a/BUG TableView State Restore/restore/restore-Info.plist b/Archive/BUG TableView State Restore/restore/restore-Info.plist similarity index 100% rename from BUG TableView State Restore/restore/restore-Info.plist rename to Archive/BUG TableView State Restore/restore/restore-Info.plist diff --git a/BUG TableView State Restore/restore/restore-Prefix.pch b/Archive/BUG TableView State Restore/restore/restore-Prefix.pch similarity index 100% rename from BUG TableView State Restore/restore/restore-Prefix.pch rename to Archive/BUG TableView State Restore/restore/restore-Prefix.pch From be1ee3ef2f7d2bd8b5bd04116e87727eb4e07440 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 17:30:02 +0000 Subject: [PATCH 127/142] Archive StaticTable, Styles and TaskTimer projects --- .../StaticTable}/README.markdown | 0 .../StaticTable.xcodeproj/project.pbxproj | 67 ++- .../StaticTable/Settings.storyboard | 259 ++++----- .../StaticTable/StaticTable-Info.plist | 2 +- .../StaticTable/StaticTable-Prefix.pch | 0 .../UYLAdvancedSettingsViewController.h | 0 .../UYLAdvancedSettingsViewController.m | 0 .../StaticTable}/StaticTable/UYLAppDelegate.h | 0 .../StaticTable}/StaticTable/UYLAppDelegate.m | 0 .../StaticTable/UYLFirstViewController.h | 0 .../StaticTable/UYLFirstViewController.m | 0 .../StaticTable/UYLFirstViewController.xib | 35 ++ .../UYLGeneralSettingsTableViewController.h | 0 .../UYLGeneralSettingsTableViewController.m | 0 .../UYLRotatingTableViewController.h | 0 .../UYLRotatingTableViewController.m | 0 .../StaticTable/en.lproj/InfoPlist.strings | 0 .../StaticTable}/StaticTable/first.png | Bin .../StaticTable}/StaticTable/first@2x.png | Bin .../StaticTable}/StaticTable/main.m | 0 .../StaticTable}/StaticTable/second.png | Bin .../StaticTable}/StaticTable/second@2x.png | Bin Archive/Styles/README | 71 +++ .../Styles/Styles.xcodeproj/project.pbxproj | 458 ++++++++++++++++ Archive/Styles/Styles/LaunchScreen.storyboard | 29 ++ .../Styles/Styles/MainStoryboard.storyboard | 484 +++++++++++++++++ .../Resources/back-button-landscape.png | Bin 0 -> 838 bytes .../Resources/back-button-landscape@2x.png | Bin 0 -> 2005 bytes .../Styles/Styles/Resources/back-button.png | Bin 0 -> 1012 bytes .../Styles/Resources/back-button@2x.png | Bin 0 -> 2384 bytes Archive/Styles/Styles/Resources/divider.png | Bin 0 -> 72 bytes .../Styles/Styles/Resources/divider@2x.png | Bin 0 -> 75 bytes .../Styles/Styles/Resources/green-button.png | Bin 0 -> 2305 bytes .../Styles/Resources/green-button@2x.png | Bin 0 -> 7044 bytes .../Styles/Resources/navbar-landscape.png | Bin 0 -> 1631 bytes .../Styles/Resources/navbar-landscape@2x.png | Bin 0 -> 4652 bytes Archive/Styles/Styles/Resources/navbar.png | Bin 0 -> 2009 bytes Archive/Styles/Styles/Resources/navbar@2x.png | Bin 0 -> 6321 bytes .../Styles/Styles/Resources/orange-button.png | Bin 0 -> 2111 bytes .../Styles/Resources/orange-button@2x.png | Bin 0 -> 7016 bytes Archive/Styles/Styles/Resources/orange.png | Bin 0 -> 82 bytes Archive/Styles/Styles/Resources/orange@2x.png | Bin 0 -> 78 bytes .../Styles/Styles/Resources/red-button.png | Bin 0 -> 2039 bytes .../Styles/Styles/Resources/red-button@2x.png | Bin 0 -> 6696 bytes .../Styles/Styles/Resources/steel-button.png | Bin 0 -> 2562 bytes .../Styles/Resources/steel-button@2x.png | Bin 0 -> 8079 bytes Archive/Styles/Styles/Styles-Info.plist | 43 ++ Archive/Styles/Styles/Styles-Prefix.pch | 14 + Archive/Styles/Styles/UYLAppDelegate.h | 39 ++ Archive/Styles/Styles/UYLAppDelegate.m | 46 ++ Archive/Styles/Styles/UYLListViewController.h | 38 ++ Archive/Styles/Styles/UYLListViewController.m | 45 ++ Archive/Styles/Styles/UYLOkButton.h | 36 ++ Archive/Styles/Styles/UYLOkButton.m | 36 ++ Archive/Styles/Styles/UYLResetButton.h | 36 ++ Archive/Styles/Styles/UYLResetButton.m | 36 ++ .../Styles/Styles/UYLRotatingViewController.h | 38 ++ .../Styles/Styles/UYLRotatingViewController.m | 49 ++ Archive/Styles/Styles/UYLStyleController.h | 39 ++ Archive/Styles/Styles/UYLStyleController.m | 125 +++++ Archive/Styles/Styles/UYLZeroButton.h | 36 ++ Archive/Styles/Styles/UYLZeroButton.m | 36 ++ .../Styles/Styles/en.lproj/InfoPlist.strings | 2 + Archive/Styles/Styles/main.m | 43 ++ Archive/TaskTimer/README | 95 ++++ .../TaskTimer.xcodeproj/project.pbxproj | 493 ++++++++++++++++++ .../UYLTaskListViewController_iPad.xib | 29 ++ .../UYLTaskListViewController_iPhone.xib | 28 + .../Base.lproj/UYLTaskViewController_iPad.xib | 65 +++ .../UYLTaskViewController_iPhone.xib | 64 +++ .../TaskTimer/NSNumber+UYLTimeFormatter.h | 39 ++ .../TaskTimer/NSNumber+UYLTimeFormatter.m | 63 +++ Archive/TaskTimer/TaskTimer/Task.h | 44 ++ Archive/TaskTimer/TaskTimer/Task.m | 43 ++ .../TaskTimer/TaskTimer/TaskTimer-Info.plist | 46 ++ .../TaskTimer/TaskTimer/TaskTimer-Prefix.pch | 15 + .../TaskTimer.xcdatamodeld/.xccurrentversion | 8 + .../Accessibile.xcdatamodel/contents | 12 + Archive/TaskTimer/TaskTimer/UYLAppDelegate.h | 49 ++ Archive/TaskTimer/TaskTimer/UYLAppDelegate.m | 164 ++++++ Archive/TaskTimer/TaskTimer/UYLCounterView.h | 51 ++ Archive/TaskTimer/TaskTimer/UYLCounterView.m | 292 +++++++++++ .../TaskTimer/UYLTaskListViewController.h | 43 ++ .../TaskTimer/UYLTaskListViewController.m | 247 +++++++++ .../TaskTimer/UYLTaskViewController.h | 43 ++ .../TaskTimer/UYLTaskViewController.m | 299 +++++++++++ Archive/TaskTimer/TaskTimer/checked.png | Bin 0 -> 1790 bytes Archive/TaskTimer/TaskTimer/checked@2x.png | Bin 0 -> 2241 bytes .../TaskTimer/en.lproj/InfoPlist.strings | 2 + Archive/TaskTimer/TaskTimer/main.m | 43 ++ Archive/TaskTimer/TaskTimer/redbutton.png | Bin 0 -> 2242 bytes Archive/TaskTimer/TaskTimer/start.png | Bin 0 -> 2182 bytes Archive/TaskTimer/TaskTimer/start@2x.png | Bin 0 -> 2864 bytes Archive/TaskTimer/TaskTimer/stop.png | Bin 0 -> 2173 bytes Archive/TaskTimer/TaskTimer/stop@2x.png | Bin 0 -> 2845 bytes Archive/TaskTimer/TaskTimer/unchecked.png | Bin 0 -> 1536 bytes Archive/TaskTimer/TaskTimer/unchecked@2x.png | Bin 0 -> 1603 bytes .../StaticTable/UYLFirstViewController.xib | 223 -------- 98 files changed, 4261 insertions(+), 381 deletions(-) rename {StaticTable => Archive/StaticTable}/README.markdown (100%) rename {StaticTable => Archive/StaticTable}/StaticTable.xcodeproj/project.pbxproj (87%) rename {StaticTable => Archive/StaticTable}/StaticTable/Settings.storyboard (70%) rename {StaticTable => Archive/StaticTable}/StaticTable/StaticTable-Info.plist (94%) rename {StaticTable => Archive/StaticTable}/StaticTable/StaticTable-Prefix.pch (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLAdvancedSettingsViewController.h (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLAdvancedSettingsViewController.m (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLAppDelegate.h (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLAppDelegate.m (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLFirstViewController.h (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLFirstViewController.m (100%) create mode 100644 Archive/StaticTable/StaticTable/UYLFirstViewController.xib rename {StaticTable => Archive/StaticTable}/StaticTable/UYLGeneralSettingsTableViewController.h (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLGeneralSettingsTableViewController.m (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLRotatingTableViewController.h (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/UYLRotatingTableViewController.m (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/en.lproj/InfoPlist.strings (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/first.png (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/first@2x.png (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/main.m (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/second.png (100%) rename {StaticTable => Archive/StaticTable}/StaticTable/second@2x.png (100%) create mode 100644 Archive/Styles/README create mode 100644 Archive/Styles/Styles.xcodeproj/project.pbxproj create mode 100644 Archive/Styles/Styles/LaunchScreen.storyboard create mode 100644 Archive/Styles/Styles/MainStoryboard.storyboard create mode 100644 Archive/Styles/Styles/Resources/back-button-landscape.png create mode 100644 Archive/Styles/Styles/Resources/back-button-landscape@2x.png create mode 100644 Archive/Styles/Styles/Resources/back-button.png create mode 100644 Archive/Styles/Styles/Resources/back-button@2x.png create mode 100644 Archive/Styles/Styles/Resources/divider.png create mode 100644 Archive/Styles/Styles/Resources/divider@2x.png create mode 100644 Archive/Styles/Styles/Resources/green-button.png create mode 100644 Archive/Styles/Styles/Resources/green-button@2x.png create mode 100644 Archive/Styles/Styles/Resources/navbar-landscape.png create mode 100644 Archive/Styles/Styles/Resources/navbar-landscape@2x.png create mode 100644 Archive/Styles/Styles/Resources/navbar.png create mode 100644 Archive/Styles/Styles/Resources/navbar@2x.png create mode 100644 Archive/Styles/Styles/Resources/orange-button.png create mode 100644 Archive/Styles/Styles/Resources/orange-button@2x.png create mode 100644 Archive/Styles/Styles/Resources/orange.png create mode 100644 Archive/Styles/Styles/Resources/orange@2x.png create mode 100644 Archive/Styles/Styles/Resources/red-button.png create mode 100644 Archive/Styles/Styles/Resources/red-button@2x.png create mode 100644 Archive/Styles/Styles/Resources/steel-button.png create mode 100644 Archive/Styles/Styles/Resources/steel-button@2x.png create mode 100644 Archive/Styles/Styles/Styles-Info.plist create mode 100644 Archive/Styles/Styles/Styles-Prefix.pch create mode 100644 Archive/Styles/Styles/UYLAppDelegate.h create mode 100644 Archive/Styles/Styles/UYLAppDelegate.m create mode 100644 Archive/Styles/Styles/UYLListViewController.h create mode 100644 Archive/Styles/Styles/UYLListViewController.m create mode 100644 Archive/Styles/Styles/UYLOkButton.h create mode 100644 Archive/Styles/Styles/UYLOkButton.m create mode 100644 Archive/Styles/Styles/UYLResetButton.h create mode 100644 Archive/Styles/Styles/UYLResetButton.m create mode 100644 Archive/Styles/Styles/UYLRotatingViewController.h create mode 100644 Archive/Styles/Styles/UYLRotatingViewController.m create mode 100644 Archive/Styles/Styles/UYLStyleController.h create mode 100644 Archive/Styles/Styles/UYLStyleController.m create mode 100644 Archive/Styles/Styles/UYLZeroButton.h create mode 100644 Archive/Styles/Styles/UYLZeroButton.m create mode 100644 Archive/Styles/Styles/en.lproj/InfoPlist.strings create mode 100644 Archive/Styles/Styles/main.m create mode 100644 Archive/TaskTimer/README create mode 100644 Archive/TaskTimer/TaskTimer.xcodeproj/project.pbxproj create mode 100644 Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPad.xib create mode 100644 Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPhone.xib create mode 100644 Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPad.xib create mode 100644 Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPhone.xib create mode 100644 Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h create mode 100644 Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m create mode 100644 Archive/TaskTimer/TaskTimer/Task.h create mode 100644 Archive/TaskTimer/TaskTimer/Task.m create mode 100644 Archive/TaskTimer/TaskTimer/TaskTimer-Info.plist create mode 100644 Archive/TaskTimer/TaskTimer/TaskTimer-Prefix.pch create mode 100644 Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion create mode 100644 Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents create mode 100644 Archive/TaskTimer/TaskTimer/UYLAppDelegate.h create mode 100644 Archive/TaskTimer/TaskTimer/UYLAppDelegate.m create mode 100644 Archive/TaskTimer/TaskTimer/UYLCounterView.h create mode 100644 Archive/TaskTimer/TaskTimer/UYLCounterView.m create mode 100644 Archive/TaskTimer/TaskTimer/UYLTaskListViewController.h create mode 100644 Archive/TaskTimer/TaskTimer/UYLTaskListViewController.m create mode 100644 Archive/TaskTimer/TaskTimer/UYLTaskViewController.h create mode 100644 Archive/TaskTimer/TaskTimer/UYLTaskViewController.m create mode 100644 Archive/TaskTimer/TaskTimer/checked.png create mode 100644 Archive/TaskTimer/TaskTimer/checked@2x.png create mode 100644 Archive/TaskTimer/TaskTimer/en.lproj/InfoPlist.strings create mode 100644 Archive/TaskTimer/TaskTimer/main.m create mode 100644 Archive/TaskTimer/TaskTimer/redbutton.png create mode 100644 Archive/TaskTimer/TaskTimer/start.png create mode 100644 Archive/TaskTimer/TaskTimer/start@2x.png create mode 100644 Archive/TaskTimer/TaskTimer/stop.png create mode 100644 Archive/TaskTimer/TaskTimer/stop@2x.png create mode 100644 Archive/TaskTimer/TaskTimer/unchecked.png create mode 100644 Archive/TaskTimer/TaskTimer/unchecked@2x.png delete mode 100644 StaticTable/StaticTable/UYLFirstViewController.xib diff --git a/StaticTable/README.markdown b/Archive/StaticTable/README.markdown similarity index 100% rename from StaticTable/README.markdown rename to Archive/StaticTable/README.markdown diff --git a/StaticTable/StaticTable.xcodeproj/project.pbxproj b/Archive/StaticTable/StaticTable.xcodeproj/project.pbxproj similarity index 87% rename from StaticTable/StaticTable.xcodeproj/project.pbxproj rename to Archive/StaticTable/StaticTable.xcodeproj/project.pbxproj index bb3438f..e8d0a88 100644 --- a/StaticTable/StaticTable.xcodeproj/project.pbxproj +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -42,7 +42,7 @@ 532B11F7154F362C004B4780 /* second.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = second.png; sourceTree = ""; }; 532B11F9154F362C004B4780 /* second@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "second@2x.png"; sourceTree = ""; }; 532B1206154F3712004B4780 /* Settings.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Settings.storyboard; sourceTree = ""; }; - 53ACC43215582581005E26DC /* README.markdown */ = {isa = PBXFileReference; fileEncoding = 4; path = README.markdown; sourceTree = ""; }; + 53ACC43215582581005E26DC /* README.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.markdown; sourceTree = ""; }; 53F33DE215508DBE0094277E /* UYLGeneralSettingsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLGeneralSettingsTableViewController.h; sourceTree = ""; }; 53F33DE315508DBE0094277E /* UYLGeneralSettingsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLGeneralSettingsTableViewController.m; sourceTree = ""; }; 53F33DE915509B360094277E /* UYLAdvancedSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLAdvancedSettingsViewController.h; sourceTree = ""; }; @@ -190,14 +190,15 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0430; + LastUpgradeCheck = 1120; }; buildConfigurationList = 532B11D1154F362C004B4780 /* Build configuration list for PBXProject "StaticTable" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 532B11CC154F362C004B4780; productRefGroup = 532B11D8154F362C004B4780 /* Products */; @@ -259,12 +260,32 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -272,10 +293,14 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; 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; SDKROOT = iphoneos; }; name = Debug; @@ -284,16 +309,38 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; 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"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -306,6 +353,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "StaticTable/StaticTable-Prefix.pch"; INFOPLIST_FILE = "StaticTable/StaticTable-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -317,6 +365,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "StaticTable/StaticTable-Prefix.pch"; INFOPLIST_FILE = "StaticTable/StaticTable-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/StaticTable/StaticTable/Settings.storyboard b/Archive/StaticTable/StaticTable/Settings.storyboard similarity index 70% rename from StaticTable/StaticTable/Settings.storyboard rename to Archive/StaticTable/StaticTable/Settings.storyboard index 9a8474f..bd38de0 100644 --- a/StaticTable/StaticTable/Settings.storyboard +++ b/Archive/StaticTable/StaticTable/Settings.storyboard @@ -1,140 +1,136 @@ - - + + + - - - + + + - + - - - + + - + - - + + - - + + - - - + - + - - + + - - + + - - - + - + - - + + - - + + - - - + - + - - + + - - + + - - - + @@ -154,132 +150,126 @@ + - + - + - - - + + - + - - + + - - - + - + - - + + - - - + - + - - + + - - - + - + - - + + - - - + - + - - + + - - - + - + - - + + - - - + @@ -291,17 +281,17 @@ + - + - - + @@ -309,38 +299,37 @@ + - + - + - - - + + - + - - + + - - - + @@ -350,22 +339,21 @@ - + - - + + - - - + @@ -380,34 +368,9 @@ + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/StaticTable/StaticTable/StaticTable-Info.plist b/Archive/StaticTable/StaticTable/StaticTable-Info.plist similarity index 94% rename from StaticTable/StaticTable/StaticTable-Info.plist rename to Archive/StaticTable/StaticTable/StaticTable-Info.plist index 408dd6d..9989d33 100644 --- a/StaticTable/StaticTable/StaticTable-Info.plist +++ b/Archive/StaticTable/StaticTable/StaticTable-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/StaticTable/StaticTable/StaticTable-Prefix.pch b/Archive/StaticTable/StaticTable/StaticTable-Prefix.pch similarity index 100% rename from StaticTable/StaticTable/StaticTable-Prefix.pch rename to Archive/StaticTable/StaticTable/StaticTable-Prefix.pch diff --git a/StaticTable/StaticTable/UYLAdvancedSettingsViewController.h b/Archive/StaticTable/StaticTable/UYLAdvancedSettingsViewController.h similarity index 100% rename from StaticTable/StaticTable/UYLAdvancedSettingsViewController.h rename to Archive/StaticTable/StaticTable/UYLAdvancedSettingsViewController.h diff --git a/StaticTable/StaticTable/UYLAdvancedSettingsViewController.m b/Archive/StaticTable/StaticTable/UYLAdvancedSettingsViewController.m similarity index 100% rename from StaticTable/StaticTable/UYLAdvancedSettingsViewController.m rename to Archive/StaticTable/StaticTable/UYLAdvancedSettingsViewController.m diff --git a/StaticTable/StaticTable/UYLAppDelegate.h b/Archive/StaticTable/StaticTable/UYLAppDelegate.h similarity index 100% rename from StaticTable/StaticTable/UYLAppDelegate.h rename to Archive/StaticTable/StaticTable/UYLAppDelegate.h diff --git a/StaticTable/StaticTable/UYLAppDelegate.m b/Archive/StaticTable/StaticTable/UYLAppDelegate.m similarity index 100% rename from StaticTable/StaticTable/UYLAppDelegate.m rename to Archive/StaticTable/StaticTable/UYLAppDelegate.m diff --git a/StaticTable/StaticTable/UYLFirstViewController.h b/Archive/StaticTable/StaticTable/UYLFirstViewController.h similarity index 100% rename from StaticTable/StaticTable/UYLFirstViewController.h rename to Archive/StaticTable/StaticTable/UYLFirstViewController.h diff --git a/StaticTable/StaticTable/UYLFirstViewController.m b/Archive/StaticTable/StaticTable/UYLFirstViewController.m similarity index 100% rename from StaticTable/StaticTable/UYLFirstViewController.m rename to Archive/StaticTable/StaticTable/UYLFirstViewController.m diff --git a/Archive/StaticTable/StaticTable/UYLFirstViewController.xib b/Archive/StaticTable/StaticTable/UYLFirstViewController.xib new file mode 100644 index 0000000..8325205 --- /dev/null +++ b/Archive/StaticTable/StaticTable/UYLFirstViewController.xib @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StaticTable/StaticTable/UYLGeneralSettingsTableViewController.h b/Archive/StaticTable/StaticTable/UYLGeneralSettingsTableViewController.h similarity index 100% rename from StaticTable/StaticTable/UYLGeneralSettingsTableViewController.h rename to Archive/StaticTable/StaticTable/UYLGeneralSettingsTableViewController.h diff --git a/StaticTable/StaticTable/UYLGeneralSettingsTableViewController.m b/Archive/StaticTable/StaticTable/UYLGeneralSettingsTableViewController.m similarity index 100% rename from StaticTable/StaticTable/UYLGeneralSettingsTableViewController.m rename to Archive/StaticTable/StaticTable/UYLGeneralSettingsTableViewController.m diff --git a/StaticTable/StaticTable/UYLRotatingTableViewController.h b/Archive/StaticTable/StaticTable/UYLRotatingTableViewController.h similarity index 100% rename from StaticTable/StaticTable/UYLRotatingTableViewController.h rename to Archive/StaticTable/StaticTable/UYLRotatingTableViewController.h diff --git a/StaticTable/StaticTable/UYLRotatingTableViewController.m b/Archive/StaticTable/StaticTable/UYLRotatingTableViewController.m similarity index 100% rename from StaticTable/StaticTable/UYLRotatingTableViewController.m rename to Archive/StaticTable/StaticTable/UYLRotatingTableViewController.m diff --git a/StaticTable/StaticTable/en.lproj/InfoPlist.strings b/Archive/StaticTable/StaticTable/en.lproj/InfoPlist.strings similarity index 100% rename from StaticTable/StaticTable/en.lproj/InfoPlist.strings rename to Archive/StaticTable/StaticTable/en.lproj/InfoPlist.strings diff --git a/StaticTable/StaticTable/first.png b/Archive/StaticTable/StaticTable/first.png similarity index 100% rename from StaticTable/StaticTable/first.png rename to Archive/StaticTable/StaticTable/first.png diff --git a/StaticTable/StaticTable/first@2x.png b/Archive/StaticTable/StaticTable/first@2x.png similarity index 100% rename from StaticTable/StaticTable/first@2x.png rename to Archive/StaticTable/StaticTable/first@2x.png diff --git a/StaticTable/StaticTable/main.m b/Archive/StaticTable/StaticTable/main.m similarity index 100% rename from StaticTable/StaticTable/main.m rename to Archive/StaticTable/StaticTable/main.m diff --git a/StaticTable/StaticTable/second.png b/Archive/StaticTable/StaticTable/second.png similarity index 100% rename from StaticTable/StaticTable/second.png rename to Archive/StaticTable/StaticTable/second.png diff --git a/StaticTable/StaticTable/second@2x.png b/Archive/StaticTable/StaticTable/second@2x.png similarity index 100% rename from StaticTable/StaticTable/second@2x.png rename to Archive/StaticTable/StaticTable/second@2x.png diff --git a/Archive/Styles/README b/Archive/Styles/README new file mode 100644 index 0000000..029456c --- /dev/null +++ b/Archive/Styles/README @@ -0,0 +1,71 @@ +======================================================================= +Styles + +Version 1.0 24 August 2012 Initial Version +======================================================================= + +The Styles App is an example of how to use the UIAppearance protocol to +customise the appearance of common UIKit controls. + +For further details see: + +useyourloaf.com/blog/using-appearance-proxy-to-style-apps/ + + +======================================================================= +App Delegate +======================================================================= + +UYLAppDelegate.h +UYLAppDelegate.m + +The App delegate is largely unmodified from the template code. The use of +a storyboard to configure and load the UI means there is not much for the +app delegate to do in this simple app other than setup the appearance. + +======================================================================= +Style Controller +======================================================================= + +The core of the appearance code is contained in the custom UYLStyleController +class. This class has a single public class method +applyStyle which +contains all of the UIAppearance related code. Refer to the blog post +for a full description. + +======================================================================= +Views +======================================================================= + +MainStoryboard.storyboard + +The storyboard file defines the user interface for the application. It +uses a navigation controller with a static table view as the root view +to list each of the UIKit control views. + +UYLOkButton.h +UYLOkButton.m +UYLResetButton.h +UYLResetButton.m +UYLZeroButton.h +UYLZeroButton.m + +These classes are UIButton sub-classes that do nothing other than define +a custom subclass used to allow the appearance of specific buttons to be +modified. + +======================================================================= +Controllers +======================================================================= + +UYLListViewController.h +UYLListViewController.m + +This is a subclass of UITableViewController used for the static table view +containing the list of UIKit controls. The only method that the subclass +actually contains is to enable interface rotation. + +UYLRotatingViewController.h +UYLRotatingViewController.m + +This is a container class used for all of the UIKit control views. The viewDidLoad method is used to set the view background. It also implements +the standard method to enable interface orientation. diff --git a/Archive/Styles/Styles.xcodeproj/project.pbxproj b/Archive/Styles/Styles.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f63390f --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.pbxproj @@ -0,0 +1,458 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + 5305B53E15E6310900AC81F4 /* UYLZeroButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 5305B53D15E6310900AC81F4 /* UYLZeroButton.m */; }; + 5305B54615E6408500AC81F4 /* divider.png in Resources */ = {isa = PBXBuildFile; fileRef = 5305B54415E6408500AC81F4 /* divider.png */; }; + 5305B54715E6408500AC81F4 /* divider@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5305B54515E6408500AC81F4 /* divider@2x.png */; }; + 532F266715BDDF7A00321881 /* UYLRotatingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532F266615BDDF7A00321881 /* UYLRotatingViewController.m */; }; + 532F267915BDE44F00321881 /* UYLResetButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 532F267815BDE44F00321881 /* UYLResetButton.m */; }; + 532F267C15BDEAEB00321881 /* UYLStyleController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532F267B15BDEAEB00321881 /* UYLStyleController.m */; }; + 5334608A23CA316E00BE943E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5334608923CA316E00BE943E /* LaunchScreen.storyboard */; }; + 535734EA15B75876006F0E6A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 535734E915B75876006F0E6A /* UIKit.framework */; }; + 535734EC15B75876006F0E6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 535734EB15B75876006F0E6A /* Foundation.framework */; }; + 535734EE15B75876006F0E6A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 535734ED15B75876006F0E6A /* CoreGraphics.framework */; }; + 535734F415B75876006F0E6A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 535734F215B75876006F0E6A /* InfoPlist.strings */; }; + 535734F615B75877006F0E6A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 535734F515B75877006F0E6A /* main.m */; }; + 535734FA15B75878006F0E6A /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 535734F915B75878006F0E6A /* UYLAppDelegate.m */; }; + 5357350015B75878006F0E6A /* UYLListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 535734FF15B75878006F0E6A /* UYLListViewController.m */; }; + 5374A30A15B7698400B796D2 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5374A30915B7698400B796D2 /* MainStoryboard.storyboard */; }; + 53AA526415E56F7A000C8D04 /* green-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525615E56F7A000C8D04 /* green-button.png */; }; + 53AA526515E56F7A000C8D04 /* green-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525715E56F7A000C8D04 /* green-button@2x.png */; }; + 53AA526615E56F7A000C8D04 /* navbar-landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525815E56F7A000C8D04 /* navbar-landscape.png */; }; + 53AA526715E56F7A000C8D04 /* navbar-landscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525915E56F7A000C8D04 /* navbar-landscape@2x.png */; }; + 53AA526815E56F7A000C8D04 /* navbar.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525A15E56F7A000C8D04 /* navbar.png */; }; + 53AA526915E56F7A000C8D04 /* navbar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525B15E56F7A000C8D04 /* navbar@2x.png */; }; + 53AA526A15E56F7A000C8D04 /* orange-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525C15E56F7A000C8D04 /* orange-button.png */; }; + 53AA526B15E56F7A000C8D04 /* orange-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525D15E56F7A000C8D04 /* orange-button@2x.png */; }; + 53AA526E15E56F7A000C8D04 /* red-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526015E56F7A000C8D04 /* red-button.png */; }; + 53AA526F15E56F7A000C8D04 /* red-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526115E56F7A000C8D04 /* red-button@2x.png */; }; + 53AA527015E56F7A000C8D04 /* steel-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526215E56F7A000C8D04 /* steel-button.png */; }; + 53AA527115E56F7A000C8D04 /* steel-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526315E56F7A000C8D04 /* steel-button@2x.png */; }; + 53AA527715E57B0C000C8D04 /* back-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527615E57B0C000C8D04 /* back-button.png */; }; + 53AA527915E58E9B000C8D04 /* back-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527815E58E9B000C8D04 /* back-button@2x.png */; }; + 53AA527C15E591BF000C8D04 /* back-button-landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527A15E591BF000C8D04 /* back-button-landscape.png */; }; + 53AA527D15E591BF000C8D04 /* back-button-landscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527B15E591BF000C8D04 /* back-button-landscape@2x.png */; }; + 53E2967015BF36C800D8AD2A /* UYLOkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E2966F15BF36C800D8AD2A /* UYLOkButton.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5305B53C15E6310900AC81F4 /* UYLZeroButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLZeroButton.h; sourceTree = ""; }; + 5305B53D15E6310900AC81F4 /* UYLZeroButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLZeroButton.m; sourceTree = ""; }; + 5305B54415E6408500AC81F4 /* divider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = divider.png; sourceTree = ""; }; + 5305B54515E6408500AC81F4 /* divider@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "divider@2x.png"; sourceTree = ""; }; + 532F266515BDDF7A00321881 /* UYLRotatingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLRotatingViewController.h; sourceTree = ""; }; + 532F266615BDDF7A00321881 /* UYLRotatingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLRotatingViewController.m; sourceTree = ""; }; + 532F267715BDE44F00321881 /* UYLResetButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLResetButton.h; sourceTree = ""; }; + 532F267815BDE44F00321881 /* UYLResetButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLResetButton.m; sourceTree = ""; }; + 532F267A15BDEAEA00321881 /* UYLStyleController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLStyleController.h; sourceTree = ""; }; + 532F267B15BDEAEB00321881 /* UYLStyleController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLStyleController.m; sourceTree = ""; }; + 5334608823CA30B700BE943E /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 5334608923CA316E00BE943E /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + 535734E515B75876006F0E6A /* Styles.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Styles.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 535734E915B75876006F0E6A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 535734EB15B75876006F0E6A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 535734ED15B75876006F0E6A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 535734F115B75876006F0E6A /* Styles-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Styles-Info.plist"; sourceTree = ""; }; + 535734F315B75876006F0E6A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 535734F515B75877006F0E6A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 535734F715B75877006F0E6A /* Styles-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Styles-Prefix.pch"; sourceTree = ""; }; + 535734F815B75878006F0E6A /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; + 535734F915B75878006F0E6A /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; + 535734FE15B75878006F0E6A /* UYLListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLListViewController.h; sourceTree = ""; }; + 535734FF15B75878006F0E6A /* UYLListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLListViewController.m; sourceTree = ""; }; + 5374A30915B7698400B796D2 /* MainStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryboard.storyboard; sourceTree = ""; }; + 53AA525615E56F7A000C8D04 /* green-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "green-button.png"; sourceTree = ""; }; + 53AA525715E56F7A000C8D04 /* green-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "green-button@2x.png"; sourceTree = ""; }; + 53AA525815E56F7A000C8D04 /* navbar-landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navbar-landscape.png"; sourceTree = ""; }; + 53AA525915E56F7A000C8D04 /* navbar-landscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navbar-landscape@2x.png"; sourceTree = ""; }; + 53AA525A15E56F7A000C8D04 /* navbar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = navbar.png; sourceTree = ""; }; + 53AA525B15E56F7A000C8D04 /* navbar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navbar@2x.png"; sourceTree = ""; }; + 53AA525C15E56F7A000C8D04 /* orange-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "orange-button.png"; sourceTree = ""; }; + 53AA525D15E56F7A000C8D04 /* orange-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "orange-button@2x.png"; sourceTree = ""; }; + 53AA526015E56F7A000C8D04 /* red-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "red-button.png"; sourceTree = ""; }; + 53AA526115E56F7A000C8D04 /* red-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "red-button@2x.png"; sourceTree = ""; }; + 53AA526215E56F7A000C8D04 /* steel-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "steel-button.png"; sourceTree = ""; }; + 53AA526315E56F7A000C8D04 /* steel-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "steel-button@2x.png"; sourceTree = ""; }; + 53AA527615E57B0C000C8D04 /* back-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button.png"; sourceTree = ""; }; + 53AA527815E58E9B000C8D04 /* back-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button@2x.png"; sourceTree = ""; }; + 53AA527A15E591BF000C8D04 /* back-button-landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button-landscape.png"; sourceTree = ""; }; + 53AA527B15E591BF000C8D04 /* back-button-landscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button-landscape@2x.png"; sourceTree = ""; }; + 53E2966E15BF36C800D8AD2A /* UYLOkButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLOkButton.h; sourceTree = ""; }; + 53E2966F15BF36C800D8AD2A /* UYLOkButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLOkButton.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 535734E215B75876006F0E6A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 535734EA15B75876006F0E6A /* UIKit.framework in Frameworks */, + 535734EC15B75876006F0E6A /* Foundation.framework in Frameworks */, + 535734EE15B75876006F0E6A /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 535734DA15B75875006F0E6A = { + isa = PBXGroup; + children = ( + 5334608823CA30B700BE943E /* README */, + 535734EF15B75876006F0E6A /* Styles */, + 535734E815B75876006F0E6A /* Frameworks */, + 535734E615B75876006F0E6A /* Products */, + ); + sourceTree = ""; + }; + 535734E615B75876006F0E6A /* Products */ = { + isa = PBXGroup; + children = ( + 535734E515B75876006F0E6A /* Styles.app */, + ); + name = Products; + sourceTree = ""; + }; + 535734E815B75876006F0E6A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 535734E915B75876006F0E6A /* UIKit.framework */, + 535734EB15B75876006F0E6A /* Foundation.framework */, + 535734ED15B75876006F0E6A /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 535734EF15B75876006F0E6A /* Styles */ = { + isa = PBXGroup; + children = ( + 53AA525515E56F7A000C8D04 /* Resources */, + 5357351115B75A9B006F0E6A /* Views */, + 5357351215B75AB6006F0E6A /* Controllers */, + 535734F815B75878006F0E6A /* UYLAppDelegate.h */, + 535734F915B75878006F0E6A /* UYLAppDelegate.m */, + 535734F015B75876006F0E6A /* Supporting Files */, + ); + path = Styles; + sourceTree = ""; + }; + 535734F015B75876006F0E6A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 535734F115B75876006F0E6A /* Styles-Info.plist */, + 535734F215B75876006F0E6A /* InfoPlist.strings */, + 535734F515B75877006F0E6A /* main.m */, + 535734F715B75877006F0E6A /* Styles-Prefix.pch */, + 5334608923CA316E00BE943E /* LaunchScreen.storyboard */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 5357351115B75A9B006F0E6A /* Views */ = { + isa = PBXGroup; + children = ( + 5374A30915B7698400B796D2 /* MainStoryboard.storyboard */, + 532F267715BDE44F00321881 /* UYLResetButton.h */, + 532F267815BDE44F00321881 /* UYLResetButton.m */, + 53E2966E15BF36C800D8AD2A /* UYLOkButton.h */, + 53E2966F15BF36C800D8AD2A /* UYLOkButton.m */, + 5305B53C15E6310900AC81F4 /* UYLZeroButton.h */, + 5305B53D15E6310900AC81F4 /* UYLZeroButton.m */, + ); + name = Views; + sourceTree = ""; + }; + 5357351215B75AB6006F0E6A /* Controllers */ = { + isa = PBXGroup; + children = ( + 535734FE15B75878006F0E6A /* UYLListViewController.h */, + 535734FF15B75878006F0E6A /* UYLListViewController.m */, + 532F266515BDDF7A00321881 /* UYLRotatingViewController.h */, + 532F266615BDDF7A00321881 /* UYLRotatingViewController.m */, + 532F267A15BDEAEA00321881 /* UYLStyleController.h */, + 532F267B15BDEAEB00321881 /* UYLStyleController.m */, + ); + name = Controllers; + sourceTree = ""; + }; + 53AA525515E56F7A000C8D04 /* Resources */ = { + isa = PBXGroup; + children = ( + 5305B54415E6408500AC81F4 /* divider.png */, + 5305B54515E6408500AC81F4 /* divider@2x.png */, + 53AA527A15E591BF000C8D04 /* back-button-landscape.png */, + 53AA527B15E591BF000C8D04 /* back-button-landscape@2x.png */, + 53AA527815E58E9B000C8D04 /* back-button@2x.png */, + 53AA527615E57B0C000C8D04 /* back-button.png */, + 53AA525615E56F7A000C8D04 /* green-button.png */, + 53AA525715E56F7A000C8D04 /* green-button@2x.png */, + 53AA525815E56F7A000C8D04 /* navbar-landscape.png */, + 53AA525915E56F7A000C8D04 /* navbar-landscape@2x.png */, + 53AA525A15E56F7A000C8D04 /* navbar.png */, + 53AA525B15E56F7A000C8D04 /* navbar@2x.png */, + 53AA525C15E56F7A000C8D04 /* orange-button.png */, + 53AA525D15E56F7A000C8D04 /* orange-button@2x.png */, + 53AA526015E56F7A000C8D04 /* red-button.png */, + 53AA526115E56F7A000C8D04 /* red-button@2x.png */, + 53AA526215E56F7A000C8D04 /* steel-button.png */, + 53AA526315E56F7A000C8D04 /* steel-button@2x.png */, + ); + path = Resources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 535734E415B75876006F0E6A /* Styles */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5357350E15B75878006F0E6A /* Build configuration list for PBXNativeTarget "Styles" */; + buildPhases = ( + 535734E115B75876006F0E6A /* Sources */, + 535734E215B75876006F0E6A /* Frameworks */, + 535734E315B75876006F0E6A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Styles; + productName = Styles; + productReference = 535734E515B75876006F0E6A /* Styles.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 535734DC15B75875006F0E6A /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = UYL; + LastUpgradeCheck = 1120; + }; + buildConfigurationList = 535734DF15B75875006F0E6A /* Build configuration list for PBXProject "Styles" */; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 535734DA15B75875006F0E6A; + productRefGroup = 535734E615B75876006F0E6A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 535734E415B75876006F0E6A /* Styles */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 535734E315B75876006F0E6A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 535734F415B75876006F0E6A /* InfoPlist.strings in Resources */, + 5374A30A15B7698400B796D2 /* MainStoryboard.storyboard in Resources */, + 53AA526415E56F7A000C8D04 /* green-button.png in Resources */, + 53AA526515E56F7A000C8D04 /* green-button@2x.png in Resources */, + 53AA526615E56F7A000C8D04 /* navbar-landscape.png in Resources */, + 53AA526715E56F7A000C8D04 /* navbar-landscape@2x.png in Resources */, + 53AA526815E56F7A000C8D04 /* navbar.png in Resources */, + 53AA526915E56F7A000C8D04 /* navbar@2x.png in Resources */, + 53AA526A15E56F7A000C8D04 /* orange-button.png in Resources */, + 53AA526B15E56F7A000C8D04 /* orange-button@2x.png in Resources */, + 53AA526E15E56F7A000C8D04 /* red-button.png in Resources */, + 53AA526F15E56F7A000C8D04 /* red-button@2x.png in Resources */, + 53AA527015E56F7A000C8D04 /* steel-button.png in Resources */, + 53AA527115E56F7A000C8D04 /* steel-button@2x.png in Resources */, + 53AA527715E57B0C000C8D04 /* back-button.png in Resources */, + 53AA527915E58E9B000C8D04 /* back-button@2x.png in Resources */, + 53AA527C15E591BF000C8D04 /* back-button-landscape.png in Resources */, + 53AA527D15E591BF000C8D04 /* back-button-landscape@2x.png in Resources */, + 5334608A23CA316E00BE943E /* LaunchScreen.storyboard in Resources */, + 5305B54615E6408500AC81F4 /* divider.png in Resources */, + 5305B54715E6408500AC81F4 /* divider@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 535734E115B75876006F0E6A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 535734F615B75877006F0E6A /* main.m in Sources */, + 535734FA15B75878006F0E6A /* UYLAppDelegate.m in Sources */, + 5357350015B75878006F0E6A /* UYLListViewController.m in Sources */, + 532F266715BDDF7A00321881 /* UYLRotatingViewController.m in Sources */, + 532F267915BDE44F00321881 /* UYLResetButton.m in Sources */, + 532F267C15BDEAEB00321881 /* UYLStyleController.m in Sources */, + 53E2967015BF36C800D8AD2A /* UYLOkButton.m in Sources */, + 5305B53E15E6310900AC81F4 /* UYLZeroButton.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 535734F215B75876006F0E6A /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 535734F315B75876006F0E6A /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5357350C15B75878006F0E6A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + 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_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 5357350D15B75878006F0E6A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5357350F15B75878006F0E6A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Styles/Styles-Prefix.pch"; + INFOPLIST_FILE = "Styles/Styles-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 5357351015B75878006F0E6A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Styles/Styles-Prefix.pch"; + INFOPLIST_FILE = "Styles/Styles-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 535734DF15B75875006F0E6A /* Build configuration list for PBXProject "Styles" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5357350C15B75878006F0E6A /* Debug */, + 5357350D15B75878006F0E6A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5357350E15B75878006F0E6A /* Build configuration list for PBXNativeTarget "Styles" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5357350F15B75878006F0E6A /* Debug */, + 5357351015B75878006F0E6A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 535734DC15B75875006F0E6A /* Project object */; +} diff --git a/Archive/Styles/Styles/LaunchScreen.storyboard b/Archive/Styles/Styles/LaunchScreen.storyboard new file mode 100644 index 0000000..06d6044 --- /dev/null +++ b/Archive/Styles/Styles/LaunchScreen.storyboard @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/Styles/Styles/MainStoryboard.storyboard b/Archive/Styles/Styles/MainStoryboard.storyboard new file mode 100644 index 0000000..e0db02c --- /dev/null +++ b/Archive/Styles/Styles/MainStoryboard.storyboard @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/Styles/Styles/Resources/back-button-landscape.png b/Archive/Styles/Styles/Resources/back-button-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0731703b9bedb6b4aa886a77721002ed57742b GIT binary patch literal 838 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�(Efv9yxxarn-`$X#CnAmBL2>f=V zdDl}wUPEch7WfsS+aC-79?RwO0{J6m*Y+p6osDaPm9Rbuo=~Mg&+Z3ECp>6b)*G3= zfng`(8idT?cR252(cX*E#o&n$Ze4%p-JV{MIC^yU3Cqs@%yIj`Fm1lrl;BJU^s~`b zv5*i?6hPzVyVsZldLS>q{OUhSm2$(e?MH-RCg0BJ@5Nygz3aD|4Fh^8XV0E({bzCU zyUoV!@1fTO(S_ZCb#jP4W2Wy`RTAOD!_k0v1@uVv?%ms%oSghS2C&l*G-_Hla2g7& z%j*)o?nI!}N$?1P?=2h9V<9P*FJJyEk$0lqZrC-_roBfT9z*hhRgD~J2DT9!gdT6jR5-1W()+^z8ES{ON_YUCxpglM^ z_>;ERTo8nvyyX3QXgG^{&JpBiz*sdV#B(38mU86CkxfEa^O>AGC4?%CF?k;QQ6vV> z&S>2J@1g-~EUxQb1_-{{TE6`U-)n|7TIIB!!@#*7MlzZT>Nh3B1A$=}%mHhd3b?ei z^n2g;zm9(U7NEz8szzc%iS?ndfk2!BN$^CR0%^G))MzxOT{k-qs!NPL90%%t5E_dI zB9Ob(f2G0!+$tX}6Vb_RfB*A{krdWNXddAMVqLEZ0fN_TumjQ}^62b-+qO?nfZD2(9MwRqg~+A{Q=PxQ2)s3UG%oM88hz`sK%H5@>~_JDyPgCYT0N zbR6e9M0m#c+CCBSO%MUAehb9^?+gWmbH?a+gdhl*1XFlhytur){8QJ>Jx&1H)mJr= z9EE;Cf)9f^7j!&;bnw-5I)E=y+-I8RDa&>y!$8G+2a4VS(1r181^E8&3`nue&(HtO z^SrOgNc{zb;07ns18_6MXaC60St5805Q*r#0qGW!Tj#Tg_+tuMi$LM>M$UO!`5n%A zPr#g@bR9k8vFZE%uQ&x#{`Z2VQt34Sc)~O-Te}e$=0DH5N`(68Gr~3zow<1N;?wMa zb>M_brScX4Jg5#d3^S~LQCILBR=s*dh;1Q+BV|BVoEzzOfKG~eNs6x{;%)#yLwZ5Q zSb!>N@@F9D5eZX-gcL-yCFa}pdi|w?2M@MD%Kre!5YUJ)N+ovy0000zopr0GPiHEC2ui literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/divider@2x.png b/Archive/Styles/Styles/Resources/divider@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ea104494b15a476cf7fb941850c286a367bea276 GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^Oh6pL0U`qqZhQo!ggjjwLo|YuJ(!u>0<)$pQe|b( X*?lQ-QDWf|pe%!@tDnm{r-UW|GYb+6 literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/green-button.png b/Archive/Styles/Styles/Resources/green-button.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5fe4e20ac78868acbe04d94bb70fa88920bc65 GIT binary patch literal 2305 zcmV+c3I6tpP)2af>btMrzx>U|{n>Y)->?78uYPZzZ$8~T9?CF4 zm;n;jv<#U^V1^_Zhxa*O9{&4JzUyCn`Si^XzJLDihwrDq`TL)I_tyXe_&5Ljga7!= z=l9?Jt8aer)1Un2v#)>m$w!ZhCFo(95gR#7hQPC2voUjJ%?1e?FgV{oeEZewmp}O8 z|NZ*6zxeT&Pygw^|M<869tMB>iy!{gFaO1t|Kor9hadg)r{8@>+K@b8qA(kp22r+0 zF?dobo>9~02?C5KcTBcX^7zFMf9wDLqi=ul2j71F4}bsD@BaFM?>@hO`LBNUgP;Dv zx1S{e#5(SXP*l!QTr^#jI(KNG5WG%`QHtuCl zdSiV3n@_&`d|!Y0?*9Da*3bUOU;bd9zR+^-Q9M4}1M%P=R@kj2H& z=uRF_c`pC@mp|B-PxrHrcm3h-eLqT#a@dnz0vL*ij5`bjs8MEGwsFTev&KS{Hc4Q1 zkb7|R@%{Ynqd)wJAAP#HAc8m&F;m&5@8cmE!cZC7RGyobFx1IoB{QknGPtx^=>!{BX-k#{urMeD-CZ* zo97a2lBZ}oESe0=IS)JHVrEUE+0xJ>$D#zymb=H6!GTX7Zyq;YAjxCPTQ=OoI7|{Z zTUNrmnbYx%hJ#ld(1@Id%gjW%4XQ9O&%208}v zhOwn%!*cIqi{go+haD|@Idk}UG7YCojU7D<5+*j9^K!$iTv*nGiZOsvtc1#>JN9tN zxWkASE3}W3D_z3EcpWildT>#;5q8eN@ZOp6u*=0ZN+z*^I>SkufoTz(E1C}wMN-*2 z8;Kt6^gbq*UK#_C8c232+M^5EaMP2aM(JU9@|Y8h89_cExi`;%mO_)`W>2mxNKIwM zgJ{uc!1L0yaap)zEQw1^;u)8QQE_}Y9B^d~6P~5UaDEb;tL8E9YcjzduGZe)-#Y`UXVMmV((BoMu znnjy+Y@U1M6dMOGmU(bGHY$2-xuRL|B&;wMqcS7f;lPJbIu`A9#^rJD8BQ^23A;HM zmZwRCQ4`3bhS>D-NTcvfFB>-|jzZ@HiY|tz%$)3|Xe@S_Av3{oJDJID4wgr*0p^^? z0(Od>QBW_KD1LvG_uL*wCY?1X3Bdu%Q?dWW>^c!xuLh)QtL2<0}R zH=eVbb{Lq$6vhrC*`_ypj(3#A9&cx+2N&4L;qgEz#789ho)(LD+G8DHya{ghq~pf3 zIQEcuX){T@RQAw~9as@V(GJ6T#~KBF0CZ`w#{>7uV>=hykeS|do5g!fdTBg8#Op9d z@M3XOv?Ja{JSL|e8x;s2>fX!A;LV}Uip}DdmBUPn25iFQy)$F8xUuM=m;+}VZ5A)K z(P2DXQTHKl4~~WcYl6<1r#VA5c5s+CwsEs1>~biEZp2}-4Ty`4D^J|;Cdm8Yd}&b@ z=V7NX3L_aNcaJTFF(}sz6`Km&P!^VqJ8c$2u@P1-dT_pcEWf@_z!~BQE5L_b@1-W6xAFg1n!y*RMaG*FV0Wd0!?*!RdJ@Gu>%3v=J*C7Xz^= z9;p~L&oR4pO^L*Lg4u16a`#*p95BuMK z|L+)T3>X@_7!AQpTGpeT-NR0MDBCDCTS8`KL$qvoRrQ(jb@*dvD`<~wP zrk8L3==|zW`o-sO{S6G@C;#pFkH7ip{kyOKA3y!UKg{P}=Hts8CJeN3Y-|T=7}#=H zvC-rVz>qwEJm&o>Uw(gn^Dpzw&-%sh{eS+`ul}un4+DT7|6l&<{gJ=?^0hzv{>Q%l z@qe>Vzh&RE7crBpX%P$n7z!{z0NQx)@y);0$3Oe#;~RhX>DT_|pZ^zs4KM%z z`2GLtFYfW@edT98{;^uPMg b0093#-l(3VZ}h4{00000NkvXXu0mjfN28_V literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/green-button@2x.png b/Archive/Styles/Styles/Resources/green-button@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b8354921c5ba2c0ceebd6bdeec3938d08f4b58fb GIT binary patch literal 7044 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 X-J)^t*ua&De;@Mk@N;i;4N3nmRY-Hg literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/navbar-landscape.png b/Archive/Styles/Styles/Resources/navbar-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..765fe756f0b1e581bae441756ff4a1f8aa34c42f GIT binary patch literal 1631 zcmV-l2B7(gP)|{9VB)t9G_qm4h+Qq1WPIAaeI9S#iw@`{!V#a*SwaJi)PLx zTVPpL%Iuc!umf_WDr@LI7QyF$wPeszL1PU;G%eG#%=5f}YQ@AhO~M7P)kJ9v7aQ~k z=AM&;FgVAZE9X0x)VN8b;xi7zFbf#j5M4;!N~K)5 z5UEi>%103>NBn`5iX??lYyvFU1{)g(_!T|40s3Y|qgILEc<0T|yk{Rk8a7)j=JWZ2 zFc*Of&TKxLJtJoR^D}Bl(4fhJYB47vj_563jbKVbE3OzKkzCMXBLcCh@B35Vn<5cS zJsjV*Cz`IwvV3!MBT2HZ>ywG?`=00dQ_KMn3V2}JkdK)!O0-JZwr$sS zp&$25T@fWBomGXdd2ND8Q;sJ?{$O1w!GOfo}>-zfY z=Dl zG%Rvb03um*9}WkSEM>FVf9-pFdzTj%-KVZ;0VV(o<3OMH`~4n0-Fm&APNx&^0sZ=2 zz1!2j%H@it zwIPH@*uWYRm7?*p-99gzhuIGgKR^6ZhZquDGL3W;zOi-ktB0V!NK zNP@*9x_9^YM@L6t_Wk{RMOI!v7!7Da2DIpigRR&H7LM3<>?IJ=&3XmViVf(FKt+u( zJ9c>RI}q|0h_{!^V6~255J9ZhpW^YIogG>-Z-D;CcwB6Mazs|}tk+@`T~iT>vL#zV z!$N>JY(*p3-%)%EP*k<1swzmON~+5F{OP;@^V593D#Byq8KV_CdZ`x20g#BwQ_RCSVEz7DTs!Ci`0=O;pBvmDEi%OJu5Zq{mfH8Kg9688@eFT#}PnJ>soacEV zDDpz3C~_%iAW%G8r-A5YRDjQNy8^(h779=<+hb7;sfJzKi#CtM<_UOw5+NZ9i6WvZ zP&}G$tb(}U{RE>;ar3A;qq>38_<7rkvMhvXTUKE@sNh0Q|6nb>)@bEAv2$-P+9_(m(98TQt%W}GxjArpPp2f52bQ;IX zsaOoNa9s}y(qVKPIa5L?FgOL6`Pk2htFS3zLi9s19*+h3?`ATdSkfUenBb5&mM&z1 z0&0l&)8sO`ysT)99X~Ju{Iq$Z(eQ3`H&Uo5M#CXgfaJ0)4C$ag@^IZR7=iT?Y>4g} dyPzLt_6O87x~&Jh0ObGx002ovPDHLkV1l}>2~7Y1 literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/navbar-landscape@2x.png b/Archive/Styles/Styles/Resources/navbar-landscape@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6414039b00d9e5e97bc48b1d972cd96ed78fd2f2 GIT binary patch literal 4652 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 literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/navbar.png b/Archive/Styles/Styles/Resources/navbar.png new file mode 100644 index 0000000000000000000000000000000000000000..29c90298df11d229bfae67ec0e5641709886b48a GIT binary patch literal 2009 zcmV;~2PXK5P)gH)|IaYYbJ3`sT=u?m&87f>5* z@1?cY_qwi?wEGIj`6I%~V4zRvMy`@1-Th5Zcmo zVATrYofb}+w?%qBpMPkI0TW2Dkp+<|PLzUF15U(gQ0yQb6EhTuuR5K|QkLc4S8~9T z1G11K$};p))KYE`$RUa(f(1x?+;?5q_wXJGb@x3y20#OWJr@EsX-X-i)&Ms_ge(IIF2eb2q{HEOI37<1Q2@cf zvy|hUZDmcFCntU(Dyer_O6Ai=+cR^LzBP#A6Y$6_Lh?nz&K@WD8jNc2J90N_?dB%BqZPdHFp-?bQBk+S>uSdoxq6MaiqY*_= zFhjJEZnxWLG!#WUIX)>A3zvrB`#~7?$STg`kkskk5<55!B=H0PtR!!2Y%DD;r5NdS z`rz=uzH$Qi0J3(mGDL@GK!|utxm5Z$esJhGPA3RDbi~Xnd7eLqN2BePO7h3m)zmBO z?d>^^i#PLw!1u5s>WLM=HmaK&4+pO$=wskl?tkrm6UfQVX!Zzkg+4!AXAC1zpro zY`D~Ds`h@|wrxcCK=;FB^7MOl^O`a}{!vT7K#o_#w_rbkREN737*4Eem{(<6a-1)qNe=@3~5p>QxFS@FO1k|#kX0zF~wU_ao&lK0-nkBGE zf2b(e?M8tZ2G9H7mqMC_1PGLr7BX$}g!@T`!&!|j%d(yPN&5u91{L-CeZHPQKY5<# zrf&WeMO9U|zJIKbmo^~nN5cD!9mtV$ob!{2xi+{LZ1PNK{A+d<%8`gw9uq=`e z0LPh+tli6xBSe;J$m{h&!D`#x@Vwo8k}w#%<;4_@ z*%+XS8#b?7ZxSN|T}a4?o9sow4&n;kv?!0jgzk4JMEfQg0Ah*j-wr|_oJg8%nevx5tOm|RDkZ3kY>NjR(>A8kFz+wHqyB`00000NkvXXu0mjfR8YoX literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/navbar@2x.png b/Archive/Styles/Styles/Resources/navbar@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7c2328d40c0e63f18726dbfd114bbc02275492 GIT binary patch literal 6321 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 literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/orange-button.png b/Archive/Styles/Styles/Resources/orange-button.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3680ed6b71e8194fcf6133d9ddeeecce51d883 GIT binary patch literal 2111 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 bfrlY#8t2#LqGx!33K%?H{an^LB{Ts5XW|of literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/red-button.png b/Archive/Styles/Styles/Resources/red-button.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6ad7a2258e10a9b6cc77dc4d193ee5f74fd548 GIT binary patch literal 2039 zcmV9sW+e=3Ca?JJXMLXEe181> z=P&&1tKa)8fC2pSlfV9>x1ap_ldpdF%wGo6nEG`R-?b2@ibp^3y*$Kl$I^^3~U$_~$S3emJ~0XF^g~GG`7KpwSfJ9hI6h zH32d`TwL7dpT|Fan*Z~qufBDD^3BUn;ejvs@h@Nd>Nj7^jT-=@lDTo_@Loufxi~pF z6B+?-xskc?miN&(oE%zy^Wv8;Uwy%k;q~>Ge)Q#sAN=E|G-`$o5K2B|rR>@BHqIDabV&#WQXQuu(dmkqP7mtVtHd z9&V#NXo$m>;e9+0mGJ*IpXxjE!`JftfBIza;vqca9UcT&uGtuFQ;zBRq{TIIX*|ZemjXf0a03cyQX~P5~C}3>37-yK3FdV>O6!Cs= z^D#cv_g>@MH{P%z%Az5LV#CoU8Ip~TjUF6NbI~#+%pz>m?8%~wG3iKdjBmg2=`GhN z9)!^BNk>MILDOi64Y)8W0GY(YVsaow%@z=bxJ~->didf%+9(@`r*wGc;*p{P&<$+S zSm3bDq9G<{7A=NoEcS2>dGIdy;`Qb^99$ZVt8f4P$s; zHjKp`+b9`}hLGWoHWL6)4)AjH1&4;R!w8xd4Ka$A!A7y^p)wRbqZnJKM>csYDQJy~OP*+T(03KAA=Cd@63Mc61d3egboHp1lvH!5uw z2crSOfP^s$7=jU)cX{GKU=f&u(tw6C+-9Zd;njn<;nKryEZu+s#XyF}a1e}z7+o5` z+@g69JhKvNp5={4Lc^QKVL-!iqp)}a#v+Itp$KqNI2<=15Qe;iBsYw3SX?lf9$wIK z(O9$PVvUknF*M1=GY)QA7;*r(=8=OCmV;W1N9fk$G_AIo{YqhhjWY*{G>7 zmBx;MULsrs<{6dDmMhy>W-1NxajbaL!()mMfkxP2XbOvX59N8N)NCXnyl@xqhe5of zv6xZbvIsLoLu|szM|qGL-dHq}iSaff89t6}h{Gnqy^i-xr9l?rFbQi81a>6GT|BeK z@@^)ffQ*|2wiqE}B#Sl`ae2Rv&yRqp>4_i#ECSA01Y=n_BNUsY*bplX!_j7<6nki6 z6puN5e#LKJ5unA9nHY-;fC&Tv!B}H?m%#>3;Au{tK@MWiTnUchRo?ve^_j0f;eCK1 zNY5nC<}MpxQ><($W-8khLqTewapS;L3`QyTgke6(o3EeG^NYVYy+$}34p-c~!#I<< zqqumR@F9)26z}G6=9c#;t`zsqMQ=`u#vLbLl)pHAo?kpSKmQfK`EI=99pOgJ$8zP3 z_wkm)Mdpq-ig$z?7w_?Lxj1~pM_e2(&Ro24xVZRk{EFY){Cx1g_%Hu3|LK2>2iI(b z!Lq|>6wI@P#f{x;X`|Sz6b59JXB3TRa~R0t-^ZWjzy53f^8>$r{Or&3&A*B_$a|?= z2{#V!xVU)7H6P6#?{RULchlt^jd#3J$$a2#YCbM^d6)O`XYuFx=GTv(!2te_zy4Ex z@;~RRe~7Q~F#>?_jKi`aifx1^VF66VfI+koWahQ}Y4b0af0J+ik-z!3{3Q$k{yRVY z7yS5-`N4Pj&fl@$<1;=GY)&3?vM?ab5MclafNdr(yzs5~cl0ZM^MCpKU-Ps7z+V9j z0090QKl;QEUwr@JdtdPF@#VvV2Lk{A00000K)B=L4{v^ZeEq>MKJ)Yc$ln40{C^$~ V7KXqtuG|0s002ovPDHLkV1jyj&qe?M literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/red-button@2x.png b/Archive/Styles/Styles/Resources/red-button@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e197a76c64b209b9ee86e7faeea5b9aa4fc88d80 GIT binary patch literal 6696 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 y?cA{Q!!GL|1$V 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 Y2Sbo%1c++c7ytkO07*qoM6N<$f<=|Ji2wiq literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Resources/steel-button@2x.png b/Archive/Styles/Styles/Resources/steel-button@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0afa6ac96b0e3a3f4c3af581320016d186fb7f41 GIT binary patch literal 8079 zcma)hc{JNwyMIj8Dx$4p9y%!6q7*TQR#7df4!5P{n58|9A%fHxZA}M3t7t?h4(dJL z8se&;C>0_^gSV0jK@fU~S%gS#&U^14zdwF=t-IIW`@8mc@3q&n_p_hz^ScMcMNURd z1^@uax!$;bSM>e6c^*9?>O(%gKLh}@AGlt>djGkY)GYP*9;%ET>@&h$iyvtX^lYbn_p@~Ve0x#8?F&0{YuXP74jI4_p9^Pn%KLyu^+X8it_Gaesk z%w4hLa<}55eEtLg_&Z&K2_Z?_K8YVL{7bmsC0G;kd0SmvER(;e-O+B(O=Q-uum3}= zJASRG{a`x2i!mj=K7Fvj>EupdMsmeOREkOmH;K@`_L)nbN(8L!kf;7<^8fuUTDA7s zm&2LdU4P8D+{NFV^gaCfuq$!x5QSRfCanRP@xs~qq@6!eYrcGCVV_U~;P)^4m-apO zn-&5hbMH8cFFX()il)~DQ$o77U{+heLUBa{-~S=v-<14+yY4dK7E16*xMaVdD|m&B-$K+{t@%Ls!r-^@a>VGK%J|DLZ`FwiWA;$i2r~a@@m?i8%ZICkf?Cv1d%+=7c!)am-7gYUp`;%ioJF;q^HW?LLeTRN- zAqn8>F5IDK^Q*LWXs=aJ2>~6hJnmDtj=4dSNXV2R!SY5CpvDTuwTd$lI(>e!Yu(B z#bU0P9g6OIgm00w#ufYre~pRS(-x!)ziJ;+nFnQp{fVw=U*09*DG`kVrvjUcos0_B zE#yapOI4Mp71hg?LES*#9bZ1{eQnt4=6OQaqJ||QB(iC=aWrw;$|dFCuA?r=JeAUy zo*7v#fjky{QP0MP@u$~x@#EA98o1ph4)T%>@)U5(4_+{mKRTof$@k zvl`mbAN8$$qv&tOKGX&BPVYlT7mUhs7mdnT5M0jwd{nJsyJE~w9i+}fK_hCVYxS~l zp=%{qu#}s$14Ri(1OzTuC}0YYuPX~jeK&t;?fsCS%QBj<+USF)wr))&j27K=u|bX{ zUi7UIFPJ2pY}5C-s61f>C$wg*m26FoGjKzssaeE%!kS891th1{hIzjBzI?&lS6ohx z4TX>cNfgZa@^8&pbR7=+@;A2FBSKyNblHLQ{J0yZx;(*zRHw4v$}=W;dCSh{?2sa^ zQy~^Xiw#u)aI@{!%A>4+nfyCpf%tQIzy8KK7ok?XdcS3SWk8kUd9;%1fALGi$l4(R z1>onU2e7NL3nU`@^`` z({cUDC{;BNs9p5t5Ii?BE5tG4V{A2Kub33NXi0(18vhdbdY$*LHNN~_Qc@R}b#{R;3-B2<7)!M}8i~USAHpFgi zZUR{rdd}dt8;~dX8E=>+C7qt5#k4x5_2$yEHVI7-Qz6Ll!n;2%``rg5NzO1*VLCD? z*;m-MI``o7e!3_{XJOZV$)obue3f|ZZ7cvDaO zI&*1ml`y(6OT1M4HG)7>_l3PB0s!`aHo_IgSr zc3VZi4}TEWY+R3sPn)Wxk5WD95ILP}aPegWjNF+xJ$5^(0}S%T_poihfOqa2JX7<9 zp7)Hox7}1tvHip8lqI+`wWf)R+$ElG^p{x*V2RI3CyOI%OjuXUz^3e+&$T0Ae%O+O zkk;S<|5ER6Yjm%gvMwg*W5nXI->FrJDe;!3g|8O+CNdIrK&#$cGmuJJZ#uHAQU9;y z=i~`k4Ou<5trEZod`Lh($SgEB>?;Y&K5%AGK%DLzCCUUoxb*`qMas43tYT2_-hOwQ ze#?u57(^Di5agS`1u6hd#m+8-$%H@P=$T$yPKDP*QXyY>af^z29y~FRWk}YyW>!d* zMS(o|tiQ%QXeJOMj?SilrdDujktVrw3vo&%4b{P4f-Vl8jXkYNRBjk3d2;bGhvFxJ zq*qr+0LxDFMu4+ye@WIByY3s=0qr{*wvlfq({E@KmvL-4_wOn3+}26B=#V67Nx&Jk1IOf~ zJ2Kiam24&CB8dv)4ce&9+0L(e8*5-W+YuUzylMEEAj=NyDVwdK+Kn%agSrc8IVBUG zneB~rR$da9-5Ej(F%fmAlz~LMVUvox#1~R zJ5_8??Ax81BW+LVqvf#5F(S?{;yZ(UQ(>9~CYs00?7~e?r1iLLy90|}AR5FxruT*_ zoMbtSklE^-R16|yVaP*z(L}LQ-uSu|ixw$H%9YXap~P}&)C8RBt>Bp`+0fG~qbJ@? z-99qDLcB&9qQQYCDmi6Ob8%9vhN1a{4=>Uc-kA4+3XTlX7ynqCCFa+6=*MkY@2ud~ zlJ(FY(qDmMM!p#ScC3raBbg?m{(z2YnS6ZD;8l|p+>`>#NXaJP)jf%Ql?o?=uw<+i z@oL}+LuJ#fpcC?6_g*se!8$gSr6{ot^b|w?H1BnH!2#tf%cdiJMHgyUQs{)eRL}cW zX{xbKtn&2nDtBD!Y(VV=2l_3hE#qB@*D>J4HqF0Z&Ox^<^zAdPlY!DT{fWl$b+tOb zI0l;5in#j~2!KGA^wg)=v!cT&A)m*(Z@4mPUO>X8^X$@a`&R4l-peR{{G0An!WXYvE3X>6b_vxbi2=8wTGV^=>#zmJL$6d)3?4@o{%O%ZWd8ryRP(eDQjL|i?Z9&0020zHTl z>58$mu&9y_c+uw?$U>?e+UL>7W;&H}44(TM#sY`#2P`iVWfY$!b>g*f z#W5-o8sA;;RcmHuGjL=N#=NlNBT-`HYjLsOH9N7nmR1XW<$bQj zG1HansWva!0~CAMDeslRt~e^v+X7kPN^$;d_*cqDRvG_oJGvS4b+WPn7bV8;ioiY-!PDWPQU7!qmo?2+U~lX~m$UkM`DfEZk<@<>U`8e}w7;Dil&P4Dq$JL$sitB`wF zTl*YN=)C=aY8EEE94ReVidv)>cs>2~T|T;I^=){SpG zVvhNaKX@q0#WAXd(4=f(_qI1J_t)Q&2DiMS*dr_oMsFrE(BfEkF2H9WqHmCvOPr5; z@MGyH*4hJa1M1UTmy$(ir8l6BJ99SwSo}4igcWb#^RrREu%Wz_-h)Vu>ZMC-JZNDX zof^Kay`fdm5JD-(`KaY{0KD>U5;qZ)9hNbC)18}dQCtAxsFmHjp=y{QtsuzWJl12JBCTfLRd*;Z!h_}Ut6?-M-t|}ktu&l*TyIGLDd%Nl(6XI25`~cYZpy3BLI2Z)%tN;=rQV#a)h#xrtsV zkN~n{!=%kpHs-2n3uyySE2*T2Fk4=ZU8bheRoRWzT6`5&bG2KIY+jQ7>|McnG5-&T z1sCz0dVCL}=@owCSZ*22g$H`9Sh<+*)3Z*>!^bBLW^?_McE`f93o#`~0ye!@%a^Kf z`PIO<&L7zFfpOLCrDnX{POX>9S$eVrb$hhYPOn0~J69aSAT&Z2h8};U-z_6%WodrS zFwABZk|t~sO>l7b@g>jBc&#u`U0=tri~|+RzM+RL>vheRwnmZL&!Jozv^6UjJMZ)^ zuN^7@J~P$bUba%}Ew=H>0k_t)P)wYc853JK%o~Fw~yJe0v-udd*d;Z*FO?wRv zGwJpwk#*ImI|6S>r~DGKbnV^FhC4VcuGQ=)&riZ=*F*{JT1tZMCO(qXvDfhM)<$b; zPkWoBgk&8xFKk!}nS)ytl8R-Tm)|v?anx+YU88v>sQ$=6YsiUVSEE$aAnG3?VkCUh zQX284pDPI!CQ7@tPfq}+ULcZ6Bskku$e1UbrYa&it6o*HGR>P7Nbk3HhO3LKQHhCa z4erC%YPpHWoYQi#ve5X8=mH(!iad>KY!#2Myc))$Opn*({ysp*&Qum5N&L5$X7S1H3$r#I_`9aOnJ2Zj3@p25C=s?Nk1ygV z&KpkH-q#4@+sE{KKD0`PdMVgzq1Up^$w(?U$+`71*=Dj z-3Gg*y|S}TF}WyGL=g*}fl<9sY{TfuT{)6l_D;#|kj8%G3uSgjZ02f|tkxgcv@DBu zV`vLwAvCi@Zdf&EIKmma_&CMR+U~li>mniXyGkGWjKWo2^v*U!z8eTALS#ZY0o_X4 z@d%{tX*jH=BIP~3XmVb5g1%HKw;VFO6KlL*9b&UCg}~`Sr>QyBvrX=sC8n9BC34!< zTM3uzdHm+yC9SMmx_Hg_pR#I)Zv2rY@GtJ_xI*Yhul`a)d-7z0b2?T3AFD_NtFE5QNQIMk+3XPFTA;^FzBwrjvNAp{)_NYQ zztY{K&)F;vqM(EPF=N!^!D1z6+OcBdCG$d{4}?Sn!XSa{`Oh-X?YtUG_9g%rRp;1)$xti>gP6J+%M-ytW=+Y7z|Y?50{je z{-tp4#UN1J`U{SP(MyGE7e0Kn|D4sCuAn|UXV=M~RM>41N=5GXH<2aG)awJ-y)9de zreu^afU~Epw!Y29zab$#GtHmfs2qL%x*4Ox@zOJEyL}wbvIf|5>0#wwt8h`W zqm;D%xo)1GI5VvfTuq+dgXq%ztanBJy8T5DLXOtui4*GWgnpxdS1DGpQ6XX4sTb6Y z>1gCnxC=dAB(jUq5M5Jd6C~uE{Xe0|EA#9|3*<4m#Tq>J7=c!O9R8F*)Wl-K%aoD1 zXASh)Po#<$XanXm!3W0jYt@PSTBA+jY9;HtwT-NhTfy$H@-eJx$mX{ZVARTjTVM47 zBVKoIK9rI^s|fVD*6%#5Rp5*>Uk!Tj=zFtB+s&xABUlCb+>O-^ccwRhcjrZWl#AKR zMFe97*AC0S2h?6P0##6YL*I%$nucFCGKD@$>q&(| zgHv-atH}vLkx!#XQd^HQi3^WQYaKQuW=h&kS&Kx(ZykGW zG5dbkY}#vORoC=N|Ei2V*KHBQnES9z)Eq7`eYId*X)NPUfmS!Y9*=lWTpy0t|JJv6 zR(eJ{xsnxhS7T+28}YoQyL`#dTQ&_J{sU@X7L#TZW~ztpy-WAo4=5}Cgm72**5uf{ z7tpKf9mg0RG*r(!VJJgmNP&7hpt@{!Fjpo2nN}Ns|3RdUF;gv@N%9^RU~v*o)I%&7@X5@xyXXI>7mujau=q-aonx zk4I7l&DU^$)jBLlC+`hj(j&4h+dSXTRW|`W86jtriuG2Pp88M2kw-#abtlsA22xuQ ztRU+1R&d&Z4(HCJw7hc~Y3e3{FG_a2>+n7I&d3cvX7GqZTy)Y+QR1LAXAJ?gh-Zfl z#8|`pq)uY9rU>X@3+7yijnV88Nvx4=LflqovkPhVM8SKW2DZ=t126-VIV|gP|EpHw zkjl;r=YbQC_d`aH4wBR=kLPL2EcbRlhq`xDwJkfX{O+_N(ak>ePJgp41H`< zzInqiR&eQEg*-(1uujm)1#@l$Oj2sbMJy+&8kbE*aO^aS(4d*4O5~hZ0prapXImJh z9GJ?)sYQmJ5=95*9oSz!qBUndbZKZ+zrIG~na-1tBN~9YYIX2rem>lk4U*VG(3KTP z(GI+;r>*V`fF8!wJTYMSgEE7PoI~bxX{x_v?lvwrxLHcMG}Bu1U0a^CM2RRdO)&v$ zJ10jHZ61DaHi$dcAWw&r|46pVnH-uQI(pO|aB=ERi~;~b&?hr?H?n9I5mH5S zmq*~x71gQiPE!?VjLF+VOeP#V<=?sBG$ZM3w%_1(<>3s6KLZejQZ50CnlU0$Buq5Y zn(nB!!QkU7cNyXwn3zTRmzr0ED+FgRM$;7%U}N~RsefBF(!;-7tWBdCN3mn>(63%v#SFCC? zIhJ@OrV|^zzqAo&S(agnw#g0)!&3@#KvF^9y-wXY9_4VWUu#OIc*{Qw=7MJhVXx=) z4C@#d%r#ghd>$M;gqd&@V!p)K7&ZOwSNvM1tJ|0PV&69<Y?T>;mBFK%Ivnwf~;!u4(+JZT}&uDy%?C@t>h4aQ%)lBeOPd@Ft* z5?+cZLdWd|#gxDpb7}bDhAJ)G@pyxLHE^m{R&`$m+o&+E1z!!GjKUBa!^8X^h({rq z(u;@t(gH08PNLt%Q9FW>rkD^SJ3w-1xMxa|i2nMFgVUQ+lZs;-fwo9>`o(r{pMf9` zS_n3epI-~c^41yh8+NO8Cf;!uVAiLh?iI7%9qv!qY)wDZT7UdnSIXaLzNS86jey6#`lC_V^Sl1p|J1(jCsL&)jYlwSm~wB9Lo_Iz;df?O7YrrvUyfK)!;_c zY-|51I5`J2a}D+=28Ot`Icb0JPy53$`yEz)E;DXTxUs%=xXJ2grgd@qQ6p0r9ivb8 z$`G7LaI}$Gju9u}Oa{e}=|mtu{K!&>&Kx8e=Hy(h0nch&|jiE0m2Q`4pNZAJV2l*BD7KXiU0HPEdIp6u~tR}TU>4JG-l_R`a~YDjve1W zT#R^^*3@Hg#ls{j(~+#9Z}y4htevKkx%ev4=zWtrSTie*ftmFLGs02(EPFxy;r?x* zBA>G+;0XUJ@=fAd`2Vt3B!Y5wyK0#NUx5h085Xvx@j3SE?Mdv1U98WTM!K_E+Uea0 zlNJK`h@!fO)N1|Vf1;Z9l{uWUKHrXZluFmb z!`~+VYza*fOE&%+cTIkR5$gc}bl%eeMF<3h1fAa^DSz+b>IAv|@tWVu{{k=yX&nFn literal 0 HcmV?d00001 diff --git a/Archive/Styles/Styles/Styles-Info.plist b/Archive/Styles/Styles/Styles-Info.plist new file mode 100644 index 0000000..66a4d0c --- /dev/null +++ b/Archive/Styles/Styles/Styles-Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + MainStoryboard + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + + diff --git a/Archive/Styles/Styles/Styles-Prefix.pch b/Archive/Styles/Styles/Styles-Prefix.pch new file mode 100644 index 0000000..6c81c58 --- /dev/null +++ b/Archive/Styles/Styles/Styles-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'Styles' target in the 'Styles' project +// + +#import + +#ifndef __IPHONE_5_0 +#warning "This project uses features only available in iOS SDK 5.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/Archive/Styles/Styles/UYLAppDelegate.h b/Archive/Styles/Styles/UYLAppDelegate.h new file mode 100644 index 0000000..febe5c9 --- /dev/null +++ b/Archive/Styles/Styles/UYLAppDelegate.h @@ -0,0 +1,39 @@ +// +// UYLAppDelegate.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface UYLAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/Archive/Styles/Styles/UYLAppDelegate.m b/Archive/Styles/Styles/UYLAppDelegate.m new file mode 100644 index 0000000..cd2822a --- /dev/null +++ b/Archive/Styles/Styles/UYLAppDelegate.m @@ -0,0 +1,46 @@ +// +// UYLAppDelegate.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "UYLAppDelegate.h" +#import "UYLStyleController.h" + +@implementation UYLAppDelegate + +@synthesize window = _window; + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + [UYLStyleController applyStyle]; + return YES; +} + +@end diff --git a/Archive/Styles/Styles/UYLListViewController.h b/Archive/Styles/Styles/UYLListViewController.h new file mode 100644 index 0000000..e1ecd40 --- /dev/null +++ b/Archive/Styles/Styles/UYLListViewController.h @@ -0,0 +1,38 @@ +// +// UYLFirstViewController.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UYLListViewController : UITableViewController + +@end diff --git a/Archive/Styles/Styles/UYLListViewController.m b/Archive/Styles/Styles/UYLListViewController.m new file mode 100644 index 0000000..ca15048 --- /dev/null +++ b/Archive/Styles/Styles/UYLListViewController.m @@ -0,0 +1,45 @@ +// +// UYLFirstViewController.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "UYLListViewController.h" + +@interface UYLListViewController () +@end + +@implementation UYLListViewController + +//- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +//{ +// return YES; +//} + +@end diff --git a/Archive/Styles/Styles/UYLOkButton.h b/Archive/Styles/Styles/UYLOkButton.h new file mode 100644 index 0000000..279a947 --- /dev/null +++ b/Archive/Styles/Styles/UYLOkButton.h @@ -0,0 +1,36 @@ +// +// UYLOkButton.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface UYLOkButton : UIButton +@end diff --git a/Archive/Styles/Styles/UYLOkButton.m b/Archive/Styles/Styles/UYLOkButton.m new file mode 100644 index 0000000..52c135d --- /dev/null +++ b/Archive/Styles/Styles/UYLOkButton.m @@ -0,0 +1,36 @@ +// +// UYLOkButton.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "UYLOkButton.h" + +@implementation UYLOkButton +@end diff --git a/Archive/Styles/Styles/UYLResetButton.h b/Archive/Styles/Styles/UYLResetButton.h new file mode 100644 index 0000000..8e02791 --- /dev/null +++ b/Archive/Styles/Styles/UYLResetButton.h @@ -0,0 +1,36 @@ +// +// UYLResetButton.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface UYLResetButton : UIButton +@end diff --git a/Archive/Styles/Styles/UYLResetButton.m b/Archive/Styles/Styles/UYLResetButton.m new file mode 100644 index 0000000..2de0503 --- /dev/null +++ b/Archive/Styles/Styles/UYLResetButton.m @@ -0,0 +1,36 @@ +// +// UYLResetButton.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "UYLResetButton.h" + +@implementation UYLResetButton +@end diff --git a/Archive/Styles/Styles/UYLRotatingViewController.h b/Archive/Styles/Styles/UYLRotatingViewController.h new file mode 100644 index 0000000..eacf87e --- /dev/null +++ b/Archive/Styles/Styles/UYLRotatingViewController.h @@ -0,0 +1,38 @@ +// +// UYLRotatingViewController.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UYLRotatingViewController : UIViewController + +@end diff --git a/Archive/Styles/Styles/UYLRotatingViewController.m b/Archive/Styles/Styles/UYLRotatingViewController.m new file mode 100644 index 0000000..243d96f --- /dev/null +++ b/Archive/Styles/Styles/UYLRotatingViewController.m @@ -0,0 +1,49 @@ +// +// UYLRotatingViewController.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLRotatingViewController.h" + +@implementation UYLRotatingViewController + +- (void) viewDidLoad +{ + [super viewDidLoad]; + self.view.backgroundColor = [UIColor lightGrayColor]; +} + +//- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +//{ +// return YES; +//} + +@end diff --git a/Archive/Styles/Styles/UYLStyleController.h b/Archive/Styles/Styles/UYLStyleController.h new file mode 100644 index 0000000..7ec86af --- /dev/null +++ b/Archive/Styles/Styles/UYLStyleController.h @@ -0,0 +1,39 @@ +// +// UYLStyleController.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface UYLStyleController : NSObject + ++ (void)applyStyle; + +@end diff --git a/Archive/Styles/Styles/UYLStyleController.m b/Archive/Styles/Styles/UYLStyleController.m new file mode 100644 index 0000000..7310ba7 --- /dev/null +++ b/Archive/Styles/Styles/UYLStyleController.m @@ -0,0 +1,125 @@ +// +// UYLStyleController.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLStyleController.h" +#import "UYLRotatingViewController.h" +#import "UYLResetButton.h" +#import "UYLOkButton.h" +#import "UYLZeroButton.h" + +@implementation UYLStyleController + ++ (void)applyStyle +{ + // UINavigationBar + UIImage *navBarImage = [UIImage imageNamed:@"navbar"]; + navBarImage = [navBarImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; + + UIImage *navBarLandscapeImage = [UIImage imageNamed:@"navbar-landscape"]; + navBarLandscapeImage = [navBarLandscapeImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; + + UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; + [navigationBarAppearance setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsDefault]; + [navigationBarAppearance setBackgroundImage:navBarLandscapeImage forBarMetrics:UIBarMetricsLandscapePhone]; + + NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor grayColor], NSForegroundColorAttributeName, nil]; + [navigationBarAppearance setTitleTextAttributes:textAttributes]; + + UIImage *backButtonImage = [UIImage imageNamed:@"back-button"]; + backButtonImage = [backButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 25.0, 0, 6.0)]; + + UIImage *backButtonLandscapeImage = [UIImage imageNamed:@"back-button-landscape"]; + backButtonLandscapeImage = [backButtonLandscapeImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 25.0, 0, 6.0)]; + + UIBarButtonItem *barButtonItemAppearance = [UIBarButtonItem appearance]; + [barButtonItemAppearance setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [barButtonItemAppearance setBackButtonBackgroundImage:backButtonLandscapeImage forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; + + + // UIButton + UIImage *defaultButtonImage = [UIImage imageNamed:@"steel-button"]; + defaultButtonImage = [defaultButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; + [[UIButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:defaultButtonImage forState:UIControlStateNormal]; + + UIImage *okButtonImage = [UIImage imageNamed:@"green-button"]; + okButtonImage = [okButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; + [[UYLOkButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:okButtonImage forState:UIControlStateNormal]; + + UIImage *zeroButtonImage = [UIImage imageNamed:@"orange-button"]; + zeroButtonImage = [zeroButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; + [[UYLZeroButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:zeroButtonImage forState:UIControlStateNormal]; + + UIImage *resetButtonImage = [UIImage imageNamed:@"red-button"]; + resetButtonImage = [resetButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; + [[UYLResetButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:resetButtonImage forState:UIControlStateNormal]; + [[UYLResetButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + + + // Set some colors + UIColor *mainColor = [UIColor darkGrayColor]; + UIColor *altColor = [UIColor lightGrayColor]; + + + // UILabel + UILabel *labelAppearance = [UILabel appearanceWhenContainedIn:[UYLRotatingViewController class], nil]; + [labelAppearance setTextColor:mainColor]; + + + // UIActivityIndicator + [[UIActivityIndicatorView appearance] setColor:[UIColor redColor]]; + + + // UIProgressView + [[UIProgressView appearance] setProgressTintColor:mainColor]; + [[UIProgressView appearance] setTrackTintColor:altColor]; + + + // UISwitch + [[UISwitch appearance] setOnTintColor:altColor]; + + + // UISlider + [[UISlider appearance] setMinimumTrackTintColor:mainColor]; + [[UISlider appearance] setMaximumTrackTintColor:altColor]; + [[UISlider appearance] setThumbTintColor:[UIColor redColor]]; + + + // UISegmentedControl + [[UISegmentedControl appearance] setBackgroundImage:defaultButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [[UISegmentedControl appearance] setBackgroundImage:zeroButtonImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; + + UIImage *dividerImage = [UIImage imageNamed:@"divider"]; + [[UISegmentedControl appearance] setDividerImage:dividerImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; +} + +@end diff --git a/Archive/Styles/Styles/UYLZeroButton.h b/Archive/Styles/Styles/UYLZeroButton.h new file mode 100644 index 0000000..e773f6b --- /dev/null +++ b/Archive/Styles/Styles/UYLZeroButton.h @@ -0,0 +1,36 @@ +// +// UYLZeroButton.h +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface UYLZeroButton : UIButton +@end diff --git a/Archive/Styles/Styles/UYLZeroButton.m b/Archive/Styles/Styles/UYLZeroButton.m new file mode 100644 index 0000000..1bb41ea --- /dev/null +++ b/Archive/Styles/Styles/UYLZeroButton.m @@ -0,0 +1,36 @@ +// +// UYLZeroButton.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "UYLZeroButton.h" + +@implementation UYLZeroButton +@end diff --git a/Archive/Styles/Styles/en.lproj/InfoPlist.strings b/Archive/Styles/Styles/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Archive/Styles/Styles/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Archive/Styles/Styles/main.m b/Archive/Styles/Styles/main.m new file mode 100644 index 0000000..b1284ba --- /dev/null +++ b/Archive/Styles/Styles/main.m @@ -0,0 +1,43 @@ +// +// main.m +// Styles +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +#import "UYLAppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([UYLAppDelegate class])); + } +} diff --git a/Archive/TaskTimer/README b/Archive/TaskTimer/README new file mode 100644 index 0000000..949762d --- /dev/null +++ b/Archive/TaskTimer/README @@ -0,0 +1,95 @@ +======================================================================= +TaskTimer + +Version 1.1 14 May 2012 Add shake to reset +Version 1.0 6-April 2012 Initial Version +======================================================================= + +The TaskTimer App is intended as an example on how to add accessibility +features to an existing App. It is based on the Master Detail Xcode +project template and is a universal app that uses Core Data for its +model. The basic function of the App is to time how long it takes to +perform a list of tasks. + +For further details see: + +https://useyourloaf.com/blog/voiceover-accessibility/ +https://useyourloaf.com/blog/detecting-voiceover-status-changes/ + +======================================================================= +Model +======================================================================= + +Task.m +Task.h +The model consists of a single Core Data entity class for the task data. + +======================================================================= +View +======================================================================= + +UYLCounterView.h +UYLCounterView.m + +The UYLCounterView is a custom UIView subclass used to display the +current duration of a task and buttons to start and stop the counter. +Users of the view can implement the UYLCounterViewDelegate protocol +to receive methods calls when the counter is stopper/started. + +UYLTaskListViewController_iPad.xib +UYLTaskListViewController_iPhone.xib + +iPad and iPhone versions of the NIB for the UYLTaskListViewController. +This NIB is a basic UITableView. + +UYLTaskViewController_iPad.xib +UYLTaskViewController_iPhone.xib + +iPad and iPhone versions of the NIB for the UYLTaskViewController. This +is a custom view containing a text view to allow the task name to be +displayed and edited. It also contains a UYLCounterView to show the +task timer. + +======================================================================= +Controller +======================================================================= + +UYLTaskListViewController.h +UYLTaskListViewController.m + +The master view controller on the iPad and root view controller on the +iPhone. This controller implements the delegates for a table view +showing the list of tasks. The table supports adding/deleting of tasks. + +On the iPad the currently selected task is shown in the detail view +controller which is implemented by a UYLTaskViewController. + +On the iPhone selecting a task pushes a UYLTaskViewController onto +the navigation controller stack. + +UYLTaskViewController.h +UYLTaskViewController.m + +Used to show the task details and allow the task timer to be stopped +and started. A shake event can be used to reset the task. A reset +button is shown/hidden depending on the state of VoiceOver. + +======================================================================= +App Delegate +======================================================================= + +UYLAppDelegate.h +UYLAppDelegate.m + +The App delegate is largely unmodified from the template code. It creates +the root view controllers and initialises the core data stack. + +======================================================================= +Other files +======================================================================= + +NSNumber+UYLTimeFormatter.h +NSNumber+UYLTimeFormatter.m + +A category on NSNumber to provide a string representation of the elapsed +time. diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.pbxproj b/Archive/TaskTimer/TaskTimer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c30bd55 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.pbxproj @@ -0,0 +1,493 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 532DD95A1530C8EC00ED5845 /* UYLCounterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD9591530C8EC00ED5845 /* UYLCounterView.m */; }; + 532DD9601530C90300ED5845 /* UYLTaskListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD95D1530C90300ED5845 /* UYLTaskListViewController.m */; }; + 532DD9611530C90300ED5845 /* UYLTaskViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD95F1530C90300ED5845 /* UYLTaskViewController.m */; }; + 532DD96C1530C9AD00ED5845 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD96B1530C9AD00ED5845 /* UYLAppDelegate.m */; }; + 532DD9751530CA6400ED5845 /* UYLTaskListViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD96D1530CA6400ED5845 /* UYLTaskListViewController_iPad.xib */; }; + 532DD9761530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD96F1530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib */; }; + 532DD9771530CA6400ED5845 /* UYLTaskViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD9711530CA6400ED5845 /* UYLTaskViewController_iPad.xib */; }; + 532DD9781530CA6400ED5845 /* UYLTaskViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD9731530CA6400ED5845 /* UYLTaskViewController_iPhone.xib */; }; + 534644A5155F083D00B20849 /* redbutton.png in Resources */ = {isa = PBXBuildFile; fileRef = 534644A4155F083D00B20849 /* redbutton.png */; }; + 536270F6152E0A55009732E1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270F5152E0A55009732E1 /* UIKit.framework */; }; + 536270F8152E0A55009732E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270F7152E0A55009732E1 /* Foundation.framework */; }; + 536270FA152E0A55009732E1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270F9152E0A55009732E1 /* CoreGraphics.framework */; }; + 536270FC152E0A55009732E1 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270FB152E0A55009732E1 /* CoreData.framework */; }; + 53627102152E0A55009732E1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53627100152E0A55009732E1 /* InfoPlist.strings */; }; + 53627104152E0A55009732E1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53627103152E0A55009732E1 /* main.m */; }; + 53627127152E0B87009732E1 /* Task.m in Sources */ = {isa = PBXBuildFile; fileRef = 53627125152E0B87009732E1 /* Task.m */; }; + 5362712B152E0BF1009732E1 /* TaskTimer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 53627129152E0BF1009732E1 /* TaskTimer.xcdatamodeld */; }; + 539F94F1153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F94F0153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m */; }; + 53BD55AA1533880300BCFB33 /* checked.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A21533880300BCFB33 /* checked.png */; }; + 53BD55AB1533880300BCFB33 /* checked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A31533880300BCFB33 /* checked@2x.png */; }; + 53BD55AC1533880300BCFB33 /* start.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A41533880300BCFB33 /* start.png */; }; + 53BD55AD1533880300BCFB33 /* start@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A51533880300BCFB33 /* start@2x.png */; }; + 53BD55AE1533880300BCFB33 /* stop.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A61533880300BCFB33 /* stop.png */; }; + 53BD55AF1533880300BCFB33 /* stop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A71533880300BCFB33 /* stop@2x.png */; }; + 53BD55B01533880300BCFB33 /* unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A81533880300BCFB33 /* unchecked.png */; }; + 53BD55B11533880300BCFB33 /* unchecked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A91533880300BCFB33 /* unchecked@2x.png */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 532DD9581530C8EC00ED5845 /* UYLCounterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCounterView.h; sourceTree = ""; }; + 532DD9591530C8EC00ED5845 /* UYLCounterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCounterView.m; sourceTree = ""; }; + 532DD95C1530C90300ED5845 /* UYLTaskListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTaskListViewController.h; sourceTree = ""; }; + 532DD95D1530C90300ED5845 /* UYLTaskListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTaskListViewController.m; sourceTree = ""; }; + 532DD95E1530C90300ED5845 /* UYLTaskViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTaskViewController.h; sourceTree = ""; }; + 532DD95F1530C90300ED5845 /* UYLTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTaskViewController.m; sourceTree = ""; }; + 532DD96A1530C9AD00ED5845 /* UYLAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; + 532DD96B1530C9AD00ED5845 /* UYLAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; + 5334608B23CA3B5E00BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLTaskListViewController_iPad.xib; sourceTree = ""; }; + 5334608C23CA3B5E00BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLTaskListViewController_iPhone.xib; sourceTree = ""; }; + 5334608D23CA3B5E00BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLTaskViewController_iPad.xib; sourceTree = ""; }; + 5334608E23CA3B5E00BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLTaskViewController_iPhone.xib; sourceTree = ""; }; + 534644A4155F083D00B20849 /* redbutton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = redbutton.png; sourceTree = ""; }; + 536270F1152E0A55009732E1 /* TaskTimer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TaskTimer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 536270F5152E0A55009732E1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 536270F7152E0A55009732E1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 536270F9152E0A55009732E1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 536270FB152E0A55009732E1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 536270FF152E0A55009732E1 /* TaskTimer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TaskTimer-Info.plist"; sourceTree = ""; }; + 53627101152E0A55009732E1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 53627103152E0A55009732E1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 53627105152E0A55009732E1 /* TaskTimer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TaskTimer-Prefix.pch"; sourceTree = ""; }; + 53627124152E0B87009732E1 /* Task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Task.h; sourceTree = ""; }; + 53627125152E0B87009732E1 /* Task.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Task.m; sourceTree = ""; }; + 5362712A152E0BF1009732E1 /* Accessibile.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Accessibile.xcdatamodel; sourceTree = ""; }; + 539F94EF153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+UYLTimeFormatter.h"; sourceTree = ""; }; + 539F94F0153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+UYLTimeFormatter.m"; sourceTree = ""; }; + 53BD55A21533880300BCFB33 /* checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checked.png; sourceTree = ""; }; + 53BD55A31533880300BCFB33 /* checked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checked@2x.png"; sourceTree = ""; }; + 53BD55A41533880300BCFB33 /* start.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = start.png; sourceTree = ""; }; + 53BD55A51533880300BCFB33 /* start@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start@2x.png"; sourceTree = ""; }; + 53BD55A61533880300BCFB33 /* stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stop.png; sourceTree = ""; }; + 53BD55A71533880300BCFB33 /* stop@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@2x.png"; sourceTree = ""; }; + 53BD55A81533880300BCFB33 /* unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = unchecked.png; sourceTree = ""; }; + 53BD55A91533880300BCFB33 /* unchecked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "unchecked@2x.png"; sourceTree = ""; }; + 53DA48A1152FA0D700A616D8 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 536270EE152E0A55009732E1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 536270F6152E0A55009732E1 /* UIKit.framework in Frameworks */, + 536270F8152E0A55009732E1 /* Foundation.framework in Frameworks */, + 536270FA152E0A55009732E1 /* CoreGraphics.framework in Frameworks */, + 536270FC152E0A55009732E1 /* CoreData.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 536270E6152E0A55009732E1 = { + isa = PBXGroup; + children = ( + 53DA48A1152FA0D700A616D8 /* README */, + 536270FD152E0A55009732E1 /* TaskTimer */, + 536270F4152E0A55009732E1 /* Frameworks */, + 536270F2152E0A55009732E1 /* Products */, + ); + sourceTree = ""; + }; + 536270F2152E0A55009732E1 /* Products */ = { + isa = PBXGroup; + children = ( + 536270F1152E0A55009732E1 /* TaskTimer.app */, + ); + name = Products; + sourceTree = ""; + }; + 536270F4152E0A55009732E1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 536270F5152E0A55009732E1 /* UIKit.framework */, + 536270F7152E0A55009732E1 /* Foundation.framework */, + 536270F9152E0A55009732E1 /* CoreGraphics.framework */, + 536270FB152E0A55009732E1 /* CoreData.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 536270FD152E0A55009732E1 /* TaskTimer */ = { + isa = PBXGroup; + children = ( + 532DD96A1530C9AD00ED5845 /* UYLAppDelegate.h */, + 532DD96B1530C9AD00ED5845 /* UYLAppDelegate.m */, + 53A72C4A153DEE61000AAB9C /* Categories */, + 53627123152E0B65009732E1 /* Model */, + 5362712C152E0BFF009732E1 /* View */, + 5362712D152E0C07009732E1 /* Controller */, + 53627146152E0C72009732E1 /* Images */, + 536270FE152E0A55009732E1 /* Supporting Files */, + ); + path = TaskTimer; + sourceTree = ""; + }; + 536270FE152E0A55009732E1 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 536270FF152E0A55009732E1 /* TaskTimer-Info.plist */, + 53627100152E0A55009732E1 /* InfoPlist.strings */, + 53627103152E0A55009732E1 /* main.m */, + 53627105152E0A55009732E1 /* TaskTimer-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 53627123152E0B65009732E1 /* Model */ = { + isa = PBXGroup; + children = ( + 53627129152E0BF1009732E1 /* TaskTimer.xcdatamodeld */, + 53627124152E0B87009732E1 /* Task.h */, + 53627125152E0B87009732E1 /* Task.m */, + ); + name = Model; + sourceTree = ""; + }; + 5362712C152E0BFF009732E1 /* View */ = { + isa = PBXGroup; + children = ( + 532DD96D1530CA6400ED5845 /* UYLTaskListViewController_iPad.xib */, + 532DD96F1530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib */, + 532DD9711530CA6400ED5845 /* UYLTaskViewController_iPad.xib */, + 532DD9731530CA6400ED5845 /* UYLTaskViewController_iPhone.xib */, + 532DD9581530C8EC00ED5845 /* UYLCounterView.h */, + 532DD9591530C8EC00ED5845 /* UYLCounterView.m */, + ); + name = View; + sourceTree = ""; + }; + 5362712D152E0C07009732E1 /* Controller */ = { + isa = PBXGroup; + children = ( + 532DD95C1530C90300ED5845 /* UYLTaskListViewController.h */, + 532DD95D1530C90300ED5845 /* UYLTaskListViewController.m */, + 532DD95E1530C90300ED5845 /* UYLTaskViewController.h */, + 532DD95F1530C90300ED5845 /* UYLTaskViewController.m */, + ); + name = Controller; + sourceTree = ""; + }; + 53627146152E0C72009732E1 /* Images */ = { + isa = PBXGroup; + children = ( + 534644A4155F083D00B20849 /* redbutton.png */, + 53BD55A21533880300BCFB33 /* checked.png */, + 53BD55A31533880300BCFB33 /* checked@2x.png */, + 53BD55A41533880300BCFB33 /* start.png */, + 53BD55A51533880300BCFB33 /* start@2x.png */, + 53BD55A61533880300BCFB33 /* stop.png */, + 53BD55A71533880300BCFB33 /* stop@2x.png */, + 53BD55A81533880300BCFB33 /* unchecked.png */, + 53BD55A91533880300BCFB33 /* unchecked@2x.png */, + ); + name = Images; + sourceTree = ""; + }; + 53A72C4A153DEE61000AAB9C /* Categories */ = { + isa = PBXGroup; + children = ( + 539F94EF153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.h */, + 539F94F0153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m */, + ); + name = Categories; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 536270F0152E0A55009732E1 /* TaskTimer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53627120152E0A55009732E1 /* Build configuration list for PBXNativeTarget "TaskTimer" */; + buildPhases = ( + 536270ED152E0A55009732E1 /* Sources */, + 536270EE152E0A55009732E1 /* Frameworks */, + 536270EF152E0A55009732E1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TaskTimer; + productName = TaskTimer; + productReference = 536270F1152E0A55009732E1 /* TaskTimer.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 536270E8152E0A55009732E1 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = UYL; + LastUpgradeCheck = 1120; + }; + buildConfigurationList = 536270EB152E0A55009732E1 /* Build configuration list for PBXProject "TaskTimer" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 536270E6152E0A55009732E1; + productRefGroup = 536270F2152E0A55009732E1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 536270F0152E0A55009732E1 /* TaskTimer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 536270EF152E0A55009732E1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53627102152E0A55009732E1 /* InfoPlist.strings in Resources */, + 532DD9751530CA6400ED5845 /* UYLTaskListViewController_iPad.xib in Resources */, + 532DD9761530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib in Resources */, + 532DD9771530CA6400ED5845 /* UYLTaskViewController_iPad.xib in Resources */, + 532DD9781530CA6400ED5845 /* UYLTaskViewController_iPhone.xib in Resources */, + 53BD55AA1533880300BCFB33 /* checked.png in Resources */, + 53BD55AB1533880300BCFB33 /* checked@2x.png in Resources */, + 53BD55AC1533880300BCFB33 /* start.png in Resources */, + 53BD55AD1533880300BCFB33 /* start@2x.png in Resources */, + 53BD55AE1533880300BCFB33 /* stop.png in Resources */, + 53BD55AF1533880300BCFB33 /* stop@2x.png in Resources */, + 53BD55B01533880300BCFB33 /* unchecked.png in Resources */, + 53BD55B11533880300BCFB33 /* unchecked@2x.png in Resources */, + 534644A5155F083D00B20849 /* redbutton.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 536270ED152E0A55009732E1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53627104152E0A55009732E1 /* main.m in Sources */, + 53627127152E0B87009732E1 /* Task.m in Sources */, + 5362712B152E0BF1009732E1 /* TaskTimer.xcdatamodeld in Sources */, + 532DD95A1530C8EC00ED5845 /* UYLCounterView.m in Sources */, + 532DD9601530C90300ED5845 /* UYLTaskListViewController.m in Sources */, + 532DD9611530C90300ED5845 /* UYLTaskViewController.m in Sources */, + 532DD96C1530C9AD00ED5845 /* UYLAppDelegate.m in Sources */, + 539F94F1153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 532DD96D1530CA6400ED5845 /* UYLTaskListViewController_iPad.xib */ = { + isa = PBXVariantGroup; + children = ( + 5334608B23CA3B5E00BE943E /* Base */, + ); + name = UYLTaskListViewController_iPad.xib; + sourceTree = ""; + }; + 532DD96F1530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib */ = { + isa = PBXVariantGroup; + children = ( + 5334608C23CA3B5E00BE943E /* Base */, + ); + name = UYLTaskListViewController_iPhone.xib; + sourceTree = ""; + }; + 532DD9711530CA6400ED5845 /* UYLTaskViewController_iPad.xib */ = { + isa = PBXVariantGroup; + children = ( + 5334608D23CA3B5E00BE943E /* Base */, + ); + name = UYLTaskViewController_iPad.xib; + sourceTree = ""; + }; + 532DD9731530CA6400ED5845 /* UYLTaskViewController_iPhone.xib */ = { + isa = PBXVariantGroup; + children = ( + 5334608E23CA3B5E00BE943E /* Base */, + ); + name = UYLTaskViewController_iPhone.xib; + sourceTree = ""; + }; + 53627100152E0A55009732E1 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 53627101152E0A55009732E1 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5362711E152E0A55009732E1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + 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_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5362711F152E0A55009732E1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 53627121152E0A55009732E1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TaskTimer/TaskTimer-Prefix.pch"; + INFOPLIST_FILE = "TaskTimer/TaskTimer-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 53627122152E0A55009732E1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TaskTimer/TaskTimer-Prefix.pch"; + INFOPLIST_FILE = "TaskTimer/TaskTimer-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 536270EB152E0A55009732E1 /* Build configuration list for PBXProject "TaskTimer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5362711E152E0A55009732E1 /* Debug */, + 5362711F152E0A55009732E1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53627120152E0A55009732E1 /* Build configuration list for PBXNativeTarget "TaskTimer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53627121152E0A55009732E1 /* Debug */, + 53627122152E0A55009732E1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 53627129152E0BF1009732E1 /* TaskTimer.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 5362712A152E0BF1009732E1 /* Accessibile.xcdatamodel */, + ); + currentVersion = 5362712A152E0BF1009732E1 /* Accessibile.xcdatamodel */; + path = TaskTimer.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 536270E8152E0A55009732E1 /* Project object */; +} diff --git a/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPad.xib b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPad.xib new file mode 100644 index 0000000..f37ea5e --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPad.xib @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPhone.xib b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPhone.xib new file mode 100644 index 0000000..477fd87 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskListViewController_iPhone.xib @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPad.xib b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPad.xib new file mode 100644 index 0000000..1fd7bab --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPad.xib @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPhone.xib b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPhone.xib new file mode 100644 index 0000000..328cc4f --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/Base.lproj/UYLTaskViewController_iPhone.xib @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h b/Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h new file mode 100644 index 0000000..3c2cd73 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h @@ -0,0 +1,39 @@ +// +// NSNumber+UYLTimeFormatter.h +// TaskTimer +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface NSNumber (UYLTimeFormatter) + +- (NSString *)stringValueAsTime; + +@end diff --git a/Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m b/Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m new file mode 100644 index 0000000..b5c8699 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m @@ -0,0 +1,63 @@ +// +// NSNumber+UYLTimeFormatter.m +// TaskTimer +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "NSNumber+UYLTimeFormatter.h" + +@implementation NSNumber (UYLTimeFormatter) + +// Returns an NSString with a textual representation of the time expressed in +// minutes and seconds (e.g. "5 minutes and 10 seconds" + +- (NSString *)stringValueAsTime +{ + NSUInteger minutes = [self integerValue] / 60; + NSUInteger seconds = [self integerValue] % 60; + + NSString *secondsFormat = (seconds == 1) ? NSLocalizedString(@"second",nil) : + NSLocalizedString(@"seconds",nil); + NSString *minutesFormat = (minutes == 1) ? NSLocalizedString(@"minute",nil) : + NSLocalizedString(@"minutes",nil); + + NSString *text = nil; + if (minutes > 0) + { + text = [NSString stringWithFormat:@" %u %@ %u %@",minutes,minutesFormat,seconds,secondsFormat]; + } + else + { + text = [NSString stringWithFormat:@" %u %@",seconds,secondsFormat]; + } + + return text; +} + +@end diff --git a/Archive/TaskTimer/TaskTimer/Task.h b/Archive/TaskTimer/TaskTimer/Task.h new file mode 100644 index 0000000..59044a8 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/Task.h @@ -0,0 +1,44 @@ +// +// Task.h +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import +#import + + +@interface Task : NSManagedObject + +@property (nonatomic, retain) NSNumber * complete; +@property (nonatomic, retain) NSDate * createdAt; +@property (nonatomic, retain) NSNumber * duration; +@property (nonatomic, retain) NSString * note; + +@end diff --git a/Archive/TaskTimer/TaskTimer/Task.m b/Archive/TaskTimer/TaskTimer/Task.m new file mode 100644 index 0000000..da446c8 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/Task.m @@ -0,0 +1,43 @@ +// +// Task.m +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "Task.h" + + +@implementation Task + +@dynamic complete; +@dynamic createdAt; +@dynamic duration; +@dynamic note; + +@end diff --git a/Archive/TaskTimer/TaskTimer/TaskTimer-Info.plist b/Archive/TaskTimer/TaskTimer/TaskTimer-Info.plist new file mode 100644 index 0000000..363537d --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/TaskTimer-Info.plist @@ -0,0 +1,46 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Archive/TaskTimer/TaskTimer/TaskTimer-Prefix.pch b/Archive/TaskTimer/TaskTimer/TaskTimer-Prefix.pch new file mode 100644 index 0000000..79c40be --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/TaskTimer-Prefix.pch @@ -0,0 +1,15 @@ +// +// Prefix header for all source files of the 'TaskTimer' target in the 'TaskTimer' project +// + +#import + +#ifndef __IPHONE_4_0 +#warning "This project uses features only available in iOS SDK 4.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import + #import +#endif diff --git a/Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion b/Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..34639d4 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + Accessibile.xcdatamodel + + diff --git a/Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents b/Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents new file mode 100644 index 0000000..0bd2cc0 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Archive/TaskTimer/TaskTimer/UYLAppDelegate.h b/Archive/TaskTimer/TaskTimer/UYLAppDelegate.h new file mode 100644 index 0000000..2f14c1f --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLAppDelegate.h @@ -0,0 +1,49 @@ +// +// UYLAppDelegate.h +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface UYLAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; +@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; +@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; + +@property (strong, nonatomic) UINavigationController *navigationController; +@property (strong, nonatomic) UISplitViewController *splitViewController; + +- (void)saveContext; +- (NSURL *)applicationDocumentsDirectory; + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLAppDelegate.m b/Archive/TaskTimer/TaskTimer/UYLAppDelegate.m new file mode 100644 index 0000000..b0a54ba --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLAppDelegate.m @@ -0,0 +1,164 @@ +// +// UYLAppDelegate.m +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLAppDelegate.h" +#import "UYLTaskListViewController.h" +#import "UYLTaskViewController.h" + +@implementation UYLAppDelegate + +@synthesize window = _window; +@synthesize managedObjectContext = __managedObjectContext; +@synthesize managedObjectModel = __managedObjectModel; +@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; +@synthesize navigationController = _navigationController; +@synthesize splitViewController = _splitViewController; + +#pragma mark - +#pragma mark === Application Delegate Methods === +#pragma mark - + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) + { + UYLTaskListViewController *taskListViewController = [[UYLTaskListViewController alloc] initWithNibName:@"UYLTaskListViewController_iPhone" + bundle:nil]; + self.navigationController = [[UINavigationController alloc] initWithRootViewController:taskListViewController]; + self.window.rootViewController = self.navigationController; + taskListViewController.managedObjectContext = self.managedObjectContext; + } + else + { + UYLTaskListViewController *taskListViewController = [[UYLTaskListViewController alloc] initWithNibName:@"UYLTaskListViewController_iPad" + bundle:nil]; + UINavigationController *taskListNavigationController = [[UINavigationController alloc] initWithRootViewController:taskListViewController]; + UYLTaskViewController *taskViewController = [[UYLTaskViewController alloc] initWithNibName:@"UYLTaskViewController_iPad" bundle:nil]; + UINavigationController *taskNavigationController = [[UINavigationController alloc] initWithRootViewController:taskViewController]; + taskListViewController.detailViewController = taskViewController; + + self.splitViewController = [[UISplitViewController alloc] init]; + self.splitViewController.viewControllers = [NSArray arrayWithObjects:taskListNavigationController, taskNavigationController, nil]; + self.splitViewController.delegate = taskViewController; + + self.window.rootViewController = self.splitViewController; + taskListViewController.managedObjectContext = self.managedObjectContext; + } + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + [self saveContext]; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + [self saveContext]; +} + +#pragma mark - +#pragma mark === Core Data Accessors === +#pragma mark - + +- (NSManagedObjectContext *)managedObjectContext +{ + if (__managedObjectContext != nil) + { + return __managedObjectContext; + } + + NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; + if (coordinator != nil) + { + __managedObjectContext = [[NSManagedObjectContext alloc] init]; + [__managedObjectContext setPersistentStoreCoordinator:coordinator]; + } + return __managedObjectContext; +} + +- (NSManagedObjectModel *)managedObjectModel +{ + if (__managedObjectModel != nil) + { + return __managedObjectModel; + } + NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TaskTimer" withExtension:@"momd"]; + __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; + return __managedObjectModel; +} + +- (NSPersistentStoreCoordinator *)persistentStoreCoordinator +{ + if (__persistentStoreCoordinator != nil) + { + return __persistentStoreCoordinator; + } + + NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TaskTimer.sqlite"]; + + NSError *error = nil; + __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; +} + +#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 *)applicationDocumentsDirectory +{ + return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; +} + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLCounterView.h b/Archive/TaskTimer/TaskTimer/UYLCounterView.h new file mode 100644 index 0000000..7fbd13e --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLCounterView.h @@ -0,0 +1,51 @@ +// +// UYLCounterView.h +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import + +@protocol UYLCounterViewDelegate + +@optional + +- (void)didStartCounter; +- (void)didStopCounter; + +@end + +@interface UYLCounterView : UIView + +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) NSUInteger secondsCounter; +@property (nonatomic, strong) NSMutableArray *accessibleElements; +@property (nonatomic, assign) BOOL counterEnabled; + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLCounterView.m b/Archive/TaskTimer/TaskTimer/UYLCounterView.m new file mode 100644 index 0000000..245d24a --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLCounterView.m @@ -0,0 +1,292 @@ +// +// UYLCounterView.m +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLCounterView.h" +#import "NSNumber+UYLTimeFormatter.h" + +@interface UYLCounterView () + +@property (nonatomic, strong) UIButton *startButton; +@property (nonatomic, strong) UIButton *stopButton; + +- (void)setupView; + +@end + +@implementation UYLCounterView + +@synthesize delegate=_delegate; +@synthesize secondsCounter=_secondsCounter; +@synthesize accessibleElements=_accessibleElements; +@synthesize counterEnabled=_counterEnabled; +@synthesize startButton=_startButton; +@synthesize stopButton=_stopButton; + +#define UYLCOUNTERVIEW_LIMIT 3599 // Maximum seconds that can be displayed as mm:ss +#define UYLCOUNTERVIEW_MARGIN 10 +#define UYLCOUNTERVIEW_MINFONT 10 + +#define UYLCOUNTERVIEW_ELEMENTINDEX_STARTBUTTON 0 +#define UYLCOUNTERVIEW_ELEMENTINDEX_COUNTERTEXT 1 +#define UYLCOUNTERVIEW_ELEMENTINDEX_STOPBUTTON 2 + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) + { + [self setupView]; + } + return self; +} + +- (void)setSecondsCounter:(NSUInteger)secondsCounter +{ + if (secondsCounter > UYLCOUNTERVIEW_LIMIT) + { + secondsCounter = UYLCOUNTERVIEW_LIMIT; + } + + _secondsCounter = secondsCounter; + + if (_accessibleElements) + { + UIAccessibilityElement *counterElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_COUNTERTEXT]; + counterElement.accessibilityValue = [[NSNumber numberWithInteger:secondsCounter] stringValueAsTime]; + } + + [self setNeedsDisplay]; +} + +- (void)setCounterEnabled:(BOOL)counterEnabled +{ + _counterEnabled = counterEnabled; + + if (counterEnabled == YES) + { + self.startButton.enabled = YES; + self.stopButton.enabled = NO; + } + else + { + self.startButton.enabled = NO; + self.stopButton.enabled = NO; + } +} +- (void)drawRect:(CGRect)rect +{ + NSUInteger minutes = self.secondsCounter / 60; + NSUInteger seconds = self.secondsCounter % 60; + + NSString *counterText = [NSString stringWithFormat:@"%02u:%02u", minutes, seconds]; + UIFont *font = [UIFont boldSystemFontOfSize:48]; + + CGFloat actualFontSize; + CGSize stringSize = [counterText sizeWithFont:font + minFontSize:UYLCOUNTERVIEW_MINFONT + actualFontSize:&actualFontSize + forWidth:self.bounds.size.width + lineBreakMode:UILineBreakModeTailTruncation]; + + + CGPoint point = CGPointMake((self.bounds.size.width - stringSize.width)/2, + (self.bounds.size.height - stringSize.height)/2); + + [counterText drawAtPoint:point + forWidth:stringSize.width + withFont:font + fontSize:actualFontSize + lineBreakMode:UILineBreakModeWordWrap + baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; + +} + +#pragma mark - +#pragma mark === Action methods === +#pragma mark - + +- (void)startAction:(UIButton *)sender +{ + self.startButton.enabled = NO; + self.stopButton.enabled = YES; + + if (_accessibleElements) + { + UIAccessibilityElement *startElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_STARTBUTTON]; + startElement.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled; + + UIAccessibilityElement *stopElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_STOPBUTTON]; + stopElement.accessibilityTraits = UIAccessibilityTraitButton; + } + + if ([self.delegate respondsToSelector:@selector(didStartCounter)]) + { + [self.delegate didStartCounter]; + } +} + +- (void)stopAction:(UIButton *)sender +{ + self.counterEnabled = NO; + + if (_accessibleElements) + { + UIAccessibilityElement *stopElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_STOPBUTTON]; + stopElement.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled; + } + + if ([self.delegate respondsToSelector:@selector(didStopCounter)]) + { + [self.delegate didStopCounter]; + } +} + +#pragma mark - +#pragma mark === Accessibility Container methods === +#pragma mark - + +- (NSArray *)accessibleElements +{ + if (_accessibleElements != nil) + { + return _accessibleElements; + } + + _accessibleElements = [[NSMutableArray alloc] init]; + + // For the start and stop buttons we need to convert the button frame to the screen + // coord system when setting the accessibility frame. + + // start button + + UIAccessibilityElement *startElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; + startElement.accessibilityFrame = [self convertRect:self.startButton.frame toView:nil]; + startElement.accessibilityLabel = NSLocalizedString(@"Start", nil); + startElement.accessibilityTraits = UIAccessibilityTraitButton; + if (self.startButton.enabled == NO) startElement.accessibilityTraits |= UIAccessibilityTraitNotEnabled; + + [_accessibleElements addObject:startElement]; + + // The accessibilityFrame is returned in screen coordinates so it is first + // converted from screen to the local view coord system. + // The counter element frame is then calculated and then converted back + // to the screen coordinate system when setting the accessibility frame. + + CGRect frame = [self convertRect:self.accessibilityFrame fromView:nil]; + + UIAccessibilityElement *counterElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; + CGRect textFrame = CGRectInset(frame, UYLCOUNTERVIEW_MARGIN + self.startButton.bounds.size.width + UYLCOUNTERVIEW_MARGIN, UYLCOUNTERVIEW_MARGIN); + counterElement.accessibilityFrame = [self convertRect:textFrame toView:nil]; + counterElement.accessibilityLabel = NSLocalizedString(@"Duration", nil); + counterElement.accessibilityValue = [[NSNumber numberWithInteger:self.secondsCounter] stringValueAsTime]; + counterElement.accessibilityTraits = UIAccessibilityTraitUpdatesFrequently; + + [_accessibleElements addObject:counterElement]; + + // stop button + + UIAccessibilityElement *stopElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; + stopElement.accessibilityFrame = [self convertRect:self.stopButton.frame toView:nil]; + stopElement.accessibilityLabel = NSLocalizedString(@"Stop", nil); + stopElement.accessibilityTraits = UIAccessibilityTraitButton; + if (self.stopButton.enabled == NO) stopElement.accessibilityTraits |= UIAccessibilityTraitNotEnabled; + + [_accessibleElements addObject:stopElement]; + + return _accessibleElements; +} + +- (BOOL)isAccessibilityElement +{ + return NO; +} + +- (NSInteger)accessibilityElementCount +{ + return [[self accessibleElements] count]; +} + +- (id)accessibilityElementAtIndex:(NSInteger)index +{ + return [[self accessibleElements] objectAtIndex:index]; +} + +- (NSInteger)indexOfAccessibilityElement:(id)element +{ + return [[self accessibleElements] indexOfObject:element]; +} + +#pragma mark - +#pragma mark === Private methods === +#pragma mark - + +- (void)setupView +{ + UIImage *startImage = [UIImage imageNamed:@"start.png"]; + UIImage *stopImage = [UIImage imageNamed:@"stop.png"]; + + CGRect startFrame = CGRectMake(UYLCOUNTERVIEW_MARGIN, (self.bounds.size.height - startImage.size.height)/2, + startImage.size.height, startImage.size.width); + CGRect stopFrame = CGRectMake(self.bounds.size.width - UYLCOUNTERVIEW_MARGIN - stopImage.size.width, + (self.bounds.size.height - stopImage.size.height)/2, + stopImage.size.height, stopImage.size.width); + + self.startButton = [[UIButton alloc] initWithFrame:startFrame]; + self.stopButton = [[UIButton alloc] initWithFrame:stopFrame]; + + self.startButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; + self.stopButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + + [self.startButton setImage:startImage forState:UIControlStateNormal]; + [self.stopButton setImage:stopImage forState:UIControlStateNormal]; + + [self.startButton addTarget:self action:@selector(startAction:) forControlEvents:UIControlEventTouchUpInside]; + [self.stopButton addTarget:self action:@selector(stopAction:) forControlEvents:UIControlEventTouchUpInside]; + + self.startButton.enabled = NO; + self.stopButton.enabled = NO; + + [self addSubview:self.startButton]; + [self addSubview:self.stopButton]; +} + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLTaskListViewController.h b/Archive/TaskTimer/TaskTimer/UYLTaskListViewController.h new file mode 100644 index 0000000..53127fa --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLTaskListViewController.h @@ -0,0 +1,43 @@ +// +// UYLMasterViewController.h +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import +#import +#import "UYLTaskViewController.h" + +@interface UYLTaskListViewController : UITableViewController + +@property (strong, nonatomic) UYLTaskViewController *detailViewController; +@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; +@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLTaskListViewController.m b/Archive/TaskTimer/TaskTimer/UYLTaskListViewController.m new file mode 100644 index 0000000..0505d63 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLTaskListViewController.m @@ -0,0 +1,247 @@ +// +// UYLMasterViewController.m +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLTaskListViewController.h" +#import "Task.h" +#import "NSNumber+UYLTimeFormatter.h" + +@interface UYLTaskListViewController () +- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath; +@end + +@implementation UYLTaskListViewController + +@synthesize detailViewController = _detailViewController; +@synthesize fetchedResultsController = __fetchedResultsController; +@synthesize managedObjectContext = __managedObjectContext; + +#pragma mark - +#pragma mark === View Life Cycle Management === +#pragma mark - + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) + { + self.title = NSLocalizedString(@"Task List", nil); + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) + { + self.clearsSelectionOnViewWillAppear = NO; + self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); + } + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + self.navigationItem.leftBarButtonItem = self.editButtonItem; + + UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)]; + self.navigationItem.rightBarButtonItem = addButton; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +#pragma mark - +#pragma mark === Table View Data Source Delegate Methods === +#pragma mark - + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return [[self.fetchedResultsController sections] count]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; + return [sectionInfo numberOfObjects]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *CellIdentifier = @"Cell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) + { + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + } + } + + [self configureCell:cell atIndexPath:indexPath]; + return cell; +} + +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath +{ + return YES; +} + +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (editingStyle == UITableViewCellEditingStyleDelete) + { + Task *task = [[self fetchedResultsController] objectAtIndexPath:indexPath]; + if ([self.detailViewController.task isEqual:task]) + { + self.detailViewController.task = nil; + } + + NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; + [context deleteObject:task]; + + NSError *error = nil; + if (![context save:&error]) + { + NSLog(@"Unresolved error %@, %@", error, [error userInfo]); + } + } +} + +#pragma mark - +#pragma mark === Table View Delegate Methods === +#pragma mark - + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + Task *task = [[self fetchedResultsController] objectAtIndexPath:indexPath]; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) + { + UYLTaskViewController *detailViewController = [[UYLTaskViewController alloc] initWithNibName:@"UYLTaskViewController_iPhone" + bundle:nil]; + detailViewController.task = task; + [self.navigationController pushViewController:detailViewController animated:YES]; + } + else + { + self.detailViewController.task = task; + } +} + +#pragma mark - +#pragma mark === Fetched Results Controller === +#pragma mark - + +- (NSFetchedResultsController *)fetchedResultsController +{ + if (__fetchedResultsController != nil) + { + return __fetchedResultsController; + } + + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription entityForName:@"Task" inManagedObjectContext:self.managedObjectContext]; + [fetchRequest setEntity:entity]; + [fetchRequest setFetchBatchSize:20]; + + NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO]; + NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; + [fetchRequest setSortDescriptors:sortDescriptors]; + + NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest + managedObjectContext:self.managedObjectContext + sectionNameKeyPath:nil + cacheName:@"Todo"]; + frc.delegate = self; + self.fetchedResultsController = frc; + + NSError *error = nil; + if (![self.fetchedResultsController performFetch:&error]) + { + NSLog(@"Unresolved error %@, %@", error, [error userInfo]); + } + + return __fetchedResultsController; +} + + - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller +{ + [self.tableView reloadData]; +} + +#pragma mark - +#pragma mark === Action methods === +#pragma mark - + +- (void)insertNewObject:(id)sender +{ + NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; + NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; + Task *task = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; + + task.note = @"New Task"; + task.createdAt = [NSDate date]; + + NSError *error = nil; + if (![context save:&error]) + { + NSLog(@"Unresolved error %@, %@", error, [error userInfo]); + } +} + +#pragma mark - +#pragma mark === Private methods === +#pragma mark - + +- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath +{ + Task *task = [self.fetchedResultsController objectAtIndexPath:indexPath]; + cell.textLabel.text = task.note; + cell.detailTextLabel.text = nil; + cell.imageView.image = [UIImage imageNamed:@"unchecked.png"]; + cell.accessibilityLabel = task.note; + + if ([task.complete boolValue]) + { + NSUInteger minutes = [task.duration integerValue] / 60; + NSUInteger seconds = [task.duration integerValue] % 60; + + cell.detailTextLabel.text = [NSString stringWithFormat:@"%02u:%02u", minutes, seconds]; + cell.imageView.image = [UIImage imageNamed:@"checked.png"]; + + NSString *durationText = [NSString stringWithFormat:@"%@ %@",task.note, + NSLocalizedString(@"completed in", nil)]; + durationText = [durationText stringByAppendingString:[task.duration stringValueAsTime]]; + cell.accessibilityLabel = durationText; + } +} + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLTaskViewController.h b/Archive/TaskTimer/TaskTimer/UYLTaskViewController.h new file mode 100644 index 0000000..e73c2be --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLTaskViewController.h @@ -0,0 +1,43 @@ +// +// UYLDetailViewController.h +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import +#import "Task.h" +#import "UYLCounterView.h" + +@interface UYLTaskViewController : UIViewController + +@property (strong, nonatomic) Task *task; +@property (weak, nonatomic) IBOutlet UITextField *taskNote; +@property (weak, nonatomic) IBOutlet UYLCounterView *taskCounterView; + +@end diff --git a/Archive/TaskTimer/TaskTimer/UYLTaskViewController.m b/Archive/TaskTimer/TaskTimer/UYLTaskViewController.m new file mode 100644 index 0000000..e956ad2 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer/UYLTaskViewController.m @@ -0,0 +1,299 @@ +// +// UYLDetailViewController.m +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2012 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: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of Keith Harrison nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#import "UYLTaskViewController.h" + +@interface UYLTaskViewController () + +@property (assign, nonatomic) BOOL running; +@property (strong, nonatomic) NSTimer *taskTimer; +@property (strong, nonatomic) UIPopoverController *masterPopoverController; +@property (weak, nonatomic) IBOutlet UIButton *taskResetButton; + +- (void)configureView; +- (void)saveContext; +- (IBAction)taskResetAction; +- (void)voiceOverStatusChanged; + +@end + +@implementation UYLTaskViewController + +@synthesize task=_task; +@synthesize taskNote=_taskNote; +@synthesize taskCounterView=_taskCounterView; +@synthesize taskResetButton=_taskResetButton; +@synthesize running=_running; +@synthesize taskTimer=_taskTimer; +@synthesize masterPopoverController = _masterPopoverController; + +#pragma mark - +#pragma mark === Accessors === +#pragma mark - + +- (void)setTask:(Task *)newTask +{ + if (_task != newTask) + { + _task = newTask; + + self.running = NO; + self.taskTimer = nil; + + // Update the view. + [self configureView]; + } + + if (self.masterPopoverController != nil) { + [self.masterPopoverController dismissPopoverAnimated:YES]; + } +} + +- (void)setTaskTimer:(NSTimer *)taskTimer +{ + [_taskTimer invalidate]; + _taskTimer = taskTimer; +} + +#pragma mark - +#pragma mark === View Life Cycle Management === +#pragma mark - + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) + { + self.title = NSLocalizedString(@"Task", nil); + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + self.taskCounterView.delegate = self; + [self configureView]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(voiceOverStatusChanged) + name:UIAccessibilityVoiceOverStatusChanged + object:nil]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + self.taskTimer = nil; + [self saveContext]; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)viewWillAppear:(BOOL)animated +{ + [self becomeFirstResponder]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + self.taskTimer = nil; + [self saveContext]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation +{ + // The accessibility elements should be recalculated when the orientation changes + self.taskCounterView.accessibleElements = nil; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - +#pragma mark === Split View Delegate methods === +#pragma mark - + +- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { + return NO; +} + +- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController +{ + barButtonItem.title = NSLocalizedString(@"Task List", nil); + [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; + self.masterPopoverController = popoverController; +} + +- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem +{ + // Called when the view is shown again in the split view, invalidating the button and popover controller. + [self.navigationItem setLeftBarButtonItem:nil animated:YES]; + self.masterPopoverController = nil; +} + +#pragma mark - +#pragma mark === Text delegate methods === +#pragma mark - + +- (BOOL)textFieldShouldReturn:(UITextField *)textField +{ + if (self.task) + { + self.task.note = textField.text; + } + [textField resignFirstResponder]; + return YES; +} + +#pragma mark - +#pragma mark === UIResponder Respond to motion events === +#pragma mark - + +- (BOOL)canBecomeFirstResponder +{ + return YES; +} + +- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event +{ + [self taskResetAction]; +} + +#pragma mark - +#pragma mark === UYLCounterViewDelegate methods === +#pragma mark - + +- (void)didStartCounter +{ + self.running = YES; + + // Create a timer that fires every second. + NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 + target:self + selector:@selector(timerTick:) + userInfo:nil + repeats:YES]; + self.taskTimer = timer; +} + +- (void)didStopCounter +{ + if (self.task) + { + self.task.complete = [NSNumber numberWithBool:YES]; + } + + self.running = NO; + self.taskTimer = nil; + [self saveContext]; +} + +- (void)timerTick:(NSTimer *)timer +{ + if (self.running && self.task) + { + NSUInteger duration = [self.task.duration integerValue]; + duration++; + + self.task.duration = [NSNumber numberWithInteger:duration]; + self.taskCounterView.secondsCounter = duration; + } +} + +#pragma mark - +#pragma mark === Private methods === +#pragma mark - + +- (void)configureView +{ + NSInteger duration = 0; + self.taskNote.enabled = NO; + self.taskCounterView.counterEnabled = NO; + self.taskNote.text = nil; + + if (self.task) + { + self.taskNote.enabled = YES; + self.taskNote.text = self.task.note; + duration = [self.task.duration integerValue]; + if ([self.task.complete boolValue] == NO) + { + self.taskCounterView.counterEnabled = YES; + } + } + self.taskCounterView.secondsCounter = duration; + self.taskResetButton.hidden = ! UIAccessibilityIsVoiceOverRunning(); +} + +- (void)saveContext +{ + NSError *error = nil; + NSManagedObjectContext *managedObjectContext = [self.task managedObjectContext]; + if (managedObjectContext != nil) + { + if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) + { + NSLog(@"Unresolved error %@, %@", error, [error userInfo]); + } + } +} + +- (IBAction)taskResetAction +{ + if (self.task) + { + self.running = NO; + self.taskTimer = nil; + + self.task.duration = [NSNumber numberWithInteger:0]; + self.task.complete = [NSNumber numberWithBool:NO]; + + self.taskCounterView.secondsCounter = 0; + self.taskCounterView.counterEnabled = YES; + } +} + +- (void)voiceOverStatusChanged +{ + self.taskResetButton.hidden = ! UIAccessibilityIsVoiceOverRunning(); +} + +@end diff --git a/Archive/TaskTimer/TaskTimer/checked.png b/Archive/TaskTimer/TaskTimer/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..df7084dc9f6845b1f42013f2118460dae4ede262 GIT binary patch literal 1790 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 v8_LW}d5@_B&>Vo3r&8}hSX40 + +#import "UYLAppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([UYLAppDelegate class])); + } +} diff --git a/Archive/TaskTimer/TaskTimer/redbutton.png b/Archive/TaskTimer/TaskTimer/redbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..5b99cd97c28a264f388e15a67e9723bfa10d3553 GIT binary patch literal 2242 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 literal 0 HcmV?d00001 diff --git a/Archive/TaskTimer/TaskTimer/start@2x.png b/Archive/TaskTimer/TaskTimer/start@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2bc5218486b53ea67ef7dc4eda6cbdf5478397 GIT binary patch literal 2864 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 literal 0 HcmV?d00001 diff --git a/Archive/TaskTimer/TaskTimer/stop.png b/Archive/TaskTimer/TaskTimer/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..25d1c1102f34992286c860186f1b876cc41ea1a4 GIT binary patch literal 2173 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 ZhiF@Y8|3ijF6*673}tC&QDNp2`yaCT6f*z- literal 0 HcmV?d00001 diff --git a/Archive/TaskTimer/TaskTimer/unchecked.png b/Archive/TaskTimer/TaskTimer/unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f88e126a1d92060e63e0b9e807e71fe494a30e GIT binary patch literal 1536 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)xihVE&Nl>>S|f?5q$_l%JNFlghxL zF|jxFZvO2M5&O>km?dKN3pV!giFU6K4UXO^Ew%O-o9E=EFP)@zp1q;9VEBTyyC%o=Ipm#|1T~LTe+NBWu8+`xNWW6$ION)E3Mb@E8KJY`9br(Z z(0BMWb5`||LqAWNi@gqhuW+w(N7j$ll>z%Q&Q4L=ky})G&TduPoa|lZUAE2Qg7;Tl zcAEHH*esy+FYGsXr|a`9s!r_nV%2x<1@|u>JKa$&Q2*lAE0*(-5zErz zp8jjq?u+Lu7PzLnIpm35r_0_2#~j{WUw&+duH}Qribc^zvBrHOPX8t)vu*C!Iq`Fz z^V*g<(z9ltF1CMSw^eK5`77&IO-tP?>rx}pr)shw;V{oTtB4JZMk^+?^X!u?2n=Rs z_L&lJC1{F7=ki3p)VGyS8x9v9nZdi}`b<-|%<~Tg-?hlhE)i~hbNso2<|OBo89fa? z_f+yH9#-kTBv@2%d7Di4`J}ryzkIecxuE@6w)xD?d2aC{@7Gjcy0E_f%XhKt-xKF# zYR|7=KX90D%M9j^zt-#h-Jtzxqm$mA>dmiT3HjKp+`sbn%CA?r-mPA_wPWHh+pTT; zLp_r7(k5KAv2&ZyE`C}e?r>^N&4q&h%#~$5+f|d!T3r{;j8K2UzO-G{;BS&JmsbDvEJk8iTPJ_c|DUa$z6GK&t`kYo(f&IIS2M$z4~pV#rmcw zWX@! z_Olh7{39O8P*`z9z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLj>|?L9+q}oPwjafLBZ?k;uzx5`S#jIUIqmo=7Z)*|EKyM zWpik>o2otkj;h1Xn#X1g2IU#EFF*C<>YvsD0XFW3^z|HE&z~{PI!uxCyrcRThvmzv{dUFZG3gy^ zb-#8vUh&{PbM{-W{}-2rtz6EmGS4X|+_qNkV`jsYmDcO{74EtH{GfT?@y@YR0cujmq_3Pe^7xo*x)Ae~4RVVg(vFbbbg8P?`o$ja>sDE+m70da^h-GPU zPye-Q_r>!S3tZFP9P-4j(`E01V-D}GFF&?J*Yd$*#iD4VSmQnsr+<@@**16VocKA< zd2P!a=~=T+7u!Fv+p4wj{FQa9rlszcb*Yi)Q#DzTaG2+vRm28HqZJd{dG^T`1O_uR z`%DSA5;R4kb9o|P>f6ev4TlSl%-~&feWs~f=J|($?^9V zwdYr`A2`gnWd`%dU+eY$ZqWX;(MfMl_2$>FgnVpP?q7L(<<~1*?^dte+A;B$?bf#a zp&rS3X%jBm*ttz;7eB2KcR01C=0d@L=E}03?W##isG9 zQ$?S0KiyMQ9zFebndgs?A7MWNfB5}~`yrX~a8g0!56>M+HOetPbFV&rp8WYub5-4nJa0`PlBg3pY5)2HCd6^**B@w}FfdWk9d zNvV1jxdlMg3=B3ERzPNMYDuC(MQ%=Bu~mhw5?F;5kPQ;nS5g2gDap1~itr6kaLzAE zRWQ*r(KAr8<5EyiuqjGOvkG!?gK7uzY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>l zjf`}GDs+o0^GXscbn}XpA%?)raY-#sF3Kz@$;{7F0GXSZlwVq6tE2?72o50bOi6~@ zQ&3uz1GXh4SwA%=H8(Y{q*&ij&rlz3I8d)mO0rdPX;M~datYYoaO1!pa7s+qM-sNt z$5d^j4{{Nb3nAVIivs;`$7Q1r4@*0)r}n&#z~HU-ba4#HXncEXFIR&B55q&3n*ZT_ zlY?YjU#Q;MUi$jt{H13*R!BU!VcWRBhtu-9W9ZX$oi!6@p5G|3S*h)Ugi|s{uc8S7 z#^$yy|137NZK;}7C%toPlyQsN;-9&t(wmi%o%CD}uqUT|UX=ohYEM@`mvv4FO#sIH BxwZfR literal 0 HcmV?d00001 diff --git a/StaticTable/StaticTable/UYLFirstViewController.xib b/StaticTable/StaticTable/UYLFirstViewController.xib deleted file mode 100644 index 5df5285..0000000 --- a/StaticTable/StaticTable/UYLFirstViewController.xib +++ /dev/null @@ -1,223 +0,0 @@ - - - - 1296 - 11D50 - 2182 - 1138.32 - 568.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUIView - IBUILabel - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 298 - {{20, 155}, {280, 21}} - - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - First View Controller - - 1 - MCAwIDAAA - - - 0 - 10 - 1 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - {{0, 64}, {320, 367}} - - - - - 10 - - 549453824 - {512, 1} - - - - - - TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA -AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA -AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI -AAgACAAIAAEAAQABAAE - - - - - - 3 - MCAwAA - - - groupTableViewBackgroundColor - - - - NO - - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - - - 0 - - - - - - 1 - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 5 - - - - - - - UYLFirstViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 5 - - - - - UYLFirstViewController - UIViewController - - IBProjectSource - ./Classes/UYLFirstViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - From ae53a069fe33df7fd13eeb2ad8ba88bb2f882e95 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 17:30:20 +0000 Subject: [PATCH 128/142] Remove archived projects --- Styles/README | 71 --- Styles/Styles.xcodeproj/project.pbxproj | 401 -------------- Styles/Styles/MainStoryboard.storyboard | 501 ------------------ .../Resources/back-button-landscape.png | Bin 838 -> 0 bytes .../Resources/back-button-landscape@2x.png | Bin 2005 -> 0 bytes Styles/Styles/Resources/back-button.png | Bin 1012 -> 0 bytes Styles/Styles/Resources/back-button@2x.png | Bin 2384 -> 0 bytes Styles/Styles/Resources/divider.png | Bin 72 -> 0 bytes Styles/Styles/Resources/divider@2x.png | Bin 75 -> 0 bytes Styles/Styles/Resources/green-button.png | Bin 2305 -> 0 bytes Styles/Styles/Resources/green-button@2x.png | Bin 7044 -> 0 bytes Styles/Styles/Resources/navbar-landscape.png | Bin 1631 -> 0 bytes .../Styles/Resources/navbar-landscape@2x.png | Bin 4652 -> 0 bytes Styles/Styles/Resources/navbar.png | Bin 2009 -> 0 bytes Styles/Styles/Resources/navbar@2x.png | Bin 6321 -> 0 bytes Styles/Styles/Resources/orange-button.png | Bin 2111 -> 0 bytes Styles/Styles/Resources/orange-button@2x.png | Bin 7016 -> 0 bytes Styles/Styles/Resources/orange.png | Bin 82 -> 0 bytes Styles/Styles/Resources/orange@2x.png | Bin 78 -> 0 bytes Styles/Styles/Resources/red-button.png | Bin 2039 -> 0 bytes Styles/Styles/Resources/red-button@2x.png | Bin 6696 -> 0 bytes Styles/Styles/Resources/steel-button.png | Bin 2562 -> 0 bytes Styles/Styles/Resources/steel-button@2x.png | Bin 8079 -> 0 bytes Styles/Styles/Styles-Info.plist | 41 -- Styles/Styles/Styles-Prefix.pch | 14 - Styles/Styles/UYLAppDelegate.h | 39 -- Styles/Styles/UYLAppDelegate.m | 46 -- Styles/Styles/UYLListViewController.h | 38 -- Styles/Styles/UYLListViewController.m | 45 -- Styles/Styles/UYLOkButton.h | 36 -- Styles/Styles/UYLOkButton.m | 36 -- Styles/Styles/UYLResetButton.h | 36 -- Styles/Styles/UYLResetButton.m | 36 -- Styles/Styles/UYLRotatingViewController.h | 38 -- Styles/Styles/UYLRotatingViewController.m | 49 -- Styles/Styles/UYLStyleController.h | 39 -- Styles/Styles/UYLStyleController.m | 125 ----- Styles/Styles/UYLZeroButton.h | 36 -- Styles/Styles/UYLZeroButton.m | 36 -- Styles/Styles/en.lproj/InfoPlist.strings | 2 - Styles/Styles/main.m | 43 -- TaskTimer/README | 95 ---- TaskTimer/TaskTimer.xcodeproj/project.pbxproj | 444 ---------------- .../TaskTimer/NSNumber+UYLTimeFormatter.h | 39 -- .../TaskTimer/NSNumber+UYLTimeFormatter.m | 63 --- TaskTimer/TaskTimer/Task.h | 44 -- TaskTimer/TaskTimer/Task.m | 43 -- TaskTimer/TaskTimer/TaskTimer-Info.plist | 46 -- TaskTimer/TaskTimer/TaskTimer-Prefix.pch | 15 - .../TaskTimer.xcdatamodeld/.xccurrentversion | 8 - .../Accessibile.xcdatamodel/contents | 12 - TaskTimer/TaskTimer/UYLAppDelegate.h | 49 -- TaskTimer/TaskTimer/UYLAppDelegate.m | 164 ------ TaskTimer/TaskTimer/UYLCounterView.h | 51 -- TaskTimer/TaskTimer/UYLCounterView.m | 292 ---------- .../TaskTimer/UYLTaskListViewController.h | 43 -- .../TaskTimer/UYLTaskListViewController.m | 247 --------- TaskTimer/TaskTimer/UYLTaskViewController.h | 43 -- TaskTimer/TaskTimer/UYLTaskViewController.m | 299 ----------- TaskTimer/TaskTimer/checked.png | Bin 1790 -> 0 bytes TaskTimer/TaskTimer/checked@2x.png | Bin 2241 -> 0 bytes .../TaskTimer/en.lproj/InfoPlist.strings | 2 - .../UYLTaskListViewController_iPad.xib | 166 ------ .../UYLTaskListViewController_iPhone.xib | 143 ----- .../en.lproj/UYLTaskViewController_iPad.xib | 331 ------------ .../en.lproj/UYLTaskViewController_iPhone.xib | 334 ------------ TaskTimer/TaskTimer/main.m | 43 -- TaskTimer/TaskTimer/redbutton.png | Bin 2242 -> 0 bytes TaskTimer/TaskTimer/start.png | Bin 2182 -> 0 bytes TaskTimer/TaskTimer/start@2x.png | Bin 2864 -> 0 bytes TaskTimer/TaskTimer/stop.png | Bin 2173 -> 0 bytes TaskTimer/TaskTimer/stop@2x.png | Bin 2845 -> 0 bytes TaskTimer/TaskTimer/unchecked.png | Bin 1536 -> 0 bytes TaskTimer/TaskTimer/unchecked@2x.png | Bin 1603 -> 0 bytes 74 files changed, 4724 deletions(-) delete mode 100644 Styles/README delete mode 100644 Styles/Styles.xcodeproj/project.pbxproj delete mode 100644 Styles/Styles/MainStoryboard.storyboard delete mode 100644 Styles/Styles/Resources/back-button-landscape.png delete mode 100644 Styles/Styles/Resources/back-button-landscape@2x.png delete mode 100644 Styles/Styles/Resources/back-button.png delete mode 100644 Styles/Styles/Resources/back-button@2x.png delete mode 100644 Styles/Styles/Resources/divider.png delete mode 100644 Styles/Styles/Resources/divider@2x.png delete mode 100644 Styles/Styles/Resources/green-button.png delete mode 100644 Styles/Styles/Resources/green-button@2x.png delete mode 100644 Styles/Styles/Resources/navbar-landscape.png delete mode 100644 Styles/Styles/Resources/navbar-landscape@2x.png delete mode 100644 Styles/Styles/Resources/navbar.png delete mode 100644 Styles/Styles/Resources/navbar@2x.png delete mode 100644 Styles/Styles/Resources/orange-button.png delete mode 100644 Styles/Styles/Resources/orange-button@2x.png delete mode 100644 Styles/Styles/Resources/orange.png delete mode 100644 Styles/Styles/Resources/orange@2x.png delete mode 100644 Styles/Styles/Resources/red-button.png delete mode 100644 Styles/Styles/Resources/red-button@2x.png delete mode 100644 Styles/Styles/Resources/steel-button.png delete mode 100644 Styles/Styles/Resources/steel-button@2x.png delete mode 100644 Styles/Styles/Styles-Info.plist delete mode 100644 Styles/Styles/Styles-Prefix.pch delete mode 100644 Styles/Styles/UYLAppDelegate.h delete mode 100644 Styles/Styles/UYLAppDelegate.m delete mode 100644 Styles/Styles/UYLListViewController.h delete mode 100644 Styles/Styles/UYLListViewController.m delete mode 100644 Styles/Styles/UYLOkButton.h delete mode 100644 Styles/Styles/UYLOkButton.m delete mode 100644 Styles/Styles/UYLResetButton.h delete mode 100644 Styles/Styles/UYLResetButton.m delete mode 100644 Styles/Styles/UYLRotatingViewController.h delete mode 100644 Styles/Styles/UYLRotatingViewController.m delete mode 100644 Styles/Styles/UYLStyleController.h delete mode 100644 Styles/Styles/UYLStyleController.m delete mode 100644 Styles/Styles/UYLZeroButton.h delete mode 100644 Styles/Styles/UYLZeroButton.m delete mode 100644 Styles/Styles/en.lproj/InfoPlist.strings delete mode 100644 Styles/Styles/main.m delete mode 100644 TaskTimer/README delete mode 100644 TaskTimer/TaskTimer.xcodeproj/project.pbxproj delete mode 100644 TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h delete mode 100644 TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m delete mode 100644 TaskTimer/TaskTimer/Task.h delete mode 100644 TaskTimer/TaskTimer/Task.m delete mode 100644 TaskTimer/TaskTimer/TaskTimer-Info.plist delete mode 100644 TaskTimer/TaskTimer/TaskTimer-Prefix.pch delete mode 100644 TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion delete mode 100644 TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents delete mode 100644 TaskTimer/TaskTimer/UYLAppDelegate.h delete mode 100644 TaskTimer/TaskTimer/UYLAppDelegate.m delete mode 100644 TaskTimer/TaskTimer/UYLCounterView.h delete mode 100644 TaskTimer/TaskTimer/UYLCounterView.m delete mode 100644 TaskTimer/TaskTimer/UYLTaskListViewController.h delete mode 100644 TaskTimer/TaskTimer/UYLTaskListViewController.m delete mode 100644 TaskTimer/TaskTimer/UYLTaskViewController.h delete mode 100644 TaskTimer/TaskTimer/UYLTaskViewController.m delete mode 100644 TaskTimer/TaskTimer/checked.png delete mode 100644 TaskTimer/TaskTimer/checked@2x.png delete mode 100644 TaskTimer/TaskTimer/en.lproj/InfoPlist.strings delete mode 100644 TaskTimer/TaskTimer/en.lproj/UYLTaskListViewController_iPad.xib delete mode 100644 TaskTimer/TaskTimer/en.lproj/UYLTaskListViewController_iPhone.xib delete mode 100644 TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPad.xib delete mode 100644 TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPhone.xib delete mode 100644 TaskTimer/TaskTimer/main.m delete mode 100644 TaskTimer/TaskTimer/redbutton.png delete mode 100644 TaskTimer/TaskTimer/start.png delete mode 100644 TaskTimer/TaskTimer/start@2x.png delete mode 100644 TaskTimer/TaskTimer/stop.png delete mode 100644 TaskTimer/TaskTimer/stop@2x.png delete mode 100644 TaskTimer/TaskTimer/unchecked.png delete mode 100644 TaskTimer/TaskTimer/unchecked@2x.png diff --git a/Styles/README b/Styles/README deleted file mode 100644 index 463bf10..0000000 --- a/Styles/README +++ /dev/null @@ -1,71 +0,0 @@ -======================================================================= -Styles - -Version 1.0 24 August 2012 Initial Version -======================================================================= - -The Styles App is an example of how to use the UIAppearance protocol to -customise the appearance of common UIKit controls. - -For further details see: - -useyourloaf.com/blog/2012/08/24/using-appearance-proxy-to-style-apps.html - - -======================================================================= -App Delegate -======================================================================= - -UYLAppDelegate.h -UYLAppDelegate.m - -The App delegate is largely unmodified from the template code. The use of -a storyboard to configure and load the UI means there is not much for the -app delegate to do in this simple app other than setup the appearance. - -======================================================================= -Style Controller -======================================================================= - -The core of the appearance code is contained in the custom UYLStyleController -class. This class has a single public class method +applyStyle which -contains all of the UIAppearance related code. Refer to the blog post -for a full description. - -======================================================================= -Views -======================================================================= - -MainStoryboard.storyboard - -The storyboard file defines the user interface for the application. It -uses a navigation controller with a static table view as the root view -to list each of the UIKit control views. - -UYLOkButton.h -UYLOkButton.m -UYLResetButton.h -UYLResetButton.m -UYLZeroButton.h -UYLZeroButton.m - -These classes are UIButton sub-classes that do nothing other than define -a custom subclass used to allow the appearance of specific buttons to be -modified. - -======================================================================= -Controllers -======================================================================= - -UYLListViewController.h -UYLListViewController.m - -This is a subclass of UITableViewController used for the static table view -containing the list of UIKit controls. The only method that the subclass -actually contains is to enable interface rotation. - -UYLRotatingViewController.h -UYLRotatingViewController.m - -This is a container class used for all of the UIKit control views. The viewDidLoad method is used to set the view background. It also implements -the standard method to enable interface orientation. \ No newline at end of file diff --git a/Styles/Styles.xcodeproj/project.pbxproj b/Styles/Styles.xcodeproj/project.pbxproj deleted file mode 100644 index 26e39d7..0000000 --- a/Styles/Styles.xcodeproj/project.pbxproj +++ /dev/null @@ -1,401 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5305B53E15E6310900AC81F4 /* UYLZeroButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 5305B53D15E6310900AC81F4 /* UYLZeroButton.m */; }; - 5305B54615E6408500AC81F4 /* divider.png in Resources */ = {isa = PBXBuildFile; fileRef = 5305B54415E6408500AC81F4 /* divider.png */; }; - 5305B54715E6408500AC81F4 /* divider@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5305B54515E6408500AC81F4 /* divider@2x.png */; }; - 532F266715BDDF7A00321881 /* UYLRotatingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532F266615BDDF7A00321881 /* UYLRotatingViewController.m */; }; - 532F267915BDE44F00321881 /* UYLResetButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 532F267815BDE44F00321881 /* UYLResetButton.m */; }; - 532F267C15BDEAEB00321881 /* UYLStyleController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532F267B15BDEAEB00321881 /* UYLStyleController.m */; }; - 535734EA15B75876006F0E6A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 535734E915B75876006F0E6A /* UIKit.framework */; }; - 535734EC15B75876006F0E6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 535734EB15B75876006F0E6A /* Foundation.framework */; }; - 535734EE15B75876006F0E6A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 535734ED15B75876006F0E6A /* CoreGraphics.framework */; }; - 535734F415B75876006F0E6A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 535734F215B75876006F0E6A /* InfoPlist.strings */; }; - 535734F615B75877006F0E6A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 535734F515B75877006F0E6A /* main.m */; }; - 535734FA15B75878006F0E6A /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 535734F915B75878006F0E6A /* UYLAppDelegate.m */; }; - 5357350015B75878006F0E6A /* UYLListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 535734FF15B75878006F0E6A /* UYLListViewController.m */; }; - 5374A30A15B7698400B796D2 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5374A30915B7698400B796D2 /* MainStoryboard.storyboard */; }; - 53AA526415E56F7A000C8D04 /* green-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525615E56F7A000C8D04 /* green-button.png */; }; - 53AA526515E56F7A000C8D04 /* green-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525715E56F7A000C8D04 /* green-button@2x.png */; }; - 53AA526615E56F7A000C8D04 /* navbar-landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525815E56F7A000C8D04 /* navbar-landscape.png */; }; - 53AA526715E56F7A000C8D04 /* navbar-landscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525915E56F7A000C8D04 /* navbar-landscape@2x.png */; }; - 53AA526815E56F7A000C8D04 /* navbar.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525A15E56F7A000C8D04 /* navbar.png */; }; - 53AA526915E56F7A000C8D04 /* navbar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525B15E56F7A000C8D04 /* navbar@2x.png */; }; - 53AA526A15E56F7A000C8D04 /* orange-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525C15E56F7A000C8D04 /* orange-button.png */; }; - 53AA526B15E56F7A000C8D04 /* orange-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA525D15E56F7A000C8D04 /* orange-button@2x.png */; }; - 53AA526E15E56F7A000C8D04 /* red-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526015E56F7A000C8D04 /* red-button.png */; }; - 53AA526F15E56F7A000C8D04 /* red-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526115E56F7A000C8D04 /* red-button@2x.png */; }; - 53AA527015E56F7A000C8D04 /* steel-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526215E56F7A000C8D04 /* steel-button.png */; }; - 53AA527115E56F7A000C8D04 /* steel-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA526315E56F7A000C8D04 /* steel-button@2x.png */; }; - 53AA527715E57B0C000C8D04 /* back-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527615E57B0C000C8D04 /* back-button.png */; }; - 53AA527915E58E9B000C8D04 /* back-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527815E58E9B000C8D04 /* back-button@2x.png */; }; - 53AA527C15E591BF000C8D04 /* back-button-landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527A15E591BF000C8D04 /* back-button-landscape.png */; }; - 53AA527D15E591BF000C8D04 /* back-button-landscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53AA527B15E591BF000C8D04 /* back-button-landscape@2x.png */; }; - 53E2967015BF36C800D8AD2A /* UYLOkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E2966F15BF36C800D8AD2A /* UYLOkButton.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5305B53C15E6310900AC81F4 /* UYLZeroButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLZeroButton.h; sourceTree = ""; }; - 5305B53D15E6310900AC81F4 /* UYLZeroButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLZeroButton.m; sourceTree = ""; }; - 5305B54415E6408500AC81F4 /* divider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = divider.png; sourceTree = ""; }; - 5305B54515E6408500AC81F4 /* divider@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "divider@2x.png"; sourceTree = ""; }; - 532F266515BDDF7A00321881 /* UYLRotatingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLRotatingViewController.h; sourceTree = ""; }; - 532F266615BDDF7A00321881 /* UYLRotatingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLRotatingViewController.m; sourceTree = ""; }; - 532F267715BDE44F00321881 /* UYLResetButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLResetButton.h; sourceTree = ""; }; - 532F267815BDE44F00321881 /* UYLResetButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLResetButton.m; sourceTree = ""; }; - 532F267A15BDEAEA00321881 /* UYLStyleController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLStyleController.h; sourceTree = ""; }; - 532F267B15BDEAEB00321881 /* UYLStyleController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLStyleController.m; sourceTree = ""; }; - 535734E515B75876006F0E6A /* Styles.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Styles.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 535734E915B75876006F0E6A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 535734EB15B75876006F0E6A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 535734ED15B75876006F0E6A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 535734F115B75876006F0E6A /* Styles-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Styles-Info.plist"; sourceTree = ""; }; - 535734F315B75876006F0E6A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 535734F515B75877006F0E6A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 535734F715B75877006F0E6A /* Styles-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Styles-Prefix.pch"; sourceTree = ""; }; - 535734F815B75878006F0E6A /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; - 535734F915B75878006F0E6A /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; - 535734FE15B75878006F0E6A /* UYLListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLListViewController.h; sourceTree = ""; }; - 535734FF15B75878006F0E6A /* UYLListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLListViewController.m; sourceTree = ""; }; - 5374A30915B7698400B796D2 /* MainStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryboard.storyboard; sourceTree = ""; }; - 53AA525615E56F7A000C8D04 /* green-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "green-button.png"; sourceTree = ""; }; - 53AA525715E56F7A000C8D04 /* green-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "green-button@2x.png"; sourceTree = ""; }; - 53AA525815E56F7A000C8D04 /* navbar-landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navbar-landscape.png"; sourceTree = ""; }; - 53AA525915E56F7A000C8D04 /* navbar-landscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navbar-landscape@2x.png"; sourceTree = ""; }; - 53AA525A15E56F7A000C8D04 /* navbar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = navbar.png; sourceTree = ""; }; - 53AA525B15E56F7A000C8D04 /* navbar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navbar@2x.png"; sourceTree = ""; }; - 53AA525C15E56F7A000C8D04 /* orange-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "orange-button.png"; sourceTree = ""; }; - 53AA525D15E56F7A000C8D04 /* orange-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "orange-button@2x.png"; sourceTree = ""; }; - 53AA526015E56F7A000C8D04 /* red-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "red-button.png"; sourceTree = ""; }; - 53AA526115E56F7A000C8D04 /* red-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "red-button@2x.png"; sourceTree = ""; }; - 53AA526215E56F7A000C8D04 /* steel-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "steel-button.png"; sourceTree = ""; }; - 53AA526315E56F7A000C8D04 /* steel-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "steel-button@2x.png"; sourceTree = ""; }; - 53AA527615E57B0C000C8D04 /* back-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button.png"; sourceTree = ""; }; - 53AA527815E58E9B000C8D04 /* back-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button@2x.png"; sourceTree = ""; }; - 53AA527A15E591BF000C8D04 /* back-button-landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button-landscape.png"; sourceTree = ""; }; - 53AA527B15E591BF000C8D04 /* back-button-landscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back-button-landscape@2x.png"; sourceTree = ""; }; - 53E2966E15BF36C800D8AD2A /* UYLOkButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLOkButton.h; sourceTree = ""; }; - 53E2966F15BF36C800D8AD2A /* UYLOkButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLOkButton.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 535734E215B75876006F0E6A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 535734EA15B75876006F0E6A /* UIKit.framework in Frameworks */, - 535734EC15B75876006F0E6A /* Foundation.framework in Frameworks */, - 535734EE15B75876006F0E6A /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 535734DA15B75875006F0E6A = { - isa = PBXGroup; - children = ( - 535734EF15B75876006F0E6A /* Styles */, - 535734E815B75876006F0E6A /* Frameworks */, - 535734E615B75876006F0E6A /* Products */, - ); - sourceTree = ""; - }; - 535734E615B75876006F0E6A /* Products */ = { - isa = PBXGroup; - children = ( - 535734E515B75876006F0E6A /* Styles.app */, - ); - name = Products; - sourceTree = ""; - }; - 535734E815B75876006F0E6A /* Frameworks */ = { - isa = PBXGroup; - children = ( - 535734E915B75876006F0E6A /* UIKit.framework */, - 535734EB15B75876006F0E6A /* Foundation.framework */, - 535734ED15B75876006F0E6A /* CoreGraphics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 535734EF15B75876006F0E6A /* Styles */ = { - isa = PBXGroup; - children = ( - 53AA525515E56F7A000C8D04 /* Resources */, - 5357351115B75A9B006F0E6A /* Views */, - 5357351215B75AB6006F0E6A /* Controllers */, - 535734F815B75878006F0E6A /* UYLAppDelegate.h */, - 535734F915B75878006F0E6A /* UYLAppDelegate.m */, - 535734F015B75876006F0E6A /* Supporting Files */, - ); - path = Styles; - sourceTree = ""; - }; - 535734F015B75876006F0E6A /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 535734F115B75876006F0E6A /* Styles-Info.plist */, - 535734F215B75876006F0E6A /* InfoPlist.strings */, - 535734F515B75877006F0E6A /* main.m */, - 535734F715B75877006F0E6A /* Styles-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 5357351115B75A9B006F0E6A /* Views */ = { - isa = PBXGroup; - children = ( - 5374A30915B7698400B796D2 /* MainStoryboard.storyboard */, - 532F267715BDE44F00321881 /* UYLResetButton.h */, - 532F267815BDE44F00321881 /* UYLResetButton.m */, - 53E2966E15BF36C800D8AD2A /* UYLOkButton.h */, - 53E2966F15BF36C800D8AD2A /* UYLOkButton.m */, - 5305B53C15E6310900AC81F4 /* UYLZeroButton.h */, - 5305B53D15E6310900AC81F4 /* UYLZeroButton.m */, - ); - name = Views; - sourceTree = ""; - }; - 5357351215B75AB6006F0E6A /* Controllers */ = { - isa = PBXGroup; - children = ( - 535734FE15B75878006F0E6A /* UYLListViewController.h */, - 535734FF15B75878006F0E6A /* UYLListViewController.m */, - 532F266515BDDF7A00321881 /* UYLRotatingViewController.h */, - 532F266615BDDF7A00321881 /* UYLRotatingViewController.m */, - 532F267A15BDEAEA00321881 /* UYLStyleController.h */, - 532F267B15BDEAEB00321881 /* UYLStyleController.m */, - ); - name = Controllers; - sourceTree = ""; - }; - 53AA525515E56F7A000C8D04 /* Resources */ = { - isa = PBXGroup; - children = ( - 5305B54415E6408500AC81F4 /* divider.png */, - 5305B54515E6408500AC81F4 /* divider@2x.png */, - 53AA527A15E591BF000C8D04 /* back-button-landscape.png */, - 53AA527B15E591BF000C8D04 /* back-button-landscape@2x.png */, - 53AA527815E58E9B000C8D04 /* back-button@2x.png */, - 53AA527615E57B0C000C8D04 /* back-button.png */, - 53AA525615E56F7A000C8D04 /* green-button.png */, - 53AA525715E56F7A000C8D04 /* green-button@2x.png */, - 53AA525815E56F7A000C8D04 /* navbar-landscape.png */, - 53AA525915E56F7A000C8D04 /* navbar-landscape@2x.png */, - 53AA525A15E56F7A000C8D04 /* navbar.png */, - 53AA525B15E56F7A000C8D04 /* navbar@2x.png */, - 53AA525C15E56F7A000C8D04 /* orange-button.png */, - 53AA525D15E56F7A000C8D04 /* orange-button@2x.png */, - 53AA526015E56F7A000C8D04 /* red-button.png */, - 53AA526115E56F7A000C8D04 /* red-button@2x.png */, - 53AA526215E56F7A000C8D04 /* steel-button.png */, - 53AA526315E56F7A000C8D04 /* steel-button@2x.png */, - ); - path = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 535734E415B75876006F0E6A /* Styles */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5357350E15B75878006F0E6A /* Build configuration list for PBXNativeTarget "Styles" */; - buildPhases = ( - 535734E115B75876006F0E6A /* Sources */, - 535734E215B75876006F0E6A /* Frameworks */, - 535734E315B75876006F0E6A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Styles; - productName = Styles; - productReference = 535734E515B75876006F0E6A /* Styles.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 535734DC15B75875006F0E6A /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = UYL; - LastUpgradeCheck = 0430; - }; - buildConfigurationList = 535734DF15B75875006F0E6A /* Build configuration list for PBXProject "Styles" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 535734DA15B75875006F0E6A; - productRefGroup = 535734E615B75876006F0E6A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 535734E415B75876006F0E6A /* Styles */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 535734E315B75876006F0E6A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 535734F415B75876006F0E6A /* InfoPlist.strings in Resources */, - 5374A30A15B7698400B796D2 /* MainStoryboard.storyboard in Resources */, - 53AA526415E56F7A000C8D04 /* green-button.png in Resources */, - 53AA526515E56F7A000C8D04 /* green-button@2x.png in Resources */, - 53AA526615E56F7A000C8D04 /* navbar-landscape.png in Resources */, - 53AA526715E56F7A000C8D04 /* navbar-landscape@2x.png in Resources */, - 53AA526815E56F7A000C8D04 /* navbar.png in Resources */, - 53AA526915E56F7A000C8D04 /* navbar@2x.png in Resources */, - 53AA526A15E56F7A000C8D04 /* orange-button.png in Resources */, - 53AA526B15E56F7A000C8D04 /* orange-button@2x.png in Resources */, - 53AA526E15E56F7A000C8D04 /* red-button.png in Resources */, - 53AA526F15E56F7A000C8D04 /* red-button@2x.png in Resources */, - 53AA527015E56F7A000C8D04 /* steel-button.png in Resources */, - 53AA527115E56F7A000C8D04 /* steel-button@2x.png in Resources */, - 53AA527715E57B0C000C8D04 /* back-button.png in Resources */, - 53AA527915E58E9B000C8D04 /* back-button@2x.png in Resources */, - 53AA527C15E591BF000C8D04 /* back-button-landscape.png in Resources */, - 53AA527D15E591BF000C8D04 /* back-button-landscape@2x.png in Resources */, - 5305B54615E6408500AC81F4 /* divider.png in Resources */, - 5305B54715E6408500AC81F4 /* divider@2x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 535734E115B75876006F0E6A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 535734F615B75877006F0E6A /* main.m in Sources */, - 535734FA15B75878006F0E6A /* UYLAppDelegate.m in Sources */, - 5357350015B75878006F0E6A /* UYLListViewController.m in Sources */, - 532F266715BDDF7A00321881 /* UYLRotatingViewController.m in Sources */, - 532F267915BDE44F00321881 /* UYLResetButton.m in Sources */, - 532F267C15BDEAEB00321881 /* UYLStyleController.m in Sources */, - 53E2967015BF36C800D8AD2A /* UYLOkButton.m in Sources */, - 5305B53E15E6310900AC81F4 /* UYLZeroButton.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 535734F215B75876006F0E6A /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 535734F315B75876006F0E6A /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 5357350C15B75878006F0E6A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 5357350D15B75878006F0E6A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5357350F15B75878006F0E6A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Styles/Styles-Prefix.pch"; - INFOPLIST_FILE = "Styles/Styles-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 5357351015B75878006F0E6A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Styles/Styles-Prefix.pch"; - INFOPLIST_FILE = "Styles/Styles-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 535734DF15B75875006F0E6A /* Build configuration list for PBXProject "Styles" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5357350C15B75878006F0E6A /* Debug */, - 5357350D15B75878006F0E6A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5357350E15B75878006F0E6A /* Build configuration list for PBXNativeTarget "Styles" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5357350F15B75878006F0E6A /* Debug */, - 5357351015B75878006F0E6A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 535734DC15B75875006F0E6A /* Project object */; -} diff --git a/Styles/Styles/MainStoryboard.storyboard b/Styles/Styles/MainStoryboard.storyboard deleted file mode 100644 index 494f317..0000000 --- a/Styles/Styles/MainStoryboard.storyboard +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Styles/Styles/Resources/back-button-landscape.png b/Styles/Styles/Resources/back-button-landscape.png deleted file mode 100644 index 8e0731703b9bedb6b4aa886a77721002ed57742b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 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�(Efv9yxxarn-`$X#CnAmBL2>f=V zdDl}wUPEch7WfsS+aC-79?RwO0{J6m*Y+p6osDaPm9Rbuo=~Mg&+Z3ECp>6b)*G3= zfng`(8idT?cR252(cX*E#o&n$Ze4%p-JV{MIC^yU3Cqs@%yIj`Fm1lrl;BJU^s~`b zv5*i?6hPzVyVsZldLS>q{OUhSm2$(e?MH-RCg0BJ@5Nygz3aD|4Fh^8XV0E({bzCU zyUoV!@1fTO(S_ZCb#jP4W2Wy`RTAOD!_k0v1@uVv?%ms%oSghS2C&l*G-_Hla2g7& z%j*)o?nI!}N$?1P?=2h9V<9P*FJJyEk$0lqZrC-_roBfT9z*hhRgD~J2DT9!gdT6jR5-1W()+^z8ES{ON_YUCxpglM^ z_>;ERTo8nvyyX3QXgG^{&JpBiz*sdV#B(38mU86CkxfEa^O>AGC4?%CF?k;QQ6vV> z&S>2J@1g-~EUxQb1_-{{TE6`U-)n|7TIIB!!@#*7MlzZT>Nh3B1A$=}%mHhd3b?ei z^n2g;zm9(U7NEz8szzc%iS?ndfk2!BN$^CR0%^G))MzxOT{k-qs!NPL90%%t5E_dI zB9Ob(f2G0!+$tX}6Vb_RfB*A{krdWNXddAMVqLEZ0fN_TumjQ}^62b-+qO?nfZD2(9MwRqg~+A{Q=PxQ2)s3UG%oM88hz`sK%H5@>~_JDyPgCYT0N zbR6e9M0m#c+CCBSO%MUAehb9^?+gWmbH?a+gdhl*1XFlhytur){8QJ>Jx&1H)mJr= z9EE;Cf)9f^7j!&;bnw-5I)E=y+-I8RDa&>y!$8G+2a4VS(1r181^E8&3`nue&(HtO z^SrOgNc{zb;07ns18_6MXaC60St5805Q*r#0qGW!Tj#Tg_+tuMi$LM>M$UO!`5n%A zPr#g@bR9k8vFZE%uQ&x#{`Z2VQt34Sc)~O-Te}e$=0DH5N`(68Gr~3zow<1N;?wMa zb>M_brScX4Jg5#d3^S~LQCILBR=s*dh;1Q+BV|BVoEzzOfKG~eNs6x{;%)#yLwZ5Q zSb!>N@@F9D5eZX-gcL-yCFa}pdi|w?2M@MD%Kre!5YUJ)N+ovy0000zopr0GPiHEC2ui diff --git a/Styles/Styles/Resources/divider@2x.png b/Styles/Styles/Resources/divider@2x.png deleted file mode 100644 index ea104494b15a476cf7fb941850c286a367bea276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^Oh6pL0U`qqZhQo!ggjjwLo|YuJ(!u>0<)$pQe|b( X*?lQ-QDWf|pe%!@tDnm{r-UW|GYb+6 diff --git a/Styles/Styles/Resources/green-button.png b/Styles/Styles/Resources/green-button.png deleted file mode 100644 index 9c5fe4e20ac78868acbe04d94bb70fa88920bc65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 zcmV+c3I6tpP)2af>btMrzx>U|{n>Y)->?78uYPZzZ$8~T9?CF4 zm;n;jv<#U^V1^_Zhxa*O9{&4JzUyCn`Si^XzJLDihwrDq`TL)I_tyXe_&5Ljga7!= z=l9?Jt8aer)1Un2v#)>m$w!ZhCFo(95gR#7hQPC2voUjJ%?1e?FgV{oeEZewmp}O8 z|NZ*6zxeT&Pygw^|M<869tMB>iy!{gFaO1t|Kor9hadg)r{8@>+K@b8qA(kp22r+0 zF?dobo>9~02?C5KcTBcX^7zFMf9wDLqi=ul2j71F4}bsD@BaFM?>@hO`LBNUgP;Dv zx1S{e#5(SXP*l!QTr^#jI(KNG5WG%`QHtuCl zdSiV3n@_&`d|!Y0?*9Da*3bUOU;bd9zR+^-Q9M4}1M%P=R@kj2H& z=uRF_c`pC@mp|B-PxrHrcm3h-eLqT#a@dnz0vL*ij5`bjs8MEGwsFTev&KS{Hc4Q1 zkb7|R@%{Ynqd)wJAAP#HAc8m&F;m&5@8cmE!cZC7RGyobFx1IoB{QknGPtx^=>!{BX-k#{urMeD-CZ* zo97a2lBZ}oESe0=IS)JHVrEUE+0xJ>$D#zymb=H6!GTX7Zyq;YAjxCPTQ=OoI7|{Z zTUNrmnbYx%hJ#ld(1@Id%gjW%4XQ9O&%208}v zhOwn%!*cIqi{go+haD|@Idk}UG7YCojU7D<5+*j9^K!$iTv*nGiZOsvtc1#>JN9tN zxWkASE3}W3D_z3EcpWildT>#;5q8eN@ZOp6u*=0ZN+z*^I>SkufoTz(E1C}wMN-*2 z8;Kt6^gbq*UK#_C8c232+M^5EaMP2aM(JU9@|Y8h89_cExi`;%mO_)`W>2mxNKIwM zgJ{uc!1L0yaap)zEQw1^;u)8QQE_}Y9B^d~6P~5UaDEb;tL8E9YcjzduGZe)-#Y`UXVMmV((BoMu znnjy+Y@U1M6dMOGmU(bGHY$2-xuRL|B&;wMqcS7f;lPJbIu`A9#^rJD8BQ^23A;HM zmZwRCQ4`3bhS>D-NTcvfFB>-|jzZ@HiY|tz%$)3|Xe@S_Av3{oJDJID4wgr*0p^^? z0(Od>QBW_KD1LvG_uL*wCY?1X3Bdu%Q?dWW>^c!xuLh)QtL2<0}R zH=eVbb{Lq$6vhrC*`_ypj(3#A9&cx+2N&4L;qgEz#789ho)(LD+G8DHya{ghq~pf3 zIQEcuX){T@RQAw~9as@V(GJ6T#~KBF0CZ`w#{>7uV>=hykeS|do5g!fdTBg8#Op9d z@M3XOv?Ja{JSL|e8x;s2>fX!A;LV}Uip}DdmBUPn25iFQy)$F8xUuM=m;+}VZ5A)K z(P2DXQTHKl4~~WcYl6<1r#VA5c5s+CwsEs1>~biEZp2}-4Ty`4D^J|;Cdm8Yd}&b@ z=V7NX3L_aNcaJTFF(}sz6`Km&P!^VqJ8c$2u@P1-dT_pcEWf@_z!~BQE5L_b@1-W6xAFg1n!y*RMaG*FV0Wd0!?*!RdJ@Gu>%3v=J*C7Xz^= z9;p~L&oR4pO^L*Lg4u16a`#*p95BuMK z|L+)T3>X@_7!AQpTGpeT-NR0MDBCDCTS8`KL$qvoRrQ(jb@*dvD`<~wP zrk8L3==|zW`o-sO{S6G@C;#pFkH7ip{kyOKA3y!UKg{P}=Hts8CJeN3Y-|T=7}#=H zvC-rVz>qwEJm&o>Uw(gn^Dpzw&-%sh{eS+`ul}un4+DT7|6l&<{gJ=?^0hzv{>Q%l z@qe>Vzh&RE7crBpX%P$n7z!{z0NQx)@y);0$3Oe#;~RhX>DT_|pZ^zs4KM%z z`2GLtFYfW@edT98{;^uPMg b0093#-l(3VZ}h4{00000NkvXXu0mjfN28_V diff --git a/Styles/Styles/Resources/green-button@2x.png b/Styles/Styles/Resources/green-button@2x.png deleted file mode 100644 index b8354921c5ba2c0ceebd6bdeec3938d08f4b58fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7044 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 X-J)^t*ua&De;@Mk@N;i;4N3nmRY-Hg diff --git a/Styles/Styles/Resources/navbar-landscape.png b/Styles/Styles/Resources/navbar-landscape.png deleted file mode 100644 index 765fe756f0b1e581bae441756ff4a1f8aa34c42f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1631 zcmV-l2B7(gP)|{9VB)t9G_qm4h+Qq1WPIAaeI9S#iw@`{!V#a*SwaJi)PLx zTVPpL%Iuc!umf_WDr@LI7QyF$wPeszL1PU;G%eG#%=5f}YQ@AhO~M7P)kJ9v7aQ~k z=AM&;FgVAZE9X0x)VN8b;xi7zFbf#j5M4;!N~K)5 z5UEi>%103>NBn`5iX??lYyvFU1{)g(_!T|40s3Y|qgILEc<0T|yk{Rk8a7)j=JWZ2 zFc*Of&TKxLJtJoR^D}Bl(4fhJYB47vj_563jbKVbE3OzKkzCMXBLcCh@B35Vn<5cS zJsjV*Cz`IwvV3!MBT2HZ>ywG?`=00dQ_KMn3V2}JkdK)!O0-JZwr$sS zp&$25T@fWBomGXdd2ND8Q;sJ?{$O1w!GOfo}>-zfY z=Dl zG%Rvb03um*9}WkSEM>FVf9-pFdzTj%-KVZ;0VV(o<3OMH`~4n0-Fm&APNx&^0sZ=2 zz1!2j%H@it zwIPH@*uWYRm7?*p-99gzhuIGgKR^6ZhZquDGL3W;zOi-ktB0V!NK zNP@*9x_9^YM@L6t_Wk{RMOI!v7!7Da2DIpigRR&H7LM3<>?IJ=&3XmViVf(FKt+u( zJ9c>RI}q|0h_{!^V6~255J9ZhpW^YIogG>-Z-D;CcwB6Mazs|}tk+@`T~iT>vL#zV z!$N>JY(*p3-%)%EP*k<1swzmON~+5F{OP;@^V593D#Byq8KV_CdZ`x20g#BwQ_RCSVEz7DTs!Ci`0=O;pBvmDEi%OJu5Zq{mfH8Kg9688@eFT#}PnJ>soacEV zDDpz3C~_%iAW%G8r-A5YRDjQNy8^(h779=<+hb7;sfJzKi#CtM<_UOw5+NZ9i6WvZ zP&}G$tb(}U{RE>;ar3A;qq>38_<7rkvMhvXTUKE@sNh0Q|6nb>)@bEAv2$-P+9_(m(98TQt%W}GxjArpPp2f52bQ;IX zsaOoNa9s}y(qVKPIa5L?FgOL6`Pk2htFS3zLi9s19*+h3?`ATdSkfUenBb5&mM&z1 z0&0l&)8sO`ysT)99X~Ju{Iq$Z(eQ3`H&Uo5M#CXgfaJ0)4C$ag@^IZR7=iT?Y>4g} dyPzLt_6O87x~&Jh0ObGx002ovPDHLkV1l}>2~7Y1 diff --git a/Styles/Styles/Resources/navbar-landscape@2x.png b/Styles/Styles/Resources/navbar-landscape@2x.png deleted file mode 100644 index 6414039b00d9e5e97bc48b1d972cd96ed78fd2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4652 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 diff --git a/Styles/Styles/Resources/navbar.png b/Styles/Styles/Resources/navbar.png deleted file mode 100644 index 29c90298df11d229bfae67ec0e5641709886b48a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2009 zcmV;~2PXK5P)gH)|IaYYbJ3`sT=u?m&87f>5* z@1?cY_qwi?wEGIj`6I%~V4zRvMy`@1-Th5Zcmo zVATrYofb}+w?%qBpMPkI0TW2Dkp+<|PLzUF15U(gQ0yQb6EhTuuR5K|QkLc4S8~9T z1G11K$};p))KYE`$RUa(f(1x?+;?5q_wXJGb@x3y20#OWJr@EsX-X-i)&Ms_ge(IIF2eb2q{HEOI37<1Q2@cf zvy|hUZDmcFCntU(Dyer_O6Ai=+cR^LzBP#A6Y$6_Lh?nz&K@WD8jNc2J90N_?dB%BqZPdHFp-?bQBk+S>uSdoxq6MaiqY*_= zFhjJEZnxWLG!#WUIX)>A3zvrB`#~7?$STg`kkskk5<55!B=H0PtR!!2Y%DD;r5NdS z`rz=uzH$Qi0J3(mGDL@GK!|utxm5Z$esJhGPA3RDbi~Xnd7eLqN2BePO7h3m)zmBO z?d>^^i#PLw!1u5s>WLM=HmaK&4+pO$=wskl?tkrm6UfQVX!Zzkg+4!AXAC1zpro zY`D~Ds`h@|wrxcCK=;FB^7MOl^O`a}{!vT7K#o_#w_rbkREN737*4Eem{(<6a-1)qNe=@3~5p>QxFS@FO1k|#kX0zF~wU_ao&lK0-nkBGE zf2b(e?M8tZ2G9H7mqMC_1PGLr7BX$}g!@T`!&!|j%d(yPN&5u91{L-CeZHPQKY5<# zrf&WeMO9U|zJIKbmo^~nN5cD!9mtV$ob!{2xi+{LZ1PNK{A+d<%8`gw9uq=`e z0LPh+tli6xBSe;J$m{h&!D`#x@Vwo8k}w#%<;4_@ z*%+XS8#b?7ZxSN|T}a4?o9sow4&n;kv?!0jgzk4JMEfQg0Ah*j-wr|_oJg8%nevx5tOm|RDkZ3kY>NjR(>A8kFz+wHqyB`00000NkvXXu0mjfR8YoX diff --git a/Styles/Styles/Resources/navbar@2x.png b/Styles/Styles/Resources/navbar@2x.png deleted file mode 100644 index 6c7c2328d40c0e63f18726dbfd114bbc02275492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6321 zcmV;i7*6MjP)D4!?000>uii0lYXYO`0F@ZU$1+6=yv!FWhgSI?K-Z#j~2^W zsDyt;f>0e*5S(O0+@runxh0%9vT!U-c)t}Hns?{rv=wLht7fUIvRjoxxfb&Tc$l!k zSR)~U`}OM8wBs-a(*lx;D=Skf%fYtT>x%$=w7wi~>>eh;u?&+@kGv-lAs)T^FGQmT zPvE79=8#SX0sV%bJ3{H26^h)|VVtiT@0)bud8+v^kimBO1?Ok>3pj;re`M~haadL- zII9b?r8S)EGX_uK1o$Zhq!1FqEyA)O%r!*2EFMXU8B#*zDG1Su5f%~@X?`VGaV^Z0 z%4(4mW2hrMdykaiXWgPT(gM}UZ{q>GTgqERFcjR1WiX1WQItVx$G+qymzo?ET6i)> zr5oyk4@s7mceB$7w~FialeZ9qI3EEyBu3KaG zbKlRL%9tu)+XF>TGbG_OLh*eIV1@!XZvx~R$Ij_#*k^(Ow9|m=&4A_-tl`+|#u>8o z-%-Bno^#xD4DnMxN`=M~-bOUOhg$u&UA!RPDrq9waE;8#MpvP3cH3=c& zYW`yFg1R5xd*OJ5o?co}^o)gzlUehwNjklO5xMw@(~TGMPK=^@nMwg+f>%>PM*vq_ zr?j-p1ij*Fc02o?dp17U1>OR*gCj`hnAaD;LpCODMB6?>;@s`9I^+?tDN9R2YqQNJ zA-q|fB2{N=kr5?HP`do$cBi%%&pC9sXTw$jdENy89?b!ifE|25h?inemH?TvTSo}j z4cub+1BXT)>wBDFoy=+m)YEaC1J6pS+Qwy_5Lq-@&~44RaC8YAZzpWYr9>8B%`$H~ z0{O(j8T403VELv`L2?0pgd$V~&nPn>{a1p96Oiz)e$108T=s zKq^WoWf#FSDGmh{#p*2UV3idEW1Ma-a10kPdbmvVe%{-y_=Ip!{{X zG4KL)7(&3FkgyM8=J*e!fnCKM{hwZ3f=a+L36G7VM}}D|iylKpC4BkcoKMS|YLMBZ zrVe0{gOEXXP?os;XNy{pEC)eg?tjTqRLn89KTw;g8hi+JH(=@^+`KeqWiO7yo5)1G znHB;{PzdA!BUOfAMS>!GS*us={8@OVW8po*&<#)b_nQ)4B2$d4Mez3etNyo!x-+X} zPY>~y`(&PT@}%rCbyC#@pM~-^q9(@<5L0M5HTR0>ndEvRm9CpAV&cS`O>!QIy4F3+rE`6@jw@g2en2o zZtht+Hj=K6<628CGEW!dx7itf8)`K%uxiv__(Uuiuf2jrY}fulh8W~l2y<}9X0gLC zj7sOadgyKr$F%zwGk})YJaeV(RlRqMqZw$vw1B&n5)1tb-l)o-88~Cam~+MmT>Qa? zA}G*-BSNwfBto} zcZN8?4hE0-emEWyfK=;3Dif+Ssbo7qkX%9-LF|o|YgP#&YxScgv^^>y zSUK|Z-?OO=rrvN4UBtn9AeasPMjFa^Kr~{|)+><;+^r&IBfUr^NMJ zMhUHH^|8o(tk$D9ab!wq!+b&@sk&_2Mr&j?s^VX-_51Po{QUFr`{Nhmdb{1ezWzR+ z&vo4}ASoiNv&*mzGr#5_h)oImJvdX+DAsjdmgRoG&)4haa+&8D{qk>lt!sh-FC%Lk z1O0HZjqmiIvnpy$q=%yOYiAMdgCHU(Odov{t<=XY+n2V^LfIC|wzYNn_{_{CW-?~| zKYPwi7N5#iZ<2FQZsIu^G!BIP{&DgCx|dH-cJHAa3bdt^bdJ5OP+I1gdLUS69>_8}#dbSi6e?dX$K!Fg z+ikU4um*yovRvk>P>tX5nCLV2wOG z^n<_&uD@MZRlyHKjzT_=s1_DjC1Hu~LV&aeq9dAsvbC|+KK^*f&a?F6$g=at#|LX` z+ERs{QCb)ikw!`58a$G7%mkvqAv;^wKcAmRqfz>an9XMR;W<~c|5axSfD|E+LzSGs zBrPszZEkLEI-Slxt+59?wbt;C9+aplbg<*G5xUc94 zEHKH`0IcA4^S_!*Ch0MOTX%bVTj?suMm+<4E5tBaq7_qvVc9GxO-Z?N`}*?Q@Ar># z$NrbqN*hfRcAkKeq(Gh{skAXhYa|drWi)~nW?aUj7eN~E=;fHKte{Ad5f#?6Dwh8_ZW!KrmumDP#~HR&oSLnoRTF5Ygc$Xl zm9xy!)#L_TPt%ec?@2_&HZX4#kZY~g%bAu2FUtY8eBjJ{SmWKO<7FR(n#p?ywpASV zTf!kF6qsclj>5_uQSN<<4Q|-#FEr#_d$-DI{p_N~FoiTFFMvX;ScWm;5b&US!wa!x zY^VDOAUWYjtjcF4b`6MgRx$;y_#G9Gl-_)vc8F)b0emAqu&SWXinvx#maEBYUev48YY zTtS7l+B8j%kFV`^@xjZh{}s0~5zf}A9cRu^0dE{SG#TkF%Z13O%w{s6jacKf)eRS zNx~hF5OKEm*3Q>uX5`QzV7xD{_huy1;QU*(U_?O;pu$1s&V5|3*H4dNI-PcX?>Unz z=aNMX$}D#2&}&!mk`xP|I1FJvpFgCI`4G-o^h8w=E!fp++&#kpWK|3@whFiB;fy!! zovJUB$@}{zrIeizG2z88?5I^#Q6_qwFRq>@M)!T+-~X2hlly+}K2~ByS(R4IjgO<5 z909Iq?(8tQ38(MVa=FACm*9|bpqHs&ZE}y{r&y%{|A0!y}iBRuW-BFK0iNyetz24#yG}+5t|rV!_Rp#K`kRF z#u<8tgg4P}(J6k>arJ(rwBX15`};fotA*ErsK5SvEonaXgEnu|`O(yIAjgYa3ry zwzciO%lg`3Ck3g&tmrfCh@%6#Pj}rJ2MV=2GYqPZU129kC?FIpnP_=z@+;Pmvc!tu zF=OCT>jx@1J?#Y+pD)v;8D^}45>2Ou)R1t76BQ2!Wb@Z5V>TBA!!m14pNlumlQ3!*@TjtJi*N8PF zzy0c!Dd$oi4`9yup+Fm$%cErC0|+jlBqpS`z+fH;4#5>@75Vp(XhLp;-omR8UXbX)73x(>5Vg?Y7hDb}TWq;L9{jLJ#{WKz%%GDV8ZMdo)^i(Z5Vi z36{k$2+IAhkY=+v=m6sM`w|xvw7v1Z_l3m`*c*W=geqRR1lUu<({ORGOFnfk|GiNR zWEvIcN&;2^vn8p8m$(5d!q~DbM~Yt8q(+EbSb4U5m%Ep6+j02ziG%ka2Y< z%0d%h7J-pYEfYuy>6#OndU7)gW`tPavy9{tv|>p{jqlJ`{hj9Bkz4VcWF(WD+FE;U zImZKsJfU4E!7m7>Paf@5JL_$($;Jpk-!inH^sw+bMe&x3Uv;$Eii*EXCDks9AYa(V zoNLZ8#+r+6tVCwULBH0}n=p95s=q)a_T%*6xNgO$`=?x;A3)8Gg7NKBn zP2*K=Q`Dq{@-~W#zmhCkd!7f_GZ>hS{;29Gk#-~kP-+q`W2SaRrHMz}xj{oNwc*=M zM(@JuyGPV?Dql-Gc|Mgd(QhfIB}qc5xle00<-yp$}IC~L28pasQ(JYx;P*LKp)=bP2Z-Ie+3}(~Ah)P12bMBM-lq5`C zkX;fu;7!ZT*a?LM&eH?C7yo4(_RXpd-Ok{WmPk14(8lgKp?w>wdjhq3)7={wOC$>P z`HaF1A+KtL=3J@6LGoQo2qrR4PanXi`@j@#H{D>fLjr<{hUCErDyRpps5&?b1XX4r zd3tpdh9ZZ(1h$ojCn0~KA-c3l2N@P}WVT1*dQrl;w|;M0QpTZIph`W7Bcn1u&W#Vw8`BD) z>55I5PyX{j21pjdAPn{TR)5uY54_0>Em8=Oz>I%?hdEPDm~)U_kw#53-Za-UN)YXm zrhyhtD$iM7dsVGXyu}+M^tEx+{moY_DDmSl2XVh{n<-8&qg1`*bKw*I>vd4(TESo!}5t}vuBCfOM(6X}5 zbey?Utk-H8(3+GKVNwIdS*_!zLax_;M!$!IQTI&5_>tjoQuWUrkj7L>9z9AxPY7TK zlwB$s2n}4biY39m{Z0F2{p7@f{sNT$Dn0{NyqQL<&xbpl!E#?UF>Er<)WJ1 z1^sRtSu~U+gmM&=L^@{Cwo?}1t%OlUOu6gQ?X7FvWpwf@SlcP11ss>`zKD5uyB%%D zZZ)?+06B&T3DfGgge&9*gxxL!0={&O0B%h7&=al__Q5(wQ4kFeMQXstC1}likJj3m zrw-scuk+NIlisBUAm|ieAc8-m(xrk(Llls6qlJWlF&z~0s9>Lq=Sw66aLG&}B=Vi7 zUZ(qAmcn6@P5)Gn3wFdX3<7ib)i0;6V5+yR<0xPOR#rJrPtV&k{Z0$LTh&lCfPthl zcn_d%fS^b(v!ea~3YTP|&IS3JH%?;EXe}XBTR@3JZ7bbrM)x(1+4D()nROH6ou|8M zw}Z6`UW>*b4kZzR9#S-9>);kzEleA4`HReiTp^q@gp>}E^S?|nQaE-_z(i#~KY25N zZgB7v+ERHcySy^fMIhV9-N|W*`m|aixLul(BSgtbE?K)wjz5v~x`$ zG^_BNycBK#A-=qJJ&iEu(ma{5k5^?#Ap>BNsa2%e>Tw^<4k!2 zJAIUw%tTr4-6ghF)B@QI7%p!(L$VT2dDDw{B0itocfWqv%Ti#g+Nx+$TR@C4u`N#| zNa6j`)Kry9B3juP>cE1C)C4yvW%EC zs^&}?V2VXrL4=d^k;X)Lf0x+zh-he=6kwJ{ZNUy;C3t&a7N8v=n<5|pba~|AOq%CQyfI2gqGexIk#dI(aBWcjqI~)IK{Pp+e9kH9uFhHnjGv nK;TIlLyw@?@q}=7VDI~X#BRCtG;j-m00000NkvXXu0mjf3Tfi@ diff --git a/Styles/Styles/Resources/orange-button.png b/Styles/Styles/Resources/orange-button.png deleted file mode 100644 index 4a3680ed6b71e8194fcf6133d9ddeeecce51d883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2111 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 bfrlY#8t2#LqGx!33K%?H{an^LB{Ts5XW|of diff --git a/Styles/Styles/Resources/red-button.png b/Styles/Styles/Resources/red-button.png deleted file mode 100644 index 3a6ad7a2258e10a9b6cc77dc4d193ee5f74fd548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2039 zcmV9sW+e=3Ca?JJXMLXEe181> z=P&&1tKa)8fC2pSlfV9>x1ap_ldpdF%wGo6nEG`R-?b2@ibp^3y*$Kl$I^^3~U$_~$S3emJ~0XF^g~GG`7KpwSfJ9hI6h zH32d`TwL7dpT|Fan*Z~qufBDD^3BUn;ejvs@h@Nd>Nj7^jT-=@lDTo_@Loufxi~pF z6B+?-xskc?miN&(oE%zy^Wv8;Uwy%k;q~>Ge)Q#sAN=E|G-`$o5K2B|rR>@BHqIDabV&#WQXQuu(dmkqP7mtVtHd z9&V#NXo$m>;e9+0mGJ*IpXxjE!`JftfBIza;vqca9UcT&uGtuFQ;zBRq{TIIX*|ZemjXf0a03cyQX~P5~C}3>37-yK3FdV>O6!Cs= z^D#cv_g>@MH{P%z%Az5LV#CoU8Ip~TjUF6NbI~#+%pz>m?8%~wG3iKdjBmg2=`GhN z9)!^BNk>MILDOi64Y)8W0GY(YVsaow%@z=bxJ~->didf%+9(@`r*wGc;*p{P&<$+S zSm3bDq9G<{7A=NoEcS2>dGIdy;`Qb^99$ZVt8f4P$s; zHjKp`+b9`}hLGWoHWL6)4)AjH1&4;R!w8xd4Ka$A!A7y^p)wRbqZnJKM>csYDQJy~OP*+T(03KAA=Cd@63Mc61d3egboHp1lvH!5uw z2crSOfP^s$7=jU)cX{GKU=f&u(tw6C+-9Zd;njn<;nKryEZu+s#XyF}a1e}z7+o5` z+@g69JhKvNp5={4Lc^QKVL-!iqp)}a#v+Itp$KqNI2<=15Qe;iBsYw3SX?lf9$wIK z(O9$PVvUknF*M1=GY)QA7;*r(=8=OCmV;W1N9fk$G_AIo{YqhhjWY*{G>7 zmBx;MULsrs<{6dDmMhy>W-1NxajbaL!()mMfkxP2XbOvX59N8N)NCXnyl@xqhe5of zv6xZbvIsLoLu|szM|qGL-dHq}iSaff89t6}h{Gnqy^i-xr9l?rFbQi81a>6GT|BeK z@@^)ffQ*|2wiqE}B#Sl`ae2Rv&yRqp>4_i#ECSA01Y=n_BNUsY*bplX!_j7<6nki6 z6puN5e#LKJ5unA9nHY-;fC&Tv!B}H?m%#>3;Au{tK@MWiTnUchRo?ve^_j0f;eCK1 zNY5nC<}MpxQ><($W-8khLqTewapS;L3`QyTgke6(o3EeG^NYVYy+$}34p-c~!#I<< zqqumR@F9)26z}G6=9c#;t`zsqMQ=`u#vLbLl)pHAo?kpSKmQfK`EI=99pOgJ$8zP3 z_wkm)Mdpq-ig$z?7w_?Lxj1~pM_e2(&Ro24xVZRk{EFY){Cx1g_%Hu3|LK2>2iI(b z!Lq|>6wI@P#f{x;X`|Sz6b59JXB3TRa~R0t-^ZWjzy53f^8>$r{Or&3&A*B_$a|?= z2{#V!xVU)7H6P6#?{RULchlt^jd#3J$$a2#YCbM^d6)O`XYuFx=GTv(!2te_zy4Ex z@;~RRe~7Q~F#>?_jKi`aifx1^VF66VfI+koWahQ}Y4b0af0J+ik-z!3{3Q$k{yRVY z7yS5-`N4Pj&fl@$<1;=GY)&3?vM?ab5MclafNdr(yzs5~cl0ZM^MCpKU-Ps7z+V9j z0090QKl;QEUwr@JdtdPF@#VvV2Lk{A00000K)B=L4{v^ZeEq>MKJ)Yc$ln40{C^$~ V7KXqtuG|0s002ovPDHLkV1jyj&qe?M diff --git a/Styles/Styles/Resources/red-button@2x.png b/Styles/Styles/Resources/red-button@2x.png deleted file mode 100644 index e197a76c64b209b9ee86e7faeea5b9aa4fc88d80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6696 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 y?cA{Q!!GL|1$V z!lK2!rWO;LR3dmL;V?7I`MuBG>q=Vy0Kfa)?|$~^;iH!yKYsk|_4VU>$L!m)=K`zk zY8ygI5i}@(ph1z)3X)YZn00pc_-w7OF3vB$xVX6Zt^Q%_wz`Q*JnJo)6^_g{bg^>+Z$7X13xzy8(#e){R_FTVKV z-S2(x`=0*J({A0og(?IMfIy(2f`XtTim1{^&?+JTsE3ap`O9Da&!7JEKR*8b?=S!1 zyWf59jW^!-1*EOt{N^`r{`t>;{`Y_R=}+(e@P|JH5>zb^qXhz@h$@m$K%iO@+JFd( zB7_zy39X7h{_zh!_~3)fXP$ZHKYsr6pTD!<^78Vv7hZVb?sL!mz;x`6nK3guhuMdj znvR*88ArEv?7hv@-eb=;v+WtPYdU5|XG{;f+sv4bJ!9|Dj+rqtX11B_xgR{|$1nW& z?&am>YjF1b^Uwe6(@#JB*H>PC`NrRU>j@nU)6p5qv}UNGqlM}oP1R^it1Yc5Rnsa= zwRFa`T6DC`6g7>aQyo73_~UPW_St9ueY$#Z_44PRe}3nwZ-3hyLueyLu@VzBOr=mQ zE7(j(M+KEeQz;c$v?xn;g)$)}IF4Ft=^n**zWub%KmYvB)q|^-Psiiq*`NI6rJSFg z>~1Yf>>||xglQzCHDZcX(9%>y0RzGiv}0D-L8T1R=&CukW?AZVzP$9(OL=hh;MvpT z$B*wl`Q$w_TPLUyNwo|BAc4?o!T>^xj)cj{stpp9Jrj)3NfiSZX0#wNom2LwDw2=%@B$Q;Cne$USXAPaL z3C9+USlE!5)=G5(q=*V78M?@TmSjn3N=e2fQfd%XMUd3YB4ZV3dv@A;mSG=<3Mm%G zRzVv{jDo5(EKD^4G1^L^sm#!lsEUQ6nn($%Qkr0EW3Omy@4ZefGvj&>DqtiGAf<~8 z4Qa^eltxl55`iKWF)fLxb_7!GB9$VgG?7+AcFa`EiKeZYtu2L$MW_mFB%n$IqAH{! zS|}l+3Lr(OiltLo!Ki>hnMAwMoMy(%b{yA0m#ms@kdTR4q$mk(BvlAeGbGWlT16~c z70qCYsum+931}nPInp)3rtAWT`+lF*{8#FQj-2mtLuB}8?C(qPPt;?!1W z9LFJ|2#P^7?1jOS6bxDnL|PppTBNAmg-WA}l2EKIrH}|}=n^#@ZJpYh8MC*dh^knv zSxe>`(QIj0bjZRW1Z_bRt4t!jCW}^63nS99L#icc0(6s@U2UD(+TD)hFo{*FB(`A| zQ-S~{+R6q3395)VI%1(@Q-TcwbXcKCwXraXbaWruI*rjiuJ<8jR%EbhCa7ezNI(FT zL`z!DA|s_D9U#S0gC#|1Y8{Ny$g16lYGcnZ<7Bg^W^Yq+RI{vIL^Cvm46|yL1|qE{ zl-d$ZffWGh)4OEOwyNrzAbP0Umi)DkUHovp2t*35PsTZ&W@rWU#u4u*s#z(7a|DHW8U(ZE<} zsj)(bsHQZsVuqx42$VfT>(o|f?BgIo2@%sWLum-Kh@hgWw1kQ%jS3mTZUnGZgjB?| z><9#^4T;WZ>(thsI`$T&BvAzsLL14@sA^&jvnmZjsuN2I!YE=DLPkq0gQb+NY9pbI zg}p~xrx|9(9ET*PSZJj*2rMyLh=oIBj|o6fldwzBu$T!MMS|HRc3EL2(qWZ}9cISN zI5B3nW41uUrYfP(l0~V(5`drxNVsVTLscC50bg{bBVJnzKF$aPpTAEFng<&PC+9iu=)mEIw%(1s)wxsMqG^Mpt z$_{B&1l!HkrqB(kfCKq(Rciamwv6TUi*!_3x%4yB+HQg$LrgNi7MC<#!k>O@-25>=%U z(KXTnq9qBcP^ja$hObUZzPLUP$1y-?p{zwKqI;7FB-%qEidgO2#y(hLxCI zOH4;XXOU8}(17dXK)yIN{p9}TWuN-{ds#Wtlmc2Q6QbG(T0n=jq-?c9OBx5FBq*?B zFKTq6A*C4+O*s&{$NkI8KJm>bJ~^G`?4yf|i+_9Y@ZmRa-MFQxC7Q~_PGx8?OI9gu z1ZGHS9f^dX6J2GqQcZNwib!izER@h-Nb1qUM=s7Uu5y--($+73`OE*jb@SFgKJl$5 z1Qh^5L#8B}QY3<^G@6lFq?%9?lp?BVB2x)al`MmRO5^_hOAjAC`mcB2efOVEu-1D2 z%d0QHe|~zkTN$cQ4LwIzK--ot+s(5lUAW5|RO(kWjK}kQPC- zBMFMoY8HiBVs|?pA09pa+E-s)UEa8H#aAB<9O{jjvpPzap%tM zJ6UJ3vJgTZ+&H>FRVk{o!;vz5n*xZ@&YOwg3R$ zeDlqpwSBqmvomuq$?dimSZ!C5000000002AZIZzxdEEA^wbmC&K1uS?JMX;nTL6In Y2Sbo%1c++c7ytkO07*qoM6N<$f<=|Ji2wiq diff --git a/Styles/Styles/Resources/steel-button@2x.png b/Styles/Styles/Resources/steel-button@2x.png deleted file mode 100644 index 0afa6ac96b0e3a3f4c3af581320016d186fb7f41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8079 zcma)hc{JNwyMIj8Dx$4p9y%!6q7*TQR#7df4!5P{n58|9A%fHxZA}M3t7t?h4(dJL z8se&;C>0_^gSV0jK@fU~S%gS#&U^14zdwF=t-IIW`@8mc@3q&n_p_hz^ScMcMNURd z1^@uax!$;bSM>e6c^*9?>O(%gKLh}@AGlt>djGkY)GYP*9;%ET>@&h$iyvtX^lYbn_p@~Ve0x#8?F&0{YuXP74jI4_p9^Pn%KLyu^+X8it_Gaesk z%w4hLa<}55eEtLg_&Z&K2_Z?_K8YVL{7bmsC0G;kd0SmvER(;e-O+B(O=Q-uum3}= zJASRG{a`x2i!mj=K7Fvj>EupdMsmeOREkOmH;K@`_L)nbN(8L!kf;7<^8fuUTDA7s zm&2LdU4P8D+{NFV^gaCfuq$!x5QSRfCanRP@xs~qq@6!eYrcGCVV_U~;P)^4m-apO zn-&5hbMH8cFFX()il)~DQ$o77U{+heLUBa{-~S=v-<14+yY4dK7E16*xMaVdD|m&B-$K+{t@%Ls!r-^@a>VGK%J|DLZ`FwiWA;$i2r~a@@m?i8%ZICkf?Cv1d%+=7c!)am-7gYUp`;%ioJF;q^HW?LLeTRN- zAqn8>F5IDK^Q*LWXs=aJ2>~6hJnmDtj=4dSNXV2R!SY5CpvDTuwTd$lI(>e!Yu(B z#bU0P9g6OIgm00w#ufYre~pRS(-x!)ziJ;+nFnQp{fVw=U*09*DG`kVrvjUcos0_B zE#yapOI4Mp71hg?LES*#9bZ1{eQnt4=6OQaqJ||QB(iC=aWrw;$|dFCuA?r=JeAUy zo*7v#fjky{QP0MP@u$~x@#EA98o1ph4)T%>@)U5(4_+{mKRTof$@k zvl`mbAN8$$qv&tOKGX&BPVYlT7mUhs7mdnT5M0jwd{nJsyJE~w9i+}fK_hCVYxS~l zp=%{qu#}s$14Ri(1OzTuC}0YYuPX~jeK&t;?fsCS%QBj<+USF)wr))&j27K=u|bX{ zUi7UIFPJ2pY}5C-s61f>C$wg*m26FoGjKzssaeE%!kS891th1{hIzjBzI?&lS6ohx z4TX>cNfgZa@^8&pbR7=+@;A2FBSKyNblHLQ{J0yZx;(*zRHw4v$}=W;dCSh{?2sa^ zQy~^Xiw#u)aI@{!%A>4+nfyCpf%tQIzy8KK7ok?XdcS3SWk8kUd9;%1fALGi$l4(R z1>onU2e7NL3nU`@^`` z({cUDC{;BNs9p5t5Ii?BE5tG4V{A2Kub33NXi0(18vhdbdY$*LHNN~_Qc@R}b#{R;3-B2<7)!M}8i~USAHpFgi zZUR{rdd}dt8;~dX8E=>+C7qt5#k4x5_2$yEHVI7-Qz6Ll!n;2%``rg5NzO1*VLCD? z*;m-MI``o7e!3_{XJOZV$)obue3f|ZZ7cvDaO zI&*1ml`y(6OT1M4HG)7>_l3PB0s!`aHo_IgSr zc3VZi4}TEWY+R3sPn)Wxk5WD95ILP}aPegWjNF+xJ$5^(0}S%T_poihfOqa2JX7<9 zp7)Hox7}1tvHip8lqI+`wWf)R+$ElG^p{x*V2RI3CyOI%OjuXUz^3e+&$T0Ae%O+O zkk;S<|5ER6Yjm%gvMwg*W5nXI->FrJDe;!3g|8O+CNdIrK&#$cGmuJJZ#uHAQU9;y z=i~`k4Ou<5trEZod`Lh($SgEB>?;Y&K5%AGK%DLzCCUUoxb*`qMas43tYT2_-hOwQ ze#?u57(^Di5agS`1u6hd#m+8-$%H@P=$T$yPKDP*QXyY>af^z29y~FRWk}YyW>!d* zMS(o|tiQ%QXeJOMj?SilrdDujktVrw3vo&%4b{P4f-Vl8jXkYNRBjk3d2;bGhvFxJ zq*qr+0LxDFMu4+ye@WIByY3s=0qr{*wvlfq({E@KmvL-4_wOn3+}26B=#V67Nx&Jk1IOf~ zJ2Kiam24&CB8dv)4ce&9+0L(e8*5-W+YuUzylMEEAj=NyDVwdK+Kn%agSrc8IVBUG zneB~rR$da9-5Ej(F%fmAlz~LMVUvox#1~R zJ5_8??Ax81BW+LVqvf#5F(S?{;yZ(UQ(>9~CYs00?7~e?r1iLLy90|}AR5FxruT*_ zoMbtSklE^-R16|yVaP*z(L}LQ-uSu|ixw$H%9YXap~P}&)C8RBt>Bp`+0fG~qbJ@? z-99qDLcB&9qQQYCDmi6Ob8%9vhN1a{4=>Uc-kA4+3XTlX7ynqCCFa+6=*MkY@2ud~ zlJ(FY(qDmMM!p#ScC3raBbg?m{(z2YnS6ZD;8l|p+>`>#NXaJP)jf%Ql?o?=uw<+i z@oL}+LuJ#fpcC?6_g*se!8$gSr6{ot^b|w?H1BnH!2#tf%cdiJMHgyUQs{)eRL}cW zX{xbKtn&2nDtBD!Y(VV=2l_3hE#qB@*D>J4HqF0Z&Ox^<^zAdPlY!DT{fWl$b+tOb zI0l;5in#j~2!KGA^wg)=v!cT&A)m*(Z@4mPUO>X8^X$@a`&R4l-peR{{G0An!WXYvE3X>6b_vxbi2=8wTGV^=>#zmJL$6d)3?4@o{%O%ZWd8ryRP(eDQjL|i?Z9&0020zHTl z>58$mu&9y_c+uw?$U>?e+UL>7W;&H}44(TM#sY`#2P`iVWfY$!b>g*f z#W5-o8sA;;RcmHuGjL=N#=NlNBT-`HYjLsOH9N7nmR1XW<$bQj zG1HansWva!0~CAMDeslRt~e^v+X7kPN^$;d_*cqDRvG_oJGvS4b+WPn7bV8;ioiY-!PDWPQU7!qmo?2+U~lX~m$UkM`DfEZk<@<>U`8e}w7;Dil&P4Dq$JL$sitB`wF zTl*YN=)C=aY8EEE94ReVidv)>cs>2~T|T;I^=){SpG zVvhNaKX@q0#WAXd(4=f(_qI1J_t)Q&2DiMS*dr_oMsFrE(BfEkF2H9WqHmCvOPr5; z@MGyH*4hJa1M1UTmy$(ir8l6BJ99SwSo}4igcWb#^RrREu%Wz_-h)Vu>ZMC-JZNDX zof^Kay`fdm5JD-(`KaY{0KD>U5;qZ)9hNbC)18}dQCtAxsFmHjp=y{QtsuzWJl12JBCTfLRd*;Z!h_}Ut6?-M-t|}ktu&l*TyIGLDd%Nl(6XI25`~cYZpy3BLI2Z)%tN;=rQV#a)h#xrtsV zkN~n{!=%kpHs-2n3uyySE2*T2Fk4=ZU8bheRoRWzT6`5&bG2KIY+jQ7>|McnG5-&T z1sCz0dVCL}=@owCSZ*22g$H`9Sh<+*)3Z*>!^bBLW^?_McE`f93o#`~0ye!@%a^Kf z`PIO<&L7zFfpOLCrDnX{POX>9S$eVrb$hhYPOn0~J69aSAT&Z2h8};U-z_6%WodrS zFwABZk|t~sO>l7b@g>jBc&#u`U0=tri~|+RzM+RL>vheRwnmZL&!Jozv^6UjJMZ)^ zuN^7@J~P$bUba%}Ew=H>0k_t)P)wYc853JK%o~Fw~yJe0v-udd*d;Z*FO?wRv zGwJpwk#*ImI|6S>r~DGKbnV^FhC4VcuGQ=)&riZ=*F*{JT1tZMCO(qXvDfhM)<$b; zPkWoBgk&8xFKk!}nS)ytl8R-Tm)|v?anx+YU88v>sQ$=6YsiUVSEE$aAnG3?VkCUh zQX284pDPI!CQ7@tPfq}+ULcZ6Bskku$e1UbrYa&it6o*HGR>P7Nbk3HhO3LKQHhCa z4erC%YPpHWoYQi#ve5X8=mH(!iad>KY!#2Myc))$Opn*({ysp*&Qum5N&L5$X7S1H3$r#I_`9aOnJ2Zj3@p25C=s?Nk1ygV z&KpkH-q#4@+sE{KKD0`PdMVgzq1Up^$w(?U$+`71*=Dj z-3Gg*y|S}TF}WyGL=g*}fl<9sY{TfuT{)6l_D;#|kj8%G3uSgjZ02f|tkxgcv@DBu zV`vLwAvCi@Zdf&EIKmma_&CMR+U~li>mniXyGkGWjKWo2^v*U!z8eTALS#ZY0o_X4 z@d%{tX*jH=BIP~3XmVb5g1%HKw;VFO6KlL*9b&UCg}~`Sr>QyBvrX=sC8n9BC34!< zTM3uzdHm+yC9SMmx_Hg_pR#I)Zv2rY@GtJ_xI*Yhul`a)d-7z0b2?T3AFD_NtFE5QNQIMk+3XPFTA;^FzBwrjvNAp{)_NYQ zztY{K&)F;vqM(EPF=N!^!D1z6+OcBdCG$d{4}?Sn!XSa{`Oh-X?YtUG_9g%rRp;1)$xti>gP6J+%M-ytW=+Y7z|Y?50{je z{-tp4#UN1J`U{SP(MyGE7e0Kn|D4sCuAn|UXV=M~RM>41N=5GXH<2aG)awJ-y)9de zreu^afU~Epw!Y29zab$#GtHmfs2qL%x*4Ox@zOJEyL}wbvIf|5>0#wwt8h`W zqm;D%xo)1GI5VvfTuq+dgXq%ztanBJy8T5DLXOtui4*GWgnpxdS1DGpQ6XX4sTb6Y z>1gCnxC=dAB(jUq5M5Jd6C~uE{Xe0|EA#9|3*<4m#Tq>J7=c!O9R8F*)Wl-K%aoD1 zXASh)Po#<$XanXm!3W0jYt@PSTBA+jY9;HtwT-NhTfy$H@-eJx$mX{ZVARTjTVM47 zBVKoIK9rI^s|fVD*6%#5Rp5*>Uk!Tj=zFtB+s&xABUlCb+>O-^ccwRhcjrZWl#AKR zMFe97*AC0S2h?6P0##6YL*I%$nucFCGKD@$>q&(| zgHv-atH}vLkx!#XQd^HQi3^WQYaKQuW=h&kS&Kx(ZykGW zG5dbkY}#vORoC=N|Ei2V*KHBQnES9z)Eq7`eYId*X)NPUfmS!Y9*=lWTpy0t|JJv6 zR(eJ{xsnxhS7T+28}YoQyL`#dTQ&_J{sU@X7L#TZW~ztpy-WAo4=5}Cgm72**5uf{ z7tpKf9mg0RG*r(!VJJgmNP&7hpt@{!Fjpo2nN}Ns|3RdUF;gv@N%9^RU~v*o)I%&7@X5@xyXXI>7mujau=q-aonx zk4I7l&DU^$)jBLlC+`hj(j&4h+dSXTRW|`W86jtriuG2Pp88M2kw-#abtlsA22xuQ ztRU+1R&d&Z4(HCJw7hc~Y3e3{FG_a2>+n7I&d3cvX7GqZTy)Y+QR1LAXAJ?gh-Zfl z#8|`pq)uY9rU>X@3+7yijnV88Nvx4=LflqovkPhVM8SKW2DZ=t126-VIV|gP|EpHw zkjl;r=YbQC_d`aH4wBR=kLPL2EcbRlhq`xDwJkfX{O+_N(ak>ePJgp41H`< zzInqiR&eQEg*-(1uujm)1#@l$Oj2sbMJy+&8kbE*aO^aS(4d*4O5~hZ0prapXImJh z9GJ?)sYQmJ5=95*9oSz!qBUndbZKZ+zrIG~na-1tBN~9YYIX2rem>lk4U*VG(3KTP z(GI+;r>*V`fF8!wJTYMSgEE7PoI~bxX{x_v?lvwrxLHcMG}Bu1U0a^CM2RRdO)&v$ zJ10jHZ61DaHi$dcAWw&r|46pVnH-uQI(pO|aB=ERi~;~b&?hr?H?n9I5mH5S zmq*~x71gQiPE!?VjLF+VOeP#V<=?sBG$ZM3w%_1(<>3s6KLZejQZ50CnlU0$Buq5Y zn(nB!!QkU7cNyXwn3zTRmzr0ED+FgRM$;7%U}N~RsefBF(!;-7tWBdCN3mn>(63%v#SFCC? zIhJ@OrV|^zzqAo&S(agnw#g0)!&3@#KvF^9y-wXY9_4VWUu#OIc*{Qw=7MJhVXx=) z4C@#d%r#ghd>$M;gqd&@V!p)K7&ZOwSNvM1tJ|0PV&69<Y?T>;mBFK%Ivnwf~;!u4(+JZT}&uDy%?C@t>h4aQ%)lBeOPd@Ft* z5?+cZLdWd|#gxDpb7}bDhAJ)G@pyxLHE^m{R&`$m+o&+E1z!!GjKUBa!^8X^h({rq z(u;@t(gH08PNLt%Q9FW>rkD^SJ3w-1xMxa|i2nMFgVUQ+lZs;-fwo9>`o(r{pMf9` zS_n3epI-~c^41yh8+NO8Cf;!uVAiLh?iI7%9qv!qY)wDZT7UdnSIXaLzNS86jey6#`lC_V^Sl1p|J1(jCsL&)jYlwSm~wB9Lo_Iz;df?O7YrrvUyfK)!;_c zY-|51I5`J2a}D+=28Ot`Icb0JPy53$`yEz)E;DXTxUs%=xXJ2grgd@qQ6p0r9ivb8 z$`G7LaI}$Gju9u}Oa{e}=|mtu{K!&>&Kx8e=Hy(h0nch&|jiE0m2Q`4pNZAJV2l*BD7KXiU0HPEdIp6u~tR}TU>4JG-l_R`a~YDjve1W zT#R^^*3@Hg#ls{j(~+#9Z}y4htevKkx%ev4=zWtrSTie*ftmFLGs02(EPFxy;r?x* zBA>G+;0XUJ@=fAd`2Vt3B!Y5wyK0#NUx5h085Xvx@j3SE?Mdv1U98WTM!K_E+Uea0 zlNJK`h@!fO)N1|Vf1;Z9l{uWUKHrXZluFmb z!`~+VYza*fOE&%+cTIkR5$gc}bl%eeMF<3h1fAa^DSz+b>IAv|@tWVu{{k=yX&nFn diff --git a/Styles/Styles/Styles-Info.plist b/Styles/Styles/Styles-Info.plist deleted file mode 100644 index faa11bb..0000000 --- a/Styles/Styles/Styles-Info.plist +++ /dev/null @@ -1,41 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIMainStoryboardFile - MainStoryboard - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown - - - diff --git a/Styles/Styles/Styles-Prefix.pch b/Styles/Styles/Styles-Prefix.pch deleted file mode 100644 index 6c81c58..0000000 --- a/Styles/Styles/Styles-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'Styles' target in the 'Styles' project -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Styles/Styles/UYLAppDelegate.h b/Styles/Styles/UYLAppDelegate.h deleted file mode 100644 index febe5c9..0000000 --- a/Styles/Styles/UYLAppDelegate.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// UYLAppDelegate.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface UYLAppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/Styles/Styles/UYLAppDelegate.m b/Styles/Styles/UYLAppDelegate.m deleted file mode 100644 index cd2822a..0000000 --- a/Styles/Styles/UYLAppDelegate.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// UYLAppDelegate.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import "UYLAppDelegate.h" -#import "UYLStyleController.h" - -@implementation UYLAppDelegate - -@synthesize window = _window; - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - [UYLStyleController applyStyle]; - return YES; -} - -@end diff --git a/Styles/Styles/UYLListViewController.h b/Styles/Styles/UYLListViewController.h deleted file mode 100644 index e1ecd40..0000000 --- a/Styles/Styles/UYLListViewController.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// UYLFirstViewController.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@interface UYLListViewController : UITableViewController - -@end diff --git a/Styles/Styles/UYLListViewController.m b/Styles/Styles/UYLListViewController.m deleted file mode 100644 index eddda08..0000000 --- a/Styles/Styles/UYLListViewController.m +++ /dev/null @@ -1,45 +0,0 @@ -// -// UYLFirstViewController.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import "UYLListViewController.h" - -@interface UYLListViewController () -@end - -@implementation UYLListViewController - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - -@end diff --git a/Styles/Styles/UYLOkButton.h b/Styles/Styles/UYLOkButton.h deleted file mode 100644 index 279a947..0000000 --- a/Styles/Styles/UYLOkButton.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// UYLOkButton.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface UYLOkButton : UIButton -@end diff --git a/Styles/Styles/UYLOkButton.m b/Styles/Styles/UYLOkButton.m deleted file mode 100644 index 52c135d..0000000 --- a/Styles/Styles/UYLOkButton.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// UYLOkButton.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import "UYLOkButton.h" - -@implementation UYLOkButton -@end diff --git a/Styles/Styles/UYLResetButton.h b/Styles/Styles/UYLResetButton.h deleted file mode 100644 index 8e02791..0000000 --- a/Styles/Styles/UYLResetButton.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// UYLResetButton.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface UYLResetButton : UIButton -@end diff --git a/Styles/Styles/UYLResetButton.m b/Styles/Styles/UYLResetButton.m deleted file mode 100644 index 2de0503..0000000 --- a/Styles/Styles/UYLResetButton.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// UYLResetButton.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import "UYLResetButton.h" - -@implementation UYLResetButton -@end diff --git a/Styles/Styles/UYLRotatingViewController.h b/Styles/Styles/UYLRotatingViewController.h deleted file mode 100644 index eacf87e..0000000 --- a/Styles/Styles/UYLRotatingViewController.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// UYLRotatingViewController.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@interface UYLRotatingViewController : UIViewController - -@end diff --git a/Styles/Styles/UYLRotatingViewController.m b/Styles/Styles/UYLRotatingViewController.m deleted file mode 100644 index 7333012..0000000 --- a/Styles/Styles/UYLRotatingViewController.m +++ /dev/null @@ -1,49 +0,0 @@ -// -// UYLRotatingViewController.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLRotatingViewController.h" - -@implementation UYLRotatingViewController - -- (void) viewDidLoad -{ - [super viewDidLoad]; - self.view.backgroundColor = [UIColor lightGrayColor]; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - -@end diff --git a/Styles/Styles/UYLStyleController.h b/Styles/Styles/UYLStyleController.h deleted file mode 100644 index 7ec86af..0000000 --- a/Styles/Styles/UYLStyleController.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// UYLStyleController.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface UYLStyleController : NSObject - -+ (void)applyStyle; - -@end diff --git a/Styles/Styles/UYLStyleController.m b/Styles/Styles/UYLStyleController.m deleted file mode 100644 index b12ad10..0000000 --- a/Styles/Styles/UYLStyleController.m +++ /dev/null @@ -1,125 +0,0 @@ -// -// UYLStyleController.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLStyleController.h" -#import "UYLRotatingViewController.h" -#import "UYLResetButton.h" -#import "UYLOkButton.h" -#import "UYLZeroButton.h" - -@implementation UYLStyleController - -+ (void)applyStyle -{ - // UINavigationBar - UIImage *navBarImage = [UIImage imageNamed:@"navbar"]; - navBarImage = [navBarImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; - - UIImage *navBarLandscapeImage = [UIImage imageNamed:@"navbar-landscape"]; - navBarLandscapeImage = [navBarLandscapeImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; - - UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; - [navigationBarAppearance setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsDefault]; - [navigationBarAppearance setBackgroundImage:navBarLandscapeImage forBarMetrics:UIBarMetricsLandscapePhone]; - - NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor grayColor], UITextAttributeTextColor, nil]; - [navigationBarAppearance setTitleTextAttributes:textAttributes]; - - UIImage *backButtonImage = [UIImage imageNamed:@"back-button"]; - backButtonImage = [backButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 25.0, 0, 6.0)]; - - UIImage *backButtonLandscapeImage = [UIImage imageNamed:@"back-button-landscape"]; - backButtonLandscapeImage = [backButtonLandscapeImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 25.0, 0, 6.0)]; - - UIBarButtonItem *barButtonItemAppearance = [UIBarButtonItem appearance]; - [barButtonItemAppearance setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - [barButtonItemAppearance setBackButtonBackgroundImage:backButtonLandscapeImage forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; - - - // UIButton - UIImage *defaultButtonImage = [UIImage imageNamed:@"steel-button"]; - defaultButtonImage = [defaultButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; - [[UIButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:defaultButtonImage forState:UIControlStateNormal]; - - UIImage *okButtonImage = [UIImage imageNamed:@"green-button"]; - okButtonImage = [okButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; - [[UYLOkButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:okButtonImage forState:UIControlStateNormal]; - - UIImage *zeroButtonImage = [UIImage imageNamed:@"orange-button"]; - zeroButtonImage = [zeroButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; - [[UYLZeroButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:zeroButtonImage forState:UIControlStateNormal]; - - UIImage *resetButtonImage = [UIImage imageNamed:@"red-button"]; - resetButtonImage = [resetButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20.0, 0, 20.0)]; - [[UYLResetButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setBackgroundImage:resetButtonImage forState:UIControlStateNormal]; - [[UYLResetButton appearanceWhenContainedIn:[UYLRotatingViewController class], nil] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - - - // Set some colors - UIColor *mainColor = [UIColor darkGrayColor]; - UIColor *altColor = [UIColor lightGrayColor]; - - - // UILabel - UILabel *labelAppearance = [UILabel appearanceWhenContainedIn:[UYLRotatingViewController class], nil]; - [labelAppearance setTextColor:mainColor]; - - - // UIActivityIndicator - [[UIActivityIndicatorView appearance] setColor:[UIColor redColor]]; - - - // UIProgressView - [[UIProgressView appearance] setProgressTintColor:mainColor]; - [[UIProgressView appearance] setTrackTintColor:altColor]; - - - // UISwitch - [[UISwitch appearance] setOnTintColor:altColor]; - - - // UISlider - [[UISlider appearance] setMinimumTrackTintColor:mainColor]; - [[UISlider appearance] setMaximumTrackTintColor:altColor]; - [[UISlider appearance] setThumbTintColor:[UIColor redColor]]; - - - // UISegmentedControl - [[UISegmentedControl appearance] setBackgroundImage:defaultButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - [[UISegmentedControl appearance] setBackgroundImage:zeroButtonImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; - - UIImage *dividerImage = [UIImage imageNamed:@"divider"]; - [[UISegmentedControl appearance] setDividerImage:dividerImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; -} - -@end diff --git a/Styles/Styles/UYLZeroButton.h b/Styles/Styles/UYLZeroButton.h deleted file mode 100644 index e773f6b..0000000 --- a/Styles/Styles/UYLZeroButton.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// UYLZeroButton.h -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface UYLZeroButton : UIButton -@end diff --git a/Styles/Styles/UYLZeroButton.m b/Styles/Styles/UYLZeroButton.m deleted file mode 100644 index 1bb41ea..0000000 --- a/Styles/Styles/UYLZeroButton.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// UYLZeroButton.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import "UYLZeroButton.h" - -@implementation UYLZeroButton -@end diff --git a/Styles/Styles/en.lproj/InfoPlist.strings b/Styles/Styles/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/Styles/Styles/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/Styles/Styles/main.m b/Styles/Styles/main.m deleted file mode 100644 index b1284ba..0000000 --- a/Styles/Styles/main.m +++ /dev/null @@ -1,43 +0,0 @@ -// -// main.m -// Styles -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -#import "UYLAppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([UYLAppDelegate class])); - } -} diff --git a/TaskTimer/README b/TaskTimer/README deleted file mode 100644 index fd14c10..0000000 --- a/TaskTimer/README +++ /dev/null @@ -1,95 +0,0 @@ -======================================================================= -TaskTimer - -Version 1.1 14 May 2012 Add shake to reset -Version 1.0 6-April 2012 Initial Version -======================================================================= - -The TaskTimer App is intended as an example on how to add accessibility -features to an existing App. It is based on the Master Detail Xcode -project template and is a universal app that uses Core Data for its -model. The basic function of the App is to time how long it takes to -perform a list of tasks. - -For further details see: - -http://useyourloaf.com/blog/2012/4/23/voiceover-accessibility.html -http://useyourloaf.com/blog/2012/5/14/detecting-voiceover-status-changes.html - -======================================================================= -Model -======================================================================= - -Task.m -Task.h -The model consists of a single Core Data entity class for the task data. - -======================================================================= -View -======================================================================= - -UYLCounterView.h -UYLCounterView.m - -The UYLCounterView is a custom UIView subclass used to display the -current duration of a task and buttons to start and stop the counter. -Users of the view can implement the UYLCounterViewDelegate protocol -to receive methods calls when the counter is stopper/started. - -UYLTaskListViewController_iPad.xib -UYLTaskListViewController_iPhone.xib - -iPad and iPhone versions of the NIB for the UYLTaskListViewController. -This NIB is a basic UITableView. - -UYLTaskViewController_iPad.xib -UYLTaskViewController_iPhone.xib - -iPad and iPhone versions of the NIB for the UYLTaskViewController. This -is a custom view containing a text view to allow the task name to be -displayed and edited. It also contains a UYLCounterView to show the -task timer. - -======================================================================= -Controller -======================================================================= - -UYLTaskListViewController.h -UYLTaskListViewController.m - -The master view controller on the iPad and root view controller on the -iPhone. This controller implements the delegates for a table view -showing the list of tasks. The table supports adding/deleting of tasks. - -On the iPad the currently selected task is shown in the detail view -controller which is implemented by a UYLTaskViewController. - -On the iPhone selecting a task pushes a UYLTaskViewController onto -the navigation controller stack. - -UYLTaskViewController.h -UYLTaskViewController.m - -Used to show the task details and allow the task timer to be stopped -and started. A shake event can be used to reset the task. A reset -button is shown/hidden depending on the state of VoiceOver. - -======================================================================= -App Delegate -======================================================================= - -UYLAppDelegate.h -UYLAppDelegate.m - -The App delegate is largely unmodified from the template code. It creates -the root view controllers and initialises the core data stack. - -======================================================================= -Other files -======================================================================= - -NSNumber+UYLTimeFormatter.h -NSNumber+UYLTimeFormatter.m - -A category on NSNumber to provide a string representation of the elapsed -time. diff --git a/TaskTimer/TaskTimer.xcodeproj/project.pbxproj b/TaskTimer/TaskTimer.xcodeproj/project.pbxproj deleted file mode 100644 index b1fb648..0000000 --- a/TaskTimer/TaskTimer.xcodeproj/project.pbxproj +++ /dev/null @@ -1,444 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 532DD95A1530C8EC00ED5845 /* UYLCounterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD9591530C8EC00ED5845 /* UYLCounterView.m */; }; - 532DD9601530C90300ED5845 /* UYLTaskListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD95D1530C90300ED5845 /* UYLTaskListViewController.m */; }; - 532DD9611530C90300ED5845 /* UYLTaskViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD95F1530C90300ED5845 /* UYLTaskViewController.m */; }; - 532DD96C1530C9AD00ED5845 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 532DD96B1530C9AD00ED5845 /* UYLAppDelegate.m */; }; - 532DD9751530CA6400ED5845 /* UYLTaskListViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD96D1530CA6400ED5845 /* UYLTaskListViewController_iPad.xib */; }; - 532DD9761530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD96F1530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib */; }; - 532DD9771530CA6400ED5845 /* UYLTaskViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD9711530CA6400ED5845 /* UYLTaskViewController_iPad.xib */; }; - 532DD9781530CA6400ED5845 /* UYLTaskViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532DD9731530CA6400ED5845 /* UYLTaskViewController_iPhone.xib */; }; - 534644A5155F083D00B20849 /* redbutton.png in Resources */ = {isa = PBXBuildFile; fileRef = 534644A4155F083D00B20849 /* redbutton.png */; }; - 536270F6152E0A55009732E1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270F5152E0A55009732E1 /* UIKit.framework */; }; - 536270F8152E0A55009732E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270F7152E0A55009732E1 /* Foundation.framework */; }; - 536270FA152E0A55009732E1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270F9152E0A55009732E1 /* CoreGraphics.framework */; }; - 536270FC152E0A55009732E1 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 536270FB152E0A55009732E1 /* CoreData.framework */; }; - 53627102152E0A55009732E1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53627100152E0A55009732E1 /* InfoPlist.strings */; }; - 53627104152E0A55009732E1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53627103152E0A55009732E1 /* main.m */; }; - 53627127152E0B87009732E1 /* Task.m in Sources */ = {isa = PBXBuildFile; fileRef = 53627125152E0B87009732E1 /* Task.m */; }; - 5362712B152E0BF1009732E1 /* TaskTimer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 53627129152E0BF1009732E1 /* TaskTimer.xcdatamodeld */; }; - 539F94F1153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F94F0153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m */; }; - 53BD55AA1533880300BCFB33 /* checked.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A21533880300BCFB33 /* checked.png */; }; - 53BD55AB1533880300BCFB33 /* checked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A31533880300BCFB33 /* checked@2x.png */; }; - 53BD55AC1533880300BCFB33 /* start.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A41533880300BCFB33 /* start.png */; }; - 53BD55AD1533880300BCFB33 /* start@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A51533880300BCFB33 /* start@2x.png */; }; - 53BD55AE1533880300BCFB33 /* stop.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A61533880300BCFB33 /* stop.png */; }; - 53BD55AF1533880300BCFB33 /* stop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A71533880300BCFB33 /* stop@2x.png */; }; - 53BD55B01533880300BCFB33 /* unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A81533880300BCFB33 /* unchecked.png */; }; - 53BD55B11533880300BCFB33 /* unchecked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53BD55A91533880300BCFB33 /* unchecked@2x.png */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 532DD9581530C8EC00ED5845 /* UYLCounterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLCounterView.h; sourceTree = ""; }; - 532DD9591530C8EC00ED5845 /* UYLCounterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLCounterView.m; sourceTree = ""; }; - 532DD95C1530C90300ED5845 /* UYLTaskListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTaskListViewController.h; sourceTree = ""; }; - 532DD95D1530C90300ED5845 /* UYLTaskListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTaskListViewController.m; sourceTree = ""; }; - 532DD95E1530C90300ED5845 /* UYLTaskViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTaskViewController.h; sourceTree = ""; }; - 532DD95F1530C90300ED5845 /* UYLTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTaskViewController.m; sourceTree = ""; }; - 532DD96A1530C9AD00ED5845 /* UYLAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; - 532DD96B1530C9AD00ED5845 /* UYLAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; - 532DD96E1530CA6400ED5845 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLTaskListViewController_iPad.xib; sourceTree = ""; }; - 532DD9701530CA6400ED5845 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLTaskListViewController_iPhone.xib; sourceTree = ""; }; - 532DD9721530CA6400ED5845 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLTaskViewController_iPad.xib; sourceTree = ""; }; - 532DD9741530CA6400ED5845 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLTaskViewController_iPhone.xib; sourceTree = ""; }; - 534644A4155F083D00B20849 /* redbutton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = redbutton.png; sourceTree = ""; }; - 536270F1152E0A55009732E1 /* TaskTimer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TaskTimer.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 536270F5152E0A55009732E1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 536270F7152E0A55009732E1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 536270F9152E0A55009732E1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 536270FB152E0A55009732E1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - 536270FF152E0A55009732E1 /* TaskTimer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TaskTimer-Info.plist"; sourceTree = ""; }; - 53627101152E0A55009732E1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 53627103152E0A55009732E1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 53627105152E0A55009732E1 /* TaskTimer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TaskTimer-Prefix.pch"; sourceTree = ""; }; - 53627124152E0B87009732E1 /* Task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Task.h; sourceTree = ""; }; - 53627125152E0B87009732E1 /* Task.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Task.m; sourceTree = ""; }; - 5362712A152E0BF1009732E1 /* Accessibile.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Accessibile.xcdatamodel; sourceTree = ""; }; - 539F94EF153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+UYLTimeFormatter.h"; sourceTree = ""; }; - 539F94F0153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+UYLTimeFormatter.m"; sourceTree = ""; }; - 53BD55A21533880300BCFB33 /* checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checked.png; sourceTree = ""; }; - 53BD55A31533880300BCFB33 /* checked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checked@2x.png"; sourceTree = ""; }; - 53BD55A41533880300BCFB33 /* start.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = start.png; sourceTree = ""; }; - 53BD55A51533880300BCFB33 /* start@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "start@2x.png"; sourceTree = ""; }; - 53BD55A61533880300BCFB33 /* stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stop.png; sourceTree = ""; }; - 53BD55A71533880300BCFB33 /* stop@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@2x.png"; sourceTree = ""; }; - 53BD55A81533880300BCFB33 /* unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = unchecked.png; sourceTree = ""; }; - 53BD55A91533880300BCFB33 /* unchecked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "unchecked@2x.png"; sourceTree = ""; }; - 53DA48A1152FA0D700A616D8 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 536270EE152E0A55009732E1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 536270F6152E0A55009732E1 /* UIKit.framework in Frameworks */, - 536270F8152E0A55009732E1 /* Foundation.framework in Frameworks */, - 536270FA152E0A55009732E1 /* CoreGraphics.framework in Frameworks */, - 536270FC152E0A55009732E1 /* CoreData.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 536270E6152E0A55009732E1 = { - isa = PBXGroup; - children = ( - 53DA48A1152FA0D700A616D8 /* README */, - 536270FD152E0A55009732E1 /* TaskTimer */, - 536270F4152E0A55009732E1 /* Frameworks */, - 536270F2152E0A55009732E1 /* Products */, - ); - sourceTree = ""; - }; - 536270F2152E0A55009732E1 /* Products */ = { - isa = PBXGroup; - children = ( - 536270F1152E0A55009732E1 /* TaskTimer.app */, - ); - name = Products; - sourceTree = ""; - }; - 536270F4152E0A55009732E1 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 536270F5152E0A55009732E1 /* UIKit.framework */, - 536270F7152E0A55009732E1 /* Foundation.framework */, - 536270F9152E0A55009732E1 /* CoreGraphics.framework */, - 536270FB152E0A55009732E1 /* CoreData.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 536270FD152E0A55009732E1 /* TaskTimer */ = { - isa = PBXGroup; - children = ( - 532DD96A1530C9AD00ED5845 /* UYLAppDelegate.h */, - 532DD96B1530C9AD00ED5845 /* UYLAppDelegate.m */, - 53A72C4A153DEE61000AAB9C /* Categories */, - 53627123152E0B65009732E1 /* Model */, - 5362712C152E0BFF009732E1 /* View */, - 5362712D152E0C07009732E1 /* Controller */, - 53627146152E0C72009732E1 /* Images */, - 536270FE152E0A55009732E1 /* Supporting Files */, - ); - path = TaskTimer; - sourceTree = ""; - }; - 536270FE152E0A55009732E1 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 536270FF152E0A55009732E1 /* TaskTimer-Info.plist */, - 53627100152E0A55009732E1 /* InfoPlist.strings */, - 53627103152E0A55009732E1 /* main.m */, - 53627105152E0A55009732E1 /* TaskTimer-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 53627123152E0B65009732E1 /* Model */ = { - isa = PBXGroup; - children = ( - 53627129152E0BF1009732E1 /* TaskTimer.xcdatamodeld */, - 53627124152E0B87009732E1 /* Task.h */, - 53627125152E0B87009732E1 /* Task.m */, - ); - name = Model; - sourceTree = ""; - }; - 5362712C152E0BFF009732E1 /* View */ = { - isa = PBXGroup; - children = ( - 532DD96D1530CA6400ED5845 /* UYLTaskListViewController_iPad.xib */, - 532DD96F1530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib */, - 532DD9711530CA6400ED5845 /* UYLTaskViewController_iPad.xib */, - 532DD9731530CA6400ED5845 /* UYLTaskViewController_iPhone.xib */, - 532DD9581530C8EC00ED5845 /* UYLCounterView.h */, - 532DD9591530C8EC00ED5845 /* UYLCounterView.m */, - ); - name = View; - sourceTree = ""; - }; - 5362712D152E0C07009732E1 /* Controller */ = { - isa = PBXGroup; - children = ( - 532DD95C1530C90300ED5845 /* UYLTaskListViewController.h */, - 532DD95D1530C90300ED5845 /* UYLTaskListViewController.m */, - 532DD95E1530C90300ED5845 /* UYLTaskViewController.h */, - 532DD95F1530C90300ED5845 /* UYLTaskViewController.m */, - ); - name = Controller; - sourceTree = ""; - }; - 53627146152E0C72009732E1 /* Images */ = { - isa = PBXGroup; - children = ( - 534644A4155F083D00B20849 /* redbutton.png */, - 53BD55A21533880300BCFB33 /* checked.png */, - 53BD55A31533880300BCFB33 /* checked@2x.png */, - 53BD55A41533880300BCFB33 /* start.png */, - 53BD55A51533880300BCFB33 /* start@2x.png */, - 53BD55A61533880300BCFB33 /* stop.png */, - 53BD55A71533880300BCFB33 /* stop@2x.png */, - 53BD55A81533880300BCFB33 /* unchecked.png */, - 53BD55A91533880300BCFB33 /* unchecked@2x.png */, - ); - name = Images; - sourceTree = ""; - }; - 53A72C4A153DEE61000AAB9C /* Categories */ = { - isa = PBXGroup; - children = ( - 539F94EF153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.h */, - 539F94F0153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m */, - ); - name = Categories; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 536270F0152E0A55009732E1 /* TaskTimer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 53627120152E0A55009732E1 /* Build configuration list for PBXNativeTarget "TaskTimer" */; - buildPhases = ( - 536270ED152E0A55009732E1 /* Sources */, - 536270EE152E0A55009732E1 /* Frameworks */, - 536270EF152E0A55009732E1 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TaskTimer; - productName = TaskTimer; - productReference = 536270F1152E0A55009732E1 /* TaskTimer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 536270E8152E0A55009732E1 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = UYL; - LastUpgradeCheck = 0430; - }; - buildConfigurationList = 536270EB152E0A55009732E1 /* Build configuration list for PBXProject "TaskTimer" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 536270E6152E0A55009732E1; - productRefGroup = 536270F2152E0A55009732E1 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 536270F0152E0A55009732E1 /* TaskTimer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 536270EF152E0A55009732E1 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53627102152E0A55009732E1 /* InfoPlist.strings in Resources */, - 532DD9751530CA6400ED5845 /* UYLTaskListViewController_iPad.xib in Resources */, - 532DD9761530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib in Resources */, - 532DD9771530CA6400ED5845 /* UYLTaskViewController_iPad.xib in Resources */, - 532DD9781530CA6400ED5845 /* UYLTaskViewController_iPhone.xib in Resources */, - 53BD55AA1533880300BCFB33 /* checked.png in Resources */, - 53BD55AB1533880300BCFB33 /* checked@2x.png in Resources */, - 53BD55AC1533880300BCFB33 /* start.png in Resources */, - 53BD55AD1533880300BCFB33 /* start@2x.png in Resources */, - 53BD55AE1533880300BCFB33 /* stop.png in Resources */, - 53BD55AF1533880300BCFB33 /* stop@2x.png in Resources */, - 53BD55B01533880300BCFB33 /* unchecked.png in Resources */, - 53BD55B11533880300BCFB33 /* unchecked@2x.png in Resources */, - 534644A5155F083D00B20849 /* redbutton.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 536270ED152E0A55009732E1 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 53627104152E0A55009732E1 /* main.m in Sources */, - 53627127152E0B87009732E1 /* Task.m in Sources */, - 5362712B152E0BF1009732E1 /* TaskTimer.xcdatamodeld in Sources */, - 532DD95A1530C8EC00ED5845 /* UYLCounterView.m in Sources */, - 532DD9601530C90300ED5845 /* UYLTaskListViewController.m in Sources */, - 532DD9611530C90300ED5845 /* UYLTaskViewController.m in Sources */, - 532DD96C1530C9AD00ED5845 /* UYLAppDelegate.m in Sources */, - 539F94F1153AE6F0009CF03D /* NSNumber+UYLTimeFormatter.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 532DD96D1530CA6400ED5845 /* UYLTaskListViewController_iPad.xib */ = { - isa = PBXVariantGroup; - children = ( - 532DD96E1530CA6400ED5845 /* en */, - ); - name = UYLTaskListViewController_iPad.xib; - sourceTree = ""; - }; - 532DD96F1530CA6400ED5845 /* UYLTaskListViewController_iPhone.xib */ = { - isa = PBXVariantGroup; - children = ( - 532DD9701530CA6400ED5845 /* en */, - ); - name = UYLTaskListViewController_iPhone.xib; - sourceTree = ""; - }; - 532DD9711530CA6400ED5845 /* UYLTaskViewController_iPad.xib */ = { - isa = PBXVariantGroup; - children = ( - 532DD9721530CA6400ED5845 /* en */, - ); - name = UYLTaskViewController_iPad.xib; - sourceTree = ""; - }; - 532DD9731530CA6400ED5845 /* UYLTaskViewController_iPhone.xib */ = { - isa = PBXVariantGroup; - children = ( - 532DD9741530CA6400ED5845 /* en */, - ); - name = UYLTaskViewController_iPhone.xib; - sourceTree = ""; - }; - 53627100152E0A55009732E1 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 53627101152E0A55009732E1 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 5362711E152E0A55009732E1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 5362711F152E0A55009732E1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 53627121152E0A55009732E1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TaskTimer/TaskTimer-Prefix.pch"; - INFOPLIST_FILE = "TaskTimer/TaskTimer-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 53627122152E0A55009732E1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TaskTimer/TaskTimer-Prefix.pch"; - INFOPLIST_FILE = "TaskTimer/TaskTimer-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 536270EB152E0A55009732E1 /* Build configuration list for PBXProject "TaskTimer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5362711E152E0A55009732E1 /* Debug */, - 5362711F152E0A55009732E1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 53627120152E0A55009732E1 /* Build configuration list for PBXNativeTarget "TaskTimer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 53627121152E0A55009732E1 /* Debug */, - 53627122152E0A55009732E1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCVersionGroup section */ - 53627129152E0BF1009732E1 /* TaskTimer.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - 5362712A152E0BF1009732E1 /* Accessibile.xcdatamodel */, - ); - currentVersion = 5362712A152E0BF1009732E1 /* Accessibile.xcdatamodel */; - path = TaskTimer.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; -/* End XCVersionGroup section */ - }; - rootObject = 536270E8152E0A55009732E1 /* Project object */; -} diff --git a/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h b/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h deleted file mode 100644 index 3c2cd73..0000000 --- a/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// NSNumber+UYLTimeFormatter.h -// TaskTimer -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import - -@interface NSNumber (UYLTimeFormatter) - -- (NSString *)stringValueAsTime; - -@end diff --git a/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m b/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m deleted file mode 100644 index b5c8699..0000000 --- a/TaskTimer/TaskTimer/NSNumber+UYLTimeFormatter.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// NSNumber+UYLTimeFormatter.m -// TaskTimer -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import "NSNumber+UYLTimeFormatter.h" - -@implementation NSNumber (UYLTimeFormatter) - -// Returns an NSString with a textual representation of the time expressed in -// minutes and seconds (e.g. "5 minutes and 10 seconds" - -- (NSString *)stringValueAsTime -{ - NSUInteger minutes = [self integerValue] / 60; - NSUInteger seconds = [self integerValue] % 60; - - NSString *secondsFormat = (seconds == 1) ? NSLocalizedString(@"second",nil) : - NSLocalizedString(@"seconds",nil); - NSString *minutesFormat = (minutes == 1) ? NSLocalizedString(@"minute",nil) : - NSLocalizedString(@"minutes",nil); - - NSString *text = nil; - if (minutes > 0) - { - text = [NSString stringWithFormat:@" %u %@ %u %@",minutes,minutesFormat,seconds,secondsFormat]; - } - else - { - text = [NSString stringWithFormat:@" %u %@",seconds,secondsFormat]; - } - - return text; -} - -@end diff --git a/TaskTimer/TaskTimer/Task.h b/TaskTimer/TaskTimer/Task.h deleted file mode 100644 index 59044a8..0000000 --- a/TaskTimer/TaskTimer/Task.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// Task.h -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import -#import - - -@interface Task : NSManagedObject - -@property (nonatomic, retain) NSNumber * complete; -@property (nonatomic, retain) NSDate * createdAt; -@property (nonatomic, retain) NSNumber * duration; -@property (nonatomic, retain) NSString * note; - -@end diff --git a/TaskTimer/TaskTimer/Task.m b/TaskTimer/TaskTimer/Task.m deleted file mode 100644 index da446c8..0000000 --- a/TaskTimer/TaskTimer/Task.m +++ /dev/null @@ -1,43 +0,0 @@ -// -// Task.m -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "Task.h" - - -@implementation Task - -@dynamic complete; -@dynamic createdAt; -@dynamic duration; -@dynamic note; - -@end diff --git a/TaskTimer/TaskTimer/TaskTimer-Info.plist b/TaskTimer/TaskTimer/TaskTimer-Info.plist deleted file mode 100644 index 3c50c87..0000000 --- a/TaskTimer/TaskTimer/TaskTimer-Info.plist +++ /dev/null @@ -1,46 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/TaskTimer/TaskTimer/TaskTimer-Prefix.pch b/TaskTimer/TaskTimer/TaskTimer-Prefix.pch deleted file mode 100644 index 79c40be..0000000 --- a/TaskTimer/TaskTimer/TaskTimer-Prefix.pch +++ /dev/null @@ -1,15 +0,0 @@ -// -// Prefix header for all source files of the 'TaskTimer' target in the 'TaskTimer' project -// - -#import - -#ifndef __IPHONE_4_0 -#warning "This project uses features only available in iOS SDK 4.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import - #import -#endif diff --git a/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion b/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion deleted file mode 100644 index 34639d4..0000000 --- a/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/.xccurrentversion +++ /dev/null @@ -1,8 +0,0 @@ - - - - - _XCCurrentVersionName - Accessibile.xcdatamodel - - diff --git a/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents b/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents deleted file mode 100644 index 0bd2cc0..0000000 --- a/TaskTimer/TaskTimer/TaskTimer.xcdatamodeld/Accessibile.xcdatamodel/contents +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/TaskTimer/TaskTimer/UYLAppDelegate.h b/TaskTimer/TaskTimer/UYLAppDelegate.h deleted file mode 100644 index 2f14c1f..0000000 --- a/TaskTimer/TaskTimer/UYLAppDelegate.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// UYLAppDelegate.h -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@interface UYLAppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; -@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; -@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - -@property (strong, nonatomic) UINavigationController *navigationController; -@property (strong, nonatomic) UISplitViewController *splitViewController; - -- (void)saveContext; -- (NSURL *)applicationDocumentsDirectory; - -@end diff --git a/TaskTimer/TaskTimer/UYLAppDelegate.m b/TaskTimer/TaskTimer/UYLAppDelegate.m deleted file mode 100644 index b0a54ba..0000000 --- a/TaskTimer/TaskTimer/UYLAppDelegate.m +++ /dev/null @@ -1,164 +0,0 @@ -// -// UYLAppDelegate.m -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLAppDelegate.h" -#import "UYLTaskListViewController.h" -#import "UYLTaskViewController.h" - -@implementation UYLAppDelegate - -@synthesize window = _window; -@synthesize managedObjectContext = __managedObjectContext; -@synthesize managedObjectModel = __managedObjectModel; -@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; -@synthesize navigationController = _navigationController; -@synthesize splitViewController = _splitViewController; - -#pragma mark - -#pragma mark === Application Delegate Methods === -#pragma mark - - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) - { - UYLTaskListViewController *taskListViewController = [[UYLTaskListViewController alloc] initWithNibName:@"UYLTaskListViewController_iPhone" - bundle:nil]; - self.navigationController = [[UINavigationController alloc] initWithRootViewController:taskListViewController]; - self.window.rootViewController = self.navigationController; - taskListViewController.managedObjectContext = self.managedObjectContext; - } - else - { - UYLTaskListViewController *taskListViewController = [[UYLTaskListViewController alloc] initWithNibName:@"UYLTaskListViewController_iPad" - bundle:nil]; - UINavigationController *taskListNavigationController = [[UINavigationController alloc] initWithRootViewController:taskListViewController]; - UYLTaskViewController *taskViewController = [[UYLTaskViewController alloc] initWithNibName:@"UYLTaskViewController_iPad" bundle:nil]; - UINavigationController *taskNavigationController = [[UINavigationController alloc] initWithRootViewController:taskViewController]; - taskListViewController.detailViewController = taskViewController; - - self.splitViewController = [[UISplitViewController alloc] init]; - self.splitViewController.viewControllers = [NSArray arrayWithObjects:taskListNavigationController, taskNavigationController, nil]; - self.splitViewController.delegate = taskViewController; - - self.window.rootViewController = self.splitViewController; - taskListViewController.managedObjectContext = self.managedObjectContext; - } - [self.window makeKeyAndVisible]; - return YES; -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - [self saveContext]; -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - [self saveContext]; -} - -#pragma mark - -#pragma mark === Core Data Accessors === -#pragma mark - - -- (NSManagedObjectContext *)managedObjectContext -{ - if (__managedObjectContext != nil) - { - return __managedObjectContext; - } - - NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; - if (coordinator != nil) - { - __managedObjectContext = [[NSManagedObjectContext alloc] init]; - [__managedObjectContext setPersistentStoreCoordinator:coordinator]; - } - return __managedObjectContext; -} - -- (NSManagedObjectModel *)managedObjectModel -{ - if (__managedObjectModel != nil) - { - return __managedObjectModel; - } - NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TaskTimer" withExtension:@"momd"]; - __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; - return __managedObjectModel; -} - -- (NSPersistentStoreCoordinator *)persistentStoreCoordinator -{ - if (__persistentStoreCoordinator != nil) - { - return __persistentStoreCoordinator; - } - - NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TaskTimer.sqlite"]; - - NSError *error = nil; - __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; -} - -#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 *)applicationDocumentsDirectory -{ - return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; -} - -@end diff --git a/TaskTimer/TaskTimer/UYLCounterView.h b/TaskTimer/TaskTimer/UYLCounterView.h deleted file mode 100644 index 7fbd13e..0000000 --- a/TaskTimer/TaskTimer/UYLCounterView.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// UYLCounterView.h -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -@protocol UYLCounterViewDelegate - -@optional - -- (void)didStartCounter; -- (void)didStopCounter; - -@end - -@interface UYLCounterView : UIView - -@property (nonatomic, weak) id delegate; -@property (nonatomic, assign) NSUInteger secondsCounter; -@property (nonatomic, strong) NSMutableArray *accessibleElements; -@property (nonatomic, assign) BOOL counterEnabled; - -@end diff --git a/TaskTimer/TaskTimer/UYLCounterView.m b/TaskTimer/TaskTimer/UYLCounterView.m deleted file mode 100644 index 245d24a..0000000 --- a/TaskTimer/TaskTimer/UYLCounterView.m +++ /dev/null @@ -1,292 +0,0 @@ -// -// UYLCounterView.m -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLCounterView.h" -#import "NSNumber+UYLTimeFormatter.h" - -@interface UYLCounterView () - -@property (nonatomic, strong) UIButton *startButton; -@property (nonatomic, strong) UIButton *stopButton; - -- (void)setupView; - -@end - -@implementation UYLCounterView - -@synthesize delegate=_delegate; -@synthesize secondsCounter=_secondsCounter; -@synthesize accessibleElements=_accessibleElements; -@synthesize counterEnabled=_counterEnabled; -@synthesize startButton=_startButton; -@synthesize stopButton=_stopButton; - -#define UYLCOUNTERVIEW_LIMIT 3599 // Maximum seconds that can be displayed as mm:ss -#define UYLCOUNTERVIEW_MARGIN 10 -#define UYLCOUNTERVIEW_MINFONT 10 - -#define UYLCOUNTERVIEW_ELEMENTINDEX_STARTBUTTON 0 -#define UYLCOUNTERVIEW_ELEMENTINDEX_COUNTERTEXT 1 -#define UYLCOUNTERVIEW_ELEMENTINDEX_STOPBUTTON 2 - -- (id)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self) - { - [self setupView]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - self = [super initWithCoder:aDecoder]; - if (self) - { - [self setupView]; - } - return self; -} - -- (void)setSecondsCounter:(NSUInteger)secondsCounter -{ - if (secondsCounter > UYLCOUNTERVIEW_LIMIT) - { - secondsCounter = UYLCOUNTERVIEW_LIMIT; - } - - _secondsCounter = secondsCounter; - - if (_accessibleElements) - { - UIAccessibilityElement *counterElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_COUNTERTEXT]; - counterElement.accessibilityValue = [[NSNumber numberWithInteger:secondsCounter] stringValueAsTime]; - } - - [self setNeedsDisplay]; -} - -- (void)setCounterEnabled:(BOOL)counterEnabled -{ - _counterEnabled = counterEnabled; - - if (counterEnabled == YES) - { - self.startButton.enabled = YES; - self.stopButton.enabled = NO; - } - else - { - self.startButton.enabled = NO; - self.stopButton.enabled = NO; - } -} -- (void)drawRect:(CGRect)rect -{ - NSUInteger minutes = self.secondsCounter / 60; - NSUInteger seconds = self.secondsCounter % 60; - - NSString *counterText = [NSString stringWithFormat:@"%02u:%02u", minutes, seconds]; - UIFont *font = [UIFont boldSystemFontOfSize:48]; - - CGFloat actualFontSize; - CGSize stringSize = [counterText sizeWithFont:font - minFontSize:UYLCOUNTERVIEW_MINFONT - actualFontSize:&actualFontSize - forWidth:self.bounds.size.width - lineBreakMode:UILineBreakModeTailTruncation]; - - - CGPoint point = CGPointMake((self.bounds.size.width - stringSize.width)/2, - (self.bounds.size.height - stringSize.height)/2); - - [counterText drawAtPoint:point - forWidth:stringSize.width - withFont:font - fontSize:actualFontSize - lineBreakMode:UILineBreakModeWordWrap - baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; - -} - -#pragma mark - -#pragma mark === Action methods === -#pragma mark - - -- (void)startAction:(UIButton *)sender -{ - self.startButton.enabled = NO; - self.stopButton.enabled = YES; - - if (_accessibleElements) - { - UIAccessibilityElement *startElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_STARTBUTTON]; - startElement.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled; - - UIAccessibilityElement *stopElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_STOPBUTTON]; - stopElement.accessibilityTraits = UIAccessibilityTraitButton; - } - - if ([self.delegate respondsToSelector:@selector(didStartCounter)]) - { - [self.delegate didStartCounter]; - } -} - -- (void)stopAction:(UIButton *)sender -{ - self.counterEnabled = NO; - - if (_accessibleElements) - { - UIAccessibilityElement *stopElement = [self.accessibleElements objectAtIndex:UYLCOUNTERVIEW_ELEMENTINDEX_STOPBUTTON]; - stopElement.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled; - } - - if ([self.delegate respondsToSelector:@selector(didStopCounter)]) - { - [self.delegate didStopCounter]; - } -} - -#pragma mark - -#pragma mark === Accessibility Container methods === -#pragma mark - - -- (NSArray *)accessibleElements -{ - if (_accessibleElements != nil) - { - return _accessibleElements; - } - - _accessibleElements = [[NSMutableArray alloc] init]; - - // For the start and stop buttons we need to convert the button frame to the screen - // coord system when setting the accessibility frame. - - // start button - - UIAccessibilityElement *startElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; - startElement.accessibilityFrame = [self convertRect:self.startButton.frame toView:nil]; - startElement.accessibilityLabel = NSLocalizedString(@"Start", nil); - startElement.accessibilityTraits = UIAccessibilityTraitButton; - if (self.startButton.enabled == NO) startElement.accessibilityTraits |= UIAccessibilityTraitNotEnabled; - - [_accessibleElements addObject:startElement]; - - // The accessibilityFrame is returned in screen coordinates so it is first - // converted from screen to the local view coord system. - // The counter element frame is then calculated and then converted back - // to the screen coordinate system when setting the accessibility frame. - - CGRect frame = [self convertRect:self.accessibilityFrame fromView:nil]; - - UIAccessibilityElement *counterElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; - CGRect textFrame = CGRectInset(frame, UYLCOUNTERVIEW_MARGIN + self.startButton.bounds.size.width + UYLCOUNTERVIEW_MARGIN, UYLCOUNTERVIEW_MARGIN); - counterElement.accessibilityFrame = [self convertRect:textFrame toView:nil]; - counterElement.accessibilityLabel = NSLocalizedString(@"Duration", nil); - counterElement.accessibilityValue = [[NSNumber numberWithInteger:self.secondsCounter] stringValueAsTime]; - counterElement.accessibilityTraits = UIAccessibilityTraitUpdatesFrequently; - - [_accessibleElements addObject:counterElement]; - - // stop button - - UIAccessibilityElement *stopElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; - stopElement.accessibilityFrame = [self convertRect:self.stopButton.frame toView:nil]; - stopElement.accessibilityLabel = NSLocalizedString(@"Stop", nil); - stopElement.accessibilityTraits = UIAccessibilityTraitButton; - if (self.stopButton.enabled == NO) stopElement.accessibilityTraits |= UIAccessibilityTraitNotEnabled; - - [_accessibleElements addObject:stopElement]; - - return _accessibleElements; -} - -- (BOOL)isAccessibilityElement -{ - return NO; -} - -- (NSInteger)accessibilityElementCount -{ - return [[self accessibleElements] count]; -} - -- (id)accessibilityElementAtIndex:(NSInteger)index -{ - return [[self accessibleElements] objectAtIndex:index]; -} - -- (NSInteger)indexOfAccessibilityElement:(id)element -{ - return [[self accessibleElements] indexOfObject:element]; -} - -#pragma mark - -#pragma mark === Private methods === -#pragma mark - - -- (void)setupView -{ - UIImage *startImage = [UIImage imageNamed:@"start.png"]; - UIImage *stopImage = [UIImage imageNamed:@"stop.png"]; - - CGRect startFrame = CGRectMake(UYLCOUNTERVIEW_MARGIN, (self.bounds.size.height - startImage.size.height)/2, - startImage.size.height, startImage.size.width); - CGRect stopFrame = CGRectMake(self.bounds.size.width - UYLCOUNTERVIEW_MARGIN - stopImage.size.width, - (self.bounds.size.height - stopImage.size.height)/2, - stopImage.size.height, stopImage.size.width); - - self.startButton = [[UIButton alloc] initWithFrame:startFrame]; - self.stopButton = [[UIButton alloc] initWithFrame:stopFrame]; - - self.startButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; - self.stopButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; - - [self.startButton setImage:startImage forState:UIControlStateNormal]; - [self.stopButton setImage:stopImage forState:UIControlStateNormal]; - - [self.startButton addTarget:self action:@selector(startAction:) forControlEvents:UIControlEventTouchUpInside]; - [self.stopButton addTarget:self action:@selector(stopAction:) forControlEvents:UIControlEventTouchUpInside]; - - self.startButton.enabled = NO; - self.stopButton.enabled = NO; - - [self addSubview:self.startButton]; - [self addSubview:self.stopButton]; -} - -@end diff --git a/TaskTimer/TaskTimer/UYLTaskListViewController.h b/TaskTimer/TaskTimer/UYLTaskListViewController.h deleted file mode 100644 index 53127fa..0000000 --- a/TaskTimer/TaskTimer/UYLTaskListViewController.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// UYLMasterViewController.h -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import -#import -#import "UYLTaskViewController.h" - -@interface UYLTaskListViewController : UITableViewController - -@property (strong, nonatomic) UYLTaskViewController *detailViewController; -@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; -@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; - -@end diff --git a/TaskTimer/TaskTimer/UYLTaskListViewController.m b/TaskTimer/TaskTimer/UYLTaskListViewController.m deleted file mode 100644 index 0505d63..0000000 --- a/TaskTimer/TaskTimer/UYLTaskListViewController.m +++ /dev/null @@ -1,247 +0,0 @@ -// -// UYLMasterViewController.m -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLTaskListViewController.h" -#import "Task.h" -#import "NSNumber+UYLTimeFormatter.h" - -@interface UYLTaskListViewController () -- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath; -@end - -@implementation UYLTaskListViewController - -@synthesize detailViewController = _detailViewController; -@synthesize fetchedResultsController = __fetchedResultsController; -@synthesize managedObjectContext = __managedObjectContext; - -#pragma mark - -#pragma mark === View Life Cycle Management === -#pragma mark - - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) - { - self.title = NSLocalizedString(@"Task List", nil); - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) - { - self.clearsSelectionOnViewWillAppear = NO; - self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); - } - } - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - self.navigationItem.leftBarButtonItem = self.editButtonItem; - - UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)]; - self.navigationItem.rightBarButtonItem = addButton; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - -#pragma mark - -#pragma mark === Table View Data Source Delegate Methods === -#pragma mark - - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ - return [[self.fetchedResultsController sections] count]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; - return [sectionInfo numberOfObjects]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - static NSString *CellIdentifier = @"Cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - if (cell == nil) - { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) - { - cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; - } - } - - [self configureCell:cell atIndexPath:indexPath]; - return cell; -} - -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath -{ - return YES; -} - -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath -{ - if (editingStyle == UITableViewCellEditingStyleDelete) - { - Task *task = [[self fetchedResultsController] objectAtIndexPath:indexPath]; - if ([self.detailViewController.task isEqual:task]) - { - self.detailViewController.task = nil; - } - - NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; - [context deleteObject:task]; - - NSError *error = nil; - if (![context save:&error]) - { - NSLog(@"Unresolved error %@, %@", error, [error userInfo]); - } - } -} - -#pragma mark - -#pragma mark === Table View Delegate Methods === -#pragma mark - - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - Task *task = [[self fetchedResultsController] objectAtIndexPath:indexPath]; - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) - { - UYLTaskViewController *detailViewController = [[UYLTaskViewController alloc] initWithNibName:@"UYLTaskViewController_iPhone" - bundle:nil]; - detailViewController.task = task; - [self.navigationController pushViewController:detailViewController animated:YES]; - } - else - { - self.detailViewController.task = task; - } -} - -#pragma mark - -#pragma mark === Fetched Results Controller === -#pragma mark - - -- (NSFetchedResultsController *)fetchedResultsController -{ - if (__fetchedResultsController != nil) - { - return __fetchedResultsController; - } - - NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; - NSEntityDescription *entity = [NSEntityDescription entityForName:@"Task" inManagedObjectContext:self.managedObjectContext]; - [fetchRequest setEntity:entity]; - [fetchRequest setFetchBatchSize:20]; - - NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO]; - NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; - [fetchRequest setSortDescriptors:sortDescriptors]; - - NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest - managedObjectContext:self.managedObjectContext - sectionNameKeyPath:nil - cacheName:@"Todo"]; - frc.delegate = self; - self.fetchedResultsController = frc; - - NSError *error = nil; - if (![self.fetchedResultsController performFetch:&error]) - { - NSLog(@"Unresolved error %@, %@", error, [error userInfo]); - } - - return __fetchedResultsController; -} - - - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller -{ - [self.tableView reloadData]; -} - -#pragma mark - -#pragma mark === Action methods === -#pragma mark - - -- (void)insertNewObject:(id)sender -{ - NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; - NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; - Task *task = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; - - task.note = @"New Task"; - task.createdAt = [NSDate date]; - - NSError *error = nil; - if (![context save:&error]) - { - NSLog(@"Unresolved error %@, %@", error, [error userInfo]); - } -} - -#pragma mark - -#pragma mark === Private methods === -#pragma mark - - -- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath -{ - Task *task = [self.fetchedResultsController objectAtIndexPath:indexPath]; - cell.textLabel.text = task.note; - cell.detailTextLabel.text = nil; - cell.imageView.image = [UIImage imageNamed:@"unchecked.png"]; - cell.accessibilityLabel = task.note; - - if ([task.complete boolValue]) - { - NSUInteger minutes = [task.duration integerValue] / 60; - NSUInteger seconds = [task.duration integerValue] % 60; - - cell.detailTextLabel.text = [NSString stringWithFormat:@"%02u:%02u", minutes, seconds]; - cell.imageView.image = [UIImage imageNamed:@"checked.png"]; - - NSString *durationText = [NSString stringWithFormat:@"%@ %@",task.note, - NSLocalizedString(@"completed in", nil)]; - durationText = [durationText stringByAppendingString:[task.duration stringValueAsTime]]; - cell.accessibilityLabel = durationText; - } -} - -@end diff --git a/TaskTimer/TaskTimer/UYLTaskViewController.h b/TaskTimer/TaskTimer/UYLTaskViewController.h deleted file mode 100644 index e73c2be..0000000 --- a/TaskTimer/TaskTimer/UYLTaskViewController.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// UYLDetailViewController.h -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import -#import "Task.h" -#import "UYLCounterView.h" - -@interface UYLTaskViewController : UIViewController - -@property (strong, nonatomic) Task *task; -@property (weak, nonatomic) IBOutlet UITextField *taskNote; -@property (weak, nonatomic) IBOutlet UYLCounterView *taskCounterView; - -@end diff --git a/TaskTimer/TaskTimer/UYLTaskViewController.m b/TaskTimer/TaskTimer/UYLTaskViewController.m deleted file mode 100644 index e956ad2..0000000 --- a/TaskTimer/TaskTimer/UYLTaskViewController.m +++ /dev/null @@ -1,299 +0,0 @@ -// -// UYLDetailViewController.m -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import "UYLTaskViewController.h" - -@interface UYLTaskViewController () - -@property (assign, nonatomic) BOOL running; -@property (strong, nonatomic) NSTimer *taskTimer; -@property (strong, nonatomic) UIPopoverController *masterPopoverController; -@property (weak, nonatomic) IBOutlet UIButton *taskResetButton; - -- (void)configureView; -- (void)saveContext; -- (IBAction)taskResetAction; -- (void)voiceOverStatusChanged; - -@end - -@implementation UYLTaskViewController - -@synthesize task=_task; -@synthesize taskNote=_taskNote; -@synthesize taskCounterView=_taskCounterView; -@synthesize taskResetButton=_taskResetButton; -@synthesize running=_running; -@synthesize taskTimer=_taskTimer; -@synthesize masterPopoverController = _masterPopoverController; - -#pragma mark - -#pragma mark === Accessors === -#pragma mark - - -- (void)setTask:(Task *)newTask -{ - if (_task != newTask) - { - _task = newTask; - - self.running = NO; - self.taskTimer = nil; - - // Update the view. - [self configureView]; - } - - if (self.masterPopoverController != nil) { - [self.masterPopoverController dismissPopoverAnimated:YES]; - } -} - -- (void)setTaskTimer:(NSTimer *)taskTimer -{ - [_taskTimer invalidate]; - _taskTimer = taskTimer; -} - -#pragma mark - -#pragma mark === View Life Cycle Management === -#pragma mark - - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) - { - self.title = NSLocalizedString(@"Task", nil); - } - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - self.taskCounterView.delegate = self; - [self configureView]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(voiceOverStatusChanged) - name:UIAccessibilityVoiceOverStatusChanged - object:nil]; -} - -- (void)viewDidUnload -{ - [super viewDidUnload]; - self.taskTimer = nil; - [self saveContext]; - - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [self becomeFirstResponder]; -} - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; - self.taskTimer = nil; - [self saveContext]; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation -{ - // The accessibility elements should be recalculated when the orientation changes - self.taskCounterView.accessibleElements = nil; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - -#pragma mark === Split View Delegate methods === -#pragma mark - - -- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { - return NO; -} - -- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController -{ - barButtonItem.title = NSLocalizedString(@"Task List", nil); - [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; - self.masterPopoverController = popoverController; -} - -- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem -{ - // Called when the view is shown again in the split view, invalidating the button and popover controller. - [self.navigationItem setLeftBarButtonItem:nil animated:YES]; - self.masterPopoverController = nil; -} - -#pragma mark - -#pragma mark === Text delegate methods === -#pragma mark - - -- (BOOL)textFieldShouldReturn:(UITextField *)textField -{ - if (self.task) - { - self.task.note = textField.text; - } - [textField resignFirstResponder]; - return YES; -} - -#pragma mark - -#pragma mark === UIResponder Respond to motion events === -#pragma mark - - -- (BOOL)canBecomeFirstResponder -{ - return YES; -} - -- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event -{ - [self taskResetAction]; -} - -#pragma mark - -#pragma mark === UYLCounterViewDelegate methods === -#pragma mark - - -- (void)didStartCounter -{ - self.running = YES; - - // Create a timer that fires every second. - NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 - target:self - selector:@selector(timerTick:) - userInfo:nil - repeats:YES]; - self.taskTimer = timer; -} - -- (void)didStopCounter -{ - if (self.task) - { - self.task.complete = [NSNumber numberWithBool:YES]; - } - - self.running = NO; - self.taskTimer = nil; - [self saveContext]; -} - -- (void)timerTick:(NSTimer *)timer -{ - if (self.running && self.task) - { - NSUInteger duration = [self.task.duration integerValue]; - duration++; - - self.task.duration = [NSNumber numberWithInteger:duration]; - self.taskCounterView.secondsCounter = duration; - } -} - -#pragma mark - -#pragma mark === Private methods === -#pragma mark - - -- (void)configureView -{ - NSInteger duration = 0; - self.taskNote.enabled = NO; - self.taskCounterView.counterEnabled = NO; - self.taskNote.text = nil; - - if (self.task) - { - self.taskNote.enabled = YES; - self.taskNote.text = self.task.note; - duration = [self.task.duration integerValue]; - if ([self.task.complete boolValue] == NO) - { - self.taskCounterView.counterEnabled = YES; - } - } - self.taskCounterView.secondsCounter = duration; - self.taskResetButton.hidden = ! UIAccessibilityIsVoiceOverRunning(); -} - -- (void)saveContext -{ - NSError *error = nil; - NSManagedObjectContext *managedObjectContext = [self.task managedObjectContext]; - if (managedObjectContext != nil) - { - if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) - { - NSLog(@"Unresolved error %@, %@", error, [error userInfo]); - } - } -} - -- (IBAction)taskResetAction -{ - if (self.task) - { - self.running = NO; - self.taskTimer = nil; - - self.task.duration = [NSNumber numberWithInteger:0]; - self.task.complete = [NSNumber numberWithBool:NO]; - - self.taskCounterView.secondsCounter = 0; - self.taskCounterView.counterEnabled = YES; - } -} - -- (void)voiceOverStatusChanged -{ - self.taskResetButton.hidden = ! UIAccessibilityIsVoiceOverRunning(); -} - -@end diff --git a/TaskTimer/TaskTimer/checked.png b/TaskTimer/TaskTimer/checked.png deleted file mode 100644 index df7084dc9f6845b1f42013f2118460dae4ede262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcmZWp4LH+l8~_u&kgx2A_ zua2e;AvGjA9O?8y3~v-COUn1xt5t70qxW^4>w2H-x}WEM?(28|?%#c1&-I7{1AGni zEc5^XFd&n>4{A>H72BYr+1uV`(f|N5%Ony5$wVR;$m2vYV;KOjOPYJ=1!pj5i>H_q zR%Ys1T7AyYB)jSmCA5B<#V_qTA_!}4;7 z&5wlG@3E)1&oR^T<=<5rfkQs;XTKT7KcB;lSRr<11yh9us&89eEO!`rP{wyf7G#(8 z*V&KQwtaGOdLOI5V3}SA+YcYNXn2%#;N(;>wL7?Bf8gg%H_q-Ob4hb==U?wUKhk)< zH$36Ka${;`Og*^`3A_7RZN4+rWUi?_%r;ku^qMa!PA>cP{R4N?3CavOBvwSLGv$GI zPdv`wsbKLEpWrIa%3>Pa|BlTt+caF!Ly(Taye>rXuSaAhPvlm2H9Jnj{aznQF`f9Q z?X)jnVh%Ng0W;!6+tp099q_CIwhD=P{ZO;+Bgww|+fEj`w% zKaCE)q2+v4BGSKW#XUfQK>YFpl?U^;ip!~njH$%YwAQ$`LWAr5MQ%RK&X=2}&sbg( zY|fm#KL&o2N2C|#r1=fmaHOp^+1;CX+@4#O*`1Luo-HomT)P}pRvC}#fAopiGIKq- zyQ?a7@ttYRN2!eIP$JZAX*IlA2$}m(h4^&CVZNGxxRYEvF>dUKkvGc+<^NXdO<$AO zWl29^>&`YGBGK4UlBXD)k3?kl5Daf+oI2IT{R~MwnRDAV@-e!9Gc(xkjqVkZt;gUF z@`d4i&kH7_Uyt75C4^oaJV{musSm3Ur~}mDYIFL_JZ^}Ztbm?^h2>oCRgKXWCNq*k zd!79o!zqqea&Cquk$>NdBvp}q>nKse4al_a?aIj^%x&QvAzVk+($w3#RP9lfegqP* z-b9EO!98kO%fy)OeP>D3L8W1B2-~SmR%p@#W+(r)DUM`$Tydd9p&JiVjNS6Pyj-Yv zBFChP4;G?#Uwf2f-IeHdI%(jz+0@l3SzPY32ILGSzkk#GSol9)DOGdMI$JN@$RH~?jlF=x>YTshB4)?)-%tC-TVcV`> zy)<9IS6osE9{|4Iykc5Fv1}^3VqPq=fCNi z8y0#(AmE~r$b^IhM1l)~!#j?2LZMJdM`xt7GhBm!^Ap(usu0fR!@iLGkH?$Ar}3Cv z0h7Z9S9qzBoOl5i3SB9*w!Y}3)7I*6<9V^GRp>M%BbLEpumyai6T%6(My|=l&}nFX zd}K6(CRo+IMz`7kfqESImoNtT|7Z+yMbTdrerbO-s_7r6he58*5~nxnX@J*E9!>Vf z2a&{0eLwAQ4cwSE$NARUW<#E}W9+&;gmjf>3sp+8B-t428jITu#DjTc%Ot%FAOnP1 z!&*eUGFZ>w_zVj#HcWi_Fwl6h04SO-F52A{x~^hNy~MuT8%=`9m!j?P5@TK_7zz2Zrow2mla?II!@QYs&=%ZBR0PF72`@um_Hpiuu#PP1I!;!snp zjW3Xt1E_5s4p}mt7MB{CHvX{WB7k}?4Fym}X})wPGki2%H&irfIY6{0wxH*?gQAy^ z^(2_0K3ge;*Qiv^9reDi@9#n5|F)bJMWCm?x@N_-s&{bwBt0+}G#++@JgT<4&PE?N(CIQ~-fMN@RQD z-eqsHV)C-f_eL9`7zBcR2(YuGlI`pOY8b~iAeaRLZ4srrz2rQ1Rkcas(9gncO2iq; zYN=IjE(au9nwMK-$tTO+6Er1{pKUw)Ae^n~(zo+kSBP8jXDN>20wnIL+{P>cK~u5$ z^VKPE4cWz3tw;YXjz56+KlwTS0=KftrT$<`ov13-YAn)v=BYWp)xBUOpR93c@Z&-A zVo_#se(oRpbl0@oZl1@NpNnz2K}SiUS`v5nHhJmZ8MKfanE1&H-&au%(f^we?2bFK zaW)_>yW)>Z6=0CG_+jgi?TcCLYaNuKkj4G1K4Le|R&@@Ap z@Z*HHY_(7#nq%8tK3=3%Q22;v^TxV%+nM(6$_u%yTROzU8!`;cN)9zCPGe|Sz$WLj zk`-_3aGhNs5K1<+dvErJlyZhLYbt6qt|_!RU+GfcDRWXl`zzS=aqU9>`oziBF<|Qn zJD>ctILe?tN7SUB+6fEec3sm>ZD+phpP#cf>)1Y`lh7vlo8+ZBb19~?qbhd(3q0tX zs3>52u|Te|Nx3E;GW)d(wRC0sM==3)Gp2fCd>sW_(NOWc;#0T6^u>x=q3A2FHmSkQ z-ka^4^%QGO%1Ty$1b8;F4j=B|{)9wDq+K^)KF0K|51?&+Cs&qiVEKF#IcF%_CP!^_ z?dZ+0$OC!LBghM`3;PzF7n~M67c_ico#1*bkn0eK_2_A*dq&2*=Oz=P5A>Kg)_b}b zm8I1jh$cV$6K!8*fA4;AH&Ti0-MO)Qau9o6a8rPkEo!{g)ALzuSrxw@;v}OcuuVo< zR)_qs3+i-8vS&Q+R<8D78#fo_t91dXG527h_S$}RImLBy;d*sr*C?ld^ZPB_NQTQX#1AgjL=ckH7)BA6rXI!%TM$L|1I8VPaf9I%&siPG&>Z${79Mv%n zT$uqHN;jRq^93oMi`JhTlC_*yAM~(5^z$LZK`JHRYVCWIBVSh+gXxwf7B3P%JlUgv z6#OCZ+n3qcgBmvr+2(~RA8wB?NFN#*@trFk_2rE?%s0q#AADE$0EG&gx7@`quYfgN zdk-E6w08Z9fk6dD8$cj1JHVC3r#VtE-kcB=!-vCUp#&k^Wi$wc6=0Ub5Eh>S2ttC{ zJd6N`SVdr#kqX#x!dQSA$_!J;2zqJAu{rfMi6-I58Y(XHYB{I?0 z)&JPbQ;zno&Z@1k7BFY7@$t2y7tijx*>=dq`wyQx@%dQ&fGbJ9_6q&lBlt0gwNmb9 zu5ERP*@hs5My2o`l0PGnA;0U%_X9UIB&Lts>LUjWqukpW@W?^j*vp|J-gMsv{3N(P z?-Qu=1P&tQ9JnS+pYRnRLH9s|gfqfqq4@Mz@3RCMTgsUW`|*@11!!~s>$r*cLR>_G zc@Wv;@`JYnOrwL1yNB_VJ~hR1hjeJ_lI$!LlsrkI!i@95!?=!D9ZPaaOJyW~m?Tw8 zy3w>ArYO9V2JypEHo6`aEnZ4|hd=z+sj}cB`>mFe)`=z>HRv-v*5($Qn_Y#Vk8$38mq|b8a|w~qxCDD)1k@8>Nt8TDCI30`T9+Iz`wb@(EZrx zLod%QhnK30-;4J0+?IR}>Ir33gd8D#xt!51)j;iX-*=B~6w;`*Euu2~jX9Tap4#J; zbnhrEQXYJ=76{ZZ!_`7@LZ!^?g3M2+cBKPvallR}?#?kF0~RZLJ-qV)XM5_)Ly8|1 zEXVz?DrmzVwti)Yii=xyq)MeS6VDquIv|OabtRJV_`IL{dgPf;Ak6ho3%AKL<;4WP zn*Y_n3E zu6TQCCis)?H1zVM^$k^3p-i@2+we8L`+B4VX>l9|mX{LI+EWvk@3g*jD*&fzJ(aK| v8_LW}d5@_B&>Vo3r&8}hSX40 - - - 1296 - 11D50 - 2182 - 1138.32 - 568.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - {{0, 20}, {320, 832}} - - - - 3 - MQA - - YES - - 2 - - - IBUISplitViewMasterSimulatedSizeMetrics - - YES - - - - - - {320, 852} - {320, 768} - - - IBIPadFramework - Master - IBUISplitViewController - - IBUISplitViewControllerContentSizeLocation - IBUISplitViewControllerContentSizeLocationMaster - - - IBIPadFramework - YES - 1 - 0 - YES - 56 - 22 - 22 - - - - - - - view - - - - 3 - - - - dataSource - - - - 4 - - - - delegate - - - - 5 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - UYLTaskListViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 5 - - - - - UYLTaskListViewController - UITableViewController - - IBProjectSource - ./Classes/UYLTaskListViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - diff --git a/TaskTimer/TaskTimer/en.lproj/UYLTaskListViewController_iPhone.xib b/TaskTimer/TaskTimer/en.lproj/UYLTaskListViewController_iPhone.xib deleted file mode 100644 index 0087cf4..0000000 --- a/TaskTimer/TaskTimer/en.lproj/UYLTaskListViewController_iPhone.xib +++ /dev/null @@ -1,143 +0,0 @@ - - - - 1296 - 11D50 - 2182 - 1138.32 - 568.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {{0, 20}, {320, 460}} - - - - 3 - MQA - - YES - - IBCocoaTouchFramework - YES - 1 - 0 - YES - 56 - 22 - 22 - - - - - - - view - - - - 3 - - - - dataSource - - - - 4 - - - - delegate - - - - 5 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - UYLTaskListViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 5 - - - - - UYLTaskListViewController - UITableViewController - - IBProjectSource - ./Classes/UYLTaskListViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - diff --git a/TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPad.xib b/TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPad.xib deleted file mode 100644 index 0fc013c..0000000 --- a/TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPad.xib +++ /dev/null @@ -1,331 +0,0 @@ - - - - 1296 - 11E53 - 2182 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBUIButton - IBUIView - IBUITextField - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - - - 290 - {{20, 95}, {728, 31}} - - - - _NS:9 - NO - YES - IBIPadFramework - 0 - - 3 - - 3 - MAA - - 2 - - - YES - 17 - - 2 - 9 - YES - IBCocoaTouchFramework - - 1 - - 1 - 14 - - - Helvetica - 14 - 16 - - - - - 290 - {{20, 176}, {728, 174}} - - - _NS:9 - - 3 - MC42NjY2NjY2NjY3AA - - 3 - IBIPadFramework - - - - -2147483355 - {{314, 462}, {140, 37}} - - - _NS:9 - NO - - Reset - - IBIPadFramework - 0 - 0 - Reset - - 3 - MQA - - - 1 - MSAxIDEAA - - - 3 - MC41AA - - - NSImage - redbutton.png - - - 2 - 2 - - - Helvetica-Bold - 18 - 16 - - - - {{0, 64}, {768, 960}} - - - - - NO - - 2 - - - NO - - IBIPadFramework - - - - - - - view - - - - 12 - - - - taskNote - - - - 69 - - - - taskCounterView - - - - 72 - - - - taskResetButton - - - - 87 - - - - delegate - - - - 68 - - - - taskResetAction - - - 7 - - 88 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 8 - - - - - - - - - - 67 - - - - - 70 - - - - - - 86 - - - - - - - UYLTaskViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UYLCounterView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - 88 - - - - - UYLCounterView - UIView - - IBProjectSource - ./Classes/UYLCounterView.h - - - - UYLTaskViewController - UIViewController - - taskResetAction - id - - - taskResetAction - - taskResetAction - id - - - - UYLCounterView - UITextField - UIButton - - - - taskCounterView - UYLCounterView - - - taskNote - UITextField - - - taskResetButton - UIButton - - - - IBProjectSource - ./Classes/UYLTaskViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - - redbutton.png - {140, 40} - - 1181 - - diff --git a/TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPhone.xib b/TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPhone.xib deleted file mode 100644 index d65f751..0000000 --- a/TaskTimer/TaskTimer/en.lproj/UYLTaskViewController_iPhone.xib +++ /dev/null @@ -1,334 +0,0 @@ - - - - 1296 - 11E53 - 2182 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBUIButton - IBUIView - IBUITextField - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 290 - {{20, 59}, {280, 60}} - - - - _NS:9 - - 3 - MC42NjY2NjY2NjY3AA - - 3 - IBCocoaTouchFramework - - - - 290 - {{20, 18}, {280, 31}} - - - - _NS:9 - NO - YES - IBCocoaTouchFramework - 0 - - 3 - Enter task description - - 3 - MAA - - 2 - - - YES - 17 - - 2 - 9 - YES - IBCocoaTouchFramework - - 1 - - 1 - 14 - - - Helvetica - 14 - 16 - - - - - -2147483355 - {{90, 140}, {140, 37}} - - - _NS:9 - NO - - Reset - - IBCocoaTouchFramework - 0 - 0 - Reset - - 3 - MQA - - - 1 - MSAxIDEAA - - - 3 - MC41AA - - - NSImage - redbutton.png - - - 2 - 2 - - - Helvetica-Bold - 18 - 16 - - - - {{0, 64}, {320, 416}} - - - - - 3 - MQA - - - - - NO - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - taskNote - - - - 20 - - - - taskCounterView - - - - 23 - - - - taskResetButton - - - - 39 - - - - delegate - - - - 22 - - - - taskResetAction - - - 7 - - 40 - - - - - - 0 - - - - - - 1 - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 17 - - - - - - 19 - - - - - 38 - - - - - - - UYLTaskViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UYLCounterView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - 40 - - - - - UYLCounterView - UIView - - IBProjectSource - ./Classes/UYLCounterView.h - - - - UYLTaskViewController - UIViewController - - taskResetAction - id - - - taskResetAction - - taskResetAction - id - - - - UYLCounterView - UITextField - UIButton - - - - taskCounterView - UYLCounterView - - - taskNote - UITextField - - - taskResetButton - UIButton - - - - IBProjectSource - ./Classes/UYLTaskViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - - redbutton.png - {140, 40} - - 1181 - - diff --git a/TaskTimer/TaskTimer/main.m b/TaskTimer/TaskTimer/main.m deleted file mode 100644 index a098b2a..0000000 --- a/TaskTimer/TaskTimer/main.m +++ /dev/null @@ -1,43 +0,0 @@ -// -// main.m -// TaskTimer -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2012 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: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#import - -#import "UYLAppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([UYLAppDelegate class])); - } -} diff --git a/TaskTimer/TaskTimer/redbutton.png b/TaskTimer/TaskTimer/redbutton.png deleted file mode 100644 index 5b99cd97c28a264f388e15a67e9723bfa10d3553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2242 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 diff --git a/TaskTimer/TaskTimer/start@2x.png b/TaskTimer/TaskTimer/start@2x.png deleted file mode 100644 index 2e2bc5218486b53ea67ef7dc4eda6cbdf5478397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 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 diff --git a/TaskTimer/TaskTimer/stop.png b/TaskTimer/TaskTimer/stop.png deleted file mode 100644 index 25d1c1102f34992286c860186f1b876cc41ea1a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2173 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 ZhiF@Y8|3ijF6*673}tC&QDNp2`yaCT6f*z- diff --git a/TaskTimer/TaskTimer/unchecked.png b/TaskTimer/TaskTimer/unchecked.png deleted file mode 100644 index f6f88e126a1d92060e63e0b9e807e71fe494a30e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)xihVE&Nl>>S|f?5q$_l%JNFlghxL zF|jxFZvO2M5&O>km?dKN3pV!giFU6K4UXO^Ew%O-o9E=EFP)@zp1q;9VEBTyyC%o=Ipm#|1T~LTe+NBWu8+`xNWW6$ION)E3Mb@E8KJY`9br(Z z(0BMWb5`||LqAWNi@gqhuW+w(N7j$ll>z%Q&Q4L=ky})G&TduPoa|lZUAE2Qg7;Tl zcAEHH*esy+FYGsXr|a`9s!r_nV%2x<1@|u>JKa$&Q2*lAE0*(-5zErz zp8jjq?u+Lu7PzLnIpm35r_0_2#~j{WUw&+duH}Qribc^zvBrHOPX8t)vu*C!Iq`Fz z^V*g<(z9ltF1CMSw^eK5`77&IO-tP?>rx}pr)shw;V{oTtB4JZMk^+?^X!u?2n=Rs z_L&lJC1{F7=ki3p)VGyS8x9v9nZdi}`b<-|%<~Tg-?hlhE)i~hbNso2<|OBo89fa? z_f+yH9#-kTBv@2%d7Di4`J}ryzkIecxuE@6w)xD?d2aC{@7Gjcy0E_f%XhKt-xKF# zYR|7=KX90D%M9j^zt-#h-Jtzxqm$mA>dmiT3HjKp+`sbn%CA?r-mPA_wPWHh+pTT; zLp_r7(k5KAv2&ZyE`C}e?r>^N&4q&h%#~$5+f|d!T3r{;j8K2UzO-G{;BS&JmsbDvEJk8iTPJ_c|DUa$z6GK&t`kYo(f&IIS2M$z4~pV#rmcw zWX@! z_Olh7{39O8P*`z9z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLj>|?L9+q}oPwjafLBZ?k;uzx5`S#jIUIqmo=7Z)*|EKyM zWpik>o2otkj;h1Xn#X1g2IU#EFF*C<>YvsD0XFW3^z|HE&z~{PI!uxCyrcRThvmzv{dUFZG3gy^ zb-#8vUh&{PbM{-W{}-2rtz6EmGS4X|+_qNkV`jsYmDcO{74EtH{GfT?@y@YR0cujmq_3Pe^7xo*x)Ae~4RVVg(vFbbbg8P?`o$ja>sDE+m70da^h-GPU zPye-Q_r>!S3tZFP9P-4j(`E01V-D}GFF&?J*Yd$*#iD4VSmQnsr+<@@**16VocKA< zd2P!a=~=T+7u!Fv+p4wj{FQa9rlszcb*Yi)Q#DzTaG2+vRm28HqZJd{dG^T`1O_uR z`%DSA5;R4kb9o|P>f6ev4TlSl%-~&feWs~f=J|($?^9V zwdYr`A2`gnWd`%dU+eY$ZqWX;(MfMl_2$>FgnVpP?q7L(<<~1*?^dte+A;B$?bf#a zp&rS3X%jBm*ttz;7eB2KcR01C=0d@L=E}03?W##isG9 zQ$?S0KiyMQ9zFebndgs?A7MWNfB5}~`yrX~a8g0!56>M+HOetPbFV&rp8WYub5-4nJa0`PlBg3pY5)2HCd6^**B@w}FfdWk9d zNvV1jxdlMg3=B3ERzPNMYDuC(MQ%=Bu~mhw5?F;5kPQ;nS5g2gDap1~itr6kaLzAE zRWQ*r(KAr8<5EyiuqjGOvkG!?gK7uzY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>l zjf`}GDs+o0^GXscbn}XpA%?)raY-#sF3Kz@$;{7F0GXSZlwVq6tE2?72o50bOi6~@ zQ&3uz1GXh4SwA%=H8(Y{q*&ij&rlz3I8d)mO0rdPX;M~datYYoaO1!pa7s+qM-sNt z$5d^j4{{Nb3nAVIivs;`$7Q1r4@*0)r}n&#z~HU-ba4#HXncEXFIR&B55q&3n*ZT_ zlY?YjU#Q;MUi$jt{H13*R!BU!VcWRBhtu-9W9ZX$oi!6@p5G|3S*h)Ugi|s{uc8S7 z#^$yy|137NZK;}7C%toPlyQsN;-9&t(wmi%o%CD}uqUT|UX=ohYEM@`mvv4FO#sIH BxwZfR From f4ebe906e2bd94d16d671c2d5dc906ccf73eb7db Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 20:11:22 +0000 Subject: [PATCH 129/142] Archive Stepper project --- .../Stepper.xcodeproj/project.pbxproj | 67 ++- .../Stepper/Base.lproj/UYLViewController.xib | 92 ++++ .../Stepper}/Stepper/Stepper-Info.plist | 2 +- .../Stepper}/Stepper/Stepper-Prefix.pch | 0 .../Stepper}/Stepper/UYLAppDelegate.h | 0 .../Stepper}/Stepper/UYLAppDelegate.m | 0 .../Stepper}/Stepper/UYLViewController.h | 0 .../Stepper}/Stepper/UYLViewController.m | 0 .../Stepper/en.lproj/InfoPlist.strings | 0 {Stepper => Archive/Stepper}/Stepper/main.m | 0 .../Stepper/en.lproj/UYLViewController.xib | 449 ------------------ 11 files changed, 152 insertions(+), 458 deletions(-) rename {Stepper => Archive/Stepper}/Stepper.xcodeproj/project.pbxproj (81%) create mode 100644 Archive/Stepper/Stepper/Base.lproj/UYLViewController.xib rename {Stepper => Archive/Stepper}/Stepper/Stepper-Info.plist (94%) rename {Stepper => Archive/Stepper}/Stepper/Stepper-Prefix.pch (100%) rename {Stepper => Archive/Stepper}/Stepper/UYLAppDelegate.h (100%) rename {Stepper => Archive/Stepper}/Stepper/UYLAppDelegate.m (100%) rename {Stepper => Archive/Stepper}/Stepper/UYLViewController.h (100%) rename {Stepper => Archive/Stepper}/Stepper/UYLViewController.m (100%) rename {Stepper => Archive/Stepper}/Stepper/en.lproj/InfoPlist.strings (100%) rename {Stepper => Archive/Stepper}/Stepper/main.m (100%) delete mode 100644 Stepper/Stepper/en.lproj/UYLViewController.xib diff --git a/Stepper/Stepper.xcodeproj/project.pbxproj b/Archive/Stepper/Stepper.xcodeproj/project.pbxproj similarity index 81% rename from Stepper/Stepper.xcodeproj/project.pbxproj rename to Archive/Stepper/Stepper.xcodeproj/project.pbxproj index 3056532..9e328cf 100644 --- a/Stepper/Stepper.xcodeproj/project.pbxproj +++ b/Archive/Stepper/Stepper.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5334608F23CA627F00BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLViewController.xib; sourceTree = ""; }; 53CA1FB714B3B08500432C8E /* Stepper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stepper.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53CA1FBB14B3B08500432C8E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 53CA1FBD14B3B08500432C8E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -30,7 +31,6 @@ 53CA1FCB14B3B08500432C8E /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 53CA1FCD14B3B08500432C8E /* UYLViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLViewController.h; sourceTree = ""; }; 53CA1FCE14B3B08500432C8E /* UYLViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLViewController.m; sourceTree = ""; }; - 53CA1FD114B3B08500432C8E /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -124,14 +124,15 @@ 53CA1FAE14B3B08500432C8E /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0430; + LastUpgradeCheck = 1120; }; buildConfigurationList = 53CA1FB114B3B08500432C8E /* Build configuration list for PBXProject "Stepper" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 53CA1FAC14B3B08500432C8E; productRefGroup = 53CA1FB814B3B08500432C8E /* Products */; @@ -180,7 +181,7 @@ 53CA1FD014B3B08500432C8E /* UYLViewController.xib */ = { isa = PBXVariantGroup; children = ( - 53CA1FD114B3B08500432C8E /* en */, + 5334608F23CA627F00BE943E /* Base */, ); name = UYLViewController.xib; sourceTree = ""; @@ -192,11 +193,31 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -204,10 +225,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -216,15 +242,38 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 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_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -238,6 +287,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stepper/Stepper-Prefix.pch"; INFOPLIST_FILE = "Stepper/Stepper-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -250,6 +300,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stepper/Stepper-Prefix.pch"; INFOPLIST_FILE = "Stepper/Stepper-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Archive/Stepper/Stepper/Base.lproj/UYLViewController.xib b/Archive/Stepper/Stepper/Base.lproj/UYLViewController.xib new file mode 100644 index 0000000..e957a6e --- /dev/null +++ b/Archive/Stepper/Stepper/Base.lproj/UYLViewController.xib @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Stepper/Stepper/Stepper-Info.plist b/Archive/Stepper/Stepper/Stepper-Info.plist similarity index 94% rename from Stepper/Stepper/Stepper-Info.plist rename to Archive/Stepper/Stepper/Stepper-Info.plist index 82d3103..a5a6331 100644 --- a/Stepper/Stepper/Stepper-Info.plist +++ b/Archive/Stepper/Stepper/Stepper-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFiles CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Stepper/Stepper/Stepper-Prefix.pch b/Archive/Stepper/Stepper/Stepper-Prefix.pch similarity index 100% rename from Stepper/Stepper/Stepper-Prefix.pch rename to Archive/Stepper/Stepper/Stepper-Prefix.pch diff --git a/Stepper/Stepper/UYLAppDelegate.h b/Archive/Stepper/Stepper/UYLAppDelegate.h similarity index 100% rename from Stepper/Stepper/UYLAppDelegate.h rename to Archive/Stepper/Stepper/UYLAppDelegate.h diff --git a/Stepper/Stepper/UYLAppDelegate.m b/Archive/Stepper/Stepper/UYLAppDelegate.m similarity index 100% rename from Stepper/Stepper/UYLAppDelegate.m rename to Archive/Stepper/Stepper/UYLAppDelegate.m diff --git a/Stepper/Stepper/UYLViewController.h b/Archive/Stepper/Stepper/UYLViewController.h similarity index 100% rename from Stepper/Stepper/UYLViewController.h rename to Archive/Stepper/Stepper/UYLViewController.h diff --git a/Stepper/Stepper/UYLViewController.m b/Archive/Stepper/Stepper/UYLViewController.m similarity index 100% rename from Stepper/Stepper/UYLViewController.m rename to Archive/Stepper/Stepper/UYLViewController.m diff --git a/Stepper/Stepper/en.lproj/InfoPlist.strings b/Archive/Stepper/Stepper/en.lproj/InfoPlist.strings similarity index 100% rename from Stepper/Stepper/en.lproj/InfoPlist.strings rename to Archive/Stepper/Stepper/en.lproj/InfoPlist.strings diff --git a/Stepper/Stepper/main.m b/Archive/Stepper/Stepper/main.m similarity index 100% rename from Stepper/Stepper/main.m rename to Archive/Stepper/Stepper/main.m diff --git a/Stepper/Stepper/en.lproj/UYLViewController.xib b/Stepper/Stepper/en.lproj/UYLViewController.xib deleted file mode 100644 index 61a93e4..0000000 --- a/Stepper/Stepper/en.lproj/UYLViewController.xib +++ /dev/null @@ -1,449 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBUISwitch - IBUIStepper - IBUIView - IBUILabel - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 292 - {{20, 20}, {280, 40}} - - - - _NS:328 - NO - YES - 7 - NO - IBCocoaTouchFramework - UIStepper - - 1 - MSAxIDAAA - - - 1 - 10 - 1 - - 2 - 24 - - - Helvetica-Bold - 24 - 16 - - - - - 292 - {{130, 68}, {60, 50}} - - - - _NS:328 - - 1 - MCAwIDAAA - - NO - YES - 7 - NO - IBCocoaTouchFramework - 000 - - 1 - MSAxIDEAA - - - 1 - 10 - 1 - - 2 - 30 - - - Helvetica-Bold - 30 - 16 - - - - - 268 - {{113, 149}, {94, 27}} - - - - _NS:992 - NO - YES - IBCocoaTouchFramework - 0 - 0 - 100 - - - - 292 - {{154, 216}, {94, 27}} - - - - _NS:606 - NO - IBCocoaTouchFramework - 0 - 0 - YES - - - - 292 - {{20, 219}, {141, 21}} - - - - _NS:328 - NO - YES - 7 - NO - IBCocoaTouchFramework - Autorepeat - - - 1 - 10 - 2 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 292 - {{154, 277}, {94, 27}} - - - _NS:606 - NO - IBCocoaTouchFramework - 0 - 0 - YES - - - - 292 - {{20, 280}, {141, 21}} - - - - _NS:328 - NO - YES - 7 - NO - IBCocoaTouchFramework - Continuous - - - 1 - 10 - 2 - - - - - - 292 - {{154, 340}, {94, 27}} - - - _NS:606 - NO - IBCocoaTouchFramework - 0 - 0 - YES - - - - 292 - {{20, 340}, {141, 21}} - - - - _NS:328 - NO - YES - 7 - NO - IBCocoaTouchFramework - Value wraps - - - 1 - 10 - 2 - - - - - {{0, 20}, {320, 460}} - - - - - 1 - MCAwLjUwMTk2MDgxNCAxAA - - NO - - IBCocoaTouchFramework - - - - - - - view - - - - 7 - - - - counter - - - - 12 - - - - stepper - - - - 22 - - - - stepperChanged: - - - 13 - - 11 - - - - autorepeatChanged: - - - 13 - - 19 - - - - continuousChanged: - - - 13 - - 20 - - - - wrapChanged: - - - 13 - - 21 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - - - - - - - - - - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 17 - - - - - 18 - - - - - - - UYLViewController - 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 - - - - - - 22 - - - - - UYLViewController - UIViewController - - UILabel - UIStepper - - - - counter - UILabel - - - stepper - UIStepper - - - - IBProjectSource - ./Classes/UYLViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 933 - - From 0fb9b36ace67a943973f25d75f85233dd0e47739 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 20:19:27 +0000 Subject: [PATCH 130/142] Archive AlertView --- .../AlertView/en.lproj/UYLViewController.xib | 326 ------------------ .../AlertView.xcodeproj/project.pbxproj | 70 +++- .../AlertView}/AlertView/AlertView-Info.plist | 2 +- .../AlertView}/AlertView/AlertView-Prefix.pch | 0 .../Base.lproj/UYLViewController.xib | 89 +++++ .../AlertView}/AlertView/UYLAppDelegate.h | 0 .../AlertView}/AlertView/UYLAppDelegate.m | 0 .../AlertView}/AlertView/UYLViewController.h | 0 .../AlertView}/AlertView/UYLViewController.m | 0 .../AlertView/en.lproj/InfoPlist.strings | 0 .../AlertView}/AlertView/main.m | 0 11 files changed, 152 insertions(+), 335 deletions(-) delete mode 100644 AlertView/AlertView/en.lproj/UYLViewController.xib rename {AlertView => Archive/AlertView}/AlertView.xcodeproj/project.pbxproj (80%) rename {AlertView => Archive/AlertView}/AlertView/AlertView-Info.plist (94%) rename {AlertView => Archive/AlertView}/AlertView/AlertView-Prefix.pch (100%) create mode 100644 Archive/AlertView/AlertView/Base.lproj/UYLViewController.xib rename {AlertView => Archive/AlertView}/AlertView/UYLAppDelegate.h (100%) rename {AlertView => Archive/AlertView}/AlertView/UYLAppDelegate.m (100%) rename {AlertView => Archive/AlertView}/AlertView/UYLViewController.h (100%) rename {AlertView => Archive/AlertView}/AlertView/UYLViewController.m (100%) rename {AlertView => Archive/AlertView}/AlertView/en.lproj/InfoPlist.strings (100%) rename {AlertView => Archive/AlertView}/AlertView/main.m (100%) diff --git a/AlertView/AlertView/en.lproj/UYLViewController.xib b/AlertView/AlertView/en.lproj/UYLViewController.xib deleted file mode 100644 index 7de4aa1..0000000 --- a/AlertView/AlertView/en.lproj/UYLViewController.xib +++ /dev/null @@ -1,326 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBUIButton - IBUIView - IBUILabel - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 292 - {{20, 118}, {280, 37}} - - - _NS:225 - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Default Style - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{20, 190}, {280, 37}} - - - _NS:225 - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Secure Text Input - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - 292 - {{20, 262}, {280, 37}} - - - _NS:225 - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Plain Text Input - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - 292 - {{20, 336}, {280, 37}} - - - _NS:225 - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Login and Password - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - 292 - {{20, 20}, {280, 46}} - - - _NS:328 - NO - YES - 7 - NO - IBCocoaTouchFramework - UIAlertViewStyle - - 1 - MSAxIDAAA - - - 1 - 10 - 1 - - 1 - 20 - - - Helvetica - 20 - 16 - - - - {{0, 20}, {320, 460}} - - - - - 1 - MC41IDAgMC41AA - - NO - - IBCocoaTouchFramework - - - - - - - view - - - - 7 - - - - showDefaultAlertView: - - - 7 - - 13 - - - - showSecureTextAlertView: - - - 7 - - 14 - - - - showPlainTextAlertView: - - - 7 - - 15 - - - - showLoginPassAlertView: - - - 7 - - 16 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - - - - - - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - - - UYLViewController - 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 - - - - - - 16 - - - - - UYLViewController - UIViewController - - IBProjectSource - ./Classes/UYLViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 933 - - diff --git a/AlertView/AlertView.xcodeproj/project.pbxproj b/Archive/AlertView/AlertView.xcodeproj/project.pbxproj similarity index 80% rename from AlertView/AlertView.xcodeproj/project.pbxproj rename to Archive/AlertView/AlertView.xcodeproj/project.pbxproj index 3bef398..0af1f42 100644 --- a/AlertView/AlertView.xcodeproj/project.pbxproj +++ b/Archive/AlertView/AlertView.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5334609223CA652200BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLViewController.xib; sourceTree = ""; }; 534028B91497F89D002DB13A /* AlertView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlertView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 534028BD1497F89D002DB13A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 534028BF1497F89D002DB13A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -30,7 +31,6 @@ 534028CD1497F89D002DB13A /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 534028CF1497F89D002DB13A /* UYLViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLViewController.h; sourceTree = ""; }; 534028D01497F89D002DB13A /* UYLViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLViewController.m; sourceTree = ""; }; - 534028D31497F89D002DB13A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -124,14 +124,15 @@ 534028B01497F89D002DB13A /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 1120; }; buildConfigurationList = 534028B31497F89D002DB13A /* Build configuration list for PBXProject "AlertView" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 534028AE1497F89D002DB13A; productRefGroup = 534028BA1497F89D002DB13A /* Products */; @@ -180,7 +181,7 @@ 534028D21497F89D002DB13A /* UYLViewController.xib */ = { isa = PBXVariantGroup; children = ( - 534028D31497F89D002DB13A /* en */, + 5334609223CA652200BE943E /* Base */, ); name = UYLViewController.xib; sourceTree = ""; @@ -192,11 +193,31 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -204,10 +225,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -216,15 +242,38 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 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_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -234,9 +283,11 @@ 534028D81497F89D002DB13A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "AlertView/AlertView-Prefix.pch"; INFOPLIST_FILE = "AlertView/AlertView-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -245,9 +296,11 @@ 534028D91497F89D002DB13A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "AlertView/AlertView-Prefix.pch"; INFOPLIST_FILE = "AlertView/AlertView-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -272,6 +325,7 @@ 534028D91497F89D002DB13A /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/AlertView/AlertView/AlertView-Info.plist b/Archive/AlertView/AlertView/AlertView-Info.plist similarity index 94% rename from AlertView/AlertView/AlertView-Info.plist rename to Archive/AlertView/AlertView/AlertView-Info.plist index f5d7a12..5da589d 100644 --- a/AlertView/AlertView/AlertView-Info.plist +++ b/Archive/AlertView/AlertView/AlertView-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFiles CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/AlertView/AlertView/AlertView-Prefix.pch b/Archive/AlertView/AlertView/AlertView-Prefix.pch similarity index 100% rename from AlertView/AlertView/AlertView-Prefix.pch rename to Archive/AlertView/AlertView/AlertView-Prefix.pch diff --git a/Archive/AlertView/AlertView/Base.lproj/UYLViewController.xib b/Archive/AlertView/AlertView/Base.lproj/UYLViewController.xib new file mode 100644 index 0000000..154769b --- /dev/null +++ b/Archive/AlertView/AlertView/Base.lproj/UYLViewController.xib @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AlertView/AlertView/UYLAppDelegate.h b/Archive/AlertView/AlertView/UYLAppDelegate.h similarity index 100% rename from AlertView/AlertView/UYLAppDelegate.h rename to Archive/AlertView/AlertView/UYLAppDelegate.h diff --git a/AlertView/AlertView/UYLAppDelegate.m b/Archive/AlertView/AlertView/UYLAppDelegate.m similarity index 100% rename from AlertView/AlertView/UYLAppDelegate.m rename to Archive/AlertView/AlertView/UYLAppDelegate.m diff --git a/AlertView/AlertView/UYLViewController.h b/Archive/AlertView/AlertView/UYLViewController.h similarity index 100% rename from AlertView/AlertView/UYLViewController.h rename to Archive/AlertView/AlertView/UYLViewController.h diff --git a/AlertView/AlertView/UYLViewController.m b/Archive/AlertView/AlertView/UYLViewController.m similarity index 100% rename from AlertView/AlertView/UYLViewController.m rename to Archive/AlertView/AlertView/UYLViewController.m diff --git a/AlertView/AlertView/en.lproj/InfoPlist.strings b/Archive/AlertView/AlertView/en.lproj/InfoPlist.strings similarity index 100% rename from AlertView/AlertView/en.lproj/InfoPlist.strings rename to Archive/AlertView/AlertView/en.lproj/InfoPlist.strings diff --git a/AlertView/AlertView/main.m b/Archive/AlertView/AlertView/main.m similarity index 100% rename from AlertView/AlertView/main.m rename to Archive/AlertView/AlertView/main.m From ec53858b4005013a717e9620e44321596ac0221e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 20:24:37 +0000 Subject: [PATCH 131/142] Archive MasterSlide --- .../MasterSlide.xcodeproj/project.pbxproj | 81 +++- .../Base.lproj/UYLDetailViewController.xib | 80 ++++ .../Base.lproj/UYLMasterViewController.xib | 29 ++ .../MasterSlide/MasterSlide/MainWindow.xib | 55 +++ .../MasterSlide/MasterSlide-Info.plist | 6 +- .../MasterSlide/MasterSlide-Prefix.pch | 0 .../MasterSlide}/MasterSlide/UYLAppDelegate.h | 0 .../MasterSlide}/MasterSlide/UYLAppDelegate.m | 0 .../MasterSlide/UYLDetailViewController.h | 0 .../MasterSlide/UYLDetailViewController.m | 0 .../MasterSlide/UYLMasterViewController.h | 0 .../MasterSlide/UYLMasterViewController.m | 0 .../MasterSlide/en.lproj/InfoPlist.strings | 0 .../MasterSlide}/MasterSlide/main.m | 0 MasterSlide/MasterSlide/MainWindow.xib | 337 -------------- .../en.lproj/UYLDetailViewController.xib | 410 ------------------ .../en.lproj/UYLMasterViewController.xib | 140 ------ 17 files changed, 234 insertions(+), 904 deletions(-) rename {MasterSlide => Archive/MasterSlide}/MasterSlide.xcodeproj/project.pbxproj (81%) create mode 100644 Archive/MasterSlide/MasterSlide/Base.lproj/UYLDetailViewController.xib create mode 100644 Archive/MasterSlide/MasterSlide/Base.lproj/UYLMasterViewController.xib create mode 100644 Archive/MasterSlide/MasterSlide/MainWindow.xib rename {MasterSlide => Archive/MasterSlide}/MasterSlide/MasterSlide-Info.plist (95%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/MasterSlide-Prefix.pch (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/UYLAppDelegate.h (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/UYLAppDelegate.m (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/UYLDetailViewController.h (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/UYLDetailViewController.m (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/UYLMasterViewController.h (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/UYLMasterViewController.m (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/en.lproj/InfoPlist.strings (100%) rename {MasterSlide => Archive/MasterSlide}/MasterSlide/main.m (100%) delete mode 100644 MasterSlide/MasterSlide/MainWindow.xib delete mode 100644 MasterSlide/MasterSlide/en.lproj/UYLDetailViewController.xib delete mode 100644 MasterSlide/MasterSlide/en.lproj/UYLMasterViewController.xib diff --git a/MasterSlide/MasterSlide.xcodeproj/project.pbxproj b/Archive/MasterSlide/MasterSlide.xcodeproj/project.pbxproj similarity index 81% rename from MasterSlide/MasterSlide.xcodeproj/project.pbxproj rename to Archive/MasterSlide/MasterSlide.xcodeproj/project.pbxproj index 148bd98..8383db9 100644 --- a/MasterSlide/MasterSlide.xcodeproj/project.pbxproj +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -21,6 +21,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5334609323CA65EF00BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLMasterViewController.xib; sourceTree = ""; }; + 5334609423CA65F000BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLDetailViewController.xib; sourceTree = ""; }; 53A7615E146C7E9600B4F8F6 /* masterslide.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = masterslide.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53A76162146C7E9600B4F8F6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 53A76164146C7E9600B4F8F6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -35,8 +37,6 @@ 53A76175146C7E9600B4F8F6 /* UYLMasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLMasterViewController.m; sourceTree = ""; }; 53A76177146C7E9600B4F8F6 /* UYLDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLDetailViewController.h; sourceTree = ""; }; 53A76178146C7E9600B4F8F6 /* UYLDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLDetailViewController.m; sourceTree = ""; }; - 53A7617B146C7E9700B4F8F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLMasterViewController.xib; sourceTree = ""; }; - 53A7617E146C7E9700B4F8F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLDetailViewController.xib; sourceTree = ""; }; 53FF8C18146F264400005E54 /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; /* End PBXFileReference section */ @@ -151,14 +151,15 @@ 53A76155146C7E9600B4F8F6 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 1120; }; - buildConfigurationList = 53A76158146C7E9600B4F8F6 /* Build configuration list for PBXProject "masterslide" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + buildConfigurationList = 53A76158146C7E9600B4F8F6 /* Build configuration list for PBXProject "MasterSlide" */; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 53A76153146C7E9600B4F8F6; productRefGroup = 53A7615F146C7E9600B4F8F6 /* Products */; @@ -210,7 +211,7 @@ 53A7617A146C7E9700B4F8F6 /* UYLMasterViewController.xib */ = { isa = PBXVariantGroup; children = ( - 53A7617B146C7E9700B4F8F6 /* en */, + 5334609323CA65EF00BE943E /* Base */, ); name = UYLMasterViewController.xib; sourceTree = ""; @@ -218,7 +219,7 @@ 53A7617D146C7E9700B4F8F6 /* UYLDetailViewController.xib */ = { isa = PBXVariantGroup; children = ( - 53A7617E146C7E9700B4F8F6 /* en */, + 5334609423CA65F000BE943E /* Base */, ); name = UYLDetailViewController.xib; sourceTree = ""; @@ -230,11 +231,31 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + 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", @@ -242,10 +263,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; }; @@ -255,15 +281,38 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 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_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; @@ -274,9 +323,11 @@ 53A76183146C7E9700B4F8F6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "masterslide/masterslide-Prefix.pch"; INFOPLIST_FILE = "masterslide/masterslide-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -285,9 +336,11 @@ 53A76184146C7E9700B4F8F6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "masterslide/masterslide-Prefix.pch"; INFOPLIST_FILE = "masterslide/masterslide-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -296,7 +349,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 53A76158146C7E9600B4F8F6 /* Build configuration list for PBXProject "masterslide" */ = { + 53A76158146C7E9600B4F8F6 /* Build configuration list for PBXProject "MasterSlide" */ = { isa = XCConfigurationList; buildConfigurations = ( 53A76180146C7E9700B4F8F6 /* Debug */, diff --git a/Archive/MasterSlide/MasterSlide/Base.lproj/UYLDetailViewController.xib b/Archive/MasterSlide/MasterSlide/Base.lproj/UYLDetailViewController.xib new file mode 100644 index 0000000..4f045c5 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide/Base.lproj/UYLDetailViewController.xib @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/MasterSlide/MasterSlide/Base.lproj/UYLMasterViewController.xib b/Archive/MasterSlide/MasterSlide/Base.lproj/UYLMasterViewController.xib new file mode 100644 index 0000000..77a8e58 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide/Base.lproj/UYLMasterViewController.xib @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/MasterSlide/MasterSlide/MainWindow.xib b/Archive/MasterSlide/MasterSlide/MainWindow.xib new file mode 100644 index 0000000..dc9f4e1 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide/MainWindow.xib @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MasterSlide/MasterSlide/MasterSlide-Info.plist b/Archive/MasterSlide/MasterSlide/MasterSlide-Info.plist similarity index 95% rename from MasterSlide/MasterSlide/MasterSlide-Info.plist rename to Archive/MasterSlide/MasterSlide/MasterSlide-Info.plist index 410100c..7d691bc 100644 --- a/MasterSlide/MasterSlide/MasterSlide-Info.plist +++ b/Archive/MasterSlide/MasterSlide/MasterSlide-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFiles CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -26,6 +26,8 @@ 1.0 LSRequiresIPhoneOS + NSMainNibFile + MainWindow UIRequiredDeviceCapabilities armv7 @@ -43,7 +45,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - NSMainNibFile - MainWindow diff --git a/MasterSlide/MasterSlide/MasterSlide-Prefix.pch b/Archive/MasterSlide/MasterSlide/MasterSlide-Prefix.pch similarity index 100% rename from MasterSlide/MasterSlide/MasterSlide-Prefix.pch rename to Archive/MasterSlide/MasterSlide/MasterSlide-Prefix.pch diff --git a/MasterSlide/MasterSlide/UYLAppDelegate.h b/Archive/MasterSlide/MasterSlide/UYLAppDelegate.h similarity index 100% rename from MasterSlide/MasterSlide/UYLAppDelegate.h rename to Archive/MasterSlide/MasterSlide/UYLAppDelegate.h diff --git a/MasterSlide/MasterSlide/UYLAppDelegate.m b/Archive/MasterSlide/MasterSlide/UYLAppDelegate.m similarity index 100% rename from MasterSlide/MasterSlide/UYLAppDelegate.m rename to Archive/MasterSlide/MasterSlide/UYLAppDelegate.m diff --git a/MasterSlide/MasterSlide/UYLDetailViewController.h b/Archive/MasterSlide/MasterSlide/UYLDetailViewController.h similarity index 100% rename from MasterSlide/MasterSlide/UYLDetailViewController.h rename to Archive/MasterSlide/MasterSlide/UYLDetailViewController.h diff --git a/MasterSlide/MasterSlide/UYLDetailViewController.m b/Archive/MasterSlide/MasterSlide/UYLDetailViewController.m similarity index 100% rename from MasterSlide/MasterSlide/UYLDetailViewController.m rename to Archive/MasterSlide/MasterSlide/UYLDetailViewController.m diff --git a/MasterSlide/MasterSlide/UYLMasterViewController.h b/Archive/MasterSlide/MasterSlide/UYLMasterViewController.h similarity index 100% rename from MasterSlide/MasterSlide/UYLMasterViewController.h rename to Archive/MasterSlide/MasterSlide/UYLMasterViewController.h diff --git a/MasterSlide/MasterSlide/UYLMasterViewController.m b/Archive/MasterSlide/MasterSlide/UYLMasterViewController.m similarity index 100% rename from MasterSlide/MasterSlide/UYLMasterViewController.m rename to Archive/MasterSlide/MasterSlide/UYLMasterViewController.m diff --git a/MasterSlide/MasterSlide/en.lproj/InfoPlist.strings b/Archive/MasterSlide/MasterSlide/en.lproj/InfoPlist.strings similarity index 100% rename from MasterSlide/MasterSlide/en.lproj/InfoPlist.strings rename to Archive/MasterSlide/MasterSlide/en.lproj/InfoPlist.strings diff --git a/MasterSlide/MasterSlide/main.m b/Archive/MasterSlide/MasterSlide/main.m similarity index 100% rename from MasterSlide/MasterSlide/main.m rename to Archive/MasterSlide/MasterSlide/main.m diff --git a/MasterSlide/MasterSlide/MainWindow.xib b/MasterSlide/MasterSlide/MainWindow.xib deleted file mode 100644 index de12c87..0000000 --- a/MasterSlide/MasterSlide/MainWindow.xib +++ /dev/null @@ -1,337 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBProxyObject - IBUINavigationController - IBUIViewController - IBUICustomObject - IBUISplitViewController - IBUIWindow - IBUITableViewController - IBUINavigationItem - IBUINavigationBar - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - IBIPadFramework - - - - 1316 - - {768, 1024} - - - - - 1 - MSAxIDEAA - - NO - NO - - 2 - - IBIPadFramework - YES - - - - - 2 - - - 3 - 3 - - IBIPadFramework - YES - - - - 2 - - - 1 - 1 - - IBIPadFramework - NO - - - 256 - {0, 0} - _NS:839 - YES - YES - IBIPadFramework - - - - Master - - Master - IBIPadFramework - - - UYLMasterViewController - - 2 - - - 1 - 1 - - IBIPadFramework - NO - NO - - - - - Detail - - - UYLDetailViewController - - 1 - 1 - - IBIPadFramework - NO - - - - - - - - delegate - - - - 5 - - - - window - - - - 14 - - - - splitViewController - - - - 13 - - - - detailViewController - - - - 35 - - - - - - 0 - - - - - - 2 - - - - - -1 - - - File's Owner - - - 4 - - - App Delegate - - - -2 - - - - - 6 - - - - - - - - - 15 - - - - - - 8 - - - - - - - - - 10 - - - - - - - - 11 - - - - - 9 - - - - - - - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UYLMasterViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UYLDetailViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UYLAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 35 - - - - - UYLAppDelegate - UIResponder - - UISplitViewController - UIWindow - - - - splitViewController - UISplitViewController - - - window - UIWindow - - - - IBProjectSource - ./Classes/UYLAppDelegate.h - - - - UYLDetailViewController - UIViewController - - detailDescriptionLabel - UILabel - - - detailDescriptionLabel - - detailDescriptionLabel - UILabel - - - - IBProjectSource - ./Classes/UYLDetailViewController.h - - - - UYLMasterViewController - UITableViewController - - detailViewController - UYLDetailViewController - - - detailViewController - - detailViewController - UYLDetailViewController - - - - IBProjectSource - ./Classes/UYLMasterViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 933 - - diff --git a/MasterSlide/MasterSlide/en.lproj/UYLDetailViewController.xib b/MasterSlide/MasterSlide/en.lproj/UYLDetailViewController.xib deleted file mode 100644 index 0e8a58b..0000000 --- a/MasterSlide/MasterSlide/en.lproj/UYLDetailViewController.xib +++ /dev/null @@ -1,410 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBUISwipeGestureRecognizer - IBUITapGestureRecognizer - IBUIToolbar - IBUIView - IBUILabel - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - - - 290 - {768, 44} - - - - _NS:372 - NO - NO - IBIPadFramework - - - - - 292 - {{363, 11}, {42, 21}} - - - - _NS:345 - NO - YES - 7 - NO - IBIPadFramework - Detail - - 1 - MCAwIDAAA - - - 1 - 10 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 274 - - - - 298 - {{20, 470}, {728, 21}} - - - - - 3 - MQA - - YES - - NO - IBIPadFramework - Select an item - - - 1 - 10 - 1 - - 1 - 4 - - - Helvetica - 14 - 16 - - - - {{0, 44}, {768, 960}} - - - _NS:212 - - 3 - MQA - - 2 - - - - IBIPadFramework - - - {{0, 20}, {768, 1004}} - - - - - YES - - - 2 - - - IBUISplitViewDetailSimulatedSizeMetrics - - YES - - - - - - {768, 1024} - {703, 768} - - - IBIPadFramework - Detail - IBUISplitViewController - - IBUISplitViewControllerContentSizeLocation - IBUISplitViewControllerContentSizeLocationDetail - - - IBIPadFramework - - - - 2 - - - - - - - - view - - - - 12 - - - - toolbar - - - - 72 - - - - detailTitle - - - - 74 - - - - detailDescriptionLabel - - - - 66 - - - - handleTap: - - - - 97 - - - - handleSwipeRight: - - - - 98 - - - - handleSwipeLeft: - - - - 102 - - - - gestureRecognizers - - - NSArray - YES - - 111 - - - - gestureRecognizers - - - NSArray - YES - - 112 - - - - gestureRecognizers - - - NSArray - YES - - 113 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 8 - - - - - - - - - - 67 - - - - - - 73 - - - - - 110 - - - - - - - - 45 - - - - - 79 - - - - - 81 - - - - - 75 - - - - - - - UYLDetailViewController - 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 - - - - - - 113 - - - - - UYLDetailViewController - UIViewController - - UISwipeGestureRecognizer - UISwipeGestureRecognizer - UITapGestureRecognizer - - - - handleSwipeLeft: - UISwipeGestureRecognizer - - - handleSwipeRight: - UISwipeGestureRecognizer - - - handleTap: - UITapGestureRecognizer - - - - UILabel - UILabel - UIToolbar - - - - detailDescriptionLabel - UILabel - - - detailTitle - UILabel - - - toolbar - UIToolbar - - - - IBProjectSource - ./Classes/UYLDetailViewController.h - - - - - 0 - IBIPadFramework - YES - 3 - 933 - - diff --git a/MasterSlide/MasterSlide/en.lproj/UYLMasterViewController.xib b/MasterSlide/MasterSlide/en.lproj/UYLMasterViewController.xib deleted file mode 100644 index aac88df..0000000 --- a/MasterSlide/MasterSlide/en.lproj/UYLMasterViewController.xib +++ /dev/null @@ -1,140 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - {320, 852} - - - - _NS:408 - - 3 - MQA - - YES - IBIPadFramework - YES - 1 - 0 - YES - 44 - 22 - 22 - - - - - - - view - - - - 11 - - - - delegate - - - - 10 - - - - dataSource - - - - 9 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 7 - - - - - - - UYLMasterViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 11 - - - - - UYLMasterViewController - UIViewController - - IBProjectSource - ./Classes/UYLMasterViewController.h - - - - - 0 - IBIPadFramework - YES - 3 - 933 - - From 42545b49221e9cde74294092b58a5ef226ba0372 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 20:47:15 +0000 Subject: [PATCH 132/142] Archive SyncMe --- .../SyncMe}/SyncMe.xcodeproj/project.pbxproj | 73 ++++++++++++++++--- .../SyncMe/Base.lproj}/UYLViewController.xib | 0 .../SyncMe}/SyncMe/SyncMe-Info.plist | 2 +- .../SyncMe}/SyncMe/SyncMe-Prefix.pch | 0 .../SyncMe}/SyncMe/SyncMe.entitlements | 0 .../SyncMe}/SyncMe/UYLAppDelegate.h | 0 .../SyncMe}/SyncMe/UYLAppDelegate.m | 0 .../SyncMe}/SyncMe/UYLViewController.h | 0 .../SyncMe}/SyncMe/UYLViewController.m | 0 .../SyncMe}/SyncMe/en.lproj/InfoPlist.strings | 0 {SyncMe => Archive/SyncMe}/SyncMe/main.m | 0 11 files changed, 64 insertions(+), 11 deletions(-) rename {SyncMe => Archive/SyncMe}/SyncMe.xcodeproj/project.pbxproj (80%) rename {SyncMe/SyncMe/en.lproj => Archive/SyncMe/SyncMe/Base.lproj}/UYLViewController.xib (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/SyncMe-Info.plist (94%) rename {SyncMe => Archive/SyncMe}/SyncMe/SyncMe-Prefix.pch (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/SyncMe.entitlements (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/UYLAppDelegate.h (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/UYLAppDelegate.m (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/UYLViewController.h (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/UYLViewController.m (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/en.lproj/InfoPlist.strings (100%) rename {SyncMe => Archive/SyncMe}/SyncMe/main.m (100%) diff --git a/SyncMe/SyncMe.xcodeproj/project.pbxproj b/Archive/SyncMe/SyncMe.xcodeproj/project.pbxproj similarity index 80% rename from SyncMe/SyncMe.xcodeproj/project.pbxproj rename to Archive/SyncMe/SyncMe.xcodeproj/project.pbxproj index b823bf1..df3f587 100644 --- a/SyncMe/SyncMe.xcodeproj/project.pbxproj +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -18,6 +18,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5334609523CA6B2500BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UYLViewController.xib; sourceTree = ""; }; 53DA6A481454A1C300368AB3 /* SyncMe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SyncMe.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA6A4C1454A1C300368AB3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 53DA6A4E1454A1C300368AB3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -30,7 +31,6 @@ 53DA6A5C1454A1C300368AB3 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 53DA6A5E1454A1C300368AB3 /* UYLViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLViewController.h; sourceTree = ""; }; 53DA6A5F1454A1C400368AB3 /* UYLViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLViewController.m; sourceTree = ""; }; - 53DA6A621454A1C400368AB3 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/UYLViewController.xib; sourceTree = ""; }; 53DA6A771454B39300368AB3 /* SyncMe.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = SyncMe.entitlements; sourceTree = ""; }; /* End PBXFileReference section */ @@ -126,14 +126,15 @@ 53DA6A3F1454A1C300368AB3 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 1120; }; buildConfigurationList = 53DA6A421454A1C300368AB3 /* Build configuration list for PBXProject "SyncMe" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 53DA6A3D1454A1C300368AB3; productRefGroup = 53DA6A491454A1C300368AB3 /* Products */; @@ -182,7 +183,7 @@ 53DA6A611454A1C400368AB3 /* UYLViewController.xib */ = { isa = PBXVariantGroup; children = ( - 53DA6A621454A1C400368AB3 /* en */, + 5334609523CA6B2500BE943E /* Base */, ); name = UYLViewController.xib; sourceTree = ""; @@ -194,11 +195,31 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; + 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", @@ -206,10 +227,15 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -218,15 +244,38 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 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_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -236,10 +285,12 @@ 53DA6A671454A1C400368AB3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = SyncMe/SyncMe.entitlements; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SyncMe/SyncMe-Prefix.pch"; INFOPLIST_FILE = "SyncMe/SyncMe-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -248,10 +299,12 @@ 53DA6A681454A1C400368AB3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = SyncMe/SyncMe.entitlements; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SyncMe/SyncMe-Prefix.pch"; INFOPLIST_FILE = "SyncMe/SyncMe-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/SyncMe/SyncMe/en.lproj/UYLViewController.xib b/Archive/SyncMe/SyncMe/Base.lproj/UYLViewController.xib similarity index 100% rename from SyncMe/SyncMe/en.lproj/UYLViewController.xib rename to Archive/SyncMe/SyncMe/Base.lproj/UYLViewController.xib diff --git a/SyncMe/SyncMe/SyncMe-Info.plist b/Archive/SyncMe/SyncMe/SyncMe-Info.plist similarity index 94% rename from SyncMe/SyncMe/SyncMe-Info.plist rename to Archive/SyncMe/SyncMe/SyncMe-Info.plist index f5d7a12..5da589d 100644 --- a/SyncMe/SyncMe/SyncMe-Info.plist +++ b/Archive/SyncMe/SyncMe/SyncMe-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFiles CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/SyncMe/SyncMe/SyncMe-Prefix.pch b/Archive/SyncMe/SyncMe/SyncMe-Prefix.pch similarity index 100% rename from SyncMe/SyncMe/SyncMe-Prefix.pch rename to Archive/SyncMe/SyncMe/SyncMe-Prefix.pch diff --git a/SyncMe/SyncMe/SyncMe.entitlements b/Archive/SyncMe/SyncMe/SyncMe.entitlements similarity index 100% rename from SyncMe/SyncMe/SyncMe.entitlements rename to Archive/SyncMe/SyncMe/SyncMe.entitlements diff --git a/SyncMe/SyncMe/UYLAppDelegate.h b/Archive/SyncMe/SyncMe/UYLAppDelegate.h similarity index 100% rename from SyncMe/SyncMe/UYLAppDelegate.h rename to Archive/SyncMe/SyncMe/UYLAppDelegate.h diff --git a/SyncMe/SyncMe/UYLAppDelegate.m b/Archive/SyncMe/SyncMe/UYLAppDelegate.m similarity index 100% rename from SyncMe/SyncMe/UYLAppDelegate.m rename to Archive/SyncMe/SyncMe/UYLAppDelegate.m diff --git a/SyncMe/SyncMe/UYLViewController.h b/Archive/SyncMe/SyncMe/UYLViewController.h similarity index 100% rename from SyncMe/SyncMe/UYLViewController.h rename to Archive/SyncMe/SyncMe/UYLViewController.h diff --git a/SyncMe/SyncMe/UYLViewController.m b/Archive/SyncMe/SyncMe/UYLViewController.m similarity index 100% rename from SyncMe/SyncMe/UYLViewController.m rename to Archive/SyncMe/SyncMe/UYLViewController.m diff --git a/SyncMe/SyncMe/en.lproj/InfoPlist.strings b/Archive/SyncMe/SyncMe/en.lproj/InfoPlist.strings similarity index 100% rename from SyncMe/SyncMe/en.lproj/InfoPlist.strings rename to Archive/SyncMe/SyncMe/en.lproj/InfoPlist.strings diff --git a/SyncMe/SyncMe/main.m b/Archive/SyncMe/SyncMe/main.m similarity index 100% rename from SyncMe/SyncMe/main.m rename to Archive/SyncMe/SyncMe/main.m From b2b756fddacbff93cb7b9ec0c9bc5f5f35224f7a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 11 Jan 2020 21:05:45 +0000 Subject: [PATCH 133/142] Archive AirPrinter --- AirPrinter/AirPrinter/WebViewController.xib | 177 --------- AirPrinter/AirPrinter/en.lproj/MainWindow.xib | 331 ----------------- .../en.lproj/RootViewController.xib | 170 --------- .../iPad/en.lproj/MainWindow-iPad.xib | 349 ------------------ .../AirPrinter.xcodeproj/project.pbxproj | 44 ++- .../AirPrinter/AirPrinter-Info.plist | 2 +- .../AirPrinter/AirPrinter-Prefix.pch | 0 .../AirPrinter/AirPrinterAppDelegate.h | 0 .../AirPrinter/AirPrinterAppDelegate.m | 0 .../AirPrinter/Base.lproj/MainWindow.xib | 44 +++ .../Base.lproj/RootViewController.xib | 37 ++ .../AirPrinter/RootViewController.h | 0 .../AirPrinter/RootViewController.m | 0 .../AirPrinter/UYLGenericPrintPageRenderer.h | 0 .../AirPrinter/UYLGenericPrintPageRenderer.m | 0 .../AirPrinter/WebViewController.h | 0 .../AirPrinter/WebViewController.m | 0 .../AirPrinter/WebViewController.xib | 28 ++ .../AirPrinter/en.lproj/InfoPlist.strings | 0 .../iPad/Base.lproj/MainWindow-iPad.xib | 48 +++ .../AirPrinter}/AirPrinter/main.m | 0 21 files changed, 187 insertions(+), 1043 deletions(-) delete mode 100644 AirPrinter/AirPrinter/WebViewController.xib delete mode 100644 AirPrinter/AirPrinter/en.lproj/MainWindow.xib delete mode 100644 AirPrinter/AirPrinter/en.lproj/RootViewController.xib delete mode 100644 AirPrinter/AirPrinter/iPad/en.lproj/MainWindow-iPad.xib rename {AirPrinter => Archive/AirPrinter}/AirPrinter.xcodeproj/project.pbxproj (90%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/AirPrinter-Info.plist (94%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/AirPrinter-Prefix.pch (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/AirPrinterAppDelegate.h (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/AirPrinterAppDelegate.m (100%) create mode 100644 Archive/AirPrinter/AirPrinter/Base.lproj/MainWindow.xib create mode 100644 Archive/AirPrinter/AirPrinter/Base.lproj/RootViewController.xib rename {AirPrinter => Archive/AirPrinter}/AirPrinter/RootViewController.h (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/RootViewController.m (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/UYLGenericPrintPageRenderer.h (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/UYLGenericPrintPageRenderer.m (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/WebViewController.h (100%) rename {AirPrinter => Archive/AirPrinter}/AirPrinter/WebViewController.m (100%) create mode 100644 Archive/AirPrinter/AirPrinter/WebViewController.xib rename {AirPrinter => Archive/AirPrinter}/AirPrinter/en.lproj/InfoPlist.strings (100%) create mode 100644 Archive/AirPrinter/AirPrinter/iPad/Base.lproj/MainWindow-iPad.xib rename {AirPrinter => Archive/AirPrinter}/AirPrinter/main.m (100%) diff --git a/AirPrinter/AirPrinter/WebViewController.xib b/AirPrinter/AirPrinter/WebViewController.xib deleted file mode 100644 index b28d757..0000000 --- a/AirPrinter/AirPrinter/WebViewController.xib +++ /dev/null @@ -1,177 +0,0 @@ - - - - 1056 - 11A511 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 534 - - - YES - IBProxyObject - IBUIWebView - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - {240, 128} - - - _NS:667 - - 1 - MSAxIDEAA - - IBCocoaTouchFramework - YES - - - - - YES - - - webView - - - - 5 - - - - delegate - - - - 6 - - - - view - - - - 7 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - Web View - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 4.IBPluginDependency - - - YES - WebViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 7 - - - - YES - - WebViewController - UIViewController - - webView - UIWebView - - - webView - - webView - UIWebView - - - - IBProjectSource - ./Classes/WebViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 534 - - diff --git a/AirPrinter/AirPrinter/en.lproj/MainWindow.xib b/AirPrinter/AirPrinter/en.lproj/MainWindow.xib deleted file mode 100644 index ba438d9..0000000 --- a/AirPrinter/AirPrinter/en.lproj/MainWindow.xib +++ /dev/null @@ -1,331 +0,0 @@ - - - - 1024 - 11A511 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 534 - - - YES - IBProxyObject - IBUINavigationController - IBUIViewController - IBUICustomObject - IBUIBarButtonItem - IBUIWindow - IBUINavigationBar - IBUINavigationItem - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {320, 480} - - - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - - - - - 1 - 1 - - IBCocoaTouchFramework - NO - - - 256 - {0, 0} - NO - YES - YES - IBCocoaTouchFramework - - - YES - - - - AirPrinter - - Home - IBCocoaTouchFramework - 1 - - IBCocoaTouchFramework - - - RootViewController - - - 1 - 1 - - IBCocoaTouchFramework - NO - - - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - navigationController - - - - 15 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - -2 - - - - - 9 - - - YES - - - - - - - 11 - - - - - 13 - - - YES - - - - - - 14 - - - YES - - - - - - 17 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 11.IBPluginDependency - 13.CustomClassName - 13.IBPluginDependency - 14.IBPluginDependency - 17.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 9.IBPluginDependency - - - YES - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - RootViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - AirPrinterAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 17 - - - - YES - - AirPrinterAppDelegate - NSObject - - YES - - YES - navigationController - window - - - YES - UINavigationController - UIWindow - - - - YES - - YES - navigationController - window - - - YES - - navigationController - UINavigationController - - - window - UIWindow - - - - - IBProjectSource - ./Classes/AirPrinterAppDelegate.h - - - - RootViewController - UIViewController - - IBProjectSource - ./Classes/RootViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 534 - - diff --git a/AirPrinter/AirPrinter/en.lproj/RootViewController.xib b/AirPrinter/AirPrinter/en.lproj/RootViewController.xib deleted file mode 100644 index 6768cbf..0000000 --- a/AirPrinter/AirPrinter/en.lproj/RootViewController.xib +++ /dev/null @@ -1,170 +0,0 @@ - - - - 784 - 11A511 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 534 - - - IBProxyObject - IBUIView - IBUITextField - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - - - 290 - {{20, 71}, {280, 31}} - - - - _NS:294 - NO - YES - IBCocoaTouchFramework - 0 - http://apple.com - 3 - Enter a web site URL - - 3 - MAA - - 2 - - - YES - 17 - - 1 - 3 - 1 - YES - IBCocoaTouchFramework - - 1 - - - {320, 460} - - - - _NS:180 - - 1 - MC41IDAgMC41AA - - IBCocoaTouchFramework - - - - - - - view - - - - 10 - - - - delegate - - - - 11 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - - - - - - 8 - - - - - - - RootViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 11 - - - - - RootViewController - UIViewController - - IBProjectSource - ./Classes/RootViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 534 - - diff --git a/AirPrinter/AirPrinter/iPad/en.lproj/MainWindow-iPad.xib b/AirPrinter/AirPrinter/iPad/en.lproj/MainWindow-iPad.xib deleted file mode 100644 index c56e8f8..0000000 --- a/AirPrinter/AirPrinter/iPad/en.lproj/MainWindow-iPad.xib +++ /dev/null @@ -1,349 +0,0 @@ - - - - 1056 - 11A511 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 534 - - - YES - IBProxyObject - IBUINavigationController - IBUIViewController - IBUICustomObject - IBUIBarButtonItem - IBUIWindow - IBUINavigationBar - IBUINavigationItem - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - IBIPadFramework - - - - 1316 - - {768, 1024} - - - - - 1 - MSAxIDEAA - - NO - NO - - 2 - - IBIPadFramework - YES - - - - - 1 - 1 - - IBIPadFramework - NO - - - 256 - {0, 0} - NO - YES - YES - IBIPadFramework - - - YES - - - - AirPrinter - - Home - IBIPadFramework - 1 - - IBIPadFramework - - - RootViewController - - - 1 - 1 - - IBIPadFramework - NO - - - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - navigationController - - - - 15 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - -2 - - - - - 9 - - - YES - - - - - - - 11 - - - - - 13 - - - YES - - - - - - 14 - - - YES - - - - - - 17 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 11.IBPluginDependency - 13.CustomClassName - 13.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 13.IBPluginDependency - 14.IBPluginDependency - 17.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 9.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 9.IBPluginDependency - - - YES - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - RootViewController - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - AirPrinterAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 17 - - - - YES - - AirPrinterAppDelegate - NSObject - - YES - - YES - navigationController - window - - - YES - UINavigationController - UIWindow - - - - YES - - YES - navigationController - window - - - YES - - navigationController - UINavigationController - - - window - UIWindow - - - - - IBProjectSource - ./Classes/AirPrinterAppDelegate.h - - - - RootViewController - UIViewController - - IBProjectSource - ./Classes/RootViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 534 - - diff --git a/AirPrinter/AirPrinter.xcodeproj/project.pbxproj b/Archive/AirPrinter/AirPrinter.xcodeproj/project.pbxproj similarity index 90% rename from AirPrinter/AirPrinter.xcodeproj/project.pbxproj rename to Archive/AirPrinter/AirPrinter.xcodeproj/project.pbxproj index 687d0f6..d1e10dd 100644 --- a/AirPrinter/AirPrinter.xcodeproj/project.pbxproj +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -29,6 +29,9 @@ 5310096E13E73E49008FC50D /* WebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WebViewController.xib; sourceTree = ""; }; 5310097613E74913008FC50D /* UYLGenericPrintPageRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLGenericPrintPageRenderer.h; sourceTree = ""; }; 5310097713E74913008FC50D /* UYLGenericPrintPageRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLGenericPrintPageRenderer.m; sourceTree = ""; }; + 5334609623CA6FC800BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainWindow.xib; sourceTree = ""; }; + 5334609723CA6FC900BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/RootViewController.xib; sourceTree = ""; }; + 5334609823CA6FC900BE943E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "iPad/Base.lproj/MainWindow-iPad.xib"; sourceTree = ""; }; 5336C32213E46620007FB510 /* AirPrinter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AirPrinter.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5336C32613E46620007FB510 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 5336C32813E46620007FB510 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -39,11 +42,8 @@ 5336C33413E46620007FB510 /* AirPrinter-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AirPrinter-Prefix.pch"; sourceTree = ""; }; 5336C33513E46620007FB510 /* AirPrinterAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AirPrinterAppDelegate.h; sourceTree = ""; }; 5336C33613E46620007FB510 /* AirPrinterAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AirPrinterAppDelegate.m; sourceTree = ""; }; - 5336C33913E46620007FB510 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = ""; }; 5336C33B13E46620007FB510 /* RootViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; 5336C33C13E46620007FB510 /* RootViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; - 5336C33F13E46620007FB510 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/RootViewController.xib; sourceTree = ""; }; - 5336C34813E4663E007FB510 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = "iPad/en.lproj/MainWindow-iPad.xib"; sourceTree = ""; }; 53B8321B14069CB300E052A4 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -186,12 +186,16 @@ /* Begin PBXProject section */ 5336C31913E46620007FB510 /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 1120; + }; buildConfigurationList = 5336C31C13E46620007FB510 /* Build configuration list for PBXProject "AirPrinter" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 5336C31713E46620007FB510; productRefGroup = 5336C32313E46620007FB510 /* Products */; @@ -245,7 +249,7 @@ 5336C33813E46620007FB510 /* MainWindow.xib */ = { isa = PBXVariantGroup; children = ( - 5336C33913E46620007FB510 /* en */, + 5334609623CA6FC800BE943E /* Base */, ); name = MainWindow.xib; sourceTree = ""; @@ -253,7 +257,7 @@ 5336C33E13E46620007FB510 /* RootViewController.xib */ = { isa = PBXVariantGroup; children = ( - 5336C33F13E46620007FB510 /* en */, + 5334609723CA6FC900BE943E /* Base */, ); name = RootViewController.xib; sourceTree = ""; @@ -261,7 +265,7 @@ 5336C34713E4663E007FB510 /* MainWindow-iPad.xib */ = { isa = PBXVariantGroup; children = ( - 5336C34813E4663E007FB510 /* en */, + 5334609823CA6FC900BE943E /* Base */, ); name = "MainWindow-iPad.xib"; sourceTree = ""; @@ -273,9 +277,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -288,7 +293,8 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "-DUYL_DEBUG"; SDKROOT = iphoneos; }; @@ -298,7 +304,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -306,7 +312,7 @@ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -316,10 +322,14 @@ 5336C34413E46620007FB510 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "AirPrinter/AirPrinter-Prefix.pch"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "AirPrinter/AirPrinter-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + 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; @@ -329,10 +339,14 @@ 5336C34513E46620007FB510 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "AirPrinter/AirPrinter-Prefix.pch"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "AirPrinter/AirPrinter-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + 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; diff --git a/AirPrinter/AirPrinter/AirPrinter-Info.plist b/Archive/AirPrinter/AirPrinter/AirPrinter-Info.plist similarity index 94% rename from AirPrinter/AirPrinter/AirPrinter-Info.plist rename to Archive/AirPrinter/AirPrinter/AirPrinter-Info.plist index 3070946..cd79178 100644 --- a/AirPrinter/AirPrinter/AirPrinter-Info.plist +++ b/Archive/AirPrinter/AirPrinter/AirPrinter-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/AirPrinter/AirPrinter/AirPrinter-Prefix.pch b/Archive/AirPrinter/AirPrinter/AirPrinter-Prefix.pch similarity index 100% rename from AirPrinter/AirPrinter/AirPrinter-Prefix.pch rename to Archive/AirPrinter/AirPrinter/AirPrinter-Prefix.pch diff --git a/AirPrinter/AirPrinter/AirPrinterAppDelegate.h b/Archive/AirPrinter/AirPrinter/AirPrinterAppDelegate.h similarity index 100% rename from AirPrinter/AirPrinter/AirPrinterAppDelegate.h rename to Archive/AirPrinter/AirPrinter/AirPrinterAppDelegate.h diff --git a/AirPrinter/AirPrinter/AirPrinterAppDelegate.m b/Archive/AirPrinter/AirPrinter/AirPrinterAppDelegate.m similarity index 100% rename from AirPrinter/AirPrinter/AirPrinterAppDelegate.m rename to Archive/AirPrinter/AirPrinter/AirPrinterAppDelegate.m diff --git a/Archive/AirPrinter/AirPrinter/Base.lproj/MainWindow.xib b/Archive/AirPrinter/AirPrinter/Base.lproj/MainWindow.xib new file mode 100644 index 0000000..a6f7cfc --- /dev/null +++ b/Archive/AirPrinter/AirPrinter/Base.lproj/MainWindow.xib @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/AirPrinter/AirPrinter/Base.lproj/RootViewController.xib b/Archive/AirPrinter/AirPrinter/Base.lproj/RootViewController.xib new file mode 100644 index 0000000..ea17a5e --- /dev/null +++ b/Archive/AirPrinter/AirPrinter/Base.lproj/RootViewController.xib @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AirPrinter/AirPrinter/RootViewController.h b/Archive/AirPrinter/AirPrinter/RootViewController.h similarity index 100% rename from AirPrinter/AirPrinter/RootViewController.h rename to Archive/AirPrinter/AirPrinter/RootViewController.h diff --git a/AirPrinter/AirPrinter/RootViewController.m b/Archive/AirPrinter/AirPrinter/RootViewController.m similarity index 100% rename from AirPrinter/AirPrinter/RootViewController.m rename to Archive/AirPrinter/AirPrinter/RootViewController.m diff --git a/AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.h b/Archive/AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.h similarity index 100% rename from AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.h rename to Archive/AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.h diff --git a/AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.m b/Archive/AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.m similarity index 100% rename from AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.m rename to Archive/AirPrinter/AirPrinter/UYLGenericPrintPageRenderer.m diff --git a/AirPrinter/AirPrinter/WebViewController.h b/Archive/AirPrinter/AirPrinter/WebViewController.h similarity index 100% rename from AirPrinter/AirPrinter/WebViewController.h rename to Archive/AirPrinter/AirPrinter/WebViewController.h diff --git a/AirPrinter/AirPrinter/WebViewController.m b/Archive/AirPrinter/AirPrinter/WebViewController.m similarity index 100% rename from AirPrinter/AirPrinter/WebViewController.m rename to Archive/AirPrinter/AirPrinter/WebViewController.m diff --git a/Archive/AirPrinter/AirPrinter/WebViewController.xib b/Archive/AirPrinter/AirPrinter/WebViewController.xib new file mode 100644 index 0000000..58e917e --- /dev/null +++ b/Archive/AirPrinter/AirPrinter/WebViewController.xib @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AirPrinter/AirPrinter/en.lproj/InfoPlist.strings b/Archive/AirPrinter/AirPrinter/en.lproj/InfoPlist.strings similarity index 100% rename from AirPrinter/AirPrinter/en.lproj/InfoPlist.strings rename to Archive/AirPrinter/AirPrinter/en.lproj/InfoPlist.strings diff --git a/Archive/AirPrinter/AirPrinter/iPad/Base.lproj/MainWindow-iPad.xib b/Archive/AirPrinter/AirPrinter/iPad/Base.lproj/MainWindow-iPad.xib new file mode 100644 index 0000000..52816fd --- /dev/null +++ b/Archive/AirPrinter/AirPrinter/iPad/Base.lproj/MainWindow-iPad.xib @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AirPrinter/AirPrinter/main.m b/Archive/AirPrinter/AirPrinter/main.m similarity index 100% rename from AirPrinter/AirPrinter/main.m rename to Archive/AirPrinter/AirPrinter/main.m From a8308cf1ce3b3b6798311b840dfe1ec6a1888792 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 12 Jan 2020 21:05:45 +0000 Subject: [PATCH 134/142] Archive TCNibLoad --- .../TCNibLoad}/Classes/NewViewController.h | 0 .../TCNibLoad}/Classes/NewViewController.m | 0 .../TCNibLoad}/Classes/OldViewController.h | 0 .../TCNibLoad}/Classes/OldViewController.m | 0 .../TCNibLoad/Classes/OldViewController.xib | 28 + .../TCNibLoad}/Classes/TCNibLoadAppDelegate.h | 0 .../TCNibLoad}/Classes/TCNibLoadAppDelegate.m | 0 Archive/TCNibLoad/LabelCell.xib | 50 ++ Archive/TCNibLoad/MainWindow.xib | 49 ++ .../TCNibLoad}/TCNibLoad-Info.plist | 2 +- .../TCNibLoad.xcodeproj/project.pbxproj | 89 ++- .../TCNibLoad}/TCNibLoad_Prefix.pch | 0 {TCNibLoad => Archive/TCNibLoad}/main.m | 0 TCNibLoad/Classes/OldViewController.xib | 173 ----- TCNibLoad/LabelCell.xib | 445 ------------- TCNibLoad/MainWindow.xib | 614 ------------------ 16 files changed, 202 insertions(+), 1248 deletions(-) rename {TCNibLoad => Archive/TCNibLoad}/Classes/NewViewController.h (100%) rename {TCNibLoad => Archive/TCNibLoad}/Classes/NewViewController.m (100%) rename {TCNibLoad => Archive/TCNibLoad}/Classes/OldViewController.h (100%) rename {TCNibLoad => Archive/TCNibLoad}/Classes/OldViewController.m (100%) create mode 100644 Archive/TCNibLoad/Classes/OldViewController.xib rename {TCNibLoad => Archive/TCNibLoad}/Classes/TCNibLoadAppDelegate.h (100%) rename {TCNibLoad => Archive/TCNibLoad}/Classes/TCNibLoadAppDelegate.m (100%) create mode 100644 Archive/TCNibLoad/LabelCell.xib create mode 100644 Archive/TCNibLoad/MainWindow.xib rename {TCNibLoad => Archive/TCNibLoad}/TCNibLoad-Info.plist (92%) rename {TCNibLoad => Archive/TCNibLoad}/TCNibLoad.xcodeproj/project.pbxproj (80%) rename {TCNibLoad => Archive/TCNibLoad}/TCNibLoad_Prefix.pch (100%) rename {TCNibLoad => Archive/TCNibLoad}/main.m (100%) delete mode 100644 TCNibLoad/Classes/OldViewController.xib delete mode 100644 TCNibLoad/LabelCell.xib delete mode 100644 TCNibLoad/MainWindow.xib diff --git a/TCNibLoad/Classes/NewViewController.h b/Archive/TCNibLoad/Classes/NewViewController.h similarity index 100% rename from TCNibLoad/Classes/NewViewController.h rename to Archive/TCNibLoad/Classes/NewViewController.h diff --git a/TCNibLoad/Classes/NewViewController.m b/Archive/TCNibLoad/Classes/NewViewController.m similarity index 100% rename from TCNibLoad/Classes/NewViewController.m rename to Archive/TCNibLoad/Classes/NewViewController.m diff --git a/TCNibLoad/Classes/OldViewController.h b/Archive/TCNibLoad/Classes/OldViewController.h similarity index 100% rename from TCNibLoad/Classes/OldViewController.h rename to Archive/TCNibLoad/Classes/OldViewController.h diff --git a/TCNibLoad/Classes/OldViewController.m b/Archive/TCNibLoad/Classes/OldViewController.m similarity index 100% rename from TCNibLoad/Classes/OldViewController.m rename to Archive/TCNibLoad/Classes/OldViewController.m diff --git a/Archive/TCNibLoad/Classes/OldViewController.xib b/Archive/TCNibLoad/Classes/OldViewController.xib new file mode 100644 index 0000000..331aaf2 --- /dev/null +++ b/Archive/TCNibLoad/Classes/OldViewController.xib @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TCNibLoad/Classes/TCNibLoadAppDelegate.h b/Archive/TCNibLoad/Classes/TCNibLoadAppDelegate.h similarity index 100% rename from TCNibLoad/Classes/TCNibLoadAppDelegate.h rename to Archive/TCNibLoad/Classes/TCNibLoadAppDelegate.h diff --git a/TCNibLoad/Classes/TCNibLoadAppDelegate.m b/Archive/TCNibLoad/Classes/TCNibLoadAppDelegate.m similarity index 100% rename from TCNibLoad/Classes/TCNibLoadAppDelegate.m rename to Archive/TCNibLoad/Classes/TCNibLoadAppDelegate.m diff --git a/Archive/TCNibLoad/LabelCell.xib b/Archive/TCNibLoad/LabelCell.xib new file mode 100644 index 0000000..3b87b28 --- /dev/null +++ b/Archive/TCNibLoad/LabelCell.xib @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Archive/TCNibLoad/MainWindow.xib b/Archive/TCNibLoad/MainWindow.xib new file mode 100644 index 0000000..36be6bd --- /dev/null +++ b/Archive/TCNibLoad/MainWindow.xib @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TCNibLoad/TCNibLoad-Info.plist b/Archive/TCNibLoad/TCNibLoad-Info.plist similarity index 92% rename from TCNibLoad/TCNibLoad-Info.plist rename to Archive/TCNibLoad/TCNibLoad-Info.plist index 3289444..276e6f6 100644 --- a/TCNibLoad/TCNibLoad-Info.plist +++ b/Archive/TCNibLoad/TCNibLoad-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/TCNibLoad/TCNibLoad.xcodeproj/project.pbxproj b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.pbxproj similarity index 80% rename from TCNibLoad/TCNibLoad.xcodeproj/project.pbxproj rename to Archive/TCNibLoad/TCNibLoad.xcodeproj/project.pbxproj index e814942..f00f8fe 100644 --- a/TCNibLoad/TCNibLoad.xcodeproj/project.pbxproj +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 45; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -140,15 +140,16 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 1120; + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TCNibLoad" */; - compatibilityVersion = "Xcode 3.1"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( - English, - Japanese, - French, - German, + Base, + en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* TCNibLoad */; projectDirPath = ""; @@ -191,16 +192,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = TCNibLoad_Prefix.pch; INFOPLIST_FILE = "TCNibLoad-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TCNibLoad; PRODUCT_NAME = TCNibLoad; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Debug; }; @@ -208,14 +215,20 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = TCNibLoad_Prefix.pch; INFOPLIST_FILE = "TCNibLoad-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.TCNibLoad; PRODUCT_NAME = TCNibLoad; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; VALIDATE_PRODUCT = YES; }; name = Release; @@ -223,12 +236,36 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -236,13 +273,35 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - PREBINDING = NO; SDKROOT = iphoneos; }; name = Release; diff --git a/TCNibLoad/TCNibLoad_Prefix.pch b/Archive/TCNibLoad/TCNibLoad_Prefix.pch similarity index 100% rename from TCNibLoad/TCNibLoad_Prefix.pch rename to Archive/TCNibLoad/TCNibLoad_Prefix.pch diff --git a/TCNibLoad/main.m b/Archive/TCNibLoad/main.m similarity index 100% rename from TCNibLoad/main.m rename to Archive/TCNibLoad/main.m diff --git a/TCNibLoad/Classes/OldViewController.xib b/TCNibLoad/Classes/OldViewController.xib deleted file mode 100644 index feaf2e1..0000000 --- a/TCNibLoad/Classes/OldViewController.xib +++ /dev/null @@ -1,173 +0,0 @@ - - - - 784 - 10B500 - 732 - 1038.2 - 437.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 62 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - 274 - {320, 460} - - - 3 - MQA - - NO - YES - NO - - NO - 1 - 0 - YES - 44 - 22 - 22 - - - - - YES - - - view - - - - 5 - - - - dataSource - - - - 6 - - - - delegate - - - - 7 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 4.IBEditorWindowLastContentRect - 4.IBPluginDependency - - - YES - OldViewController - UIResponder - {{329, 504}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 7 - - - - YES - - OldViewController - UIViewController - - IBProjectSource - OldViewController.h - - - - - 0 - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - - 3 - 3.1 - - diff --git a/TCNibLoad/LabelCell.xib b/TCNibLoad/LabelCell.xib deleted file mode 100644 index 7ad96df..0000000 --- a/TCNibLoad/LabelCell.xib +++ /dev/null @@ -1,445 +0,0 @@ - - - - 1056 - 10J567 - 823 - 1038.35 - 462.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - - - 256 - - - - 292 - {{20, 9}, {135, 21}} - - NO - YES - 7 - 101 - NO - IBCocoaTouchFramework - Label 1 - - 1 - MCAwIDAAA - - - 3 - MQA - - 1 - 10 - - - - 289 - {{163, 3}, {137, 21}} - - NO - YES - 7 - 102 - NO - IBCocoaTouchFramework - Label 2 - - Helvetica-Oblique - 12 - 16 - - - 1 - MCAwIDEAA - - - 1 - 10 - - - - 289 - {{163, 20}, {137, 16}} - - NO - YES - 7 - 103 - NO - IBCocoaTouchFramework - Label 3 - - Helvetica-Bold - 12 - 16 - - - 1 - MSAwIDAAA - - - 1 - 10 - - - {320, 44} - - - 3 - MCAwAA - - NO - YES - 4 - YES - IBCocoaTouchFramework - - - {320, 44} - - - 1 - MSAxIDEAA - - IBCocoaTouchFramework - 1 - - - LabelCell - - - - - - - labelCell - - - - 12 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 3 - - - - - - - - - - 4 - - - - - 10 - - - - - 11 - - - - - - - OldViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDIwAAwgAAAA - - {{125, 502}, {320, 44}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAwgAAAA - - - - - - - 12 - - - - - OldViewController - UITableViewController - - labelCell - UITableViewCell - - - labelCell - - labelCell - UITableViewCell - - - - IBProjectSource - Classes/OldViewController.h - - - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - TCNibLoad.xcodeproj - 3 - 132 - - diff --git a/TCNibLoad/MainWindow.xib b/TCNibLoad/MainWindow.xib deleted file mode 100644 index d8f4852..0000000 --- a/TCNibLoad/MainWindow.xib +++ /dev/null @@ -1,614 +0,0 @@ - - - - 1056 - 10J567 - 823 - 1038.35 - 462.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {320, 480} - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - - - - - - 1 - - IBCocoaTouchFramework - NO - - - NSBundle - IBCocoaTouchFramework - - - - OldViewController - - 1 - - IBCocoaTouchFramework - NO - - - YES - - - - UINib - IBCocoaTouchFramework - - - - OldViewController - - 1 - - IBCocoaTouchFramework - NO - - - - - 266 - {{129, 330}, {163, 49}} - - 3 - MCAwAA - - NO - IBCocoaTouchFramework - - - - - - YES - - - window - - - - 9 - - - - delegate - - - - 99 - - - - tabBarController - - - - 113 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - 106 - - - YES - - - - - - - - 107 - - - - - 108 - - - YES - - - - NSBundle - - - 109 - - - YES - - - - UINib - - - 110 - - - - - 111 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 107.IBPluginDependency - 108.CustomClassName - 108.IBPluginDependency - 109.CustomClassName - 109.IBPluginDependency - 110.IBPluginDependency - 111.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - {{1125, 676}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - OldViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - NewViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - YES - - - {{229, 373}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - TCNibLoadAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 124 - - - - YES - - NewViewController - OldViewController - - IBProjectSource - Classes/NewViewController.h - - - - OldViewController - UITableViewController - - labelCell - UITableViewCell - - - labelCell - - labelCell - UITableViewCell - - - - IBProjectSource - Classes/OldViewController.h - - - - TCNibLoadAppDelegate - NSObject - - YES - - YES - tabBarController - window - - - YES - UITabBarController - UIWindow - - - - YES - - YES - tabBarController - window - - - YES - - tabBarController - UITabBarController - - - window - UIWindow - - - - - IBProjectSource - Classes/TCNibLoadAppDelegate.h - - - - UIWindow - UIView - - IBUserSource - - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITabBar.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITabBarItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UITabBarItem.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - TCNibLoad.xcodeproj - 3 - 132 - - From 2f3c6e217fff8dc154b4b3f17670516643dabf44 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 13 Jan 2020 10:06:13 +0000 Subject: [PATCH 135/142] Archive RemindMe --- .../RemindMe}/Base.lproj/Localizable.strings | 0 .../RemindMe}/Base.lproj/Main.storyboard | 34 +++++++++---------- .../RemindMe}/Classes/AppDelegate.h | 0 .../RemindMe}/Classes/AppDelegate.m | 0 .../Classes/RemindMeViewController.h | 0 .../Classes/RemindMeViewController.m | 0 {RemindMe => Archive/RemindMe}/Info.plist | 0 .../RemindMe}/LaunchScreen.storyboard | 0 {RemindMe => Archive/RemindMe}/README.md | 4 +-- .../RemindMe.xcodeproj/project.pbxproj | 29 +++++++++++----- .../AppIcon.appiconset/Contents.json | 0 .../RemindMe/Images.xcassets/Contents.json | 0 {RemindMe => Archive/RemindMe}/main.m | 0 13 files changed, 40 insertions(+), 27 deletions(-) rename {RemindMe => Archive/RemindMe}/Base.lproj/Localizable.strings (100%) rename {RemindMe => Archive/RemindMe}/Base.lproj/Main.storyboard (76%) rename {RemindMe => Archive/RemindMe}/Classes/AppDelegate.h (100%) rename {RemindMe => Archive/RemindMe}/Classes/AppDelegate.m (100%) rename {RemindMe => Archive/RemindMe}/Classes/RemindMeViewController.h (100%) rename {RemindMe => Archive/RemindMe}/Classes/RemindMeViewController.m (100%) rename {RemindMe => Archive/RemindMe}/Info.plist (100%) rename {RemindMe => Archive/RemindMe}/LaunchScreen.storyboard (100%) rename {RemindMe => Archive/RemindMe}/README.md (61%) rename {RemindMe => Archive/RemindMe}/RemindMe.xcodeproj/project.pbxproj (93%) rename {RemindMe => Archive/RemindMe}/RemindMe/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename {RemindMe => Archive/RemindMe}/RemindMe/Images.xcassets/Contents.json (100%) rename {RemindMe => Archive/RemindMe}/main.m (100%) diff --git a/RemindMe/Base.lproj/Localizable.strings b/Archive/RemindMe/Base.lproj/Localizable.strings similarity index 100% rename from RemindMe/Base.lproj/Localizable.strings rename to Archive/RemindMe/Base.lproj/Localizable.strings diff --git a/RemindMe/Base.lproj/Main.storyboard b/Archive/RemindMe/Base.lproj/Main.storyboard similarity index 76% rename from RemindMe/Base.lproj/Main.storyboard rename to Archive/RemindMe/Base.lproj/Main.storyboard index 9994924..d10e6fb 100644 --- a/RemindMe/Base.lproj/Main.storyboard +++ b/Archive/RemindMe/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - - + + + - - + @@ -19,24 +19,25 @@ - - + + + - diff --git a/RemindMe/Classes/AppDelegate.h b/Archive/RemindMe/Classes/AppDelegate.h similarity index 100% rename from RemindMe/Classes/AppDelegate.h rename to Archive/RemindMe/Classes/AppDelegate.h diff --git a/RemindMe/Classes/AppDelegate.m b/Archive/RemindMe/Classes/AppDelegate.m similarity index 100% rename from RemindMe/Classes/AppDelegate.m rename to Archive/RemindMe/Classes/AppDelegate.m diff --git a/RemindMe/Classes/RemindMeViewController.h b/Archive/RemindMe/Classes/RemindMeViewController.h similarity index 100% rename from RemindMe/Classes/RemindMeViewController.h rename to Archive/RemindMe/Classes/RemindMeViewController.h diff --git a/RemindMe/Classes/RemindMeViewController.m b/Archive/RemindMe/Classes/RemindMeViewController.m similarity index 100% rename from RemindMe/Classes/RemindMeViewController.m rename to Archive/RemindMe/Classes/RemindMeViewController.m diff --git a/RemindMe/Info.plist b/Archive/RemindMe/Info.plist similarity index 100% rename from RemindMe/Info.plist rename to Archive/RemindMe/Info.plist diff --git a/RemindMe/LaunchScreen.storyboard b/Archive/RemindMe/LaunchScreen.storyboard similarity index 100% rename from RemindMe/LaunchScreen.storyboard rename to Archive/RemindMe/LaunchScreen.storyboard diff --git a/RemindMe/README.md b/Archive/RemindMe/README.md similarity index 61% rename from RemindMe/README.md rename to Archive/RemindMe/README.md index 4292e86..fe0054d 100644 --- a/RemindMe/README.md +++ b/Archive/RemindMe/README.md @@ -8,5 +8,5 @@ The RemindMe App is a demonstration on how to schedule local notifications using The original posts were written for iOS 4 a long time ago: -+ [Repeating an iOS local notification](http://useyourloaf.com/blog/repeating-an-ios-local-notification/) -+ [Add Local Notification with iOS 4](http://useyourloaf.com/blog/adding-local-notifications-with-ios-4/) ++ [Repeating an iOS local notification](https://useyourloaf.com/blog/repeating-an-ios-local-notification/) ++ [Add Local Notification with iOS 4](https://useyourloaf.com/blog/adding-local-notifications-with-ios-4/) diff --git a/RemindMe/RemindMe.xcodeproj/project.pbxproj b/Archive/RemindMe/RemindMe.xcodeproj/project.pbxproj similarity index 93% rename from RemindMe/RemindMe.xcodeproj/project.pbxproj rename to Archive/RemindMe/RemindMe.xcodeproj/project.pbxproj index 745043b..f12800f 100755 --- a/RemindMe/RemindMe.xcodeproj/project.pbxproj +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 47; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -119,7 +119,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 1D6058900D05DD3D006BFB54 = { @@ -129,15 +129,12 @@ }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "RemindMe" */; - compatibilityVersion = "Xcode 6.3"; - developmentRegion = English; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( - English, - Japanese, - French, - German, Base, + en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; @@ -238,12 +235,20 @@ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -270,12 +275,20 @@ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; diff --git a/RemindMe/RemindMe/Images.xcassets/AppIcon.appiconset/Contents.json b/Archive/RemindMe/RemindMe/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from RemindMe/RemindMe/Images.xcassets/AppIcon.appiconset/Contents.json rename to Archive/RemindMe/RemindMe/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/RemindMe/RemindMe/Images.xcassets/Contents.json b/Archive/RemindMe/RemindMe/Images.xcassets/Contents.json similarity index 100% rename from RemindMe/RemindMe/Images.xcassets/Contents.json rename to Archive/RemindMe/RemindMe/Images.xcassets/Contents.json diff --git a/RemindMe/main.m b/Archive/RemindMe/main.m similarity index 100% rename from RemindMe/main.m rename to Archive/RemindMe/main.m From dc642091dd6c9ea8497797ae6ebeed7ee8848d4e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 24 Feb 2020 16:10:04 +0000 Subject: [PATCH 136/142] Update to add support for dark mode - requires iOS 13 --- .../DynamicWebKit.xcodeproj/project.pbxproj | 42 ++++++++++++---- .../DynamicWebKit/Base.lproj/Main.storyboard | 19 ++++---- DynamicWebKit/DynamicWebKit/HTML/001-dark.png | Bin 0 -> 38737 bytes .../DynamicWebKit/HTML/001-dark@2x.png | Bin 0 -> 40763 bytes DynamicWebKit/DynamicWebKit/HTML/001.png | Bin 0 -> 28730 bytes DynamicWebKit/DynamicWebKit/HTML/001@2x.png | Bin 0 -> 41062 bytes DynamicWebKit/DynamicWebKit/HTML/default.html | 21 ++++++++ .../DynamicWebKit/HTML/stylesheet.css | 40 ++++++++++++++++ ...ontroler.swift => WebViewController.swift} | 45 +++++++----------- DynamicWebKit/DynamicWebKit/readme.html | 16 ------- DynamicWebKit/DynamicWebKit/stylesheet.css | 18 ------- DynamicWebKit/README.md | 7 ++- 12 files changed, 127 insertions(+), 81 deletions(-) create mode 100644 DynamicWebKit/DynamicWebKit/HTML/001-dark.png create mode 100644 DynamicWebKit/DynamicWebKit/HTML/001-dark@2x.png create mode 100644 DynamicWebKit/DynamicWebKit/HTML/001.png create mode 100644 DynamicWebKit/DynamicWebKit/HTML/001@2x.png create mode 100644 DynamicWebKit/DynamicWebKit/HTML/default.html create mode 100644 DynamicWebKit/DynamicWebKit/HTML/stylesheet.css rename DynamicWebKit/DynamicWebKit/{HTMLViewControler.swift => WebViewController.swift} (65%) delete mode 100644 DynamicWebKit/DynamicWebKit/readme.html delete mode 100644 DynamicWebKit/DynamicWebKit/stylesheet.css diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index f0255cc..995fc45 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -8,25 +8,33 @@ /* Begin PBXBuildFile section */ 53A2B53B1F94DBE500095FAD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2B53A1F94DBE500095FAD /* AppDelegate.swift */; }; - 53A2B53D1F94DBE500095FAD /* HTMLViewControler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2B53C1F94DBE500095FAD /* HTMLViewControler.swift */; }; + 53A2B53D1F94DBE500095FAD /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A2B53C1F94DBE500095FAD /* WebViewController.swift */; }; 53A2B5401F94DBE500095FAD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B53E1F94DBE500095FAD /* Main.storyboard */; }; 53A2B5421F94DBE500095FAD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B5411F94DBE500095FAD /* Assets.xcassets */; }; 53A2B5451F94DBE500095FAD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B5431F94DBE500095FAD /* LaunchScreen.storyboard */; }; - 53A2B54D1F94DC9700095FAD /* readme.html in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B54C1F94DC9700095FAD /* readme.html */; }; + 53A2B54D1F94DC9700095FAD /* default.html in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B54C1F94DC9700095FAD /* default.html */; }; 53A2B54F1F94DD8200095FAD /* stylesheet.css in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B54E1F94DD8200095FAD /* stylesheet.css */; }; + 53E34E032403D85700EE575E /* 001-dark.png in Resources */ = {isa = PBXBuildFile; fileRef = 53E34E022403D67600EE575E /* 001-dark.png */; }; + 53E34E042403D85A00EE575E /* 001-dark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53E34DFF2403D67600EE575E /* 001-dark@2x.png */; }; + 53E34E052403D85E00EE575E /* 001.png in Resources */ = {isa = PBXBuildFile; fileRef = 53E34E012403D67600EE575E /* 001.png */; }; + 53E34E062403D86100EE575E /* 001@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53E34E002403D67600EE575E /* 001@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 53A2B5371F94DBE500095FAD /* DynamicWebKit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicWebKit.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53A2B53A1F94DBE500095FAD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 53A2B53C1F94DBE500095FAD /* HTMLViewControler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLViewControler.swift; sourceTree = ""; }; + 53A2B53C1F94DBE500095FAD /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; 53A2B53F1F94DBE500095FAD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 53A2B5411F94DBE500095FAD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 53A2B5441F94DBE500095FAD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 53A2B5461F94DBE500095FAD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 53A2B54C1F94DC9700095FAD /* readme.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = readme.html; sourceTree = ""; }; + 53A2B54C1F94DC9700095FAD /* default.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = default.html; sourceTree = ""; }; 53A2B54E1F94DD8200095FAD /* stylesheet.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = stylesheet.css; sourceTree = ""; }; 53A2B5501F94F14800095FAD /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53E34DFF2403D67600EE575E /* 001-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001-dark@2x.png"; sourceTree = ""; }; + 53E34E002403D67600EE575E /* 001@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001@2x.png"; sourceTree = ""; }; + 53E34E012403D67600EE575E /* 001.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 001.png; sourceTree = ""; }; + 53E34E022403D67600EE575E /* 001-dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001-dark.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -61,9 +69,8 @@ isa = PBXGroup; children = ( 53A2B53A1F94DBE500095FAD /* AppDelegate.swift */, - 53A2B53C1F94DBE500095FAD /* HTMLViewControler.swift */, - 53A2B54C1F94DC9700095FAD /* readme.html */, - 53A2B54E1F94DD8200095FAD /* stylesheet.css */, + 53A2B53C1F94DBE500095FAD /* WebViewController.swift */, + 53E34DFE2403D58400EE575E /* HTML */, 53A2B53E1F94DBE500095FAD /* Main.storyboard */, 53A2B5411F94DBE500095FAD /* Assets.xcassets */, 53A2B5431F94DBE500095FAD /* LaunchScreen.storyboard */, @@ -72,6 +79,19 @@ path = DynamicWebKit; sourceTree = ""; }; + 53E34DFE2403D58400EE575E /* HTML */ = { + isa = PBXGroup; + children = ( + 53A2B54C1F94DC9700095FAD /* default.html */, + 53E34E022403D67600EE575E /* 001-dark.png */, + 53E34DFF2403D67600EE575E /* 001-dark@2x.png */, + 53E34E012403D67600EE575E /* 001.png */, + 53E34E002403D67600EE575E /* 001@2x.png */, + 53A2B54E1F94DD8200095FAD /* stylesheet.css */, + ); + path = HTML; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -132,10 +152,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 53A2B54D1F94DC9700095FAD /* readme.html in Resources */, + 53E34E042403D85A00EE575E /* 001-dark@2x.png in Resources */, + 53A2B54D1F94DC9700095FAD /* default.html in Resources */, 53A2B54F1F94DD8200095FAD /* stylesheet.css in Resources */, + 53E34E052403D85E00EE575E /* 001.png in Resources */, 53A2B5451F94DBE500095FAD /* LaunchScreen.storyboard in Resources */, + 53E34E032403D85700EE575E /* 001-dark.png in Resources */, 53A2B5421F94DBE500095FAD /* Assets.xcassets in Resources */, + 53E34E062403D86100EE575E /* 001@2x.png in Resources */, 53A2B5401F94DBE500095FAD /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -147,7 +171,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 53A2B53D1F94DBE500095FAD /* HTMLViewControler.swift in Sources */, + 53A2B53D1F94DBE500095FAD /* WebViewController.swift in Sources */, 53A2B53B1F94DBE500095FAD /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard index afb9d6c..c0a6762 100644 --- a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard +++ b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard @@ -1,29 +1,28 @@ - - - - + + - + + - + - + - + - + @@ -31,7 +30,7 @@ - + diff --git a/DynamicWebKit/DynamicWebKit/HTML/001-dark.png b/DynamicWebKit/DynamicWebKit/HTML/001-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..98e7b46dffce023f88021d1e974c6a3be2ea20af GIT binary patch literal 38737 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 Hy8~e`3+=#T69b!arT}jigH@ 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 Rz-?A{RE4p|{s+@2bFKgY literal 0 HcmV?d00001 diff --git a/DynamicWebKit/DynamicWebKit/HTML/001-dark@2x.png b/DynamicWebKit/DynamicWebKit/HTML/001-dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..867a616280402b913597f99707428d3290a857e4 GIT binary patch literal 40763 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/DynamicWebKit/DynamicWebKit/HTML/default.html b/DynamicWebKit/DynamicWebKit/HTML/default.html new file mode 100644 index 0000000..96c14f7 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/HTML/default.html @@ -0,0 +1,21 @@ + + + + + + +User Guide + + +

Dynamic Type With WebKit

+

Getting Started

+

An example of using dynamic type fonts with HTML content displayed in a WKWebView. Changing the text size in Settings should also change the text in this web view.

+

Handling Images

+

An example of an image with a dark mode variation

+ + +Xcode source editor + +
+ + diff --git a/DynamicWebKit/DynamicWebKit/HTML/stylesheet.css b/DynamicWebKit/DynamicWebKit/HTML/stylesheet.css new file mode 100644 index 0000000..00998a7 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/HTML/stylesheet.css @@ -0,0 +1,40 @@ +:root { + color-scheme: light dark; + --title-color: red; + --subhead-color: green; + --link-color: blue; +} + +@media screen and (prefers-color-scheme: dark) { + :root { + --title-color: #ff8080; + --subhead-color: #80ff80; + --link-color: #93d5ff; + } +} + +body { + font: -apple-system-body; +} + +h1 { + font: -apple-system-headline; + color: var(--title-color); +} + +h2 { + font: -apple-system-subheadline; + color: var(--subhead-color); +} + +footer { + font: -apple-system-footnote; +} + +a { + color: var(--link-color); +} + +img { + max-width: 100%; +} diff --git a/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift b/DynamicWebKit/DynamicWebKit/WebViewController.swift similarity index 65% rename from DynamicWebKit/DynamicWebKit/HTMLViewControler.swift rename to DynamicWebKit/DynamicWebKit/WebViewController.swift index 779671d..90b5382 100644 --- a/DynamicWebKit/DynamicWebKit/HTMLViewControler.swift +++ b/DynamicWebKit/DynamicWebKit/WebViewController.swift @@ -1,5 +1,5 @@ // Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright (c) 2017-2020 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -30,43 +30,34 @@ import UIKit import WebKit -final class HTMLViewControler: UIViewController { - private lazy var webview: WKWebView = { +final class WebViewController: UIViewController { + var html: String = "default" { + didSet { + loadHTML(html) + } + } + + private lazy var webView: WKWebView = { let preferences = WKPreferences() preferences.javaScriptEnabled = false let configuration = WKWebViewConfiguration() configuration.preferences = preferences - let webview = WKWebView(frame: .zero, configuration: configuration) - webview.translatesAutoresizingMaskIntoConstraints = false - return webview + return WKWebView(frame: .zero, configuration: configuration) }() - override func viewDidLoad() { - super.viewDidLoad() - setupViews() - loadHTML("readme.html") - + override func loadView() { + view = webView + loadHTML(html) NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } - private func setupViews() { - view.addSubview(webview) - NSLayoutConstraint.activate([ - webview.leadingAnchor.constraint(equalTo: view.leadingAnchor), - webview.trailingAnchor.constraint(equalTo: view.trailingAnchor), - webview.topAnchor.constraint(equalTo: view.topAnchor), - webview.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) + @objc private func contentSizeDidChange(_ notification: Notification) { + webView.reload() } - private func loadHTML(_ file: String) { - if let baseURL = Bundle.main.resourceURL { - let fileURL = baseURL.appendingPathComponent(file) - webview.loadFileURL(fileURL, allowingReadAccessTo: fileURL) + private func loadHTML(_ name: String) { + if let url = Bundle.main.url(forResource: name, withExtension: "html") { + webView.loadFileURL(url, allowingReadAccessTo: url) } } - - @objc private func contentSizeDidChange(_ notification: Notification) { - webview.reload() - } } diff --git a/DynamicWebKit/DynamicWebKit/readme.html b/DynamicWebKit/DynamicWebKit/readme.html deleted file mode 100644 index 5055016..0000000 --- a/DynamicWebKit/DynamicWebKit/readme.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - -

Dynamic Type With WebKit

-

Getting Started

-

An example of using dynamic type fonts with HTML content displayed in a WKWebView.

-

Changing the text size in Settings should also change the text in this web view.

- - - - diff --git a/DynamicWebKit/DynamicWebKit/stylesheet.css b/DynamicWebKit/DynamicWebKit/stylesheet.css deleted file mode 100644 index 59ff130..0000000 --- a/DynamicWebKit/DynamicWebKit/stylesheet.css +++ /dev/null @@ -1,18 +0,0 @@ -body { - font: -apple-system-body; -} - -h1 { - font: -apple-system-headline; - color: red; -} - -h2 { - font: -apple-system-subheadline; - color: blue; -} - -.footnote { - font: -apple-system-footnote; - color: green; -} diff --git a/DynamicWebKit/README.md b/DynamicWebKit/README.md index 188df97..6c6df29 100644 --- a/DynamicWebKit/README.md +++ b/DynamicWebKit/README.md @@ -2,8 +2,13 @@ An example of how to use the Apple system fonts in a CSS stylesheet so static HTML content in a web view respects the user's choice of content size. +## Adding Support For Dark Mode + +I've updated this project to support dark mode (requires iOS 13). + ## Further Details -For further details see the following blog post: +For further details see the following blog posts: + [Using Dynamic Type With Web Views](https://useyourloaf.com/blog/using-dynamic-type-with-web-views/) ++ [Supporting Dark Mode In Web Views](https://useyourloaf.com/blog/supporting-dark-mode-in-web-views/) From 6626ba274749496e50f146c63acdef80ef1d8ab3 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 24 Feb 2020 16:27:30 +0000 Subject: [PATCH 137/142] Update link --- DynamicWebKit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamicWebKit/README.md b/DynamicWebKit/README.md index 6c6df29..3f59978 100644 --- a/DynamicWebKit/README.md +++ b/DynamicWebKit/README.md @@ -11,4 +11,4 @@ I've updated this project to support dark mode (requires iOS 13). For further details see the following blog posts: + [Using Dynamic Type With Web Views](https://useyourloaf.com/blog/using-dynamic-type-with-web-views/) -+ [Supporting Dark Mode In Web Views](https://useyourloaf.com/blog/supporting-dark-mode-in-web-views/) ++ [Supporting Dark Mode In WkWebView](https://useyourloaf.com/blog/supporting-dark-mode-in-wkwebview/) From ce946861b94fe775c25ae00b50cc95b85b4c0ce9 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 9 Mar 2020 16:50:36 +0000 Subject: [PATCH 138/142] Update for dark mode --- .../Container-SB/Container/Base.lproj/Main.storyboard | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Container/Container-SB/Container/Base.lproj/Main.storyboard b/Container/Container-SB/Container/Base.lproj/Main.storyboard index ed85341..e5bdbfe 100644 --- a/Container/Container-SB/Container/Base.lproj/Main.storyboard +++ b/Container/Container-SB/Container/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -35,7 +35,7 @@
- + @@ -78,7 +78,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -149,7 +149,6 @@ - From c9790b09f0b100fc08f5161b47cb364d1fce35bb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 9 Mar 2020 16:50:54 +0000 Subject: [PATCH 139/142] Add DarkTheme --- DarkTheme/DarkTheme.xcodeproj/project.pbxproj | 357 ++++++++++++++++++ DarkTheme/DarkTheme/AppDelegate.swift | 34 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../DarkTheme/Assets.xcassets/Contents.json | 6 + .../Dynamic Colors/Contents.json | 6 + .../defaultBackground.colorset/Contents.json | 78 ++++ .../groupedBackground.colorset/Contents.json | 38 ++ .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../DarkTheme/Base.lproj/Main.storyboard | 187 +++++++++ DarkTheme/DarkTheme/Info.plist | 74 ++++ DarkTheme/DarkTheme/SceneDelegate.swift | 39 ++ DarkTheme/DarkTheme/Settings.swift | 42 +++ DarkTheme/DarkTheme/TextViewController.swift | 48 +++ DarkTheme/DarkTheme/Theme.swift | 49 +++ .../DarkTheme/ThemeTableViewController.swift | 67 ++++ DarkTheme/README.md | 5 + 16 files changed, 1153 insertions(+) create mode 100644 DarkTheme/DarkTheme.xcodeproj/project.pbxproj create mode 100644 DarkTheme/DarkTheme/AppDelegate.swift create mode 100644 DarkTheme/DarkTheme/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 DarkTheme/DarkTheme/Assets.xcassets/Contents.json create mode 100644 DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/Contents.json create mode 100644 DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/defaultBackground.colorset/Contents.json create mode 100644 DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/groupedBackground.colorset/Contents.json create mode 100644 DarkTheme/DarkTheme/Base.lproj/LaunchScreen.storyboard create mode 100644 DarkTheme/DarkTheme/Base.lproj/Main.storyboard create mode 100644 DarkTheme/DarkTheme/Info.plist create mode 100644 DarkTheme/DarkTheme/SceneDelegate.swift create mode 100644 DarkTheme/DarkTheme/Settings.swift create mode 100644 DarkTheme/DarkTheme/TextViewController.swift create mode 100644 DarkTheme/DarkTheme/Theme.swift create mode 100644 DarkTheme/DarkTheme/ThemeTableViewController.swift create mode 100644 DarkTheme/README.md diff --git a/DarkTheme/DarkTheme.xcodeproj/project.pbxproj b/DarkTheme/DarkTheme.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6940263 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.pbxproj @@ -0,0 +1,357 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 535DFF62241589FD00DF6476 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535DFF61241589FD00DF6476 /* AppDelegate.swift */; }; + 535DFF64241589FD00DF6476 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535DFF63241589FD00DF6476 /* SceneDelegate.swift */; }; + 535DFF6B241589FD00DF6476 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 535DFF69241589FD00DF6476 /* Main.storyboard */; }; + 535DFF6D24158A0100DF6476 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 535DFF6C24158A0100DF6476 /* Assets.xcassets */; }; + 535DFF7024158A0100DF6476 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 535DFF6E24158A0100DF6476 /* LaunchScreen.storyboard */; }; + 535DFF7824158B3E00DF6476 /* ThemeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535DFF7724158B3E00DF6476 /* ThemeTableViewController.swift */; }; + 535DFF7A24158B8E00DF6476 /* TextViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535DFF7924158B8E00DF6476 /* TextViewController.swift */; }; + 535DFF7C241597CA00DF6476 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535DFF7B241597CA00DF6476 /* Theme.swift */; }; + 535DFF7E2415996900DF6476 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535DFF7D2415996900DF6476 /* Settings.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 535DFF5E241589FD00DF6476 /* DarkTheme.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DarkTheme.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 535DFF61241589FD00DF6476 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 535DFF63241589FD00DF6476 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 535DFF6A241589FD00DF6476 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 535DFF6C24158A0100DF6476 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 535DFF6F24158A0100DF6476 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 535DFF7124158A0100DF6476 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 535DFF7724158B3E00DF6476 /* ThemeTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeTableViewController.swift; sourceTree = ""; }; + 535DFF7924158B8E00DF6476 /* TextViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewController.swift; sourceTree = ""; }; + 535DFF7B241597CA00DF6476 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; + 535DFF7D2415996900DF6476 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; + 535DFF7F2416A58B00DF6476 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 535DFF5B241589FD00DF6476 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 535DFF55241589FD00DF6476 = { + isa = PBXGroup; + children = ( + 535DFF7F2416A58B00DF6476 /* README.md */, + 535DFF60241589FD00DF6476 /* DarkTheme */, + 535DFF5F241589FD00DF6476 /* Products */, + ); + sourceTree = ""; + }; + 535DFF5F241589FD00DF6476 /* Products */ = { + isa = PBXGroup; + children = ( + 535DFF5E241589FD00DF6476 /* DarkTheme.app */, + ); + name = Products; + sourceTree = ""; + }; + 535DFF60241589FD00DF6476 /* DarkTheme */ = { + isa = PBXGroup; + children = ( + 535DFF7724158B3E00DF6476 /* ThemeTableViewController.swift */, + 535DFF7B241597CA00DF6476 /* Theme.swift */, + 535DFF7D2415996900DF6476 /* Settings.swift */, + 535DFF7924158B8E00DF6476 /* TextViewController.swift */, + 535DFF61241589FD00DF6476 /* AppDelegate.swift */, + 535DFF63241589FD00DF6476 /* SceneDelegate.swift */, + 535DFF69241589FD00DF6476 /* Main.storyboard */, + 535DFF6C24158A0100DF6476 /* Assets.xcassets */, + 535DFF6E24158A0100DF6476 /* LaunchScreen.storyboard */, + 535DFF7124158A0100DF6476 /* Info.plist */, + ); + path = DarkTheme; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 535DFF5D241589FD00DF6476 /* DarkTheme */ = { + isa = PBXNativeTarget; + buildConfigurationList = 535DFF7424158A0100DF6476 /* Build configuration list for PBXNativeTarget "DarkTheme" */; + buildPhases = ( + 535DFF5A241589FD00DF6476 /* Sources */, + 535DFF5B241589FD00DF6476 /* Frameworks */, + 535DFF5C241589FD00DF6476 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DarkTheme; + productName = DarkTheme; + productReference = 535DFF5E241589FD00DF6476 /* DarkTheme.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 535DFF56241589FD00DF6476 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1140; + LastUpgradeCheck = 1140; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 535DFF5D241589FD00DF6476 = { + CreatedOnToolsVersion = 11.4; + }; + }; + }; + buildConfigurationList = 535DFF59241589FD00DF6476 /* Build configuration list for PBXProject "DarkTheme" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 535DFF55241589FD00DF6476; + productRefGroup = 535DFF5F241589FD00DF6476 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 535DFF5D241589FD00DF6476 /* DarkTheme */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 535DFF5C241589FD00DF6476 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 535DFF7024158A0100DF6476 /* LaunchScreen.storyboard in Resources */, + 535DFF6D24158A0100DF6476 /* Assets.xcassets in Resources */, + 535DFF6B241589FD00DF6476 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 535DFF5A241589FD00DF6476 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 535DFF7E2415996900DF6476 /* Settings.swift in Sources */, + 535DFF7824158B3E00DF6476 /* ThemeTableViewController.swift in Sources */, + 535DFF62241589FD00DF6476 /* AppDelegate.swift in Sources */, + 535DFF7C241597CA00DF6476 /* Theme.swift in Sources */, + 535DFF64241589FD00DF6476 /* SceneDelegate.swift in Sources */, + 535DFF7A24158B8E00DF6476 /* TextViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 535DFF69241589FD00DF6476 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 535DFF6A241589FD00DF6476 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 535DFF6E24158A0100DF6476 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 535DFF6F24158A0100DF6476 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 535DFF7224158A0100DF6476 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "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 = 13.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 535DFF7324158A0100DF6476 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_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 = 13.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 535DFF7524158A0100DF6476 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = DarkTheme/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DarkTheme; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 535DFF7624158A0100DF6476 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = DarkTheme/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DarkTheme; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 535DFF59241589FD00DF6476 /* Build configuration list for PBXProject "DarkTheme" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 535DFF7224158A0100DF6476 /* Debug */, + 535DFF7324158A0100DF6476 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 535DFF7424158A0100DF6476 /* Build configuration list for PBXNativeTarget "DarkTheme" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 535DFF7524158A0100DF6476 /* Debug */, + 535DFF7624158A0100DF6476 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 535DFF56241589FD00DF6476 /* Project object */; +} diff --git a/DarkTheme/DarkTheme/AppDelegate.swift b/DarkTheme/DarkTheme/AppDelegate.swift new file mode 100644 index 0000000..2d32c08 --- /dev/null +++ b/DarkTheme/DarkTheme/AppDelegate.swift @@ -0,0 +1,34 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { +} diff --git a/DarkTheme/DarkTheme/Assets.xcassets/AppIcon.appiconset/Contents.json b/DarkTheme/DarkTheme/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/DarkTheme/DarkTheme/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DarkTheme/DarkTheme/Assets.xcassets/Contents.json b/DarkTheme/DarkTheme/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DarkTheme/DarkTheme/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/Contents.json b/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/defaultBackground.colorset/Contents.json b/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/defaultBackground.colorset/Contents.json new file mode 100644 index 0000000..de36eae --- /dev/null +++ b/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/defaultBackground.colorset/Contents.json @@ -0,0 +1,78 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF0", + "green" : "0xF0", + "red" : "0xF0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x33", + "green" : "0x33", + "red" : "0x33" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "contrast", + "value" : "high" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + }, + { + "appearance" : "contrast", + "value" : "high" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/groupedBackground.colorset/Contents.json b/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/groupedBackground.colorset/Contents.json new file mode 100644 index 0000000..3d85e7f --- /dev/null +++ b/DarkTheme/DarkTheme/Assets.xcassets/Dynamic Colors/groupedBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF7", + "green" : "0xF2", + "red" : "0xF2" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DarkTheme/DarkTheme/Base.lproj/LaunchScreen.storyboard b/DarkTheme/DarkTheme/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/DarkTheme/DarkTheme/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DarkTheme/DarkTheme/Base.lproj/Main.storyboard b/DarkTheme/DarkTheme/Base.lproj/Main.storyboard new file mode 100644 index 0000000..e93a726 --- /dev/null +++ b/DarkTheme/DarkTheme/Base.lproj/Main.storyboard @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DarkTheme/DarkTheme/Info.plist b/DarkTheme/DarkTheme/Info.plist new file mode 100644 index 0000000..e7f6f58 --- /dev/null +++ b/DarkTheme/DarkTheme/Info.plist @@ -0,0 +1,74 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/DarkTheme/DarkTheme/SceneDelegate.swift b/DarkTheme/DarkTheme/SceneDelegate.swift new file mode 100644 index 0000000..f5dc8a3 --- /dev/null +++ b/DarkTheme/DarkTheme/SceneDelegate.swift @@ -0,0 +1,39 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + let defaults = UserDefaults.standard + window?.overrideUserInterfaceStyle = defaults.theme.userInterfaceStyle + } +} diff --git a/DarkTheme/DarkTheme/Settings.swift b/DarkTheme/DarkTheme/Settings.swift new file mode 100644 index 0000000..6c54941 --- /dev/null +++ b/DarkTheme/DarkTheme/Settings.swift @@ -0,0 +1,42 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +extension UserDefaults { + var theme: Theme { + get { + register(defaults: [#function: Theme.device.rawValue]) + return Theme(rawValue: integer(forKey: #function)) ?? .device + } + set { + set(newValue.rawValue, forKey: #function) + } + } +} diff --git a/DarkTheme/DarkTheme/TextViewController.swift b/DarkTheme/DarkTheme/TextViewController.swift new file mode 100644 index 0000000..d42d839 --- /dev/null +++ b/DarkTheme/DarkTheme/TextViewController.swift @@ -0,0 +1,48 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class TextViewController: UIViewController { + var text: String? { + didSet { + textView?.text = text + } + } + + @IBOutlet private var textView: UITextView? + + override func viewDidLoad() { + super.viewDidLoad() + text = """ + “Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They're not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can't do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.” + ― Rob Siltanen + """ + } +} diff --git a/DarkTheme/DarkTheme/Theme.swift b/DarkTheme/DarkTheme/Theme.swift new file mode 100644 index 0000000..0aaa910 --- /dev/null +++ b/DarkTheme/DarkTheme/Theme.swift @@ -0,0 +1,49 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +enum Theme: Int { + case device + case light + case dark +} + +extension Theme { + var userInterfaceStyle: UIUserInterfaceStyle { + switch self { + case .device: + return .unspecified + case .light: + return .light + case .dark: + return .dark + } + } +} diff --git a/DarkTheme/DarkTheme/ThemeTableViewController.swift b/DarkTheme/DarkTheme/ThemeTableViewController.swift new file mode 100644 index 0000000..438ad54 --- /dev/null +++ b/DarkTheme/DarkTheme/ThemeTableViewController.swift @@ -0,0 +1,67 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class ThemeTableViewController: UITableViewController { + var defaults = UserDefaults.standard + private var theme: Theme { + get { + return defaults.theme + } + set { + defaults.theme = newValue + configureStyle(for: newValue) + } + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + configureCell(for: theme, checked: true) + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if indexPath.row != theme.rawValue { + configureCell(for: theme, checked: false) + theme = Theme(rawValue: indexPath.row) ?? .device + configureCell(for: theme, checked: true) + } + + tableView.deselectRow(at: indexPath, animated: true) + } + + private func configureCell(for theme: Theme, checked: Bool) { + let cell = tableView.cellForRow(at: IndexPath(row: theme.rawValue, section: 0)) + cell?.accessoryType = checked ? .checkmark : .none + } + + private func configureStyle(for theme: Theme) { + view.window?.overrideUserInterfaceStyle = theme.userInterfaceStyle + } +} diff --git a/DarkTheme/README.md b/DarkTheme/README.md new file mode 100644 index 0000000..180e52d --- /dev/null +++ b/DarkTheme/README.md @@ -0,0 +1,5 @@ +# Overriding Dark Mode + +An example of using `overrideUserInterfaceStyle` (iOS 13) to control the appearance of an App. See the following post for more details: + ++ [Overriding Dark Mode](https://useyourloaf.com/blog/overriding-dark-mode/) From e27f9b43930756a6fdb41d61f3e38aa8d31d61bd Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 23 Mar 2020 17:00:47 +0000 Subject: [PATCH 140/142] Add Validate project --- Validate/README.md | 7 + Validate/Validate.xcodeproj/project.pbxproj | 353 ++++++++++++++++++ Validate/Validate/AdaptiveScroll.swift | 67 ++++ Validate/Validate/AppDelegate.swift | 34 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Validate/Assets.xcassets/Contents.json | 6 + .../disabledButton.imageset/Contents.json | 29 ++ .../disabledButton.imageset/grey.pdf | Bin 0 -> 7689 bytes .../selectedSubmit.imageset/Contents.json | 29 ++ .../selectedSubmit.imageset/greensel.pdf | Bin 0 -> 12271 bytes .../submitButton.imageset/Contents.json | 29 ++ .../submitButton.imageset/green.pdf | Bin 0 -> 12238 bytes .../Base.lproj/LaunchScreen.storyboard | 25 ++ Validate/Validate/Base.lproj/Main.storyboard | 208 +++++++++++ Validate/Validate/Info.plist | 64 ++++ Validate/Validate/SceneDelegate.swift | 34 ++ Validate/Validate/String+Blank.swift | 46 +++ Validate/Validate/TermsViewController.swift | 97 +++++ 18 files changed, 1126 insertions(+) create mode 100644 Validate/README.md create mode 100644 Validate/Validate.xcodeproj/project.pbxproj create mode 100644 Validate/Validate/AdaptiveScroll.swift create mode 100644 Validate/Validate/AppDelegate.swift create mode 100644 Validate/Validate/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Validate/Validate/Assets.xcassets/Contents.json create mode 100644 Validate/Validate/Assets.xcassets/disabledButton.imageset/Contents.json create mode 100644 Validate/Validate/Assets.xcassets/disabledButton.imageset/grey.pdf create mode 100644 Validate/Validate/Assets.xcassets/selectedSubmit.imageset/Contents.json create mode 100644 Validate/Validate/Assets.xcassets/selectedSubmit.imageset/greensel.pdf create mode 100644 Validate/Validate/Assets.xcassets/submitButton.imageset/Contents.json create mode 100644 Validate/Validate/Assets.xcassets/submitButton.imageset/green.pdf create mode 100644 Validate/Validate/Base.lproj/LaunchScreen.storyboard create mode 100644 Validate/Validate/Base.lproj/Main.storyboard create mode 100644 Validate/Validate/Info.plist create mode 100644 Validate/Validate/SceneDelegate.swift create mode 100644 Validate/Validate/String+Blank.swift create mode 100644 Validate/Validate/TermsViewController.swift diff --git a/Validate/README.md b/Validate/README.md new file mode 100644 index 0000000..5a9c105 --- /dev/null +++ b/Validate/README.md @@ -0,0 +1,7 @@ +# Getting Started with Combine + +A gentle introduction to using Combine to validate user input. + +See the following blog post for more details: + ++ [Getting Started with Combine](https://useyourloaf.com/blog/getting-started-with-combine/) diff --git a/Validate/Validate.xcodeproj/project.pbxproj b/Validate/Validate.xcodeproj/project.pbxproj new file mode 100644 index 0000000..34e8923 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.pbxproj @@ -0,0 +1,353 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 532A2F1D2425823D00A0005F /* String+Blank.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532A2F1C2425823D00A0005F /* String+Blank.swift */; }; + 5385DF762427C259001E63E0 /* AdaptiveScroll.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5385DF752427C259001E63E0 /* AdaptiveScroll.swift */; }; + 539CD53024250D75000E2699 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 539CD52F24250D75000E2699 /* AppDelegate.swift */; }; + 539CD53224250D75000E2699 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 539CD53124250D75000E2699 /* SceneDelegate.swift */; }; + 539CD53724250D75000E2699 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539CD53524250D75000E2699 /* Main.storyboard */; }; + 539CD53924250D76000E2699 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 539CD53824250D76000E2699 /* Assets.xcassets */; }; + 539CD53C24250D76000E2699 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539CD53A24250D76000E2699 /* LaunchScreen.storyboard */; }; + 539CD5442425109F000E2699 /* TermsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 539CD5432425109F000E2699 /* TermsViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 532A2F1C2425823D00A0005F /* String+Blank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Blank.swift"; sourceTree = ""; }; + 5385DF752427C259001E63E0 /* AdaptiveScroll.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdaptiveScroll.swift; sourceTree = ""; }; + 539CD52C24250D75000E2699 /* Validate.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Validate.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 539CD52F24250D75000E2699 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 539CD53124250D75000E2699 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 539CD53624250D75000E2699 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 539CD53824250D76000E2699 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 539CD53B24250D76000E2699 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 539CD53D24250D76000E2699 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 539CD5432425109F000E2699 /* TermsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsViewController.swift; sourceTree = ""; }; + 53D7D6D52429223700ACD670 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 539CD52924250D75000E2699 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 539CD52324250D75000E2699 = { + isa = PBXGroup; + children = ( + 53D7D6D52429223700ACD670 /* README.md */, + 539CD52E24250D75000E2699 /* Validate */, + 539CD52D24250D75000E2699 /* Products */, + ); + sourceTree = ""; + }; + 539CD52D24250D75000E2699 /* Products */ = { + isa = PBXGroup; + children = ( + 539CD52C24250D75000E2699 /* Validate.app */, + ); + name = Products; + sourceTree = ""; + }; + 539CD52E24250D75000E2699 /* Validate */ = { + isa = PBXGroup; + children = ( + 539CD5432425109F000E2699 /* TermsViewController.swift */, + 5385DF752427C259001E63E0 /* AdaptiveScroll.swift */, + 532A2F1C2425823D00A0005F /* String+Blank.swift */, + 539CD52F24250D75000E2699 /* AppDelegate.swift */, + 539CD53124250D75000E2699 /* SceneDelegate.swift */, + 539CD53524250D75000E2699 /* Main.storyboard */, + 539CD53824250D76000E2699 /* Assets.xcassets */, + 539CD53A24250D76000E2699 /* LaunchScreen.storyboard */, + 539CD53D24250D76000E2699 /* Info.plist */, + ); + path = Validate; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 539CD52B24250D75000E2699 /* Validate */ = { + isa = PBXNativeTarget; + buildConfigurationList = 539CD54024250D76000E2699 /* Build configuration list for PBXNativeTarget "Validate" */; + buildPhases = ( + 539CD52824250D75000E2699 /* Sources */, + 539CD52924250D75000E2699 /* Frameworks */, + 539CD52A24250D75000E2699 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Validate; + productName = Validate; + productReference = 539CD52C24250D75000E2699 /* Validate.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 539CD52424250D75000E2699 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1140; + LastUpgradeCheck = 1140; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 539CD52B24250D75000E2699 = { + CreatedOnToolsVersion = 11.4; + }; + }; + }; + buildConfigurationList = 539CD52724250D75000E2699 /* Build configuration list for PBXProject "Validate" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 539CD52324250D75000E2699; + productRefGroup = 539CD52D24250D75000E2699 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 539CD52B24250D75000E2699 /* Validate */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 539CD52A24250D75000E2699 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 539CD53C24250D76000E2699 /* LaunchScreen.storyboard in Resources */, + 539CD53924250D76000E2699 /* Assets.xcassets in Resources */, + 539CD53724250D75000E2699 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 539CD52824250D75000E2699 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 539CD53024250D75000E2699 /* AppDelegate.swift in Sources */, + 5385DF762427C259001E63E0 /* AdaptiveScroll.swift in Sources */, + 539CD5442425109F000E2699 /* TermsViewController.swift in Sources */, + 539CD53224250D75000E2699 /* SceneDelegate.swift in Sources */, + 532A2F1D2425823D00A0005F /* String+Blank.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 539CD53524250D75000E2699 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 539CD53624250D75000E2699 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 539CD53A24250D76000E2699 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 539CD53B24250D76000E2699 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 539CD53E24250D76000E2699 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "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 = 13.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 539CD53F24250D76000E2699 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_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 = 13.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 539CD54124250D76000E2699 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Validate/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Validate; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 539CD54224250D76000E2699 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Validate/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Validate; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 539CD52724250D75000E2699 /* Build configuration list for PBXProject "Validate" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 539CD53E24250D76000E2699 /* Debug */, + 539CD53F24250D76000E2699 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 539CD54024250D76000E2699 /* Build configuration list for PBXNativeTarget "Validate" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 539CD54124250D76000E2699 /* Debug */, + 539CD54224250D76000E2699 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 539CD52424250D75000E2699 /* Project object */; +} diff --git a/Validate/Validate/AdaptiveScroll.swift b/Validate/Validate/AdaptiveScroll.swift new file mode 100644 index 0000000..5f43115 --- /dev/null +++ b/Validate/Validate/AdaptiveScroll.swift @@ -0,0 +1,67 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class AdaptiveScrollView: UIScrollView { + override init(frame: CGRect) { + super.init(frame: frame) + setup() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setup() + } + + private func setup() { + NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow(_:)), name: UIResponder.keyboardDidShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) + } + + @objc private func keyboardDidShow(_ notification: Notification) { + guard let userInfo = notification.userInfo, + let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { + return + } + + let keyboardSize = keyboardFrame.cgRectValue.size + let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0) + adjustContentInsets(contentInsets) + } + + @objc private func keyboardWillHide(_ notification: Notification) { + adjustContentInsets(.zero) + } + + private func adjustContentInsets(_ contentInsets: UIEdgeInsets) { + contentInset = contentInsets + scrollIndicatorInsets = contentInsets + } +} diff --git a/Validate/Validate/AppDelegate.swift b/Validate/Validate/AppDelegate.swift new file mode 100644 index 0000000..2d32c08 --- /dev/null +++ b/Validate/Validate/AppDelegate.swift @@ -0,0 +1,34 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { +} diff --git a/Validate/Validate/Assets.xcassets/AppIcon.appiconset/Contents.json b/Validate/Validate/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/Validate/Validate/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Validate/Validate/Assets.xcassets/Contents.json b/Validate/Validate/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Validate/Validate/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Validate/Validate/Assets.xcassets/disabledButton.imageset/Contents.json b/Validate/Validate/Assets.xcassets/disabledButton.imageset/Contents.json new file mode 100644 index 0000000..bf86622 --- /dev/null +++ b/Validate/Validate/Assets.xcassets/disabledButton.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "filename" : "grey.pdf", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 10, + "left" : 10, + "right" : 10, + "top" : 10 + }, + "center" : { + "height" : 1, + "mode" : "tile", + "width" : 1 + }, + "mode" : "9-part" + } + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Validate/Validate/Assets.xcassets/disabledButton.imageset/grey.pdf b/Validate/Validate/Assets.xcassets/disabledButton.imageset/grey.pdf new file mode 100644 index 0000000000000000000000000000000000000000..759973b2f12146afac9a32f9ae382c65be74f251 GIT binary patch literal 7689 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 literal 0 HcmV?d00001 diff --git a/Validate/Validate/Assets.xcassets/selectedSubmit.imageset/Contents.json b/Validate/Validate/Assets.xcassets/selectedSubmit.imageset/Contents.json new file mode 100644 index 0000000..a9f61c7 --- /dev/null +++ b/Validate/Validate/Assets.xcassets/selectedSubmit.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "filename" : "greensel.pdf", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 10, + "left" : 10, + "right" : 10, + "top" : 10 + }, + "center" : { + "height" : 1, + "mode" : "tile", + "width" : 1 + }, + "mode" : "9-part" + } + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Validate/Validate/Assets.xcassets/selectedSubmit.imageset/greensel.pdf b/Validate/Validate/Assets.xcassets/selectedSubmit.imageset/greensel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7b4ae44f61f121313936f54e33e4ec7b1683a58a GIT binary patch literal 12271 zcmeHNc{o+y*GD2lMTU?sr@>I<&ey%kJVzm!Nf#H_bal-lLxxO=LKH%oGKLhH=M+lP zWJ;!}Ov&s$*HFp#eSY8H?|t6)dH=}0kGs!0YoEQ&XYaN4T6--%bvcEjFcAbjU+uu; zz-Zdk?Y7!_dL#e^h$dF_$BzRLRlJ>rqa}a>Nv8pb0>Q=+PXd2!aE^F6yeZKP4@gMR zJ2;Z?I9qyG%4g9{cKcwA0bkwe%e@=k#&q9jmG@y+YLjj8k3es~btkAxwx?Y3aF_zR zw|XSwMvc1ZdFHu@NrtW$4A~G7JBhM|`zvK-Y2Ti`Y8&|0F|k{xRc&D*P2A|Bon+Vh z3cD{}U%WiKUX1Q`*H936;p%ZH&|*qyG(0>YClMDE|CksY?R!@du27K2=F`L88qG6& zO8oh}m4#&i%Y``Sefs`~1I?NQ(sSOkW`(~RC;5llo!}E=M&SzhY94574>Va_E97;Q z5oLGHeeMqLW~a}>6~=qe^9VI2uzO~)W(5Zb z^3YQc6ppYM9BpjRYOs0+D8Bd1pFqAjqk84KrFs~(!#X^kmMDG9!O zFUB0|Ql}omX$70GTAsJ7)wq`moZm^!euW*)8-NnE?9v;>wn1g8i_WNqbDLCVepM^r z%rW`y;;n@D4A9%b%)jplV|yju!pPn1N@BK(3Qvo)Kh|;uw=4NpbaRvNZLbMe#^b@6 zk-hAD2HjqV2b@XJadpz}i+C5i-0rV4v^POToHd#4?AzO?thL_cs;caP(!f#}uJ|Wu zQ3M}MV4IBfr@d^OqnI$t_ex_dr8+0_(ROZ*5V(3o6ME>;Gec?Qaf|alXKu#PYTcX( z$}Z_S>d0pQ1VZmGjvu#vT=wF!2uM)h#pkh^nSW(;jDv2gp`J)&UN{$j=7{ly!j7V^^CJ5&%Tr)lpH? z5wsSoe2Qc~(KS9r2N(du{9x2oGqJ*(IS30Y~5ul^JY?805 zt*vcnFMWyq63tF7-ZxV{Mnm$HyJ6RzH6ppv=tj&w1Li01 zNY{8)x(U|SA-B`kPqMhCS4C*lj?Zx@|V_&0K;*MA(6z67VyIEZK z$WS%bGp`B7S5jS_yshwiO0-pt@SO&Tu<+B?)_w`g(8r;AED>C`2D?@SLD0lRMFom` z8&bWyPAlE;(i@g%YJd8avE@!!eL5?^ug~{Xa(7%@+=tq3+oWW!rn|8 z85wnTbzwe@j6}5SrZP*Vzzvr5m?ZrQ3JNq+AW=d(QTS>PMa2e9fwND}=)EY&Hq?q9 znNXuIDlVQXF|oRJUBlEgV6lH8$k{}eoq?~5d*V6a5}}d zxsP|ix=3F|CFH#??@cOamHoJcH09lwf-~yPJRjX@y6VMLTZ8@P;orFQDt9ay(!^Dy zHFI(yJ0@U#od3uK zv{CM)prEL}y_`YZP0K9E$N@c9=}ozf=HF^`)6n!9QsMRa^OBQ}SEaw}kDC{~vi=Eus~ z*xY~dr(x@F@(&UF&sWy^%=~AFt*@-_YPSEQl?6xs9Z;(fkdgYivR1dk->zmk-GydkXp3* zUpeLfg`89SjK=UjQ|BWh6iK%`YbI#|!(TS*pyxcvb!xm98caP^^k7~YQU6 zXs|5{UCqIm+=CWV(Ure{JF(;0rvZ!RbI|izqB3G>&dU$PPv~OJ^z~|=z0_w3%wNcv z-j}F0PMc1}X}wi7R;Q9Yy>QGA<$!P4mtT|vz8-DHNLv5^ z_3$P#aR=X?V+@`iv7LBWs#!XzWL|xhFvZ+u6ObNq1pQdkurtwDh+retzxQ^KRv_G?%n940UzgDr8ZSCq+8+7%y_0 zEB_6m8>R&Y|FMz5H!RSvh_3s>{~r;J&fi6`e}`-za+e*4><7EW6}88_81$I^;e&^c zdJ11&OyiNePTQY+S(u4Mj>-Kh1>MiD6hCESN*2mtK64#!-@NuD;N zq0nvIp6S}y%N!D!oXM=krabMMFGyTCFZ1$s@m#A=Z^kWAPv8WxK-G;x*zV;;&ND`( zRwgvK12HTe!{v*HW_zewOW52Fo8}ZXV=j|s&q44{Ed;k;K0)vh%FcY3nIM>zI-h@R zy!hDT4zWg_Ua^by+omawQZE+dNuB3(^A;%-wh)(MV2z2O9hPY(%~ViEdfuVyr!*Sg zA4>A0jDk9|MAJ#>M7(EX(VLLfvGAnK_kFtKZ{}^o8G*xp_$R9Y=Eg3vHc>yLP>9S) z0HWrMC)t4ez%K#duS&C}k0}m-iXgFQ(O-LPtQfMIt@T(BLfupe4vqjs)6valE$Usn zyLSCEe$=$YnGsz;Va&}PR%31$82dxX!S!jJ8NtZ`0PWh(74tK^CP&_2gielV!H)<6 z1;xP8D6rqAh;}vN-3-G2SUl94c>h2s7z&C;qL5pJB8T4p=R$!;0pJHJf`UR3STy2y zp%7#oH-uVObHv&i0pt{T%mR@npLyDmk1*DKh|`MTnaIC73XP9;IivZ8J+QS*w5)B< z0f29s%bgB*A*RGetr4W`txgr-$L}n+U4fPPu(sKmN=n7R1E%t<43~UOI_V~v)a$D> ze*RBp}y!#UG1n#>5WX%W&JW*Ww?i>x%N91 z2NUHkUCPQnb8~9NSvjhgi)G@mvFS?n1v6hnyv<7A30J7|JG@%)iZ~!Ddx(aDUcLi; z{38F}0jleo1$CV873wF`QHS9HFgSY>U2@ie{@PrdnY2Nn(xw|R{2!CJ^jbI{BNIYP z)w|>P`cguvlMHY0^;)EO(BjL^D92F@d>3qQpS`6@0cDLfemcaTWD^9JXXX47G)YCV z<9aRjF={!Zp?6V=#4)vPmj)=MBQZaHIMBM1kg<2~6mE&B?yYuBxrmg^X9A zd%bgs(ejjhdbY8a5udZUKY!MHHE20k@ur98qUMr#qx*u^1pioTf^=wtUXRUK7Nm@w zV&;(k&A$rDqqHarZE2(i`m)r%0u+jo(Nyp@=?MQ;;Pq9RC9-4T13B|D5R&EKYN1CTUJl%9UfH>lciJ6}^g z@P3mg#=S$ay17@*mF*Vo-pY4?*F_+qZ9=LfGH9`q~bu#vR+9E9manHz6l; zRre4j^M31y19zx0~kK1ShlW;dU*y}m_1NB1tOtf*YOin;MZkXQC zR^2;@HfKWk%=z9m>Bvvj708lwrb9E|3_Dt@eJ=c*L0(M$w%52ZG45Rrm7E{A?Jqv$ zFofHoa;S@UcZQaFkJjw$O=E3c&=D|7Roy2h#;aA@!8Lx*Dv zeaa1GMp+vx#Z+E1m`gK8mR<#q{@-lBuVNX1ga+7kC zy?c6Ry4_3N%o`=~`f6ozo+msZiq{Y^Q!)Kb+1KtxSVxVCKOHuUBLi@Fmx@q3wvS~UzAKqXTKikyp>qjmR~{dZnmb~5#3SlJlz9|oRCuPU7O{i1BRS<;HSKjAoqv!R^MtqiGRAr6~|T1#mS|` z6@#otamLxjHN_3Y4Ivu}E%h0SsPzZ*hl|h=p?t9oW5!z2Ha6uryT{*2MUa#eF%g&Y*2FAVPdtV;q zAU!|d_mG8>YWQtw60!E5QJ#+q2z?x~7V@xzM@{7AWNS;6!W&;SDu#rytFXH$G%41}cPO5ezaSqYuM(pxtXJ?+ zAyhvUNEK)2-N$y}kTWUc`-?7>!2Yoh^!;B%5QfnOV{b`C0~yV&IaiIV^v)mQ*~j}= z57SBzOLfM8YRmVrq?oOqFw#*_8XK z)TE1go$eb?`h3i|e)W3FVMNCBjAsPD!r8)h89rQao{$kjT%Zh6gG_Y_ zmUh6k7P9Z%8s@e?6Rq|VYB(%WnPeN^)BYX+2`L(nm+`8P~&?aIohM=sWaF0 zbjI&<+1;7D3ogCRJ6zs(jg(C3#+vAzebbiHYm`0kbTWCexKwAXTpMR_{@iXtxLJ51 zJpF#ziCinij}98Dy6AOuby#G5e*gIf;!^K7 z*$XW9M${20k7lVc`>_)r8fJOFCNLg<;}-0hIU=x>IP;)QKUhEM)%#aL5AL7|7gR6w zjCi-l|JCx>QOTPt9@C*Sv2g`YEL2(}TG(#g#3s62oRq2ep9l%s8+c5|QKF>qKH}NE^qe+h_gTrO?wBRZCDXC~ zWC41$BMF(3*-IU>o#q*3(_^>2CO=a*8fW^Fvlfk3naATSZ+ zul+aDZ-N#iJl@U$Z*%yE1HO?w5bW}p z?6i^15R`Uu1Z!)->M$^0ZEs01{mHVCs1TGp28Y7XP&gb7ha<2Ej6M`90DgaPZaQlx zID)wd#Cl#8Oaz!YnSyn^i1jK2S+IQ95zHze*0Woy*Wmlgkq^BQ>m>vyiDu+$`t|Fd zxf53s-W<#fAi(U!k3Rs7LV?4X18X#}?2w$6B>w?+>oh17OHTf7qJb$8a`JZ*4ZI-N z1^hyW zN05sXH}{33u)n`A6pkflt2Xl?VAw6=A~EE$#m#(3jOdnkLt@EE_RW0c1kn~6DB$lj z1bnN^2=rE&5u&gy?}3DpBhJm^A`zG^V<0imtu!d=Z~CIQ@SzYGFjcd846t5y3(goA z>URvl`9=ReZ!oZC^LOk)n&|K2f;8;bzA)5QJ{abgd2=M;2sU`qY7xCA!5!2iEST9N z62Zz{veh|FE>0%uGyBP#hLaLnCo8GjQ5bNTiu41_8%F;pP(b d|C(hry#-c?f;MJVF<~$S0<7=nlUGxq|1XF-<}UyM literal 0 HcmV?d00001 diff --git a/Validate/Validate/Assets.xcassets/submitButton.imageset/Contents.json b/Validate/Validate/Assets.xcassets/submitButton.imageset/Contents.json new file mode 100644 index 0000000..fec438a --- /dev/null +++ b/Validate/Validate/Assets.xcassets/submitButton.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "filename" : "green.pdf", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 12, + "left" : 10, + "right" : 10, + "top" : 12 + }, + "center" : { + "height" : 1, + "mode" : "tile", + "width" : 1 + }, + "mode" : "9-part" + } + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Validate/Validate/Assets.xcassets/submitButton.imageset/green.pdf b/Validate/Validate/Assets.xcassets/submitButton.imageset/green.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b3fa12c24fd4dd1bf4fdc3bbfbe0807c05b03373 GIT binary patch literal 12238 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 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Validate/Validate/Base.lproj/Main.storyboard b/Validate/Validate/Base.lproj/Main.storyboard new file mode 100644 index 0000000..e09401b --- /dev/null +++ b/Validate/Validate/Base.lproj/Main.storyboard @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + You must accept these terms and conditions before continuing: + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec posuere nulla, sit amet fermentum tellus. Pellentesque bibendum eros sed mi ultricies hendrerit quis id mi. Curabitur quis sodales eros. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Validate/Validate/Info.plist b/Validate/Validate/Info.plist new file mode 100644 index 0000000..2a3483c --- /dev/null +++ b/Validate/Validate/Info.plist @@ -0,0 +1,64 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Validate/Validate/SceneDelegate.swift b/Validate/Validate/SceneDelegate.swift new file mode 100644 index 0000000..d6c5aaa --- /dev/null +++ b/Validate/Validate/SceneDelegate.swift @@ -0,0 +1,34 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/Validate/Validate/String+Blank.swift b/Validate/Validate/String+Blank.swift new file mode 100644 index 0000000..22fb8f3 --- /dev/null +++ b/Validate/Validate/String+Blank.swift @@ -0,0 +1,46 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +extension String { + /// A Boolean value indicating whether a String is blank. + /// The string is blank if it is empty or only contains whitespace. + var isBlank: Bool { + return allSatisfy { $0.isWhitespace } + } +} + +extension Optional where Wrapped == String { + /// A Boolean value indicating whether an Optional String is blank. + /// The optional string is blank if it is nil, empty or only contains whitespace. + var isBlank: Bool { + return self?.isBlank ?? true + } +} diff --git a/Validate/Validate/TermsViewController.swift b/Validate/Validate/TermsViewController.swift new file mode 100644 index 0000000..aac2772 --- /dev/null +++ b/Validate/Validate/TermsViewController.swift @@ -0,0 +1,97 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Combine +import UIKit + +final class TermsViewController: UIViewController { + @IBOutlet private var termsSwitch: UISwitch! + @IBOutlet private var privacySwitch: UISwitch! + @IBOutlet private var nameField: UITextField! + @IBOutlet private var submitButton: UIButton! + + @Published private var acceptedTerms: Bool = false + @Published private var acceptedPrivacy: Bool = false + @Published private var name: String = "" + + private var stream: AnyCancellable? + + override func viewDidLoad() { + super.viewDidLoad() + stream = validToSubmit + .receive(on: RunLoop.main) + .assign(to: \.isEnabled, on: submitButton) + } + + @IBAction private func acceptTerms(_ sender: UISwitch) { + acceptedTerms = sender.isOn + } + + @IBAction private func acceptPrivacy(_ sender: UISwitch) { + acceptedPrivacy = sender.isOn + } + + @IBAction private func nameChanged(_ sender: UITextField) { + name = sender.text ?? "" + } + + @IBAction private func submitAction(_ sender: UIButton) { + print("Submit... \(name)") + } + + private var validToSubmit: AnyPublisher { + return Publishers.CombineLatest3($acceptedTerms, $acceptedPrivacy, $name) + .map { terms, privacy, name in + terms && privacy && !name.isBlank + }.eraseToAnyPublisher() + } + + // A longer approach just for fun: + // + // private var validName: AnyPublisher { + // return $name.map { name in + // guard !name.isBlank && name.count > 2 else { return nil } + // return name + // }.eraseToAnyPublisher() + // } + // + // private var acceptedAll: AnyPublisher { + // return Publishers.CombineLatest($acceptedTerms, $acceptedPrivacy) + // .map { terms, privacy in + // terms && privacy + // }.eraseToAnyPublisher() + // } + // + // private var validToSubmit: AnyPublisher { + // return Publishers.CombineLatest(acceptedAll, validName) + // .map { terms, name in + // terms && name != nil + // }.eraseToAnyPublisher() + // } +} From e2dac291135888611cd618407ca7f08177448f3e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 6 Apr 2020 17:01:37 +0100 Subject: [PATCH 141/142] Add Xcode preview support See https://useyourloaf.com/blog/xcode-previews-for-view-controllers/ --- Validate/README.md | 4 ++ Validate/Validate.xcodeproj/project.pbxproj | 4 ++ Validate/Validate/Base.lproj/Main.storyboard | 14 ++-- Validate/Validate/TermsViewController.swift | 20 +++++- .../TermsViewControllerPreviews.swift | 71 +++++++++++++++++++ 5 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 Validate/Validate/TermsViewControllerPreviews.swift diff --git a/Validate/README.md b/Validate/README.md index 5a9c105..4329027 100644 --- a/Validate/README.md +++ b/Validate/README.md @@ -5,3 +5,7 @@ A gentle introduction to using Combine to validate user input. See the following blog post for more details: + [Getting Started with Combine](https://useyourloaf.com/blog/getting-started-with-combine/) + +For details on using Xcode previews with UIKit view controllers see: + ++ [Xcode Previews for View Controllers](https:/useyourloaf.com/blog/xcode-previews-for-view-controllers/) diff --git a/Validate/Validate.xcodeproj/project.pbxproj b/Validate/Validate.xcodeproj/project.pbxproj index 34e8923..f2273c2 100644 --- a/Validate/Validate.xcodeproj/project.pbxproj +++ b/Validate/Validate.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 532A2F1D2425823D00A0005F /* String+Blank.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532A2F1C2425823D00A0005F /* String+Blank.swift */; }; + 5371387A243202D6006CB01D /* TermsViewControllerPreviews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53713879243202D6006CB01D /* TermsViewControllerPreviews.swift */; }; 5385DF762427C259001E63E0 /* AdaptiveScroll.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5385DF752427C259001E63E0 /* AdaptiveScroll.swift */; }; 539CD53024250D75000E2699 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 539CD52F24250D75000E2699 /* AppDelegate.swift */; }; 539CD53224250D75000E2699 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 539CD53124250D75000E2699 /* SceneDelegate.swift */; }; @@ -19,6 +20,7 @@ /* Begin PBXFileReference section */ 532A2F1C2425823D00A0005F /* String+Blank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Blank.swift"; sourceTree = ""; }; + 53713879243202D6006CB01D /* TermsViewControllerPreviews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsViewControllerPreviews.swift; sourceTree = ""; }; 5385DF752427C259001E63E0 /* AdaptiveScroll.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdaptiveScroll.swift; sourceTree = ""; }; 539CD52C24250D75000E2699 /* Validate.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Validate.app; sourceTree = BUILT_PRODUCTS_DIR; }; 539CD52F24250D75000E2699 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -63,6 +65,7 @@ isa = PBXGroup; children = ( 539CD5432425109F000E2699 /* TermsViewController.swift */, + 53713879243202D6006CB01D /* TermsViewControllerPreviews.swift */, 5385DF752427C259001E63E0 /* AdaptiveScroll.swift */, 532A2F1C2425823D00A0005F /* String+Blank.swift */, 539CD52F24250D75000E2699 /* AppDelegate.swift */, @@ -147,6 +150,7 @@ buildActionMask = 2147483647; files = ( 539CD53024250D75000E2699 /* AppDelegate.swift in Sources */, + 5371387A243202D6006CB01D /* TermsViewControllerPreviews.swift in Sources */, 5385DF762427C259001E63E0 /* AdaptiveScroll.swift in Sources */, 539CD5442425109F000E2699 /* TermsViewController.swift in Sources */, 539CD53224250D75000E2699 /* SceneDelegate.swift in Sources */, diff --git a/Validate/Validate/Base.lproj/Main.storyboard b/Validate/Validate/Base.lproj/Main.storyboard index e09401b..9b9f35e 100644 --- a/Validate/Validate/Base.lproj/Main.storyboard +++ b/Validate/Validate/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -34,7 +34,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec posuere nul - + @@ -58,10 +59,10 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec posuere nul - + - + @@ -104,6 +106,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec posuere nul + @@ -128,6 +131,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec posuere nul + diff --git a/Validate/Validate/TermsViewController.swift b/Validate/Validate/TermsViewController.swift index aac2772..3ca2409 100644 --- a/Validate/Validate/TermsViewController.swift +++ b/Validate/Validate/TermsViewController.swift @@ -63,13 +63,14 @@ final class TermsViewController: UIViewController { @IBAction private func submitAction(_ sender: UIButton) { print("Submit... \(name)") + print(view.value(forKey: "_autolayoutTrace")!) } private var validToSubmit: AnyPublisher { return Publishers.CombineLatest3($acceptedTerms, $acceptedPrivacy, $name) .map { terms, privacy, name in terms && privacy && !name.isBlank - }.eraseToAnyPublisher() + }.eraseToAnyPublisher() } // A longer approach just for fun: @@ -95,3 +96,20 @@ final class TermsViewController: UIViewController { // }.eraseToAnyPublisher() // } } + +#if DEBUG +import SwiftUI + +extension TermsViewController: UIViewControllerRepresentable { + func makeUIViewController(context: Context) -> TermsViewController { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + guard let viewController = storyboard.instantiateViewController(identifier: "TermsViewController") as? TermsViewController else { + fatalError("Cannot load from storyboard") + } + return viewController + } + + func updateUIViewController(_ uiViewController: TermsViewController, context: Context) { + } +} +#endif diff --git a/Validate/Validate/TermsViewControllerPreviews.swift b/Validate/Validate/TermsViewControllerPreviews.swift new file mode 100644 index 0000000..d32af21 --- /dev/null +++ b/Validate/Validate/TermsViewControllerPreviews.swift @@ -0,0 +1,71 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#if DEBUG +import SwiftUI + +let devices = [ + "iPhone SE", + "iPhone 11", + "iPad Pro (11-inch) (2nd generation)" +] + +let sizeCategories: [ContentSizeCategory] = [ + .extraSmall, + .extraExtraExtraLarge, + .accessibilityExtraExtraExtraLarge +] + +struct TermsViewControllerPreviews: PreviewProvider { + static var previews: some View { + Group { + TermsViewController() + .previewDisplayName("Default") + + ForEach(devices, id: \.self) { name in + TermsViewController() + .previewDevice(PreviewDevice(rawValue: name)) + .previewDisplayName(name) + } + + ForEach(ColorScheme.allCases, id: \.self) { scheme in + TermsViewController() + .environment(\.colorScheme, scheme) + .previewDisplayName("\(scheme)") + } + + ForEach(sizeCategories, id: \.self) { size in + TermsViewController() + .environment(\.sizeCategory, size) + .previewDisplayName("\(size)") + } + } + } +} +#endif From c58ddb2bbb4c90f182412e3d826cd31e99a4ec3e Mon Sep 17 00:00:00 2001 From: Dan VanWinkle Date: Mon, 13 Apr 2020 17:57:01 -0400 Subject: [PATCH 142/142] =?UTF-8?q?=F0=9F=93=9D=20Updating=20name=20of=20f?= =?UTF-8?q?ont=20to=20reflect=20Google=20Fonts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ScaledFont/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ScaledFont/README.md b/ScaledFont/README.md index 616776f..d54fccd 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -2,11 +2,11 @@ ## Using Dynamic Type With Custom Fonts -An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the NotoSerif font which was downloaded from google fonts: +An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the Noto Serif font which was downloaded from google fonts: -+ [Noto Sans](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif) ++ [Noto Serif](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif) -*Refer to LICENSE.txt if you plan on using NotoSans in a shipping application.* +*Refer to LICENSE.txt if you plan on using Noto Serif in a shipping application.* **This project requires iOS 11**