From 065e460c45a376ebc14a3a78cd5756daca54ec93 Mon Sep 17 00:00:00 2001 From: Caio Dias Date: Thu, 16 Jun 2016 16:02:04 -0400 Subject: [PATCH 01/98] 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 5def1981896ddb2b4cc2fb9ad7894a7f145f33bb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 16 Apr 2018 11:23:23 +0100 Subject: [PATCH 02/98] Update playground syntax to Swift 4 --- .../Bottom.xcplaygroundpage/Contents.swift | 6 +++--- .../Bottom.xcplaygroundpage/timeline.xctimeline | 2 +- .../BottomLeft.xcplaygroundpage/Contents.swift | 6 +++--- .../timeline.xctimeline | 2 +- .../BottomRight.xcplaygroundpage/Contents.swift | 7 +++---- .../timeline.xctimeline | 2 +- .../Center.xcplaygroundpage/Contents.swift | 6 +++--- .../Center.xcplaygroundpage/timeline.xctimeline | 6 +++--- .../Pages/Left.xcplaygroundpage/Contents.swift | 6 +++--- .../Left.xcplaygroundpage/timeline.xctimeline | 2 +- .../Redraw.xcplaygroundpage/Contents.swift | 10 +++++----- .../Redraw.xcplaygroundpage/timeline.xctimeline | 6 +++--- .../Pages/Right.xcplaygroundpage/Contents.swift | 6 +++--- .../Right.xcplaygroundpage/timeline.xctimeline | 2 +- .../Contents.swift | 8 ++++---- .../timeline.xctimeline | 4 ++-- .../Contents.swift | 6 +++--- .../timeline.xctimeline | 2 +- .../ScaleToFill.xcplaygroundpage/Contents.swift | 6 +++--- .../timeline.xctimeline | 2 +- .../Pages/Top.xcplaygroundpage/Contents.swift | 6 +++--- .../Top.xcplaygroundpage/timeline.xctimeline | 2 +- .../TopLeft.xcplaygroundpage/Contents.swift | 6 +++--- .../timeline.xctimeline | 2 +- .../TopRight.xcplaygroundpage/Contents.swift | 6 +++--- .../timeline.xctimeline | 2 +- .../Sources/CircleView.swift | 10 +++++----- .../Sources/StarView.swift | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ Playgrounds/ContentMode.zip | Bin 36587 -> 0 bytes 30 files changed, 74 insertions(+), 67 deletions(-) create mode 100644 Playgrounds/ContentMode.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 Playgrounds/ContentMode.zip diff --git a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift index 24abc4e..59fec2d 100644 --- a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift @@ -1,5 +1,5 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Bottom @@ -7,9 +7,9 @@ import XCPlayground or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .Bottom +myView.starImageView.contentMode = .bottom myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline index f4e4340..161eebd 100644 --- a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift index 1bb2c89..fc978bb 100644 --- a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift @@ -1,14 +1,14 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Bottom Left Fix the position of the content. Does not scale or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .BottomLeft +myView.starImageView.contentMode = .bottomLeft myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline index 750a3a3..917c692 100644 --- a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift index f3442e5..0446b00 100644 --- a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift @@ -1,14 +1,13 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Bottom Right Fix the position of the content. Does not scale or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .BottomRight +myView.starImageView.contentMode = .bottomRight myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) -//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline index e2347be..f0fc782 100644 --- a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift index a7cbc6e..0dd5c94 100644 --- a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift @@ -1,5 +1,5 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Center @@ -7,9 +7,9 @@ import XCPlayground or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .Center +myView.starImageView.contentMode = .center myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline index 5e04c90..2bc0857 100644 --- a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline @@ -3,17 +3,17 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift index 4844811..42e640e 100644 --- a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift @@ -1,14 +1,14 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Left Fix the position of the content. Does not scale or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .Left +myView.starImageView.contentMode = .left myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline index da653f9..66dffd5 100644 --- a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift index 8486cfd..7449f2c 100644 --- a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift @@ -1,5 +1,5 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Redraw @@ -9,10 +9,10 @@ import XCPlayground calling drawRect. */ let myView = CircleView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.backgroundColor = .whiteColor() -myView.contentMode = .Redraw +myView.backgroundColor = .white +myView.contentMode = .redraw myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) -//: [Next](@next) \ No newline at end of file +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline index c8b56ae..f2256a4 100644 --- a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline @@ -3,17 +3,17 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift index e87045f..d0b78f7 100644 --- a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift @@ -1,14 +1,14 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Right Fix the position of the content. Does not scale or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .Right +myView.starImageView.contentMode = .right myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline index 52f2979..ba59fd8 100644 --- a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift index 8788d5e..59f558d 100644 --- a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift @@ -1,18 +1,18 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Scale Aspect Fill `ScaleAspectFill` scales the content to totally fill the view maintaining the aspect ratio. This can result in the content being larger than the bounds of the view. */ let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) -containerView.backgroundColor = .redColor() +containerView.backgroundColor = .red let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) containerView.addSubview(myView) myView.center = CGPoint(x: 200, y: 200) -myView.starImageView.contentMode = .ScaleAspectFill +myView.starImageView.contentMode = .scaleAspectFill /*: #### clipToBounds You will most likely want to have the superview set to clip subviews @@ -24,7 +24,7 @@ myView.starImageView.contentMode = .ScaleAspectFill myView.clipsToBounds = true containerView -XCPlaygroundPage.currentPage.liveView = containerView +PlaygroundPage.current.liveView = containerView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline index ec83354..e382b73 100644 --- a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline @@ -3,12 +3,12 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift index daae1d1..e3ffcf6 100644 --- a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift @@ -1,14 +1,14 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Scale Aspect Fit `ScaleAspectFit` scales the content to fit the view but maintains the aspect ratio. Any part of the view bounds that is not filled with content is transparent. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .ScaleAspectFit +myView.starImageView.contentMode = .scaleAspectFit myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline index 61b3e15..d7f00b2 100644 --- a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift index 5e6608e..02b1df7 100644 --- a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift @@ -1,5 +1,5 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Scale To Fill @@ -9,9 +9,9 @@ import XCPlayground aspect ratio of the image is not maintained. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .ScaleToFill +myView.starImageView.contentMode = .scaleToFill myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline index 07c1389..542aa26 100644 --- a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift index e96706e..0be4c20 100644 --- a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift @@ -1,5 +1,5 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Top @@ -7,9 +7,9 @@ import XCPlayground or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .Top +myView.starImageView.contentMode = .top myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline index 0e86698..41b8111 100644 --- a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift index 5fdbfd4..edfb1fe 100644 --- a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift @@ -1,14 +1,14 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Top Left Fix the position of the content. Does not scale or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .TopLeft +myView.starImageView.contentMode = .topLeft myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline index bfa3c3c..7be4241 100644 --- a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift index 330506c..23c2625 100644 --- a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift +++ b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift @@ -1,14 +1,14 @@ import UIKit -import XCPlayground +import PlaygroundSupport /*: ### Top Right Fix the position of the content. Does not scale or stretch the content. */ let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) -myView.starImageView.contentMode = .TopRight +myView.starImageView.contentMode = .topRight myView -XCPlaygroundPage.currentPage.liveView = myView +PlaygroundPage.current.liveView = myView //: [Previous](@previous) //: [Index](contentMode) //: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline index 5490561..4bdbe79 100644 --- a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline +++ b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/Playgrounds/ContentMode.playground/Sources/CircleView.swift b/Playgrounds/ContentMode.playground/Sources/CircleView.swift index 9ca1165..fd5c22b 100644 --- a/Playgrounds/ContentMode.playground/Sources/CircleView.swift +++ b/Playgrounds/ContentMode.playground/Sources/CircleView.swift @@ -6,15 +6,15 @@ public class CircleView: UIView { didSet { setNeedsDisplay() } } - var color: UIColor = .redColor() { + var color: UIColor = .red { didSet { setNeedsDisplay() } } - - public override func drawRect(rect: CGRect) { + + public override func draw(_ rect: CGRect) { - let circleCenter = convertPoint(center, fromView: superview) + let circleCenter = convert(center, from: superview) let circleRadius = min(bounds.size.width,bounds.size.height)/2 * 0.80 - let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true) + let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: 0, endAngle: CGFloat(2*Double.pi), clockwise: true) circlePath.lineWidth = lineWidth color.set() circlePath.stroke() diff --git a/Playgrounds/ContentMode.playground/Sources/StarView.swift b/Playgrounds/ContentMode.playground/Sources/StarView.swift index d1bc0fe..0fb8775 100644 --- a/Playgrounds/ContentMode.playground/Sources/StarView.swift +++ b/Playgrounds/ContentMode.playground/Sources/StarView.swift @@ -10,7 +10,7 @@ public class StarView: UIView { super.init(frame: frame) addSubview(starImageView) - backgroundColor = .greenColor() + backgroundColor = .green starImageView.frame = bounds } diff --git a/Playgrounds/ContentMode.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Playgrounds/ContentMode.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Playgrounds/ContentMode.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Playgrounds/ContentMode.zip b/Playgrounds/ContentMode.zip deleted file mode 100644 index 464fa32bdb5ba5d172567b7e5da8e828571f64de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36587 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 From e8f603e8bb09ccde826d17483d8275a4404ca7a9 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 16 Apr 2018 13:53:11 +0100 Subject: [PATCH 03/98] Update project settings for Xcode 9.3 --- Vector/Vector.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Vector/Vector.xcodeproj/project.pbxproj b/Vector/Vector.xcodeproj/project.pbxproj index c6e5261..694c0d8 100644 --- a/Vector/Vector.xcodeproj/project.pbxproj +++ b/Vector/Vector.xcodeproj/project.pbxproj @@ -90,7 +90,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53D182741F669CBB001F1840 = { @@ -175,6 +175,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; @@ -182,6 +183,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; @@ -232,6 +234,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; @@ -239,6 +242,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; From d30024db8bcd363c2f20190c4a6b97a3f501774a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 May 2018 11:04:50 +0100 Subject: [PATCH 04/98] Update for Xcode 9.3 --- GridView/GridView.xcodeproj/project.pbxproj | 6 +++++- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ GridView/GridView/Base.lproj/Main.storyboard | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 GridView/GridView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index c194dfa..0b421cd 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -143,7 +143,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 531CCB861EAA45D2008349F4 = { @@ -300,6 +300,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; @@ -307,6 +308,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; @@ -357,6 +359,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; @@ -364,6 +367,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; diff --git a/GridView/GridView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GridView/GridView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/GridView/GridView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GridView/GridView/Base.lproj/Main.storyboard b/GridView/GridView/Base.lproj/Main.storyboard index 15a50e8..2bb0240 100644 --- a/GridView/GridView/Base.lproj/Main.storyboard +++ b/GridView/GridView/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + From 3168b7afd3e7c251c69fdab5b4889b6982353dd8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 May 2018 11:06:43 +0100 Subject: [PATCH 05/98] Asset catalog updated by Xcode 9.3 --- .../AppIcon.appiconset/Contents.json | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/GridView/GridView/Assets.xcassets/AppIcon.appiconset/Contents.json b/GridView/GridView/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..d8db8d6 100644 --- a/GridView/GridView/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/GridView/GridView/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", @@ -59,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" : { From 9adf5d29cbdb10c5294e3e6099947ba9cfd6c6b9 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 4 Jun 2018 17:00:19 +0100 Subject: [PATCH 06/98] Update to recommended Xcode settings --- ScaledFont/ScaledFont.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index f1f5db0..b979c08 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -123,7 +123,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0940; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 5379191A1F3FA05700FF9E25 = { @@ -214,6 +214,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; @@ -221,6 +222,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; @@ -271,6 +273,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; @@ -278,6 +281,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; From 0916c03a4651708516e5ad0f93e0f6bf97945b6e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 20 Aug 2018 13:22:54 +0100 Subject: [PATCH 07/98] Update for Xcode 10 --- DynamicText/DynamicText.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 35a555a..7055b4a 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -145,7 +145,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0940; ORGANIZATIONNAME = "Keith Harrison"; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; @@ -235,12 +235,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; @@ -285,12 +287,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; From 162f75bcbd5111821379696834701c497fac8c44 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 20 Aug 2018 13:28:01 +0100 Subject: [PATCH 08/98] Update for Xcode 10, Swift 4.2 --- .../ScaledFont.xcodeproj/project.pbxproj | 22 +++++++++++++------ ScaledFont/ScaledFont/ScaledFont.swift | 4 ++-- ScaledFont/ScaledFont/ViewController.swift | 2 +- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index b979c08..bb3ec4b 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 48; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ @@ -128,11 +128,12 @@ TargetAttributes = { 5379191A1F3FA05700FF9E25 = { CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1000; }; }; }; buildConfigurationList = 537919161F3FA05700FF9E25 /* Build configuration list for PBXProject "ScaledFont" */; - compatibilityVersion = "Xcode 8.0"; + compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -306,7 +307,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; name = Release; @@ -317,10 +319,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = ScaledFont/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -331,10 +336,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = ScaledFont/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/ScaledFont/ScaledFont/ScaledFont.swift b/ScaledFont/ScaledFont/ScaledFont.swift index ed75db4..0936799 100644 --- a/ScaledFont/ScaledFont/ScaledFont.swift +++ b/ScaledFont/ScaledFont/ScaledFont.swift @@ -72,7 +72,7 @@ public final class ScaledFont { let fontName: String } - private typealias StyleDictionary = [UIFontTextStyle.RawValue: FontDescription] + private typealias StyleDictionary = [UIFont.TextStyle.RawValue: FontDescription] private var styleDictionary: StyleDictionary? /// Create a `ScaledFont` @@ -102,7 +102,7 @@ public final class ScaledFont { /// a font for this text style the default preferred /// font is returned. - public func font(forTextStyle textStyle: UIFontTextStyle) -> UIFont { + 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) diff --git a/ScaledFont/ScaledFont/ViewController.swift b/ScaledFont/ScaledFont/ViewController.swift index 0063fa5..ddd1857 100644 --- a/ScaledFont/ScaledFont/ViewController.swift +++ b/ScaledFont/ScaledFont/ViewController.swift @@ -87,7 +87,7 @@ class ViewController: UIViewController { return label(forTextStyle: .caption2, text: "Caption 2") }() - private func label(forTextStyle textStyle: UIFontTextStyle, text: String) -> UILabel { + private func label(forTextStyle textStyle: UIFont.TextStyle, text: String) -> UILabel { let label = UILabel() label.font = scaledFont.font(forTextStyle: textStyle) label.adjustsFontForContentSizeCategory = true From e44281688be9090118403e3f0249821208efc846 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 20 Aug 2018 13:32:34 +0100 Subject: [PATCH 09/98] Add ScrollGuide project --- README.md | 38 +- ScrollGuide/README.md | 5 + .../ScrollGuide.xcodeproj/project.pbxproj | 343 ++++++++++++++++++ ScrollGuide/ScrollGuide/AppDelegate.swift | 50 +++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../ScrollGuide/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 | 25 ++ ScrollGuide/ScrollGuide/Forecast.swift | 50 +++ ScrollGuide/ScrollGuide/ForecastView.swift | 81 +++++ .../ScrollGuide/ForecastViewController.swift | 126 +++++++ ScrollGuide/ScrollGuide/Info.plist | 43 +++ ScrollGuide/ScrollGuide/UILabel+Style.swift | 40 ++ 15 files changed, 903 insertions(+), 37 deletions(-) create mode 100644 ScrollGuide/README.md create mode 100644 ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj create mode 100644 ScrollGuide/ScrollGuide/AppDelegate.swift create mode 100644 ScrollGuide/ScrollGuide/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScrollGuide/ScrollGuide/Assets.xcassets/Contents.json create mode 100644 ScrollGuide/ScrollGuide/Assets.xcassets/SkyBlue.colorset/Contents.json create mode 100644 ScrollGuide/ScrollGuide/Assets.xcassets/Sun.imageset/Contents.json create mode 100644 ScrollGuide/ScrollGuide/Assets.xcassets/Sun.imageset/Sun150.pdf create mode 100644 ScrollGuide/ScrollGuide/Base.lproj/LaunchScreen.storyboard create mode 100644 ScrollGuide/ScrollGuide/Forecast.swift create mode 100644 ScrollGuide/ScrollGuide/ForecastView.swift create mode 100644 ScrollGuide/ScrollGuide/ForecastViewController.swift create mode 100644 ScrollGuide/ScrollGuide/Info.plist create mode 100644 ScrollGuide/ScrollGuide/UILabel+Style.swift diff --git a/README.md b/README.md index c85613f..b6d5e16 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,3 @@ ### Code Examples Repository -See [useyourloaf.com](http://useyourloaf.com) for details. - -### Index - -|Project|Comment| -|-------|-------| -|AdaptivePopover|Adapting a popover presentation (iOS 9, Swift) -|AirPrinter|Example of how to print from iOS -|AlertView|Demo iOS 5 changes to UIAlertView -|AlertController|UIAlertController changes in iOS 8 -|AllVisible|A split view controller template -|AnimatedConstraints|Animating Autolayout changes -|AutoLayout|AutoLayout examples -|Collection|Simple collection view with popovers -|Designable|IBDESIGNABLE/IB_Inspectable custom views -|Encode|Percent encoding of URL query string -|DynamicText|Supporting dynamic text size changes -|Huckleberry|Auto layout table view cells with varying row heights -|KeyCommand|Adding hardware keyboard shortcuts -|MasterSlide|Implementing a mail app style split view controller -|Motion|Adding motion effects to views -|NibCollection|Example use of IBOutletCollection -|QReader|Capturing and decoding QR Codes -|Refresh|Using a UIRefreshControl in a table view controller -|RemindMe|Scheduling local notifications with UILocaNotification -|Restorer|State Preservation and Restoration -|SelfSize|iOS 8 Self Sizing Table View Cells (Huckleberry updated) -|SpeakEasy|Text to speech synthesis -|Stacks|Using UIStackView -|StaticTable|Using a storyboard to implement static table views -|Stepper|Example use of UIStepper control -|Styles|Using UIAppearance proxy to style UIKit controls -|SyncMe|Example use of iCloud Key-value Storage -|TaskTimer|Example of UIAccessibility Support -|TCNibLoad|Example use of UINib class -|TwitterSearch|Example of using NSURLConnection to query Twitter API -|WorldFacts|Both iOS 8 and OS X Core Data example +See [useyourloaf.com](https://useyourloaf.com) for details. diff --git a/ScrollGuide/README.md b/ScrollGuide/README.md new file mode 100644 index 0000000..6bd1f9a --- /dev/null +++ b/ScrollGuide/README.md @@ -0,0 +1,5 @@ +# Scroll View Layout Guides + +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/) diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj b/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj new file mode 100644 index 0000000..030e70e --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.pbxproj @@ -0,0 +1,343 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 53FD5C342126C480008DA03A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FD5C332126C480008DA03A /* AppDelegate.swift */; }; + 53FD5C382126C481008DA03A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53FD5C372126C481008DA03A /* Assets.xcassets */; }; + 53FD5C3B2126C481008DA03A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53FD5C392126C481008DA03A /* LaunchScreen.storyboard */; }; + 53FD5C432126C514008DA03A /* ForecastViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FD5C422126C514008DA03A /* ForecastViewController.swift */; }; + 53FD5C452126C533008DA03A /* ForecastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FD5C442126C533008DA03A /* ForecastView.swift */; }; + 53FD5C492126C5DA008DA03A /* Forecast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FD5C482126C5DA008DA03A /* Forecast.swift */; }; + 53FD5C4B2126C617008DA03A /* UILabel+Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FD5C4A2126C617008DA03A /* UILabel+Style.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53B5CE7C212AEBDA00FF5FCB /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53FD5C302126C480008DA03A /* ScrollGuide.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScrollGuide.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53FD5C332126C480008DA03A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53FD5C372126C481008DA03A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53FD5C3A2126C481008DA03A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53FD5C3C2126C481008DA03A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53FD5C422126C514008DA03A /* ForecastViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastViewController.swift; sourceTree = ""; }; + 53FD5C442126C533008DA03A /* ForecastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastView.swift; sourceTree = ""; }; + 53FD5C482126C5DA008DA03A /* Forecast.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Forecast.swift; sourceTree = ""; }; + 53FD5C4A2126C617008DA03A /* UILabel+Style.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UILabel+Style.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53FD5C2D2126C480008DA03A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 53FD5C272126C480008DA03A = { + isa = PBXGroup; + children = ( + 53B5CE7C212AEBDA00FF5FCB /* README.md */, + 53FD5C322126C480008DA03A /* ScrollGuide */, + 53FD5C312126C480008DA03A /* Products */, + ); + sourceTree = ""; + }; + 53FD5C312126C480008DA03A /* Products */ = { + isa = PBXGroup; + children = ( + 53FD5C302126C480008DA03A /* ScrollGuide.app */, + ); + name = Products; + sourceTree = ""; + }; + 53FD5C322126C480008DA03A /* ScrollGuide */ = { + isa = PBXGroup; + children = ( + 53FD5C4A2126C617008DA03A /* UILabel+Style.swift */, + 53FD5C332126C480008DA03A /* AppDelegate.swift */, + 53FD5C422126C514008DA03A /* ForecastViewController.swift */, + 53FD5C442126C533008DA03A /* ForecastView.swift */, + 53FD5C482126C5DA008DA03A /* Forecast.swift */, + 53FD5C372126C481008DA03A /* Assets.xcassets */, + 53FD5C392126C481008DA03A /* LaunchScreen.storyboard */, + 53FD5C3C2126C481008DA03A /* Info.plist */, + ); + path = ScrollGuide; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 53FD5C2F2126C480008DA03A /* ScrollGuide */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53FD5C3F2126C481008DA03A /* Build configuration list for PBXNativeTarget "ScrollGuide" */; + buildPhases = ( + 53FD5C2C2126C480008DA03A /* Sources */, + 53FD5C2D2126C480008DA03A /* Frameworks */, + 53FD5C2E2126C480008DA03A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ScrollGuide; + productName = ScrollGuide; + productReference = 53FD5C302126C480008DA03A /* ScrollGuide.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 53FD5C282126C480008DA03A /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1000; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53FD5C2F2126C480008DA03A = { + CreatedOnToolsVersion = 10.0; + }; + }; + }; + buildConfigurationList = 53FD5C2B2126C480008DA03A /* Build configuration list for PBXProject "ScrollGuide" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 53FD5C272126C480008DA03A; + productRefGroup = 53FD5C312126C480008DA03A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53FD5C2F2126C480008DA03A /* ScrollGuide */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53FD5C2E2126C480008DA03A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53FD5C382126C481008DA03A /* Assets.xcassets in Resources */, + 53FD5C3B2126C481008DA03A /* LaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53FD5C2C2126C480008DA03A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53FD5C342126C480008DA03A /* AppDelegate.swift in Sources */, + 53FD5C432126C514008DA03A /* ForecastViewController.swift in Sources */, + 53FD5C4B2126C617008DA03A /* UILabel+Style.swift in Sources */, + 53FD5C452126C533008DA03A /* ForecastView.swift in Sources */, + 53FD5C492126C5DA008DA03A /* Forecast.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 53FD5C392126C481008DA03A /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53FD5C3A2126C481008DA03A /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 53FD5C3D2126C481008DA03A /* 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; + 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 = 12.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; + }; + 53FD5C3E2126C481008DA03A /* 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; + 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 = 12.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; + }; + 53FD5C402126C481008DA03A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ScrollGuide/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScrollGuide; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53FD5C412126C481008DA03A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = ScrollGuide/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScrollGuide; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 53FD5C2B2126C480008DA03A /* Build configuration list for PBXProject "ScrollGuide" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53FD5C3D2126C481008DA03A /* Debug */, + 53FD5C3E2126C481008DA03A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 53FD5C3F2126C481008DA03A /* Build configuration list for PBXNativeTarget "ScrollGuide" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53FD5C402126C481008DA03A /* Debug */, + 53FD5C412126C481008DA03A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 53FD5C282126C480008DA03A /* Project object */; +} diff --git a/ScrollGuide/ScrollGuide/AppDelegate.swift b/ScrollGuide/ScrollGuide/AppDelegate.swift new file mode 100644 index 0000000..071c8dd --- /dev/null +++ b/ScrollGuide/ScrollGuide/AppDelegate.swift @@ -0,0 +1,50 @@ +// 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 + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + window?.backgroundColor = .white + + let forecastViewController = ForecastViewController() + forecastViewController.title = NSLocalizedString("Forecast", comment: "Forecast") + 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 + + let navigationController = UINavigationController(rootViewController: forecastViewController) + window?.rootViewController = navigationController + window?.makeKeyAndVisible() + return true + } +} diff --git a/ScrollGuide/ScrollGuide/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScrollGuide/ScrollGuide/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/ScrollGuide/ScrollGuide/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/ScrollGuide/Assets.xcassets/Contents.json b/ScrollGuide/ScrollGuide/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ScrollGuide/ScrollGuide/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ScrollGuide/ScrollGuide/Assets.xcassets/SkyBlue.colorset/Contents.json b/ScrollGuide/ScrollGuide/Assets.xcassets/SkyBlue.colorset/Contents.json new file mode 100644 index 0000000..e039289 --- /dev/null +++ b/ScrollGuide/ScrollGuide/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.839" + } + } + } + ] +} \ No newline at end of file diff --git a/ScrollGuide/ScrollGuide/Assets.xcassets/Sun.imageset/Contents.json b/ScrollGuide/ScrollGuide/Assets.xcassets/Sun.imageset/Contents.json new file mode 100644 index 0000000..d73dd65 --- /dev/null +++ b/ScrollGuide/ScrollGuide/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/ScrollGuide/Assets.xcassets/Sun.imageset/Sun150.pdf b/ScrollGuide/ScrollGuide/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/ScrollGuide/Forecast.swift b/ScrollGuide/ScrollGuide/Forecast.swift new file mode 100644 index 0000000..691ebc2 --- /dev/null +++ b/ScrollGuide/ScrollGuide/Forecast.swift @@ -0,0 +1,50 @@ +// 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 + +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/ScrollGuide/ForecastView.swift b/ScrollGuide/ScrollGuide/ForecastView.swift new file mode 100644 index 0000000..5604c99 --- /dev/null +++ b/ScrollGuide/ScrollGuide/ForecastView.swift @@ -0,0 +1,81 @@ +// 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 ForecastView: UIView { + + let titleLabel: UILabel = { + let label = UILabel.makeLabel(forTextStyle: .title1) + label.textAlignment = .center + return label + }() + + let imageView: UIImageView = { + let view = UIImageView() + view.translatesAutoresizingMaskIntoConstraints = false + view.setContentHuggingPriority(.defaultLow + 1, for: .horizontal) + view.setContentCompressionResistancePriority(.defaultHigh + 1, for: .horizontal) + return view + }() + + let summaryLabel: UILabel = { + return UILabel.makeLabel(forTextStyle: .body) + }() + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupView() + } + + private func setupView() { + addSubview(titleLabel) + addSubview(summaryLabel) + addSubview(imageView) + + let margin = layoutMarginsGuide + NSLayoutConstraint.activate([ + titleLabel.leadingAnchor.constraint(equalTo: margin.leadingAnchor), + titleLabel.topAnchor.constraint(equalTo: margin.topAnchor), + titleLabel.trailingAnchor.constraint(equalTo: margin.trailingAnchor), + + imageView.centerXAnchor.constraint(equalTo: margin.centerXAnchor), + imageView.topAnchor.constraint(equalToSystemSpacingBelow: titleLabel.bottomAnchor, multiplier: 1.0), + + summaryLabel.leadingAnchor.constraint(equalTo: margin.leadingAnchor), + summaryLabel.topAnchor.constraint(equalToSystemSpacingBelow: imageView.bottomAnchor, multiplier: 1.0), + summaryLabel.trailingAnchor.constraint(equalTo: margin.trailingAnchor), + summaryLabel.bottomAnchor.constraint(equalTo: margin.bottomAnchor) + ]) + } +} diff --git a/ScrollGuide/ScrollGuide/ForecastViewController.swift b/ScrollGuide/ScrollGuide/ForecastViewController.swift new file mode 100644 index 0000000..045128c --- /dev/null +++ b/ScrollGuide/ScrollGuide/ForecastViewController.swift @@ -0,0 +1,126 @@ +// 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 ForecastViewController: UIViewController { + + private enum ViewMetrics { + static let margin: CGFloat = 20.0 + static let backgroundColor = UIColor(named: "SkyBlue") + } + + private let forecastView: ForecastView = { + let view = ForecastView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = ViewMetrics.backgroundColor + return view + }() + + private lazy var scrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.addSubview(forecastView) + return scrollView + }() + + private let infoButton: UIButton = { + let button = UIButton(type: .infoDark) + button.translatesAutoresizingMaskIntoConstraints = false + button.addTarget(self, action: #selector(showInfo(_:)), for: .touchUpInside) + return button + }() + + var forecast: Forecast? { didSet { updateView() } } + + private func updateView() { + if let forecast = forecast { + forecastView.titleLabel.text = forecast.title + forecastView.summaryLabel.text = forecast.summary + forecastView.imageView.image = forecast.icon() + forecastView.imageView.sizeToFit() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + updateView() + } + + private func setupView() { + view.backgroundColor = ViewMetrics.backgroundColor + view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: ViewMetrics.margin, leading: ViewMetrics.margin, bottom: ViewMetrics.margin, trailing: ViewMetrics.margin) + view.addSubview(scrollView) + + scrollView.addSubview(infoButton) + + let margin = view.readableContentGuide + let frameGuide = scrollView.frameLayoutGuide + let contentGuide = scrollView.contentLayoutGuide + + // Classic scroll view setup using scroll view anchors +// NSLayoutConstraint.activate([ +// scrollView.leadingAnchor.constraint(equalTo: margin.leadingAnchor), +// scrollView.topAnchor.constraint(equalTo: view.topAnchor), +// scrollView.trailingAnchor.constraint(equalTo: margin.trailingAnchor), +// scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor), +// +// scrollView.leadingAnchor.constraint(equalTo: forecastView.leadingAnchor), +// scrollView.topAnchor.constraint(equalTo: forecastView.topAnchor), +// scrollView.trailingAnchor.constraint(equalTo: forecastView.trailingAnchor), +// scrollView.bottomAnchor.constraint(equalTo: forecastView.bottomAnchor), +// +// forecastView.widthAnchor.constraint(equalTo: scrollView.widthAnchor) +// ]) + + // Scroll view layout guides (iOS 11) + NSLayoutConstraint.activate([ + frameGuide.leadingAnchor.constraint(equalTo: margin.leadingAnchor), + frameGuide.topAnchor.constraint(equalTo: view.topAnchor), + frameGuide.trailingAnchor.constraint(equalTo: margin.trailingAnchor), + frameGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor), + + contentGuide.leadingAnchor.constraint(equalTo: forecastView.leadingAnchor), + contentGuide.topAnchor.constraint(equalTo: forecastView.topAnchor), + contentGuide.trailingAnchor.constraint(equalTo: forecastView.trailingAnchor), + contentGuide.bottomAnchor.constraint(equalTo: forecastView.bottomAnchor), + + contentGuide.widthAnchor.constraint(equalTo: frameGuide.widthAnchor), + + infoButton.leadingAnchor.constraint(equalTo: scrollView.layoutMarginsGuide.leadingAnchor), + infoButton.topAnchor.constraint(equalTo: scrollView.layoutMarginsGuide.topAnchor) + ]) + } +} + +extension ForecastViewController { + @objc private func showInfo(_ sender: UIButton) { + print("Show Info") + } +} diff --git a/ScrollGuide/ScrollGuide/Info.plist b/ScrollGuide/ScrollGuide/Info.plist new file mode 100644 index 0000000..4222ac2 --- /dev/null +++ b/ScrollGuide/ScrollGuide/Info.plist @@ -0,0 +1,43 @@ + + + + + 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 + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ScrollGuide/ScrollGuide/UILabel+Style.swift b/ScrollGuide/ScrollGuide/UILabel+Style.swift new file mode 100644 index 0000000..b1ca3b3 --- /dev/null +++ b/ScrollGuide/ScrollGuide/UILabel+Style.swift @@ -0,0 +1,40 @@ +// 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 + +extension UILabel { + static func makeLabel(forTextStyle style: UIFont.TextStyle) -> UILabel { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = UIFont.preferredFont(forTextStyle: style) + label.adjustsFontForContentSizeCategory = true + label.numberOfLines = 0 + return label + } +} From fd181b9e809c9ec28ff444543c472a4e73718c8b Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 22 Aug 2018 10:42:44 +0100 Subject: [PATCH 10/98] Scroll view is now pinned to edges of the root view - content view takes care of keeping subviews inside the readable content guide. --- ScrollGuide/ScrollGuide/ForecastView.swift | 2 +- ScrollGuide/ScrollGuide/ForecastViewController.swift | 11 +++++------ ScrollGuide/ScrollGuide/Info.plist | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ScrollGuide/ScrollGuide/ForecastView.swift b/ScrollGuide/ScrollGuide/ForecastView.swift index 5604c99..1ef4a53 100644 --- a/ScrollGuide/ScrollGuide/ForecastView.swift +++ b/ScrollGuide/ScrollGuide/ForecastView.swift @@ -63,7 +63,7 @@ final class ForecastView: UIView { addSubview(summaryLabel) addSubview(imageView) - let margin = layoutMarginsGuide + let margin = readableContentGuide NSLayoutConstraint.activate([ titleLabel.leadingAnchor.constraint(equalTo: margin.leadingAnchor), titleLabel.topAnchor.constraint(equalTo: margin.topAnchor), diff --git a/ScrollGuide/ScrollGuide/ForecastViewController.swift b/ScrollGuide/ScrollGuide/ForecastViewController.swift index 045128c..8b2f1e0 100644 --- a/ScrollGuide/ScrollGuide/ForecastViewController.swift +++ b/ScrollGuide/ScrollGuide/ForecastViewController.swift @@ -75,20 +75,19 @@ final class ForecastViewController: UIViewController { private func setupView() { view.backgroundColor = ViewMetrics.backgroundColor - view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: ViewMetrics.margin, leading: ViewMetrics.margin, bottom: ViewMetrics.margin, trailing: ViewMetrics.margin) + forecastView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: ViewMetrics.margin, leading: ViewMetrics.margin, bottom: ViewMetrics.margin, trailing: ViewMetrics.margin) view.addSubview(scrollView) scrollView.addSubview(infoButton) - let margin = view.readableContentGuide let frameGuide = scrollView.frameLayoutGuide let contentGuide = scrollView.contentLayoutGuide // Classic scroll view setup using scroll view anchors // NSLayoutConstraint.activate([ -// scrollView.leadingAnchor.constraint(equalTo: margin.leadingAnchor), +// scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), // scrollView.topAnchor.constraint(equalTo: view.topAnchor), -// scrollView.trailingAnchor.constraint(equalTo: margin.trailingAnchor), +// scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), // scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor), // // scrollView.leadingAnchor.constraint(equalTo: forecastView.leadingAnchor), @@ -101,9 +100,9 @@ final class ForecastViewController: UIViewController { // Scroll view layout guides (iOS 11) NSLayoutConstraint.activate([ - frameGuide.leadingAnchor.constraint(equalTo: margin.leadingAnchor), + frameGuide.leadingAnchor.constraint(equalTo: view.leadingAnchor), frameGuide.topAnchor.constraint(equalTo: view.topAnchor), - frameGuide.trailingAnchor.constraint(equalTo: margin.trailingAnchor), + frameGuide.trailingAnchor.constraint(equalTo: view.trailingAnchor), frameGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor), contentGuide.leadingAnchor.constraint(equalTo: forecastView.leadingAnchor), diff --git a/ScrollGuide/ScrollGuide/Info.plist b/ScrollGuide/ScrollGuide/Info.plist index 4222ac2..e39ce31 100644 --- a/ScrollGuide/ScrollGuide/Info.plist +++ b/ScrollGuide/ScrollGuide/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString 1.0 CFBundleVersion - 1 + 2 LSRequiresIPhoneOS UILaunchStoryboardName From f2bd003441293d768cacd1298b861acc1e8a803d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 10 Sep 2018 17:08:52 +0100 Subject: [PATCH 11/98] Add StackMargin project --- StackMargin/README.md | 7 + .../StackMargin.xcodeproj/project.pbxproj | 347 ++++++++++++++++++ StackMargin/StackMargin/AppDelegate.swift | 34 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../StackMargin/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../StackMargin/Base.lproj/Main.storyboard | 146 ++++++++ .../StackMargin/CodeViewController.swift | 114 ++++++ .../StackMargin/IBViewController.swift | 68 ++++ StackMargin/StackMargin/Info.plist | 45 +++ 10 files changed, 890 insertions(+) create mode 100644 StackMargin/README.md create mode 100644 StackMargin/StackMargin.xcodeproj/project.pbxproj create mode 100644 StackMargin/StackMargin/AppDelegate.swift create mode 100644 StackMargin/StackMargin/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 StackMargin/StackMargin/Assets.xcassets/Contents.json create mode 100644 StackMargin/StackMargin/Base.lproj/LaunchScreen.storyboard create mode 100644 StackMargin/StackMargin/Base.lproj/Main.storyboard create mode 100644 StackMargin/StackMargin/CodeViewController.swift create mode 100644 StackMargin/StackMargin/IBViewController.swift create mode 100644 StackMargin/StackMargin/Info.plist diff --git a/StackMargin/README.md b/StackMargin/README.md new file mode 100644 index 0000000..a4b28b9 --- /dev/null +++ b/StackMargin/README.md @@ -0,0 +1,7 @@ +# Adding Padding To A StackView + +How to use layout margins and the readable content guide to add padding to a stack view. The sample project shows how to do this with Interface Builder and when working with programmatic layouts. + +For further details see the blog post: + ++ [Adding padding to a stack view](https://useyourloaf.com/blog/adding-padding-to-a-stack-view/) diff --git a/StackMargin/StackMargin.xcodeproj/project.pbxproj b/StackMargin/StackMargin.xcodeproj/project.pbxproj new file mode 100644 index 0000000..02c18b3 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.pbxproj @@ -0,0 +1,347 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 5315FB2D2145A86800E81704 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5315FB2C2145A86800E81704 /* AppDelegate.swift */; }; + 5315FB322145A86800E81704 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5315FB302145A86800E81704 /* Main.storyboard */; }; + 5315FB342145A86A00E81704 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5315FB332145A86A00E81704 /* Assets.xcassets */; }; + 5315FB372145A86A00E81704 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5315FB352145A86A00E81704 /* LaunchScreen.storyboard */; }; + 5315FB5A2146B0D300E81704 /* IBViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5315FB592146B0D300E81704 /* IBViewController.swift */; }; + 5315FB5C2146B12700E81704 /* CodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5315FB5B2146B12700E81704 /* CodeViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5315FB292145A86800E81704 /* StackMargin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StackMargin.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5315FB2C2145A86800E81704 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5315FB312145A86800E81704 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5315FB332145A86A00E81704 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5315FB362145A86A00E81704 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5315FB382145A86A00E81704 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5315FB592146B0D300E81704 /* IBViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IBViewController.swift; sourceTree = ""; }; + 5315FB5B2146B12700E81704 /* CodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeViewController.swift; sourceTree = ""; }; + 5315FB5D2146CCC700E81704 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5315FB262145A86800E81704 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5315FB202145A86800E81704 = { + isa = PBXGroup; + children = ( + 5315FB5D2146CCC700E81704 /* README.md */, + 5315FB2B2145A86800E81704 /* StackMargin */, + 5315FB2A2145A86800E81704 /* Products */, + ); + sourceTree = ""; + }; + 5315FB2A2145A86800E81704 /* Products */ = { + isa = PBXGroup; + children = ( + 5315FB292145A86800E81704 /* StackMargin.app */, + ); + name = Products; + sourceTree = ""; + }; + 5315FB2B2145A86800E81704 /* StackMargin */ = { + isa = PBXGroup; + children = ( + 5315FB2C2145A86800E81704 /* AppDelegate.swift */, + 5315FB592146B0D300E81704 /* IBViewController.swift */, + 5315FB5B2146B12700E81704 /* CodeViewController.swift */, + 5315FB302145A86800E81704 /* Main.storyboard */, + 5315FB332145A86A00E81704 /* Assets.xcassets */, + 5315FB352145A86A00E81704 /* LaunchScreen.storyboard */, + 5315FB382145A86A00E81704 /* Info.plist */, + ); + path = StackMargin; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5315FB282145A86800E81704 /* StackMargin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5315FB3B2145A86A00E81704 /* Build configuration list for PBXNativeTarget "StackMargin" */; + buildPhases = ( + 5315FB252145A86800E81704 /* Sources */, + 5315FB262145A86800E81704 /* Frameworks */, + 5315FB272145A86800E81704 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StackMargin; + productName = StackMargin; + productReference = 5315FB292145A86800E81704 /* StackMargin.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5315FB212145A86800E81704 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1000; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 5315FB282145A86800E81704 = { + CreatedOnToolsVersion = 10.0; + }; + }; + }; + buildConfigurationList = 5315FB242145A86800E81704 /* Build configuration list for PBXProject "StackMargin" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5315FB202145A86800E81704; + productRefGroup = 5315FB2A2145A86800E81704 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5315FB282145A86800E81704 /* StackMargin */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5315FB272145A86800E81704 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5315FB372145A86A00E81704 /* LaunchScreen.storyboard in Resources */, + 5315FB342145A86A00E81704 /* Assets.xcassets in Resources */, + 5315FB322145A86800E81704 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5315FB252145A86800E81704 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5315FB5C2146B12700E81704 /* CodeViewController.swift in Sources */, + 5315FB2D2145A86800E81704 /* AppDelegate.swift in Sources */, + 5315FB5A2146B0D300E81704 /* IBViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5315FB302145A86800E81704 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5315FB312145A86800E81704 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5315FB352145A86A00E81704 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5315FB362145A86A00E81704 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5315FB392145A86A00E81704 /* 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; + 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 = 12.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; + }; + 5315FB3A2145A86A00E81704 /* 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; + 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 = 12.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; + }; + 5315FB3C2145A86A00E81704 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = StackMargin/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StackMargin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5315FB3D2145A86A00E81704 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = StackMargin/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.StackMargin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5315FB242145A86800E81704 /* Build configuration list for PBXProject "StackMargin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5315FB392145A86A00E81704 /* Debug */, + 5315FB3A2145A86A00E81704 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5315FB3B2145A86A00E81704 /* Build configuration list for PBXNativeTarget "StackMargin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5315FB3C2145A86A00E81704 /* Debug */, + 5315FB3D2145A86A00E81704 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5315FB212145A86800E81704 /* Project object */; +} diff --git a/StackMargin/StackMargin/AppDelegate.swift b/StackMargin/StackMargin/AppDelegate.swift new file mode 100644 index 0000000..85205c0 --- /dev/null +++ b/StackMargin/StackMargin/AppDelegate.swift @@ -0,0 +1,34 @@ +// 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 + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/StackMargin/StackMargin/Assets.xcassets/AppIcon.appiconset/Contents.json b/StackMargin/StackMargin/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/StackMargin/StackMargin/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/StackMargin/StackMargin/Assets.xcassets/Contents.json b/StackMargin/StackMargin/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/StackMargin/StackMargin/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/StackMargin/StackMargin/Base.lproj/LaunchScreen.storyboard b/StackMargin/StackMargin/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..bfa3612 --- /dev/null +++ b/StackMargin/StackMargin/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StackMargin/StackMargin/Base.lproj/Main.storyboard b/StackMargin/StackMargin/Base.lproj/Main.storyboard new file mode 100644 index 0000000..46b305f --- /dev/null +++ b/StackMargin/StackMargin/Base.lproj/Main.storyboard @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StackMargin/StackMargin/CodeViewController.swift b/StackMargin/StackMargin/CodeViewController.swift new file mode 100644 index 0000000..1c35ff6 --- /dev/null +++ b/StackMargin/StackMargin/CodeViewController.swift @@ -0,0 +1,114 @@ +// 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 CodeViewController: UIViewController { + + private let chapterLabel: UILabel = { + let label = UILabel() + label.font = UIFont.preferredFont(forTextStyle: .headline) + label.numberOfLines = 0 + label.adjustsFontForContentSizeCategory = true + label.backgroundColor = .white + return label + }() + + private let textView: UITextView = { + let textView = UITextView() + textView.font = UIFont.preferredFont(forTextStyle: .body) + textView.adjustsFontForContentSizeCategory = true + textView.isScrollEnabled = false + textView.isEditable = false + return textView + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [chapterLabel, textView]) + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical + stackView.spacing = UIStackView.spacingUseSystem + return stackView + }() + + private lazy var containerView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20) + view.addSubview(stackView) + view.backgroundColor = .red + + let readable = view.readableContentGuide + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: readable.leadingAnchor), + stackView.topAnchor.constraint(equalTo: readable.topAnchor), + stackView.trailingAnchor.constraint(equalTo: readable.trailingAnchor), + stackView.bottomAnchor.constraint(equalTo: readable.bottomAnchor), + ]) + return view + }() + + private lazy var scrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.addSubview(containerView) + return scrollView + }() + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + + chapterLabel.text = "Down the Rabbit-Hole" + textView.text = """ + Alice was beginning to get very tired of sitting by her sister on the \ + bank, and of having nothing to do: once or twice she had peeped into the \ + book her sister was reading, but it had no pictures or conversations in \ + it, ‘and what is the use of a book,’ thought Alice ‘without pictures or \ + conversations?’ + """ + } + + private func setupView() { + view.addSubview(scrollView) + + NSLayoutConstraint.activate([ + scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + scrollView.topAnchor.constraint(equalTo: view.topAnchor), + scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + + scrollView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + scrollView.topAnchor.constraint(equalTo: containerView.topAnchor), + scrollView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + scrollView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + + scrollView.widthAnchor.constraint(equalTo: containerView.widthAnchor) + ]) + } +} diff --git a/StackMargin/StackMargin/IBViewController.swift b/StackMargin/StackMargin/IBViewController.swift new file mode 100644 index 0000000..a02ef44 --- /dev/null +++ b/StackMargin/StackMargin/IBViewController.swift @@ -0,0 +1,68 @@ +// 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 IBViewController: UIViewController { + + @IBOutlet var stackView: UIStackView! + @IBOutlet var chapterLabel: UILabel! + @IBOutlet var textView: UITextView! + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + + chapterLabel.text = "Down the Rabbit-Hole" + textView.text = """ + Alice was beginning to get very tired of sitting by her sister on the \ + bank, and of having nothing to do: once or twice she had peeped into the \ + book her sister was reading, but it had no pictures or conversations in \ + it, ‘and what is the use of a book,’ thought Alice ‘without pictures or \ + conversations?’ + """ + } + + private let backgroundView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.backgroundColor = .red + return view + }() + + private func setupView() { + stackView.insertSubview(backgroundView, at: 0) + + NSLayoutConstraint.activate([ + backgroundView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor), + backgroundView.topAnchor.constraint(equalTo: stackView.topAnchor), + backgroundView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor), + backgroundView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor) + ]) + } +} diff --git a/StackMargin/StackMargin/Info.plist b/StackMargin/StackMargin/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/StackMargin/StackMargin/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 + + + From 55ba3311ff20b43bb4f678aeb0ccd704e359f755 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 14 Sep 2018 14:46:18 +0100 Subject: [PATCH 12/98] Update for Xcode 10 and Swift 4.2 --- .../AllVisible.xcodeproj/project.pbxproj | 25 ++++++++++++++++--- AllVisible/AllVisible/AppDelegate.swift | 4 +-- .../AllVisible/Base.lproj/Main.storyboard | 17 ++++++++----- .../AllVisible/DetailViewController.swift | 4 +-- .../AllVisible/MasterViewController.swift | 2 +- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/AllVisible/AllVisible.xcodeproj/project.pbxproj b/AllVisible/AllVisible.xcodeproj/project.pbxproj index 7e2b795..a7d3cc7 100644 --- a/AllVisible/AllVisible.xcodeproj/project.pbxproj +++ b/AllVisible/AllVisible.xcodeproj/project.pbxproj @@ -167,12 +167,13 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53AA2EB11DA2A957008EBF84 = { CreatedOnToolsVersion = 8.0; DevelopmentTeam = LCC2J94N44; + LastSwiftMigration = 1000; ProvisioningStyle = Automatic; }; 53AA2ECC1DA2AE09008EBF84 = { @@ -293,15 +294,23 @@ 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; @@ -344,15 +353,23 @@ 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; @@ -388,7 +405,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AllVisible; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; }; name = Debug; }; @@ -401,7 +419,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.AllVisible; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; }; name = Release; }; diff --git a/AllVisible/AllVisible/AppDelegate.swift b/AllVisible/AllVisible/AppDelegate.swift index 36e6e17..6f043ce 100644 --- a/AllVisible/AllVisible/AppDelegate.swift +++ b/AllVisible/AllVisible/AppDelegate.swift @@ -3,7 +3,7 @@ // AllVisible // // Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2016 Keith Harrison. All rights reserved. +// Copyright (c) 2016-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: @@ -38,7 +38,7 @@ 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 { // Configure the SplitViewController to prefer to always // show both master and detail views and add the display diff --git a/AllVisible/AllVisible/Base.lproj/Main.storyboard b/AllVisible/AllVisible/Base.lproj/Main.storyboard index d3b70bb..cc70ba9 100644 --- a/AllVisible/AllVisible/Base.lproj/Main.storyboard +++ b/AllVisible/AllVisible/Base.lproj/Main.storyboard @@ -1,8 +1,11 @@ - + + + + - + @@ -11,7 +14,7 @@ - + @@ -31,10 +34,11 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + 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 15/98] 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 16/98] 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 @@ - - + + - - + - + @@ -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 25/98] 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 26/98] 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 27/98] 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 28/98] 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 29/98] 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 30/98] 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 31/98] 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 32/98] 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 33/98] 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 34/98] 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 35/98] 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 36/98] 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 37/98] 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 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 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 38/98] 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 39/98] 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 40/98] 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 41/98] 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 42/98] 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 43/98] 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 44/98] 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 45/98] 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 46/98] 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 47/98] 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 48/98] 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 63/98] 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 64/98] 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 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 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 65/98] 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 66/98] 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 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 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 67/98] 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 68/98] 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 69/98] 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 70/98] 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 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 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 71/98] 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 zcma)Bc~BDEy9QTKFiAs1F;P=0H55f$b6?6V%G;;qm*PsLBxwymc(ddw$__4W+rsted@D!(QSnxJcDKq)`%H;gtpUx=) zruJ+_?@ z;G3UHA8mi@vDv?~c658{%8p#fzKyN+&4Hu8Hj4*Sw{0eW{`3lN*ZaMy6`Zp2X1|lu z{WlJf(7R)&AEQmVE-j|%P>?FtJxm)R#KiRa^6z4?nQ1i9X&DBendZZR4IL+q3(But z*#2(w;tTsqD)hzp^2*Lye{jnDr$^h}cXqZ1clI@`-8j1S{?4s0rS033+mkE5f9{!n zlKQ=Ld#ZNw%fzGhxFlf68AP9wVL^;H0HLPZ1U%rtmZ*bRRdZ(DzWvqw6UExR=ALQP zljOTHQvmX?Z!-}aUiv^bJ0E=W=bod#+jiC_g41^9=G(tqY2W(ShhW);?v-s=Q*WefP&)RPdV6D0DKmkBv5IF}~2hPsI8heBp!k&Z!?kU#8 zlzX(}vTXg`dzejxi(2sq zdTsNG<8wa!T~gP;+ANZt6;ru@I%pJMV_;{jQ>f$|M@LWo`a64ad+f^3UChldnxw)O z;*w*;dtIm=TLyk(l<~7Ejd%f0nLGT;hJ@ZF@|HsP73%`Ezf^W4Q zIr_U>YjX2jyqCvfjoZ?IMuC6y*^pwCi%A0Fn{I1E{b=T~?3$UEM$hVXb^EmWE}T$B z3XhuY-}Sj+kwEl5fjaIL0+$r2B!p#N+4;%bzx|u}Z`hkD+r##^v|jw`-=l?_h-T=X zAo{@b(+WS?5;Ap;v+@YUR+Ee1spbU``r;C(@Mg_N3dhdZd(LP&F9tH~O7BA{9D)*! z%#k(Td$ZOjf^X7huN|dq0bY#9u1OXv=peU9V4vO_-(G`Evk700EwaX`&4Ml|%9$3D zTjiPgOCn)I3(y8@Q8`;;<`TyEJW4LOx@M(x8kY^rnx5+iKDo6zW54=0OXs6Rtm1}1 z3G$?hK#w#DN@Mnzz}2$Ln7HhDN9TqsW~y3fnCSnO$0)2GV#K#%FB|vaku?a*#P=U5 z9R&w1OAM0l@9DbcL~(K+MQA+K%Y#P8BYKZX;Wa0|d{D?qOP({=xgOMe{W+VI;!4-s zNB7YuefPS1pHTYFs!Tq%)GhlX0TF3iwCSGsEkKrU3KKw8t#D zZxUOaSpAe{6zStOAT`S#HDuO*?^ zHC+gAxwTCR(FxHF606lQpE4<=A#xO_IZ`*tK#J&L0> zW4DgU$U8x6icqpDqA-Yn^}8LqRncrg3!^i$3_ZjjzU$MAvq`XIYRuWbiEb0k0A!~h zpC~qqc?yYv+i8>ibFJSUR0;J}%lqtOS5X!SQk^A?4S`;HLY$qH>gu&Au=6USQ(Z$m zxA{K&z9a(KLAU9yu5l=)RUjMT7t6VqCsW3N5Pl$gNx)Z!W0Y7g7i+w-z--qRqSa6* zFcy#m+*?gZ96w<6EZ&$$fFt#6GytIjx5n{u*HHniEN^|m*E}d;Trf>m^XcAusE>u3 zP$0q-!EXXmj5W=X%1eH(NEB{g60{?mrpP`cV-&`g77C5M7%^|DxcGigRB2YzShu(3 z;gY5UCq4Me=_d{-|1&M%Duf;AP?J>@Nmk9#2&bqcTouwz0ljtlgz^t@Sui{|8F0Ryuj$ImZYJv+I3_m`H;@jFk6F9O;ZO95uS4k!!~^^O$DM zC_P0h@i6&-pmie!_5A?-b2-+Z$?(5mSrOh=$X6hWk|Je#8f$$XvG;Z6U-6Ei579_= zI+}|T=T=LCEY5zF)z@nu%E+$6vDG8vL?l4{2N+;KU}~>}v*B|0d^E6!g>uy7u%o6u z;(-s6$hA66QE>w$zrvffSOwAY^i#RW8;uKN2EBB8LfDx4F6p%6tdP7&W=$x`QU#bK z=gNykd&GvNQSPC*cKM^e17El*i#2m-s$ulFEfw>qmfBMVjjw8(wR6zu?ml5Ztu!JP zhcX5I;I?uD*p!@jh*(>l*7Q)ROPTg60-Bj4V)n|Y2(|%ZI+TF3m4C#x)i$+H@2smg zRRD9l&D`o}q3T{(_i30_p>}t3O*I%Wq67sz+dS+o~t{E+EiLdexaP)lR}7sO%GKm9WIGv1)nmAc`fU4C9W@ z8#FNDnsWqN$#q$fMfMxlMF>L0RE6@({|IQutLn#0J|Pr?jMO6dv#wN&#{Br+js`;z zo0^j7blgjaXv@XuSbvJOQ&F6nnFVMe73nkhGKoGNWrBBACWJcLT4$WbnOb%m&AM8a zl%VI)Y2AurbD_MjQWZDAvi@aCw#hCBB8B!8m;*RGQA~0LuDXPX4n!N_CdPEM$Y(|@ zM_lmZ2*u(2&Wr+aKn@oiMo7Q*bn%3888sgY{1bxtJ|n22K|7WeN?kSJ_h(VrPZ-dL z#My2OU=qN?;GfY^7%J+}uCJM9DjJQC2SOUO@8MN@^VOvLSZY)YT^pKF3ES1n-;PtF zlQ||U&pD~0gF3)~d-tOLXbcK+({+{qAP;c2OpqY1((#o>B^q_=KgNZD@y&vYzeXy; zwMvUr;!&PqOG3fdX1#}1)I}+tjrBSsme|TOLzet*97_C(WnVuFF{tb$j~OdZbpnrh zM?&Oqq123QiGNZe-vmu50Jf5QAJC?SNhG#mSCP)Mi`s|!ViJw?@O|QhmBH=OF4H8ku6B{u@RsG=xI8BHzg*wvgtvi(jNT;H?dATQbxfx8VO?cg+ z=NPrez!V-ui*AvW#lkaGYxTQD52{QFY(SyMa8%AS8tAYI+$(QGfyYC1*qYK&q#uag zAEay8vn86EKRv^esL%?qs$rO1W_SGCpyzU;%N&h}kaJdWFP{D7>w>iK(D4Y)LFbeG z%K%UXQ(O`s;%U+l<%-lN$W6%u8cm-Iz&fYy3~_ZfVmiPqDwlYqn92D1dDn1-;0Cn3{3{tALK`ueQ((%`!Zj8G2vY zsvCl3?kJ||p)hEv+=Vt5UNEMvJ>biFHSqld0q&yEudd0uX4h&$R?s}+9FTciHSKbx zpM9S;QR7h83H|#XXRuGg+^m)%QSL*+j>Jp80(*1JX)5YO6qQ@#AAUH9_+N|zbhy_*OcI;vF@?;(fm7Y<33^mbO{_hZ}kM*t$G|5N#9570Y*S! zZWiR;vfQ~mTk9D)WXXJkK!MzmUhgcE6Y`~fPJEKFDw=MMKV0bR3CkI94L@rf|5lwI z)Y4Gzi=-ew<;PP1&mHo?6V5JHIeHaYGUIr;CWEIzCx>qY2@5|3>p=~(m=X8OW)V4xT%gm{8(<4;5@}b7EnP2Zl;QXhICa?Xq20* zfp){P&_hcqF}p^!GCpZ(O$kwR7M6j19P!$o;}Kpuc~Xy3;XEyFuBlw41kN4wy+oS_ zhv;4{;9iY$h#c2_Iu^SJ80l84<9Iu+{2jSf0NJO*L*xQX3j2=rCvrOf)YHAJcZrcV z#C@){miMXtc>oyRqwt<++6B)JRZ#6vrsX{p5mqIzYXPq@9y;B0kkY-%H0^+FF~T?L zBhoE!L{IUYmGy4)U=MY>hrjoeikJCDIdgiUI)v%u9&TaPjAP~~O^NUb$jy5>9B}}& zfjf_9lAAFL>5glDse5Vf{RUVJ#Lzi5?J!ge$hJGL+w^dzMpkZO&q>pi>?;^! zRnsszY0lC=Ej`L7#@8gadA1XXXAFDyQk=_~T6MsFV5QD3?NRE{3F)OT0GR_9%_ z4-EE!ahk_6Mr9aVytQrxi#?6+;?x`AJvyO16*=@a)Q>XIYzb5g;06GI?X3WN^o?>2 zybln*jy7ao7NVNyvBJFDHTK7T_&)WI&Z#2Wl6Bt=VT)7qhSgsCAL9x4OCib`yc{8O(9SDXUUSp5ocN^V}R_cBM|-)J-y zO7KgtWUCfC5#80V;V{o0p9~>1XreApnG4HRUoF&FF4oN2p(u&G`XE?N?1zRxMzyM# z0GM*4bw-^_>a}(Iu{3@913%ueX+fGNTuojIyvPe1d=N&br(Qwa85jv@H9e?}o=yP=+KIq2m>Rey7 zpALy^N^$KLNb}w~_`El}$P;RS^LW@bOAQ;6sx1%uz;Yxs zAsTHBKM;^Ipr@L}cxI}H*;zmnCN42?&`c8U zbv#0zlcU3w+9lI1aDp#o!E-a&%b>GZvVEyNW&Aj25dUr z5N@TT8`(LWM<$<*uC(kN4p4C$X|78G**Dcxz_V&2iXA*7!ipuH0aigs2r-AHSRdsE z6ps4ReJwJPazbyw)PdNV1A|4bgi9$(uMO?=1@#hN6_2n^87#|@$(=B~7hY5G;N$=x z>Vy`s5cu5|hk{p064Y-XujYiD3Ah)E3U%%;=}hz zO8#27*uY@nC%6c%!X@vQ+%cZ9SLYb!AAn>$@5}PR>x?p+fmusF-}Im91%Cc@!XF_7 z0tgIVTANn1RPV*#K3+q_;5u3`P>ukcxvIIZlycq6SJ#YL^qHD{F`0+RNh6xKuI95v z)#@>(ne`AG0$#zr8LgBh!}dXd8w)gD$0jl?+|AAXc zJ-?3O!<+4+z)O^zwM0_X^o$)U_9a-{jT{&%_c`r9rKUA-+xuQD%YZUEJWk6u$_Y(q zaPS8Rm1!psv`$)HEDFeVxmJ&T51%$U34P+pE#`C>+ZkW;y0eQL_VQtHR&El3p zJA5Plep0fR>U4bzB1h@mTs=m#kLK{19HQelJS}xL<-)7RUb*Dld=<$@(aXe3phQbE z>`!NPbGq5F$o}qk>N@3+c?to=dK2Kpl#w4Z`K5zj`snsIMo8gjyK)bV#WMcVJnya^ zpPB733&NY>@)K}kKs~S~B$9x7FR+kv-@gVXEzsy8XVsXYrEr@J7C$ZmiqnP194ea# z!e!U?<8O*UF(B-pXQLa@-B=h4XHW2ydRiDFL&*{`J21e!OJd8En6pqyz4O`Y&~d@g zFv7*8VcyyJnOK}KcEc+1k~hY9KCldZh0z&XOgeGg!nEL}w;c_U>p2Zco@;4~^s9qi z!BqD6Ig0ZGYp1I(j>S652Ti6l+)}$4?llMJQ~53-ACVwY?rCfex;DA83H1drq{AKj6CuKlpCieBpV zhZM^Lv@55A9S|8aHymCbR=*3B8+t?*y(myg#DN|g8tijs7KdpVq{SK>7auvVk zYZr3dQ5a|QZkX(T6RfxRSIxl(jV*l#Z)J^{2 zuk}0a>)(!Sy9B@3{?E+~`+Mj>tH?{08AjZ0@%bFp|~8`Z_P|xYtT%r6i8LcVwc+ek9)n^q$R1$h}BsxHtSXJ~6(voryqp82TV=DF3^EA-f* zaMq}(3uMcg(BeK;_r7e5-Rs{U_Q(fszfQe%bUkXNHg)_?`)^@;a(m*@Uw@@+-E_M0 zv`uzG>J+$Gr|?S6$bP)7ra7QZN9$q5GtC*@IplEO@ZE!%{V0@)_&R(-Gu}$8Ct!{vWgdacg7c2QT>M;Li5?&cIRn z$~I?ZXY;pcGIPwW!we}+Oi~G5Ki2DD5*-w#{W^X{5Yy*XMI{M&D8>)7Pa)ZfpJ?EKxn@oDEps^YE`v^u%sHJS3I zHh8Bf^{4d8X8Dy{{r?XgXv01@b<;le+n4yApR<2#e>}NOOa(Tn06O+;4{q(MKWj&S zt!Cfcn0T?4QL)lh{Ns5u;(t`6|GmofjN5p-x#_g^_2%r6AFR}0w-$FccC8);pzZ8G 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 zcmV+{64UL8P)AX7*ShjZx^LjOC#lvKv`)9BIKp6T4PrT>*puBHcvs*U<(^-lhKCksMS^AdaB;{ zWq=v=7EO?o>)%1zjv+=YrA4okL8F08)U8^p5bPBS9e33o z^5axok2+3^Rs1-sGK9I1Wofa-Qj2cmVLGy@Bz$KCo1}C?gE>=K*I&=`+^s!NL#DnT zZZfdLbCb&294myJ)XmxuG4m)iK;TWozFCHV1kJ-c^r|zNV{cSBmz2K2DE%Xn=fyb3 zv9_*1ms5fSF$lu?|94ij+Wuk5!7#H>X-FXYeJ@f0ki-EH+X@ouSGCS7bP{PtI3_iHO%^N2DE=$RdMsuLl$mh->#f($IGHHO!y~v~06~Tkt9M)v0p?A%R}T;p zzd$5ZE#boQ*1E!uUhYYI6#f4!tywQaw%7AK3-K%f7Bf(gKo%1LsM#KJ-Kf2SvY*YC zthe-Sdu|(0k$2xBw)e4?31oH4K)oNm(e|sUcU{VB&Ka3=u9yojd?w)p3utMvBHU?S zF7AMNq=dpuhFcM~1;L8cwD=lYdP(>$Vx}K&6m;rWffO5spk8;35%(DPJu)-0iOj)f zL>^-H{O25WfK2n%2DeHL+uBPGveX=5l(#E-GSuzPIZ-l~5<(CIjA!TwLUaA|`1NCI z43H&;K@i&eUoj!N+datl4a}cdi;7_0FYywT$+Z6iEd;>udw<{1se~1lvM>?brMn*S zBBuf|#sbFVnTRgJ%M_lx`q!A6|LOkphom7H9L-0-5fET?cHtZaSPjRiDjP`1p1C4& z#&Tja_3}*q5Zs7!B-^e|Pfsh}4_STm6UVB26C2#{; zVkcH~3(gxpDJz??igDY%(r9T0Cf``HC0dk&x$45mQiJXR+p^%kXtTjO;c2Q!v^IEy z9N8adRo4=^5=8TBBO(e4v-l!DE9|iI=wNmq*4-xsGrKZ7s5@YiPG^!%GWnbt|I9sA zMJvL+T*s5@>iRmTS`l>CoAu`Td9zusHyq)jbb|l|Y2f1_nE}|N#}sM<&l1RpP)UmE zh?y=zLJ?^g5x5AmbJAc#&TkQl!1jO@pz$n&PD`@SO@PtgI^M6hfrA>sDAmsr4obnVR?p78mOV0x zn#|<0+3e!t;`H?N=;-L+-~b*mDzn)ilN)BY03?V5FM43(U64R14S*sWSkHNfkh``8 z8g7oHBJ;w>Ym2g+PN&1+5KnU70+r$C;h*WWEQ_|b+PGl$QBKt~b=A~3RSgeA)>O@M zSv)>I4u_w2cX!=?1L{zJc>KFumf#T^j>$EFg(ajLD|ibsNo>pjN7izoX+R)P89b_F z6%35!QYVS$UGDAex&IAxFTG2xbp@K}$~x9}mO#m0Rl=8?n>_a?{$Mb0{||$~C*Sum zPc$;CQE?`6R1tA(!NtLgt6&ufmM^mc;Rp~=MMcqQG;-gE(U(!AqQY*h?9b{HIZzaZ zp(`(7naO_t{&jeG_)cj|Vm`|`t&1(S4= zj4#ISHW-h`S|_vNRPVH=qAKIXT%%8uRn{e31bu4#TjAqRC(xsZ%vI zDOxzGa2XEC{DXnxI zt61MZ+#eqwe?S_nhll%^ptOb(WD#--!;LM9YTN)Yf#`Keli`*Tag;MOrta?U_V@SQ z?Ex0JN{JAybs``HqDVzy5M19}@9gY+KpL#;o0~8SprxP))yT>siU7`}L*S~k6qyuN z$PPe6MVVLlZ~XJ;5BH-0Hwd00rC2ZghckQ0bt4I)7)quD2`UZW{@3VF1GZr+gI%y! z@O0)83*f!({Xzl%_-f9+R`Ge&ndm+~J}#Hl1|ee@!X;D4BqW3wr4E4xQiB-83@ojz znKOU#t}~a;6fX$8?m>o7XwKDucm4SJtG&k@S~5yQNQr@gRER(#Vod@pDT!30tuRe9 z=Xl4v{*JACtre-)W(R>aduHNY{~q*0We*t%A&e3lV}J<^EeO;p7yuC_)PPX-%;j?7 zU6;$+O_Mmzb-xBvchTJMciwfs-Scn1fx4?S9g0G6)Ave94CztGNwsH^fT%F;8h5M%amAnvMF8@rwJr(1r3!@Da#N@ z#_q34EU8_L`8t1MwspRaG1_d5p`O_=3@HtLKMZ|>^fapM;QFr8SgL z6or0|eJoJE6@@gR<+-$GL&3CdVWfp{%n1VH+Ne^~&S`0&Yy%{AWhkUORdto;kN&Hp ztm~Q~{7*nIhh{;VMnY)V4TYAxUap73VYyuX>5B&C^>S&{L6-;&GjB+1-JJrH5L`qe zSM;mzGdAeVTnO*&;#`)S%|?F+_&vBqbN)EH5$is(FSe^?w{0K>>T3%FMUTBo7pDPy zRDj9`Y-#0vY2}~H42KRJwA?Hovz#Fl13`j~_eXoscKO|0YYm_I&<}^h;lH}Thhf0y z+_ufRyV+xJE@nX(f-663b=eWpn&AxqGNm#UPL&Emt@V644}JgdKV(4qp}$IYj=utf+`(E0L@2bmIbISO+kK@Pbbb5dP13!-A^>#}+)nau2P81lm zSXVHrlw4>vmz*OIvGLy@RCP*nK ziIT){m>}5dw!%qS!BH=s96}nIg+>WvI^`nC)auHJdYPv zn%#pzxIwS0I#r0IR>xkQL*k40D*e)-7mk3_7%6xkuOIG1-4^+s)w>5}3TU<$Y z!E9cZIV=ml7W$wt%fZhIUM?Wa0XdzWnHE^F_!1BmM_q8F> z_|l{xo;Uhv?W0tQ4hMb`Ic{s0gD?o~`(L)!ou-FpodtaUlU4;n&~JO*_x-;2eW(ut zcumHEI>>F4H!-8T{(!XZtp`DH){+kjWh&6Og_#h4bmryZGCsdv0- zi!7L!TrY^KUgYdHcBJ*T_?tw^M*r6HBijL%X{+k%>Z|IaimzeNYU`p>sgTAW>$2B^ zV4W?btt_b07NFf8NntLQkRPIL*_~)yX}AK@wv>lPGqMGwwW{0UviRGo=A6G@Y5gV( zgaFKEG=<8l3Rqy4gv?Zho5oX&Spr5xl_UQD!H&w^GY?52WwX&~B)J~~Tu)85VJzsL zvvc{&{aM>M&v}kH&+{B0ppKOJnGTMT6Y71!hZG~)W*llwuwVk!Hdln&3AYlPN7Hf$ z2#mBwSZ<93xRNx|vdV8SNXx?ZSi`@WCEwJVJs4fQxg0TvHDvC-kfVre(W z5uOEC4<*@|JM7}{j{r@B1&sRVv>tKzn)o6D@}|Xo$N4o18AD_-JOm9D?|i%>d(2?yE06X{a;N^A@$5~j!5^3ms+ z1eiL^dS^dw3***YQFx!ywrt&o_Lz!%`TFl^N{}E1L0F%@6_GxBbB&5fAPFz&0f|bfLwH5km6p){T%0wiMbbMC;85B&&Tjn%PUzED)O(I-;W%|9Rhfm*ZuW zD?D997^o#7g&blNAfZ4EkHiT<{Uly>1WQGgb;(&-^39@Xgi?`$Ut>dag_A3;Fp5qx zlAia6{KI*9m{9@*uU~q4xacsu0SAG_>T1Z0;}T9%C${P0q`I+)ku#Lxx+ 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 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 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 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 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 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 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 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 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 72/98] 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 73/98] 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 74/98] 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 75/98] 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 76/98] 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 77/98] 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 78/98] 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 79/98] 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 80/98] 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 81/98] 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 82/98] 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 83/98] 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 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 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 84/98] 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 85/98] =?UTF-8?q?=F0=9F=93=9D=20Updating=20name=20of=20fon?= =?UTF-8?q?t=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** From b36ab679c136ff9924ba5118bbc1202ae6571f8d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 6 Jul 2020 13:12:24 +0100 Subject: [PATCH 86/98] Add list collection project --- ListCollection/List.xcodeproj/project.pbxproj | 356 ++ ListCollection/List/AppDelegate.swift | 34 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 + .../List/Assets.xcassets/Contents.json | 6 + .../List/Base.lproj/LaunchScreen.storyboard | 25 + .../List/Base.lproj/Main.storyboard | 60 + ListCollection/List/Country.swift | 118 + ListCollection/List/Info.plist | 66 + ListCollection/List/ListController.swift | 96 + ListCollection/List/SceneDelegate.swift | 61 + ListCollection/List/countryInfo.json | 4752 +++++++++++++++++ ListCollection/README.md | 40 + 13 files changed, 5723 insertions(+) create mode 100644 ListCollection/List.xcodeproj/project.pbxproj create mode 100644 ListCollection/List/AppDelegate.swift create mode 100644 ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ListCollection/List/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ListCollection/List/Assets.xcassets/Contents.json create mode 100644 ListCollection/List/Base.lproj/LaunchScreen.storyboard create mode 100644 ListCollection/List/Base.lproj/Main.storyboard create mode 100644 ListCollection/List/Country.swift create mode 100644 ListCollection/List/Info.plist create mode 100644 ListCollection/List/ListController.swift create mode 100644 ListCollection/List/SceneDelegate.swift create mode 100644 ListCollection/List/countryInfo.json create mode 100644 ListCollection/README.md diff --git a/ListCollection/List.xcodeproj/project.pbxproj b/ListCollection/List.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6e3bc05 --- /dev/null +++ b/ListCollection/List.xcodeproj/project.pbxproj @@ -0,0 +1,356 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 53; + objects = { + +/* Begin PBXBuildFile section */ + 531BAEAA24AF76BE0052D465 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEA924AF76BE0052D465 /* AppDelegate.swift */; }; + 531BAEAC24AF76BE0052D465 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEAB24AF76BE0052D465 /* SceneDelegate.swift */; }; + 531BAEB124AF76BE0052D465 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEAF24AF76BE0052D465 /* Main.storyboard */; }; + 531BAEB324AF76C00052D465 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEB224AF76C00052D465 /* Assets.xcassets */; }; + 531BAEB624AF76C10052D465 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEB424AF76C10052D465 /* LaunchScreen.storyboard */; }; + 531BAEBE24AF7FCF0052D465 /* ListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEBD24AF7FCF0052D465 /* ListController.swift */; }; + 531BAEC024B0CA5E0052D465 /* Country.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531BAEBF24B0CA5E0052D465 /* Country.swift */; }; + 531BAEC224B0D9A50052D465 /* countryInfo.json in Resources */ = {isa = PBXBuildFile; fileRef = 531BAEC124B0CB000052D465 /* countryInfo.json */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 531BAEA624AF76BE0052D465 /* List.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = List.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 531BAEA924AF76BE0052D465 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 531BAEAB24AF76BE0052D465 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 531BAEB024AF76BE0052D465 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 531BAEB224AF76C00052D465 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 531BAEB524AF76C10052D465 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 531BAEB724AF76C10052D465 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 531BAEBD24AF7FCF0052D465 /* ListController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListController.swift; sourceTree = ""; }; + 531BAEBF24B0CA5E0052D465 /* Country.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Country.swift; sourceTree = ""; }; + 531BAEC124B0CB000052D465 /* countryInfo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = countryInfo.json; sourceTree = ""; }; + 53ABACDF24B33B500050AE6E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 531BAEA324AF76BE0052D465 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 531BAE9D24AF76BE0052D465 = { + isa = PBXGroup; + children = ( + 53ABACDF24B33B500050AE6E /* README.md */, + 531BAEA824AF76BE0052D465 /* List */, + 531BAEA724AF76BE0052D465 /* Products */, + ); + sourceTree = ""; + }; + 531BAEA724AF76BE0052D465 /* Products */ = { + isa = PBXGroup; + children = ( + 531BAEA624AF76BE0052D465 /* List.app */, + ); + name = Products; + sourceTree = ""; + }; + 531BAEA824AF76BE0052D465 /* List */ = { + isa = PBXGroup; + children = ( + 531BAEA924AF76BE0052D465 /* AppDelegate.swift */, + 531BAEAB24AF76BE0052D465 /* SceneDelegate.swift */, + 531BAEBD24AF7FCF0052D465 /* ListController.swift */, + 531BAEBF24B0CA5E0052D465 /* Country.swift */, + 531BAEAF24AF76BE0052D465 /* Main.storyboard */, + 531BAEB224AF76C00052D465 /* Assets.xcassets */, + 531BAEC124B0CB000052D465 /* countryInfo.json */, + 531BAEB424AF76C10052D465 /* LaunchScreen.storyboard */, + 531BAEB724AF76C10052D465 /* Info.plist */, + ); + path = List; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 531BAEA524AF76BE0052D465 /* List */ = { + isa = PBXNativeTarget; + buildConfigurationList = 531BAEBA24AF76C10052D465 /* Build configuration list for PBXNativeTarget "List" */; + buildPhases = ( + 531BAEA224AF76BE0052D465 /* Sources */, + 531BAEA324AF76BE0052D465 /* Frameworks */, + 531BAEA424AF76BE0052D465 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = List; + productName = List; + productReference = 531BAEA624AF76BE0052D465 /* List.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 531BAE9E24AF76BE0052D465 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1200; + LastUpgradeCheck = 1200; + TargetAttributes = { + 531BAEA524AF76BE0052D465 = { + CreatedOnToolsVersion = 12.0; + }; + }; + }; + buildConfigurationList = 531BAEA124AF76BE0052D465 /* Build configuration list for PBXProject "List" */; + compatibilityVersion = "Xcode 11.4"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 531BAE9D24AF76BE0052D465; + productRefGroup = 531BAEA724AF76BE0052D465 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 531BAEA524AF76BE0052D465 /* List */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 531BAEA424AF76BE0052D465 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 531BAEC224B0D9A50052D465 /* countryInfo.json in Resources */, + 531BAEB624AF76C10052D465 /* LaunchScreen.storyboard in Resources */, + 531BAEB324AF76C00052D465 /* Assets.xcassets in Resources */, + 531BAEB124AF76BE0052D465 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 531BAEA224AF76BE0052D465 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 531BAEC024B0CA5E0052D465 /* Country.swift in Sources */, + 531BAEAA24AF76BE0052D465 /* AppDelegate.swift in Sources */, + 531BAEAC24AF76BE0052D465 /* SceneDelegate.swift in Sources */, + 531BAEBE24AF7FCF0052D465 /* ListController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 531BAEAF24AF76BE0052D465 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 531BAEB024AF76BE0052D465 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 531BAEB424AF76C10052D465 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 531BAEB524AF76C10052D465 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 531BAEB824AF76C10052D465 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 531BAEB924AF76C10052D465 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 531BAEBB24AF76C10052D465 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = List/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.List; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 531BAEBC24AF76C10052D465 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = List/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.List; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 531BAEA124AF76BE0052D465 /* Build configuration list for PBXProject "List" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 531BAEB824AF76C10052D465 /* Debug */, + 531BAEB924AF76C10052D465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 531BAEBA24AF76C10052D465 /* Build configuration list for PBXNativeTarget "List" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 531BAEBB24AF76C10052D465 /* Debug */, + 531BAEBC24AF76C10052D465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 531BAE9E24AF76BE0052D465 /* Project object */; +} diff --git a/ListCollection/List/AppDelegate.swift b/ListCollection/List/AppDelegate.swift new file mode 100644 index 0000000..2d32c08 --- /dev/null +++ b/ListCollection/List/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/ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/AppIcon.appiconset/Contents.json b/ListCollection/List/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ListCollection/List/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/Contents.json b/ListCollection/List/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Base.lproj/LaunchScreen.storyboard b/ListCollection/List/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/ListCollection/List/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Base.lproj/Main.storyboard b/ListCollection/List/Base.lproj/Main.storyboard new file mode 100644 index 0000000..866e872 --- /dev/null +++ b/ListCollection/List/Base.lproj/Main.storyboard @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Country.swift b/ListCollection/List/Country.swift new file mode 100644 index 0000000..0c525b0 --- /dev/null +++ b/ListCollection/List/Country.swift @@ -0,0 +1,118 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import Foundation + +struct Country: Hashable { + var name: String + var capital: String? + var continent: String + var currency: String? + var area: Double + var population: Int + var visited: Bool + + var formattedPopulation: String { + NumberFormatter.localizedString(from: population as NSNumber, number: .decimal) + } + + var formattedArea: String { + NumberFormatter.localizedString(from: area as NSNumber, number: .decimal) + } + + init(name: String, capital: String? = nil, continent: String, currency: String? = nil, area: Double = 0, population: Int = 0, visited: Bool = false) { + self.name = name + self.capital = capital + self.continent = continent + self.currency = currency + self.area = area + self.population = population + self.visited = visited + } +} + +// MARK: - Codable +extension Country: Codable { + enum CodingKeys: String, CodingKey { + case name = "countryName" + case capital + case continent = "continentName" + case currency = "currencyCode" + case area = "areaInSqKm" + case population + case visited + } + + init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + name = try values.decode(String.self, forKey: .name) + capital = try values.decodeIfPresent(String.self, forKey: .capital) + continent = try values.decode(String.self, forKey: .continent) + currency = try values.decodeIfPresent(String.self, forKey: .currency) + + let areaString = try values.decode(String.self, forKey: .area) + let popString = try values.decode(String.self, forKey: .population) + + let numberFormatter = NumberFormatter() + numberFormatter.locale = Locale(identifier: "en-US") + if let areaNumber = numberFormatter.number(from: areaString) { + area = areaNumber.doubleValue + } else { + throw DecodingError.dataCorruptedError(forKey: .area, in: values, debugDescription: "Expected a double, got [\(areaString)]") + } + + if let popNumber = numberFormatter.number(from: popString) { + population = popNumber.intValue + } else { + throw DecodingError.dataCorruptedError(forKey: .population, in: values, debugDescription: "Expected an Int, got \(popString)") + } + + visited = try values.decodeIfPresent(Bool.self, forKey: .visited) ?? false + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(name, forKey: .name) + try container.encode(capital, forKey: .capital) + try container.encode(continent, forKey: .continent) + try container.encode(currency, forKey: .currency) + + let numberFormatter = NumberFormatter() + let areaString = numberFormatter.string(from: NSNumber(value: area)) + let popString = numberFormatter.string(from: NSNumber(value: population)) + try container.encode(areaString, forKey: .area) + try container.encode(popString, forKey: .population) + + try container.encode(visited, forKey: .visited) + } +} + +struct CountryInfo: Codable { + var geonames: [Country] +} diff --git a/ListCollection/List/Info.plist b/ListCollection/List/Info.plist new file mode 100644 index 0000000..5b531f7 --- /dev/null +++ b/ListCollection/List/Info.plist @@ -0,0 +1,66 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ListCollection/List/ListController.swift b/ListCollection/List/ListController.swift new file mode 100644 index 0000000..5d2fd2b --- /dev/null +++ b/ListCollection/List/ListController.swift @@ -0,0 +1,96 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class ListController: UICollectionViewController { + var countries = [Country]() { + didSet { + applySnapshot() + } + } + + private enum Section: CaseIterable { + case main + } + + private lazy var dataSource: UICollectionViewDiffableDataSource = { + let cellRegistration = UICollectionView.CellRegistration { cell, _, country in + var content = cell.defaultContentConfiguration() + content.text = country.name + + content.secondaryText = country.capital + content.secondaryTextProperties.color = .secondaryLabel + content.secondaryTextProperties.font = UIFont.preferredFont(forTextStyle: .subheadline) + + content.image = UIImage(systemName: "globe") + content.imageProperties.preferredSymbolConfiguration = .init(font: content.textProperties.font, scale: .large) + + cell.contentConfiguration = content + + // Example of setting a background configuration +// var background = UIBackgroundConfiguration.listPlainCell() +// background.backgroundColor = .systemYellow +// cell.backgroundConfiguration = background + + cell.accessories = [.disclosureIndicator()] + cell.tintColor = .systemPurple + } + + return UICollectionViewDiffableDataSource(collectionView: collectionView) { (collectionView, indexPath, country) -> UICollectionViewCell? in + collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: country) + } + }() + + override func viewDidLoad() { + super.viewDidLoad() + createLayout() + applySnapshot(animatingDifferences: false) + } + + private func applySnapshot(animatingDifferences: Bool = true) { + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections(Section.allCases) + snapshot.appendItems(countries) + dataSource.apply(snapshot, animatingDifferences: animatingDifferences) + } + + private func createLayout() { + var config = UICollectionLayoutListConfiguration(appearance: .insetGrouped) + config.backgroundColor = .systemPurple + collectionView.collectionViewLayout = UICollectionViewCompositionalLayout.list(using: config) + } + + override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if let country = dataSource.itemIdentifier(for: indexPath) { + print("didSelect \(country.name)") + collectionView.deselectItem(at: indexPath, animated: true) + } + } +} diff --git a/ListCollection/List/SceneDelegate.swift b/ListCollection/List/SceneDelegate.swift new file mode 100644 index 0000000..18313c1 --- /dev/null +++ b/ListCollection/List/SceneDelegate.swift @@ -0,0 +1,61 @@ +// Created by Keith Harrison https://useyourloaf.com +// Copyright © 2020 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + private var listController: ListController? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + if let navController = window?.rootViewController as? UINavigationController { + listController = navController.topViewController as? ListController + loadData() + } + } + + private func loadData() { + guard let url = Bundle.main.url(forResource: "countryInfo", withExtension: "json") else { + return + } + + DispatchQueue.global(qos: .userInteractive).async { + do { + let data = try Data(contentsOf: url) + let countryInfo = try JSONDecoder().decode(CountryInfo.self, from: data) + let countries = countryInfo.geonames.sorted(by: { $0.name < $1.name }) + DispatchQueue.main.async { + self.listController?.countries = countries + } + } catch { + print("Unable to load data: \(error)") + } + } + } +} diff --git a/ListCollection/List/countryInfo.json b/ListCollection/List/countryInfo.json new file mode 100644 index 0000000..026c805 --- /dev/null +++ b/ListCollection/List/countryInfo.json @@ -0,0 +1,4752 @@ +{"geonames": [ + { + "continent": "EU", + "capital": "Andorra la Vella", + "languages": "ca", + "geonameId": 3041565, + "south": 42.42874300100004, + "isoAlpha3": "AND", + "north": 42.65576500000003, + "fipsCode": "AN", + "population": "77006", + "east": 1.786576000000025, + "isoNumeric": "020", + "areaInSqKm": "468.0", + "countryCode": "AD", + "west": 1.413760001000071, + "countryName": "Andorra", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "Abu Dhabi", + "languages": "ar-AE,fa,en,hi,ur", + "geonameId": 290557, + "south": 22.6315119400001, + "isoAlpha3": "ARE", + "north": 26.0693916590001, + "fipsCode": "AE", + "population": "9630959", + "east": 56.381222289, + "isoNumeric": "784", + "areaInSqKm": "82880.0", + "countryCode": "AE", + "west": 51.5904085340001, + "countryName": "United Arab Emirates", + "continentName": "Asia", + "currencyCode": "AED" + }, + { + "continent": "AS", + "capital": "Kabul", + "languages": "fa-AF,ps,uz-AF,tk", + "geonameId": 1149361, + "south": 29.3770645357176, + "isoAlpha3": "AFG", + "north": 38.4907920755748, + "fipsCode": "AF", + "population": "37172386", + "east": 74.8894511481168, + "isoNumeric": "004", + "areaInSqKm": "647500.0", + "countryCode": "AF", + "west": 60.4720833972263, + "countryName": "Afghanistan", + "continentName": "Asia", + "currencyCode": "AFN" + }, + { + "continent": "NA", + "capital": "St John's", + "languages": "en-AG", + "geonameId": 3576396, + "south": 16.9986381530001, + "isoAlpha3": "ATG", + "north": 17.72910877443121, + "fipsCode": "AC", + "population": "96286", + "east": -61.672164917, + "isoNumeric": "028", + "areaInSqKm": "443.0", + "countryCode": "AG", + "west": -61.90630722, + "countryName": "Antigua and Barbuda", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "NA", + "capital": "The Valley", + "languages": "en-AI", + "geonameId": 3573511, + "south": 18.160292974311673, + "isoAlpha3": "AIA", + "north": 18.276901971658063, + "fipsCode": "AV", + "population": "13254", + "east": -62.96655544577948, + "isoNumeric": "660", + "areaInSqKm": "102.0", + "countryCode": "AI", + "west": -63.16808989603879, + "countryName": "Anguilla", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "EU", + "capital": "Tirana", + "languages": "sq,el", + "geonameId": 783754, + "south": 39.6448624829142, + "isoAlpha3": "ALB", + "north": 42.6611669383269, + "fipsCode": "AL", + "population": "2866376", + "east": 21.0574334835312, + "isoNumeric": "008", + "areaInSqKm": "28748.0", + "countryCode": "AL", + "west": 19.2639112711741, + "countryName": "Albania", + "continentName": "Europe", + "currencyCode": "ALL" + }, + { + "continent": "AS", + "capital": "Yerevan", + "languages": "hy", + "geonameId": 174982, + "south": 38.840244, + "isoAlpha3": "ARM", + "north": 41.3009930000001, + "fipsCode": "AM", + "population": "2951776", + "east": 46.6342220000001, + "isoNumeric": "051", + "areaInSqKm": "29800.0", + "countryCode": "AM", + "west": 43.447417525, + "countryName": "Armenia", + "continentName": "Asia", + "currencyCode": "AMD" + }, + { + "continent": "AF", + "capital": "Luanda", + "languages": "pt-AO", + "geonameId": 3351879, + "south": -18.042076, + "isoAlpha3": "AGO", + "north": -4.376826, + "fipsCode": "AO", + "population": "30809762", + "east": 24.082119, + "isoNumeric": "024", + "areaInSqKm": "1246700.0", + "countryCode": "AO", + "west": 11.679219, + "countryName": "Angola", + "continentName": "Africa", + "currencyCode": "AOA" + }, + { + "continent": "AN", + "capital": "", + "languages": "", + "geonameId": 6697173, + "south": -89.9999, + "isoAlpha3": "ATA", + "north": -60.515533, + "fipsCode": "AY", + "population": "0", + "east": 179.9999, + "isoNumeric": "010", + "areaInSqKm": "1.4E7", + "countryCode": "AQ", + "west": -179.9999, + "countryName": "Antarctica", + "continentName": "Antarctica", + "currencyCode": "" + }, + { + "continent": "SA", + "capital": "Buenos Aires", + "languages": "es-AR,en,it,de,fr,gn", + "geonameId": 3865483, + "south": -55.0576984539999, + "isoAlpha3": "ARG", + "north": -21.777951173, + "fipsCode": "AR", + "population": "44494502", + "east": -53.637962552, + "isoNumeric": "032", + "areaInSqKm": "2766890.0", + "countryCode": "AR", + "west": -73.566302817, + "countryName": "Argentina", + "continentName": "South America", + "currencyCode": "ARS" + }, + { + "continent": "OC", + "capital": "Pago Pago", + "languages": "en-AS,sm,to", + "geonameId": 5880801, + "south": -14.373776, + "isoAlpha3": "ASM", + "north": -11.047857, + "fipsCode": "AQ", + "population": "55465", + "east": -169.418925, + "isoNumeric": "016", + "areaInSqKm": "199.0", + "countryCode": "AS", + "west": -171.090042, + "countryName": "American Samoa", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Vienna", + "languages": "de-AT,hr,hu,sl", + "geonameId": 2782113, + "south": 46.3726520216244, + "isoAlpha3": "AUT", + "north": 49.0211627691393, + "fipsCode": "AU", + "population": "8847037", + "east": 17.1620685652599, + "isoNumeric": "040", + "areaInSqKm": "83858.0", + "countryCode": "AT", + "west": 9.53095237240833, + "countryName": "Austria", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Canberra", + "languages": "en-AU", + "geonameId": 2077456, + "south": -43.643194904, + "isoAlpha3": "AUS", + "north": -10.059130975, + "fipsCode": "AS", + "population": "24992369", + "east": 153.638727019, + "isoNumeric": "036", + "areaInSqKm": "7686850.0", + "countryCode": "AU", + "west": 112.921113949, + "countryName": "Australia", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "NA", + "capital": "Oranjestad", + "languages": "nl-AW,pap,es,en", + "geonameId": 3577279, + "south": 12.411707706190716, + "isoAlpha3": "ABW", + "north": 12.623718127152925, + "fipsCode": "AA", + "population": "105845", + "east": -69.86575120104982, + "isoNumeric": "533", + "areaInSqKm": "193.0", + "countryCode": "AW", + "west": -70.0644737196045, + "countryName": "Aruba", + "continentName": "North America", + "currencyCode": "AWG" + }, + { + "continent": "EU", + "capital": "Mariehamn", + "languages": "sv-AX", + "geonameId": 661882, + "south": 59.90675, + "isoAlpha3": "ALA", + "north": 60.488861, + "fipsCode": "", + "population": "26711", + "east": 21.011862, + "isoNumeric": "248", + "areaInSqKm": "1580.0", + "countryCode": "AX", + "west": 19.317694, + "countryName": "Åland", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "Baku", + "languages": "az,ru,hy", + "geonameId": 587116, + "south": 38.3922170010001, + "isoAlpha3": "AZE", + "north": 41.9123400010001, + "fipsCode": "AJ", + "population": "9942334", + "east": 50.3700828550001, + "isoNumeric": "031", + "areaInSqKm": "86600.0", + "countryCode": "AZ", + "west": 44.764683001, + "countryName": "Azerbaijan", + "continentName": "Asia", + "currencyCode": "AZN" + }, + { + "continent": "EU", + "capital": "Sarajevo", + "languages": "bs,hr-BA,sr-BA", + "geonameId": 3277605, + "south": 42.555473846, + "isoAlpha3": "BIH", + "north": 45.276539649, + "fipsCode": "BK", + "population": "3323929", + "east": 19.6237016800001, + "isoNumeric": "070", + "areaInSqKm": "51129.0", + "countryCode": "BA", + "west": 15.728732108, + "countryName": "Bosnia and Herzegovina", + "continentName": "Europe", + "currencyCode": "BAM" + }, + { + "continent": "NA", + "capital": "Bridgetown", + "languages": "en-BB", + "geonameId": 3374084, + "south": 13.0448331850001, + "isoAlpha3": "BRB", + "north": 13.3358612060001, + "fipsCode": "BB", + "population": "286641", + "east": -59.420749664, + "isoNumeric": "052", + "areaInSqKm": "431.0", + "countryCode": "BB", + "west": -59.6526374819999, + "countryName": "Barbados", + "continentName": "North America", + "currencyCode": "BBD" + }, + { + "continent": "AS", + "capital": "Dhaka", + "languages": "bn-BD,en", + "geonameId": 1210997, + "south": 20.743334, + "isoAlpha3": "BGD", + "north": 26.631945, + "fipsCode": "BG", + "population": "161356039", + "east": 92.673668, + "isoNumeric": "050", + "areaInSqKm": "144000.0", + "countryCode": "BD", + "west": 88.028336, + "countryName": "Bangladesh", + "continentName": "Asia", + "currencyCode": "BDT" + }, + { + "continent": "EU", + "capital": "Brussels", + "languages": "nl-BE,fr-BE,de-BE", + "geonameId": 2802361, + "south": 49.496968483036, + "isoAlpha3": "BEL", + "north": 51.5051118897455, + "fipsCode": "BE", + "population": "11422068", + "east": 6.40793743953125, + "isoNumeric": "056", + "areaInSqKm": "30510.0", + "countryCode": "BE", + "west": 2.54132898439873, + "countryName": "Belgium", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Ouagadougou", + "languages": "fr-BF,mos", + "geonameId": 2361809, + "south": 9.41047177500008, + "isoAlpha3": "BFA", + "north": 15.084033447, + "fipsCode": "UV", + "population": "19751535", + "east": 2.40435976900005, + "isoNumeric": "854", + "areaInSqKm": "274200.0", + "countryCode": "BF", + "west": -5.51324157299996, + "countryName": "Burkina Faso", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "EU", + "capital": "Sofia", + "languages": "bg,tr-BG,rom", + "geonameId": 732800, + "south": 41.2353414930001, + "isoAlpha3": "BGR", + "north": 44.215451, + "fipsCode": "BU", + "population": "7000039", + "east": 28.6102771760001, + "isoNumeric": "100", + "areaInSqKm": "110910.0", + "countryCode": "BG", + "west": 22.357156753, + "countryName": "Bulgaria", + "continentName": "Europe", + "currencyCode": "BGN" + }, + { + "continent": "AS", + "capital": "Manama", + "languages": "ar-BH,en,fa,ur", + "geonameId": 290291, + "south": 25.790910001, + "isoAlpha3": "BHR", + "north": 26.3308150010001, + "fipsCode": "BA", + "population": "1569439", + "east": 50.720622, + "isoNumeric": "048", + "areaInSqKm": "665.0", + "countryCode": "BH", + "west": 50.3158550000001, + "countryName": "Bahrain", + "continentName": "Asia", + "currencyCode": "BHD" + }, + { + "continent": "AF", + "capital": "Gitega", + "languages": "fr-BI,rn", + "geonameId": 433561, + "south": -4.46932899899997, + "isoAlpha3": "BDI", + "north": -2.30973016299993, + "fipsCode": "BY", + "population": "11175378", + "east": 30.84954, + "isoNumeric": "108", + "areaInSqKm": "27830.0", + "countryCode": "BI", + "west": 29.0009680000001, + "countryName": "Burundi", + "continentName": "Africa", + "currencyCode": "BIF" + }, + { + "continent": "AF", + "capital": "Porto-Novo", + "languages": "fr-BJ", + "geonameId": 2395170, + "south": 6.23477794100006, + "isoAlpha3": "BEN", + "north": 12.4086110000001, + "fipsCode": "BN", + "population": "11485048", + "east": 3.84306303800003, + "isoNumeric": "204", + "areaInSqKm": "112620.0", + "countryCode": "BJ", + "west": 0.775412326000037, + "countryName": "Benin", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "NA", + "capital": "Gustavia", + "languages": "fr", + "geonameId": 3578476, + "south": 17.878183227405575, + "isoAlpha3": "BLM", + "north": 17.928808791949283, + "fipsCode": "TB", + "population": "8450", + "east": -62.788983372985854, + "isoNumeric": "652", + "areaInSqKm": "21.0", + "countryCode": "BL", + "west": -62.8739118253784, + "countryName": "Saint Barthélemy", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "NA", + "capital": "Hamilton", + "languages": "en-BM,pt", + "geonameId": 3573345, + "south": 32.247240870129, + "isoAlpha3": "BMU", + "north": 32.3909785046382, + "fipsCode": "BD", + "population": "63968", + "east": -64.6473267161152, + "isoNumeric": "060", + "areaInSqKm": "53.0", + "countryCode": "BM", + "west": -64.8870418687384, + "countryName": "Bermuda", + "continentName": "North America", + "currencyCode": "BMD" + }, + { + "continent": "AS", + "capital": "Bandar Seri Begawan", + "languages": "ms-BN,en-BN", + "geonameId": 1820814, + "south": 4.00264384400003, + "isoAlpha3": "BRN", + "north": 5.04571171901151, + "fipsCode": "BX", + "population": "428962", + "east": 115.364671704, + "isoNumeric": "096", + "areaInSqKm": "5770.0", + "countryCode": "BN", + "west": 114.075926291, + "countryName": "Brunei", + "continentName": "Asia", + "currencyCode": "BND" + }, + { + "continent": "SA", + "capital": "Sucre", + "languages": "es-BO,qu,ay", + "geonameId": 3923057, + "south": -22.89809, + "isoAlpha3": "BOL", + "north": -9.66932299899997, + "fipsCode": "BL", + "population": "11353142", + "east": -57.4538029999999, + "isoNumeric": "068", + "areaInSqKm": "1098580.0", + "countryCode": "BO", + "west": -69.644939573, + "countryName": "Bolivia", + "continentName": "South America", + "currencyCode": "BOB" + }, + { + "continent": "NA", + "capital": "Kralendijk", + "languages": "nl,pap,en", + "geonameId": 7626844, + "south": 12.024024222896262, + "isoAlpha3": "BES", + "north": 12.312385778727828, + "fipsCode": "", + "population": "18012", + "east": -68.19423837039591, + "isoNumeric": "535", + "areaInSqKm": "328.0", + "countryCode": "BQ", + "west": -68.42092654856276, + "countryName": "Bonaire, Sint Eustatius, and Saba", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "SA", + "capital": "Brasília", + "languages": "pt-BR,es,en,fr", + "geonameId": 3469034, + "south": -33.750706, + "isoAlpha3": "BRA", + "north": 5.264877, + "fipsCode": "BR", + "population": "209469333", + "east": -32.392998, + "isoNumeric": "076", + "areaInSqKm": "8511965.0", + "countryCode": "BR", + "west": -73.985535, + "countryName": "Brazil", + "continentName": "South America", + "currencyCode": "BRL" + }, + { + "continent": "NA", + "capital": "Nassau", + "languages": "en-BS", + "geonameId": 3572887, + "south": 22.852743, + "isoAlpha3": "BHS", + "north": 26.919243, + "fipsCode": "BF", + "population": "385640", + "east": -74.423874, + "isoNumeric": "044", + "areaInSqKm": "13940.0", + "countryCode": "BS", + "west": -78.999528159018, + "countryName": "Bahamas", + "continentName": "North America", + "currencyCode": "BSD" + }, + { + "continent": "AS", + "capital": "Thimphu", + "languages": "dz", + "geonameId": 1252634, + "south": 26.702020985, + "isoAlpha3": "BTN", + "north": 28.246987001, + "fipsCode": "BT", + "population": "754394", + "east": 92.12523192, + "isoNumeric": "064", + "areaInSqKm": "47000.0", + "countryCode": "BT", + "west": 88.7455215570001, + "countryName": "Bhutan", + "continentName": "Asia", + "currencyCode": "BTN" + }, + { + "continent": "AN", + "capital": "", + "languages": "", + "geonameId": 3371123, + "south": -54.4507993522734, + "isoAlpha3": "BVT", + "north": -54.3887383509872, + "fipsCode": "BV", + "population": "0", + "east": 3.434845577758324, + "isoNumeric": "074", + "areaInSqKm": "49.0", + "countryCode": "BV", + "west": 3.286776428037342, + "countryName": "Bouvet Island", + "continentName": "Antarctica", + "currencyCode": "NOK" + }, + { + "continent": "AF", + "capital": "Gaborone", + "languages": "en-BW,tn-BW", + "geonameId": 933860, + "south": -26.907545, + "isoAlpha3": "BWA", + "north": -17.778136999, + "fipsCode": "BC", + "population": "2254126", + "east": 29.375304, + "isoNumeric": "072", + "areaInSqKm": "600370.0", + "countryCode": "BW", + "west": 19.998903, + "countryName": "Botswana", + "continentName": "Africa", + "currencyCode": "BWP" + }, + { + "continent": "EU", + "capital": "Minsk", + "languages": "be,ru", + "geonameId": 630336, + "south": 51.262011, + "isoAlpha3": "BLR", + "north": 56.1724940010001, + "fipsCode": "BO", + "population": "9485386", + "east": 32.776820001, + "isoNumeric": "112", + "areaInSqKm": "207600.0", + "countryCode": "BY", + "west": 23.1781980010001, + "countryName": "Belarus", + "continentName": "Europe", + "currencyCode": "BYN" + }, + { + "continent": "NA", + "capital": "Belmopan", + "languages": "en-BZ,es", + "geonameId": 3582678, + "south": 15.8893, + "isoAlpha3": "BLZ", + "north": 18.496557, + "fipsCode": "BH", + "population": "383071", + "east": -87.776985, + "isoNumeric": "084", + "areaInSqKm": "22966.0", + "countryCode": "BZ", + "west": -89.224815, + "countryName": "Belize", + "continentName": "North America", + "currencyCode": "BZD" + }, + { + "continent": "NA", + "capital": "Ottawa", + "languages": "en-CA,fr-CA,iu", + "geonameId": 6251999, + "south": 41.67598, + "isoAlpha3": "CAN", + "north": 83.110626, + "fipsCode": "CA", + "population": "37058856", + "east": -52.636291, + "isoNumeric": "124", + "areaInSqKm": "9984670.0", + "countryCode": "CA", + "west": -141, + "countryName": "Canada", + "continentName": "North America", + "currencyCode": "CAD" + }, + { + "continent": "AS", + "capital": "West Island", + "languages": "ms-CC,en", + "geonameId": 1547376, + "south": -12.208725839, + "isoAlpha3": "CCK", + "north": -12.072459094, + "fipsCode": "CK", + "population": "628", + "east": 96.929489344, + "isoNumeric": "166", + "areaInSqKm": "14.0", + "countryCode": "CC", + "west": 96.816941408, + "countryName": "Cocos [Keeling] Islands", + "continentName": "Asia", + "currencyCode": "AUD" + }, + { + "continent": "AF", + "capital": "Kinshasa", + "languages": "fr-CD,ln,ktu,kg,sw,lua", + "geonameId": 203312, + "south": -13.459034999, + "isoAlpha3": "COD", + "north": 5.39200300000005, + "fipsCode": "CG", + "population": "84068091", + "east": 31.3146120000001, + "isoNumeric": "180", + "areaInSqKm": "2345410.0", + "countryCode": "CD", + "west": 12.202361491, + "countryName": "DR Congo", + "continentName": "Africa", + "currencyCode": "CDF" + }, + { + "continent": "AF", + "capital": "Bangui", + "languages": "fr-CF,sg,ln,kg", + "geonameId": 239880, + "south": 2.22305300000005, + "isoAlpha3": "CAF", + "north": 11.017957, + "fipsCode": "CT", + "population": "4666377", + "east": 27.4583050000001, + "isoNumeric": "140", + "areaInSqKm": "622984.0", + "countryCode": "CF", + "west": 14.4150980000001, + "countryName": "Central African Republic", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "AF", + "capital": "Brazzaville", + "languages": "fr-CG,kg,ln-CG", + "geonameId": 2260494, + "south": -5.04072158799994, + "isoAlpha3": "COG", + "north": 3.70779100000004, + "fipsCode": "CF", + "population": "5244363", + "east": 18.65042119, + "isoNumeric": "178", + "areaInSqKm": "342000.0", + "countryCode": "CG", + "west": 11.1520760600001, + "countryName": "Congo Republic", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "EU", + "capital": "Bern", + "languages": "de-CH,fr-CH,it-CH,rm", + "geonameId": 2658434, + "south": 45.8191539516188, + "isoAlpha3": "CHE", + "north": 47.8098679329775, + "fipsCode": "SZ", + "population": "8516543", + "east": 10.4934735095497, + "isoNumeric": "756", + "areaInSqKm": "41290.0", + "countryCode": "CH", + "west": 5.95661377423453, + "countryName": "Switzerland", + "continentName": "Europe", + "currencyCode": "CHF" + }, + { + "continent": "AF", + "capital": "Yamoussoukro", + "languages": "fr-CI", + "geonameId": 2287781, + "south": 4.36035248000007, + "isoAlpha3": "CIV", + "north": 10.740015, + "fipsCode": "IV", + "population": "25069229", + "east": -2.49303099999997, + "isoNumeric": "384", + "areaInSqKm": "322460.0", + "countryCode": "CI", + "west": -8.60205899999994, + "countryName": "Ivory Coast", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "OC", + "capital": "Avarua", + "languages": "en-CK,mi", + "geonameId": 1899402, + "south": -21.944164, + "isoAlpha3": "COK", + "north": -10.023114, + "fipsCode": "CW", + "population": "21388", + "east": -157.312134, + "isoNumeric": "184", + "areaInSqKm": "240.0", + "countryCode": "CK", + "west": -161.093658, + "countryName": "Cook Islands", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "SA", + "capital": "Santiago", + "languages": "es-CL", + "geonameId": 3895114, + "south": -55.909795409, + "isoAlpha3": "CHL", + "north": -17.4977759459999, + "fipsCode": "CI", + "population": "18729160", + "east": -66.416152278, + "isoNumeric": "152", + "areaInSqKm": "756950.0", + "countryCode": "CL", + "west": -80.8370287079999, + "countryName": "Chile", + "continentName": "South America", + "currencyCode": "CLP" + }, + { + "continent": "AF", + "capital": "Yaoundé", + "languages": "en-CM,fr-CM", + "geonameId": 2233387, + "south": 1.65590000000003, + "isoAlpha3": "CMR", + "north": 13.083334, + "fipsCode": "CM", + "population": "25216237", + "east": 16.1944080000001, + "isoNumeric": "120", + "areaInSqKm": "475440.0", + "countryCode": "CM", + "west": 8.49843402900007, + "countryName": "Cameroon", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "AS", + "capital": "Beijing", + "languages": "zh-CN,yue,wuu,dta,ug,za", + "geonameId": 1814991, + "south": 15.775416, + "isoAlpha3": "CHN", + "north": 53.560974001, + "fipsCode": "CH", + "population": "1392730000", + "east": 134.7754563, + "isoNumeric": "156", + "areaInSqKm": "9596960.0", + "countryCode": "CN", + "west": 73.4994140000001, + "countryName": "China", + "continentName": "Asia", + "currencyCode": "CNY" + }, + { + "continent": "SA", + "capital": "Bogotá", + "languages": "es-CO", + "geonameId": 3686110, + "south": -4.22839224299997, + "isoAlpha3": "COL", + "north": 13.38600323, + "fipsCode": "CO", + "population": "49648685", + "east": -66.8472153989999, + "isoNumeric": "170", + "areaInSqKm": "1138910.0", + "countryCode": "CO", + "west": -81.735775648, + "countryName": "Colombia", + "continentName": "South America", + "currencyCode": "COP" + }, + { + "continent": "NA", + "capital": "San José", + "languages": "es-CR,en", + "geonameId": 3624060, + "south": 8.03962731803416, + "isoAlpha3": "CRI", + "north": 11.2197589122308, + "fipsCode": "CS", + "population": "4999441", + "east": -82.552318987959, + "isoNumeric": "188", + "areaInSqKm": "51100.0", + "countryCode": "CR", + "west": -85.9502523586265, + "countryName": "Costa Rica", + "continentName": "North America", + "currencyCode": "CRC" + }, + { + "continent": "NA", + "capital": "Havana", + "languages": "es-CU,pap", + "geonameId": 3562981, + "south": 19.828083, + "isoAlpha3": "CUB", + "north": 23.226042, + "fipsCode": "CU", + "population": "11338138", + "east": -74.131775, + "isoNumeric": "192", + "areaInSqKm": "110860.0", + "countryCode": "CU", + "west": -84.957428, + "countryName": "Cuba", + "continentName": "North America", + "currencyCode": "CUP" + }, + { + "continent": "AF", + "capital": "Praia", + "languages": "pt-CV", + "geonameId": 3374766, + "south": 14.8152942670001, + "isoAlpha3": "CPV", + "north": 17.204706193, + "fipsCode": "CV", + "population": "543767", + "east": -22.6674270629999, + "isoNumeric": "132", + "areaInSqKm": "4033.0", + "countryCode": "CV", + "west": -25.3609161379999, + "countryName": "Cabo Verde", + "continentName": "Africa", + "currencyCode": "CVE" + }, + { + "continent": "NA", + "capital": "Willemstad", + "languages": "nl,pap", + "geonameId": 7626836, + "south": 12.032745, + "isoAlpha3": "CUW", + "north": 12.385672, + "fipsCode": "UC", + "population": "159849", + "east": -68.733948, + "isoNumeric": "531", + "areaInSqKm": "444.0", + "countryCode": "CW", + "west": -69.157204, + "countryName": "Curaçao", + "continentName": "North America", + "currencyCode": "ANG" + }, + { + "continent": "OC", + "capital": "Flying Fish Cove", + "languages": "en,zh,ms-CC", + "geonameId": 2078138, + "south": -10.5704829995, + "isoAlpha3": "CXR", + "north": -10.412356007, + "fipsCode": "KT", + "population": "1500", + "east": 105.712596992, + "isoNumeric": "162", + "areaInSqKm": "135.0", + "countryCode": "CX", + "west": 105.533276992, + "countryName": "Christmas Island", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "EU", + "capital": "Nicosia", + "languages": "el-CY,tr-CY,en", + "geonameId": 146669, + "south": 34.6332846722908, + "isoAlpha3": "CYP", + "north": 35.701527, + "fipsCode": "CY", + "population": "1189265", + "east": 34.59791599999994, + "isoNumeric": "196", + "areaInSqKm": "9250.0", + "countryCode": "CY", + "west": 32.27308300000004, + "countryName": "Cyprus", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Prague", + "languages": "cs,sk", + "geonameId": 3077311, + "south": 48.551892864201, + "isoAlpha3": "CZE", + "north": 51.0557782422661, + "fipsCode": "EZ", + "population": "10625695", + "east": 18.8592743799298, + "isoNumeric": "203", + "areaInSqKm": "78866.0", + "countryCode": "CZ", + "west": 12.0906691601139, + "countryName": "Czechia", + "continentName": "Europe", + "currencyCode": "CZK" + }, + { + "continent": "EU", + "capital": "Berlin", + "languages": "de", + "geonameId": 2921044, + "south": 47.2701236047002, + "isoAlpha3": "DEU", + "north": 55.0583836008072, + "fipsCode": "GM", + "population": "82927922", + "east": 15.0418156516163, + "isoNumeric": "276", + "areaInSqKm": "357021.0", + "countryCode": "DE", + "west": 5.8663152683722, + "countryName": "Germany", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Djibouti", + "languages": "fr-DJ,ar,so-DJ,aa", + "geonameId": 223816, + "south": 10.9129530000001, + "isoAlpha3": "DJI", + "north": 12.7136967920001, + "fipsCode": "DJ", + "population": "958920", + "east": 43.4175099920001, + "isoNumeric": "262", + "areaInSqKm": "23000.0", + "countryCode": "DJ", + "west": 41.7708460000001, + "countryName": "Djibouti", + "continentName": "Africa", + "currencyCode": "DJF" + }, + { + "continent": "EU", + "capital": "Copenhagen", + "languages": "da-DK,en,fo,de-DK", + "geonameId": 2623032, + "south": 54.5590783718363, + "isoAlpha3": "DNK", + "north": 57.3282078631757, + "fipsCode": "DA", + "population": "5797446", + "east": 15.1569721573943, + "isoNumeric": "208", + "areaInSqKm": "43094.0", + "countryCode": "DK", + "west": 8.07250975308422, + "countryName": "Denmark", + "continentName": "Europe", + "currencyCode": "DKK" + }, + { + "continent": "NA", + "capital": "Roseau", + "languages": "en-DM", + "geonameId": 3575830, + "south": 15.206540651392563, + "isoAlpha3": "DMA", + "north": 15.639901700674933, + "fipsCode": "DO", + "population": "71625", + "east": -61.241630129651185, + "isoNumeric": "212", + "areaInSqKm": "754.0", + "countryCode": "DM", + "west": -61.4808292002466, + "countryName": "Dominica", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "NA", + "capital": "Santo Domingo", + "languages": "es-DO", + "geonameId": 3508796, + "south": 17.5395066830409, + "isoAlpha3": "DOM", + "north": 19.9321257501267, + "fipsCode": "DR", + "population": "10627165", + "east": -68.3229591969468, + "isoNumeric": "214", + "areaInSqKm": "48730.0", + "countryCode": "DO", + "west": -72.0114723981787, + "countryName": "Dominican Republic", + "continentName": "North America", + "currencyCode": "DOP" + }, + { + "continent": "AF", + "capital": "Algiers", + "languages": "ar-DZ", + "geonameId": 2589581, + "south": 18.968147, + "isoAlpha3": "DZA", + "north": 37.089801381, + "fipsCode": "AG", + "population": "42228429", + "east": 11.9984999060001, + "isoNumeric": "012", + "areaInSqKm": "2381740.0", + "countryCode": "DZ", + "west": -8.66761116299995, + "countryName": "Algeria", + "continentName": "Africa", + "currencyCode": "DZD" + }, + { + "continent": "SA", + "capital": "Quito", + "languages": "es-EC", + "geonameId": 3658394, + "south": -5.01615732302488, + "isoAlpha3": "ECU", + "north": 1.43523516349953, + "fipsCode": "EC", + "population": "17084357", + "east": -75.1871465547501, + "isoNumeric": "218", + "areaInSqKm": "283560.0", + "countryCode": "EC", + "west": -81.0836838953894, + "countryName": "Ecuador", + "continentName": "South America", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Tallinn", + "languages": "et,ru", + "geonameId": 453733, + "south": 57.5093097920079, + "isoAlpha3": "EST", + "north": 59.6753143130129, + "fipsCode": "EN", + "population": "1320884", + "east": 28.2090381531431, + "isoNumeric": "233", + "areaInSqKm": "45226.0", + "countryCode": "EE", + "west": 21.8285886498081, + "countryName": "Estonia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Cairo", + "languages": "ar-EG,en,fr", + "geonameId": 357994, + "south": 21.724952, + "isoAlpha3": "EGY", + "north": 31.6709930000001, + "fipsCode": "EG", + "population": "98423595", + "east": 35.7935441020001, + "isoNumeric": "818", + "areaInSqKm": "1001450.0", + "countryCode": "EG", + "west": 24.6967750000001, + "countryName": "Egypt", + "continentName": "Africa", + "currencyCode": "EGP" + }, + { + "continent": "AF", + "capital": "", + "languages": "ar,mey", + "geonameId": 2461445, + "south": 20.774158, + "isoAlpha3": "ESH", + "north": 27.669674, + "fipsCode": "WI", + "population": "273008", + "east": -8.670276, + "isoNumeric": "732", + "areaInSqKm": "266000.0", + "countryCode": "EH", + "west": -17.103182, + "countryName": "Western Sahara", + "continentName": "Africa", + "currencyCode": "MAD" + }, + { + "continent": "AF", + "capital": "Asmara", + "languages": "aa-ER,ar,tig,kun,ti-ER", + "geonameId": 338010, + "south": 12.359555, + "isoAlpha3": "ERI", + "north": 18.003084, + "fipsCode": "ER", + "population": "0", + "east": 43.13464, + "isoNumeric": "232", + "areaInSqKm": "121320.0", + "countryCode": "ER", + "west": 36.438778, + "countryName": "Eritrea", + "continentName": "Africa", + "currencyCode": "ERN" + }, + { + "continent": "EU", + "capital": "Madrid", + "languages": "es-ES,ca,gl,eu,oc", + "geonameId": 2510769, + "south": 36.0001044260548, + "isoAlpha3": "ESP", + "north": 43.7913565913767, + "fipsCode": "SP", + "population": "46723749", + "east": 4.32778473043961, + "isoNumeric": "724", + "areaInSqKm": "504782.0", + "countryCode": "ES", + "west": -9.30151567231899, + "countryName": "Spain", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Addis Ababa", + "languages": "am,en-ET,om-ET,ti-ET,so-ET,sid", + "geonameId": 337996, + "south": 3.40413700100004, + "isoAlpha3": "ETH", + "north": 14.894214, + "fipsCode": "ET", + "population": "109224559", + "east": 48.0010560010001, + "isoNumeric": "231", + "areaInSqKm": "1127127.0", + "countryCode": "ET", + "west": 32.997734001, + "countryName": "Ethiopia", + "continentName": "Africa", + "currencyCode": "ETB" + }, + { + "continent": "EU", + "capital": "Helsinki", + "languages": "fi-FI,sv-FI,smn", + "geonameId": 660013, + "south": 59.808777, + "isoAlpha3": "FIN", + "north": 70.096054, + "fipsCode": "FI", + "population": "5518050", + "east": 31.580944, + "isoNumeric": "246", + "areaInSqKm": "337030.0", + "countryCode": "FI", + "west": 20.556944, + "countryName": "Finland", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Suva", + "languages": "en-FJ,fj", + "geonameId": 2205218, + "south": -20.67597, + "isoAlpha3": "FJI", + "north": -12.4795295382484, + "fipsCode": "FJ", + "population": "883483", + "east": -178.424438, + "isoNumeric": "242", + "areaInSqKm": "18270.0", + "countryCode": "FJ", + "west": 177.140015279982, + "countryName": "Fiji", + "continentName": "Oceania", + "currencyCode": "FJD" + }, + { + "continent": "SA", + "capital": "Stanley", + "languages": "en-FK", + "geonameId": 3474414, + "south": -52.383984175, + "isoAlpha3": "FLK", + "north": -51.2331394719999, + "fipsCode": "FK", + "population": "2638", + "east": -57.718087652, + "isoNumeric": "238", + "areaInSqKm": "12173.0", + "countryCode": "FK", + "west": -61.3474566739999, + "countryName": "Falkland Islands", + "continentName": "South America", + "currencyCode": "FKP" + }, + { + "continent": "OC", + "capital": "Palikir", + "languages": "en-FM,chk,pon,yap,kos,uli,woe,nkr,kpg", + "geonameId": 2081918, + "south": 1.02629, + "isoAlpha3": "FSM", + "north": 10.08904, + "fipsCode": "FM", + "population": "112640", + "east": 163.03717, + "isoNumeric": "583", + "areaInSqKm": "702.0", + "countryCode": "FM", + "west": 137.33648, + "countryName": "Micronesia", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Tórshavn", + "languages": "fo,da-FO", + "geonameId": 2622320, + "south": 61.3910302656013, + "isoAlpha3": "FRO", + "north": 62.3938884414274, + "fipsCode": "FO", + "population": "48497", + "east": -6.25655957192113, + "isoNumeric": "234", + "areaInSqKm": "1399.0", + "countryCode": "FO", + "west": -7.688191677774624, + "countryName": "Faroe Islands", + "continentName": "Europe", + "currencyCode": "DKK" + }, + { + "continent": "EU", + "capital": "Paris", + "languages": "fr-FR,frp,br,co,ca,eu,oc", + "geonameId": 3017382, + "south": 41.3645589826522, + "isoAlpha3": "FRA", + "north": 51.0889894407743, + "fipsCode": "FR", + "population": "66987244", + "east": 9.56009360694225, + "isoNumeric": "250", + "areaInSqKm": "547030.0", + "countryCode": "FR", + "west": -5.14127657354623, + "countryName": "France", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Libreville", + "languages": "fr-GA", + "geonameId": 2400553, + "south": -3.96180775999994, + "isoAlpha3": "GAB", + "north": 2.31810900100004, + "fipsCode": "GB", + "population": "2119275", + "east": 14.5269230000001, + "isoNumeric": "266", + "areaInSqKm": "267667.0", + "countryCode": "GA", + "west": 8.69940944700005, + "countryName": "Gabon", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "EU", + "capital": "London", + "languages": "en-GB,cy-GB,gd", + "geonameId": 2635167, + "south": 49.9028622252397, + "isoAlpha3": "GBR", + "north": 59.3607741849963, + "fipsCode": "UK", + "population": "66488991", + "east": 1.7689121033873, + "isoNumeric": "826", + "areaInSqKm": "244820.0", + "countryCode": "GB", + "west": -8.61772077108559, + "countryName": "United Kingdom", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "NA", + "capital": "St. George's", + "languages": "en-GD", + "geonameId": 3580239, + "south": 11.986893, + "isoAlpha3": "GRD", + "north": 12.318283928171299, + "fipsCode": "GJ", + "population": "111454", + "east": -61.57676970108031, + "isoNumeric": "308", + "areaInSqKm": "344.0", + "countryCode": "GD", + "west": -61.802344, + "countryName": "Grenada", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "AS", + "capital": "Tbilisi", + "languages": "ka,ru,hy,az", + "geonameId": 614540, + "south": 41.054942, + "isoAlpha3": "GEO", + "north": 43.5866270000001, + "fipsCode": "GG", + "population": "3731000", + "east": 46.736119, + "isoNumeric": "268", + "areaInSqKm": "69700.0", + "countryCode": "GE", + "west": 40.006604, + "countryName": "Georgia", + "continentName": "Asia", + "currencyCode": "GEL" + }, + { + "continent": "SA", + "capital": "Cayenne", + "languages": "fr-GF", + "geonameId": 3381670, + "south": 2.11107565187642, + "isoAlpha3": "GUF", + "north": 5.74725188917531, + "fipsCode": "FG", + "population": "195506", + "east": -51.619065827085, + "isoNumeric": "254", + "areaInSqKm": "91000.0", + "countryCode": "GF", + "west": -54.6024155447667, + "countryName": "French Guiana", + "continentName": "South America", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "St Peter Port", + "languages": "en,nrf", + "geonameId": 3042362, + "south": 49.40764156876899, + "isoAlpha3": "GGY", + "north": 49.731727816705416, + "fipsCode": "GK", + "population": "65228", + "east": -2.1577152112246267, + "isoNumeric": "831", + "areaInSqKm": "78.0", + "countryCode": "GG", + "west": -2.673194593476069, + "countryName": "Guernsey", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "AF", + "capital": "Accra", + "languages": "en-GH,ak,ee,tw", + "geonameId": 2300660, + "south": 4.73894544800004, + "isoAlpha3": "GHA", + "north": 11.174952907, + "fipsCode": "GH", + "population": "29767108", + "east": 1.19948138100006, + "isoNumeric": "288", + "areaInSqKm": "239460.0", + "countryCode": "GH", + "west": -3.26078599999994, + "countryName": "Ghana", + "continentName": "Africa", + "currencyCode": "GHS" + }, + { + "continent": "EU", + "capital": "Gibraltar", + "languages": "en-GI,es,it,pt", + "geonameId": 2411586, + "south": 36.10903070140248, + "isoAlpha3": "GIB", + "north": 36.155439135670726, + "fipsCode": "GI", + "population": "33718", + "east": -5.338285164001491, + "isoNumeric": "292", + "areaInSqKm": "6.5", + "countryCode": "GI", + "west": -5.36626149743654, + "countryName": "Gibraltar", + "continentName": "Europe", + "currencyCode": "GIP" + }, + { + "continent": "NA", + "capital": "Nuuk", + "languages": "kl,da-GL,en", + "geonameId": 3425505, + "south": 59.777401, + "isoAlpha3": "GRL", + "north": 83.627357, + "fipsCode": "GL", + "population": "56025", + "east": -11.312319, + "isoNumeric": "304", + "areaInSqKm": "2166086.0", + "countryCode": "GL", + "west": -73.04203, + "countryName": "Greenland", + "continentName": "North America", + "currencyCode": "DKK" + }, + { + "continent": "AF", + "capital": "Banjul", + "languages": "en-GM,mnk,wof,wo,ff", + "geonameId": 2413451, + "south": 13.063718062, + "isoAlpha3": "GMB", + "north": 13.825058106, + "fipsCode": "GA", + "population": "2280102", + "east": -13.791386179, + "isoNumeric": "270", + "areaInSqKm": "11300.0", + "countryCode": "GM", + "west": -16.8136100139999, + "countryName": "Gambia", + "continentName": "Africa", + "currencyCode": "GMD" + }, + { + "continent": "AF", + "capital": "Conakry", + "languages": "fr-GN", + "geonameId": 2420477, + "south": 7.193553, + "isoAlpha3": "GIN", + "north": 12.67622, + "fipsCode": "GV", + "population": "12414318", + "east": -7.641071, + "isoNumeric": "324", + "areaInSqKm": "245857.0", + "countryCode": "GN", + "west": -14.926619, + "countryName": "Guinea", + "continentName": "Africa", + "currencyCode": "GNF" + }, + { + "continent": "NA", + "capital": "Basse-Terre", + "languages": "fr-GP", + "geonameId": 3579143, + "south": 15.8665030910918, + "isoAlpha3": "GLP", + "north": 16.5144923539361, + "fipsCode": "GP", + "population": "443000", + "east": -61.0019590353041, + "isoNumeric": "312", + "areaInSqKm": "1780.0", + "countryCode": "GP", + "west": -61.5508178989899, + "countryName": "Guadeloupe", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Malabo", + "languages": "es-GQ,fr", + "geonameId": 2309096, + "south": 0.92086, + "isoAlpha3": "GNQ", + "north": 2.346989, + "fipsCode": "EK", + "population": "1308974", + "east": 11.335724, + "isoNumeric": "226", + "areaInSqKm": "28051.0", + "countryCode": "GQ", + "west": 9.346865, + "countryName": "Equatorial Guinea", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "EU", + "capital": "Athens", + "languages": "el-GR,en,fr", + "geonameId": 390903, + "south": 34.8020663391466, + "isoAlpha3": "GRC", + "north": 41.7484999849641, + "fipsCode": "GR", + "population": "10727668", + "east": 28.2470831714347, + "isoNumeric": "300", + "areaInSqKm": "131940.0", + "countryCode": "GR", + "west": 19.3736035624134, + "countryName": "Greece", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AN", + "capital": "Grytviken", + "languages": "en", + "geonameId": 3474415, + "south": -59.46319341, + "isoAlpha3": "SGS", + "north": -53.980896636, + "fipsCode": "SX", + "population": "30", + "east": -26.252069712, + "isoNumeric": "239", + "areaInSqKm": "3903.0", + "countryCode": "GS", + "west": -38.0479509639999, + "countryName": "South Georgia and South Sandwich Islands", + "continentName": "Antarctica", + "currencyCode": "GBP" + }, + { + "continent": "NA", + "capital": "Guatemala City", + "languages": "es-GT", + "geonameId": 3595528, + "south": 13.7400210010001, + "isoAlpha3": "GTM", + "north": 17.815695169, + "fipsCode": "GT", + "population": "17247807", + "east": -88.233001934, + "isoNumeric": "320", + "areaInSqKm": "108890.0", + "countryCode": "GT", + "west": -92.231143101, + "countryName": "Guatemala", + "continentName": "North America", + "currencyCode": "GTQ" + }, + { + "continent": "OC", + "capital": "Hagåtña", + "languages": "en-GU,ch-GU", + "geonameId": 4043988, + "south": 13.23376, + "isoAlpha3": "GUM", + "north": 13.654402, + "fipsCode": "GQ", + "population": "165768", + "east": 144.956894, + "isoNumeric": "316", + "areaInSqKm": "549.0", + "countryCode": "GU", + "west": 144.618318, + "countryName": "Guam", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "AF", + "capital": "Bissau", + "languages": "pt-GW,pov", + "geonameId": 2372248, + "south": 10.924265, + "isoAlpha3": "GNB", + "north": 12.680789, + "fipsCode": "PU", + "population": "1874309", + "east": -13.636522, + "isoNumeric": "624", + "areaInSqKm": "36120.0", + "countryCode": "GW", + "west": -16.717535, + "countryName": "Guinea-Bissau", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "SA", + "capital": "Georgetown", + "languages": "en-GY", + "geonameId": 3378535, + "south": 1.17508, + "isoAlpha3": "GUY", + "north": 8.557567, + "fipsCode": "GY", + "population": "779004", + "east": -56.480251, + "isoNumeric": "328", + "areaInSqKm": "214970.0", + "countryCode": "GY", + "west": -61.384762, + "countryName": "Guyana", + "continentName": "South America", + "currencyCode": "GYD" + }, + { + "continent": "AS", + "capital": "Hong Kong", + "languages": "zh-HK,yue,zh,en", + "geonameId": 1819730, + "south": 22.1552256413502, + "isoAlpha3": "HKG", + "north": 22.5619493557973, + "fipsCode": "HK", + "population": "7451000", + "east": 114.441993257571, + "isoNumeric": "344", + "areaInSqKm": "1092.0", + "countryCode": "HK", + "west": 113.839212676903, + "countryName": "Hong Kong", + "continentName": "Asia", + "currencyCode": "HKD" + }, + { + "continent": "AN", + "capital": "", + "languages": "", + "geonameId": 1547314, + "south": -53.192001, + "isoAlpha3": "HMD", + "north": -52.909416, + "fipsCode": "HM", + "population": "0", + "east": 73.859146, + "isoNumeric": "334", + "areaInSqKm": "412.0", + "countryCode": "HM", + "west": 72.596535, + "countryName": "Heard Island and McDonald Islands", + "continentName": "Antarctica", + "currencyCode": "AUD" + }, + { + "continent": "NA", + "capital": "Tegucigalpa", + "languages": "es-HN,cab,miq", + "geonameId": 3608932, + "south": 12.982411, + "isoAlpha3": "HND", + "north": 16.510256, + "fipsCode": "HO", + "population": "9587522", + "east": -83.155403, + "isoNumeric": "340", + "areaInSqKm": "112090.0", + "countryCode": "HN", + "west": -89.350792, + "countryName": "Honduras", + "continentName": "North America", + "currencyCode": "HNL" + }, + { + "continent": "EU", + "capital": "Zagreb", + "languages": "hr-HR,sr", + "geonameId": 3202326, + "south": 42.43589, + "isoAlpha3": "HRV", + "north": 46.5549629558487, + "fipsCode": "HR", + "population": "4089400", + "east": 19.427389, + "isoNumeric": "191", + "areaInSqKm": "56542.0", + "countryCode": "HR", + "west": 13.493222, + "countryName": "Croatia", + "continentName": "Europe", + "currencyCode": "HRK" + }, + { + "continent": "NA", + "capital": "Port-au-Prince", + "languages": "ht,fr-HT", + "geonameId": 3723988, + "south": 18.021032, + "isoAlpha3": "HTI", + "north": 20.08782, + "fipsCode": "HA", + "population": "11123176", + "east": -71.613358, + "isoNumeric": "332", + "areaInSqKm": "27750.0", + "countryCode": "HT", + "west": -74.478584, + "countryName": "Haiti", + "continentName": "North America", + "currencyCode": "HTG" + }, + { + "continent": "EU", + "capital": "Budapest", + "languages": "hu-HU", + "geonameId": 719819, + "south": 45.7370495590001, + "isoAlpha3": "HUN", + "north": 48.585336, + "fipsCode": "HU", + "population": "9768785", + "east": 22.896564336, + "isoNumeric": "348", + "areaInSqKm": "93030.0", + "countryCode": "HU", + "west": 16.113795, + "countryName": "Hungary", + "continentName": "Europe", + "currencyCode": "HUF" + }, + { + "continent": "AS", + "capital": "Jakarta", + "languages": "id,en,nl,jv", + "geonameId": 1643084, + "south": -10.9431056999999, + "isoAlpha3": "IDN", + "north": 5.90722980000004, + "fipsCode": "ID", + "population": "267663435", + "east": 141.0194, + "isoNumeric": "360", + "areaInSqKm": "1919440.0", + "countryCode": "ID", + "west": 95.0111465000001, + "countryName": "Indonesia", + "continentName": "Asia", + "currencyCode": "IDR" + }, + { + "continent": "EU", + "capital": "Dublin", + "languages": "en-IE,ga-IE", + "geonameId": 2963597, + "south": 51.4475491577615, + "isoAlpha3": "IRL", + "north": 55.3829431564742, + "fipsCode": "EI", + "population": "4853506", + "east": -5.99804990172185, + "isoNumeric": "372", + "areaInSqKm": "70280.0", + "countryCode": "IE", + "west": -10.4800035816853, + "countryName": "Ireland", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "", + "languages": "he,ar-IL,en-IL,", + "geonameId": 294640, + "south": 29.490654862, + "isoAlpha3": "ISR", + "north": 33.2908350000001, + "fipsCode": "IS", + "population": "8883800", + "east": 35.67033, + "isoNumeric": "376", + "areaInSqKm": "20770.0", + "countryCode": "IL", + "west": 34.267257, + "countryName": "Israel", + "continentName": "Asia", + "currencyCode": "ILS" + }, + { + "continent": "EU", + "capital": "Douglas", + "languages": "en,gv", + "geonameId": 3042225, + "south": 54.055916, + "isoAlpha3": "IMN", + "north": 54.419724, + "fipsCode": "IM", + "population": "84077", + "east": -4.3115, + "isoNumeric": "833", + "areaInSqKm": "572.0", + "countryCode": "IM", + "west": -4.798722, + "countryName": "Isle of Man", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "AS", + "capital": "New Delhi", + "languages": "en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc", + "geonameId": 1269750, + "south": 6.7559528993543, + "isoAlpha3": "IND", + "north": 35.524548272882, + "fipsCode": "IN", + "population": "1352617328", + "east": 97.4152926679075, + "isoNumeric": "356", + "areaInSqKm": "3287590.0", + "countryCode": "IN", + "west": 68.4840183183648, + "countryName": "India", + "continentName": "Asia", + "currencyCode": "INR" + }, + { + "continent": "AS", + "capital": "", + "languages": "en-IO", + "geonameId": 1282588, + "south": -7.438028, + "isoAlpha3": "IOT", + "north": -5.268333, + "fipsCode": "IO", + "population": "4000", + "east": 72.493164, + "isoNumeric": "086", + "areaInSqKm": "60.0", + "countryCode": "IO", + "west": 71.259972, + "countryName": "British Indian Ocean Territory", + "continentName": "Asia", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "Baghdad", + "languages": "ar-IQ,ku,hy", + "geonameId": 99237, + "south": 29.0612080000001, + "isoAlpha3": "IRQ", + "north": 37.380746001, + "fipsCode": "IZ", + "population": "38433600", + "east": 48.6117360000001, + "isoNumeric": "368", + "areaInSqKm": "437072.0", + "countryCode": "IQ", + "west": 38.7936740000001, + "countryName": "Iraq", + "continentName": "Asia", + "currencyCode": "IQD" + }, + { + "continent": "AS", + "capital": "Tehran", + "languages": "fa-IR,ku", + "geonameId": 130758, + "south": 25.060388566, + "isoAlpha3": "IRN", + "north": 39.7822393340001, + "fipsCode": "IR", + "population": "81800269", + "east": 63.333337, + "isoNumeric": "364", + "areaInSqKm": "1648000.0", + "countryCode": "IR", + "west": 44.032638708, + "countryName": "Iran", + "continentName": "Asia", + "currencyCode": "IRR" + }, + { + "continent": "EU", + "capital": "Reykjavik", + "languages": "is,en,de,da,sv,no", + "geonameId": 2629691, + "south": 63.394392778588, + "isoAlpha3": "ISL", + "north": 66.5377933098397, + "fipsCode": "IC", + "population": "353574", + "east": -13.4946206239501, + "isoNumeric": "352", + "areaInSqKm": "103000.0", + "countryCode": "IS", + "west": -24.5326753866625, + "countryName": "Iceland", + "continentName": "Europe", + "currencyCode": "ISK" + }, + { + "continent": "EU", + "capital": "Rome", + "languages": "it-IT,de-IT,fr-IT,sc,ca,co,sl", + "geonameId": 3175395, + "south": 36.6440816661648, + "isoAlpha3": "ITA", + "north": 47.0917837415439, + "fipsCode": "IT", + "population": "60431283", + "east": 18.5203814091888, + "isoNumeric": "380", + "areaInSqKm": "301230.0", + "countryCode": "IT", + "west": 6.62662135986088, + "countryName": "Italy", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Saint Helier", + "languages": "en,fr,nrf", + "geonameId": 3042142, + "south": 49.169834, + "isoAlpha3": "JEY", + "north": 49.265057, + "fipsCode": "JE", + "population": "90812", + "east": -2.022083, + "isoNumeric": "832", + "areaInSqKm": "116.0", + "countryCode": "JE", + "west": -2.260028, + "countryName": "Jersey", + "continentName": "Europe", + "currencyCode": "GBP" + }, + { + "continent": "NA", + "capital": "Kingston", + "languages": "en-JM", + "geonameId": 3489940, + "south": 17.7059966193696, + "isoAlpha3": "JAM", + "north": 18.524766185516, + "fipsCode": "JM", + "population": "2934855", + "east": -76.1830989848426, + "isoNumeric": "388", + "areaInSqKm": "10991.0", + "countryCode": "JM", + "west": -78.3690062954957, + "countryName": "Jamaica", + "continentName": "North America", + "currencyCode": "JMD" + }, + { + "continent": "AS", + "capital": "Amman", + "languages": "ar-JO,en", + "geonameId": 248816, + "south": 29.1850360010001, + "isoAlpha3": "JOR", + "north": 33.374735, + "fipsCode": "JO", + "population": "9956011", + "east": 39.3011540000001, + "isoNumeric": "400", + "areaInSqKm": "92300.0", + "countryCode": "JO", + "west": 34.955471039, + "countryName": "Jordan", + "continentName": "Asia", + "currencyCode": "JOD" + }, + { + "continent": "AS", + "capital": "Tokyo", + "languages": "ja", + "geonameId": 1861060, + "south": 24.255169441, + "isoAlpha3": "JPN", + "north": 45.52295736, + "fipsCode": "JA", + "population": "126529100", + "east": 145.817458885, + "isoNumeric": "392", + "areaInSqKm": "377835.0", + "countryCode": "JP", + "west": 122.933653061, + "countryName": "Japan", + "continentName": "Asia", + "currencyCode": "JPY" + }, + { + "continent": "AF", + "capital": "Nairobi", + "languages": "en-KE,sw-KE", + "geonameId": 192950, + "south": -4.67989449199996, + "isoAlpha3": "KEN", + "north": 5.03342100100002, + "fipsCode": "KE", + "population": "51393010", + "east": 41.9069450000001, + "isoNumeric": "404", + "areaInSqKm": "582650.0", + "countryCode": "KE", + "west": 33.9098210000001, + "countryName": "Kenya", + "continentName": "Africa", + "currencyCode": "KES" + }, + { + "continent": "AS", + "capital": "Bishkek", + "languages": "ky,uz,ru", + "geonameId": 1527747, + "south": 39.172832, + "isoAlpha3": "KGZ", + "north": 43.238224, + "fipsCode": "KG", + "population": "6315800", + "east": 80.283165, + "isoNumeric": "417", + "areaInSqKm": "198500.0", + "countryCode": "KG", + "west": 69.276611, + "countryName": "Kyrgyzstan", + "continentName": "Asia", + "currencyCode": "KGS" + }, + { + "continent": "AS", + "capital": "Phnom Penh", + "languages": "km,fr,en", + "geonameId": 1831722, + "south": 10.409083, + "isoAlpha3": "KHM", + "north": 14.686417, + "fipsCode": "CB", + "population": "16249798", + "east": 107.627724, + "isoNumeric": "116", + "areaInSqKm": "181040.0", + "countryCode": "KH", + "west": 102.339996, + "countryName": "Cambodia", + "continentName": "Asia", + "currencyCode": "KHR" + }, + { + "continent": "OC", + "capital": "Tarawa", + "languages": "en-KI,gil", + "geonameId": 4030945, + "south": -11.4460499999991, + "isoAlpha3": "KIR", + "north": 3.93942799999973, + "fipsCode": "KR", + "population": "115847", + "east": -150.2345115032905, + "isoNumeric": "296", + "areaInSqKm": "811.0", + "countryCode": "KI", + "west": 169.548692, + "countryName": "Kiribati", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "AF", + "capital": "Moroni", + "languages": "ar,fr-KM", + "geonameId": 921929, + "south": -12.387857, + "isoAlpha3": "COM", + "north": -11.362381, + "fipsCode": "CN", + "population": "832322", + "east": 44.538223, + "isoNumeric": "174", + "areaInSqKm": "2170.0", + "countryCode": "KM", + "west": 43.21579, + "countryName": "Comoros", + "continentName": "Africa", + "currencyCode": "KMF" + }, + { + "continent": "NA", + "capital": "Basseterre", + "languages": "en-KN", + "geonameId": 3575174, + "south": 17.094276497441214, + "isoAlpha3": "KNA", + "north": 17.418152531334183, + "fipsCode": "SC", + "population": "52441", + "east": -62.53964136573717, + "isoNumeric": "659", + "areaInSqKm": "261.0", + "countryCode": "KN", + "west": -62.86483931213377, + "countryName": "St Kitts and Nevis", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "AS", + "capital": "Pyongyang", + "languages": "ko-KP", + "geonameId": 1873107, + "south": 37.673332, + "isoAlpha3": "PRK", + "north": 43.006054, + "fipsCode": "KN", + "population": "25549819", + "east": 130.674866, + "isoNumeric": "408", + "areaInSqKm": "120540.0", + "countryCode": "KP", + "west": 124.315887, + "countryName": "North Korea", + "continentName": "Asia", + "currencyCode": "KPW" + }, + { + "continent": "AS", + "capital": "Seoul", + "languages": "ko-KR,en", + "geonameId": 1835841, + "south": 33.1954102977009, + "isoAlpha3": "KOR", + "north": 38.5933891092225, + "fipsCode": "KS", + "population": "51635256", + "east": 129.583016157998, + "isoNumeric": "410", + "areaInSqKm": "98480.0", + "countryCode": "KR", + "west": 125.887442375577, + "countryName": "South Korea", + "continentName": "Asia", + "currencyCode": "KRW" + }, + { + "continent": "AS", + "capital": "Kuwait City", + "languages": "ar-KW,en", + "geonameId": 285570, + "south": 28.524611, + "isoAlpha3": "KWT", + "north": 30.095945, + "fipsCode": "KU", + "population": "4137309", + "east": 48.431473, + "isoNumeric": "414", + "areaInSqKm": "17820.0", + "countryCode": "KW", + "west": 46.555557, + "countryName": "Kuwait", + "continentName": "Asia", + "currencyCode": "KWD" + }, + { + "continent": "NA", + "capital": "George Town", + "languages": "en-KY", + "geonameId": 3580718, + "south": 19.263029, + "isoAlpha3": "CYM", + "north": 19.7617, + "fipsCode": "CJ", + "population": "64174", + "east": -79.727272, + "isoNumeric": "136", + "areaInSqKm": "262.0", + "countryCode": "KY", + "west": -81.432777, + "countryName": "Cayman Islands", + "continentName": "North America", + "currencyCode": "KYD" + }, + { + "continent": "AS", + "capital": "Nur-Sultan", + "languages": "kk,ru", + "geonameId": 1522867, + "south": 40.5686884990001, + "isoAlpha3": "KAZ", + "north": 55.441984001, + "fipsCode": "KZ", + "population": "18276499", + "east": 87.3154150010001, + "isoNumeric": "398", + "areaInSqKm": "2717300.0", + "countryCode": "KZ", + "west": 46.4936720000001, + "countryName": "Kazakhstan", + "continentName": "Asia", + "currencyCode": "KZT" + }, + { + "continent": "AS", + "capital": "Vientiane", + "languages": "lo,fr,en", + "geonameId": 1655842, + "south": 13.909720001, + "isoAlpha3": "LAO", + "north": 22.50904495, + "fipsCode": "LA", + "population": "7061507", + "east": 107.635093936, + "isoNumeric": "418", + "areaInSqKm": "236800.0", + "countryCode": "LA", + "west": 100.083872, + "countryName": "Laos", + "continentName": "Asia", + "currencyCode": "LAK" + }, + { + "continent": "AS", + "capital": "Beirut", + "languages": "ar-LB,fr-LB,en,hy", + "geonameId": 272103, + "south": 33.0550260000001, + "isoAlpha3": "LBN", + "north": 34.6920900000001, + "fipsCode": "LE", + "population": "6848925", + "east": 36.62372, + "isoNumeric": "422", + "areaInSqKm": "10400.0", + "countryCode": "LB", + "west": 35.103668213, + "countryName": "Lebanon", + "continentName": "Asia", + "currencyCode": "LBP" + }, + { + "continent": "NA", + "capital": "Castries", + "languages": "en-LC", + "geonameId": 3576468, + "south": 13.7072692224982, + "isoAlpha3": "LCA", + "north": 14.110317287646, + "fipsCode": "ST", + "population": "181889", + "east": -60.8732306422271, + "isoNumeric": "662", + "areaInSqKm": "616.0", + "countryCode": "LC", + "west": -61.07995730159752, + "countryName": "Saint Lucia", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "EU", + "capital": "Vaduz", + "languages": "de-LI", + "geonameId": 3042058, + "south": 47.0484284123471, + "isoAlpha3": "LIE", + "north": 47.2706251386959, + "fipsCode": "LS", + "population": "37910", + "east": 9.63564281136796, + "isoNumeric": "438", + "areaInSqKm": "160.0", + "countryCode": "LI", + "west": 9.47167359782014, + "countryName": "Liechtenstein", + "continentName": "Europe", + "currencyCode": "CHF" + }, + { + "continent": "AS", + "capital": "Colombo", + "languages": "si,ta,en", + "geonameId": 1227603, + "south": 5.91869676126554, + "isoAlpha3": "LKA", + "north": 9.83586297688552, + "fipsCode": "CE", + "population": "21670000", + "east": 81.8790900303934, + "isoNumeric": "144", + "areaInSqKm": "65610.0", + "countryCode": "LK", + "west": 79.6505518289324, + "countryName": "Sri Lanka", + "continentName": "Asia", + "currencyCode": "LKR" + }, + { + "continent": "AF", + "capital": "Monrovia", + "languages": "en-LR", + "geonameId": 2275384, + "south": 4.35326143300006, + "isoAlpha3": "LBR", + "north": 8.55198600000006, + "fipsCode": "LI", + "population": "4818977", + "east": -7.36925499999995, + "isoNumeric": "430", + "areaInSqKm": "111370.0", + "countryCode": "LR", + "west": -11.4993114059999, + "countryName": "Liberia", + "continentName": "Africa", + "currencyCode": "LRD" + }, + { + "continent": "AF", + "capital": "Maseru", + "languages": "en-LS,st,zu,xh", + "geonameId": 932692, + "south": -30.6755750029999, + "isoAlpha3": "LSO", + "north": -28.5708, + "fipsCode": "LT", + "population": "2108132", + "east": 29.4557099420001, + "isoNumeric": "426", + "areaInSqKm": "30355.0", + "countryCode": "LS", + "west": 27.011229998, + "countryName": "Lesotho", + "continentName": "Africa", + "currencyCode": "LSL" + }, + { + "continent": "EU", + "capital": "Vilnius", + "languages": "lt,ru,pl", + "geonameId": 597427, + "south": 53.89679499, + "isoAlpha3": "LTU", + "north": 56.4504065100001, + "fipsCode": "LH", + "population": "2789533", + "east": 26.8355231, + "isoNumeric": "440", + "areaInSqKm": "65200.0", + "countryCode": "LT", + "west": 20.941528, + "countryName": "Lithuania", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Luxembourg", + "languages": "lb,de-LU,fr-LU", + "geonameId": 2960313, + "south": 49.447858677765716, + "isoAlpha3": "LUX", + "north": 50.182772453796446, + "fipsCode": "LU", + "population": "607728", + "east": 6.5308980672559525, + "isoNumeric": "442", + "areaInSqKm": "2586.0", + "countryCode": "LU", + "west": 5.735698938390786, + "countryName": "Luxembourg", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Riga", + "languages": "lv,ru,lt", + "geonameId": 458258, + "south": 55.6746669350001, + "isoAlpha3": "LVA", + "north": 58.085568788, + "fipsCode": "LG", + "population": "1926542", + "east": 28.241403, + "isoNumeric": "428", + "areaInSqKm": "64589.0", + "countryCode": "LV", + "west": 20.9691104890001, + "countryName": "Latvia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Tripoli", + "languages": "ar-LY,it,en", + "geonameId": 2215636, + "south": 19.508045, + "isoAlpha3": "LBY", + "north": 33.168999, + "fipsCode": "LY", + "population": "6678567", + "east": 25.150612, + "isoNumeric": "434", + "areaInSqKm": "1759540.0", + "countryCode": "LY", + "west": 9.38702, + "countryName": "Libya", + "continentName": "Africa", + "currencyCode": "LYD" + }, + { + "continent": "AF", + "capital": "Rabat", + "languages": "ar-MA,ber,fr", + "geonameId": 2542007, + "south": 27.6672694750001, + "isoAlpha3": "MAR", + "north": 35.922341095, + "fipsCode": "MO", + "population": "36029138", + "east": -0.996975780999946, + "isoNumeric": "504", + "areaInSqKm": "446550.0", + "countryCode": "MA", + "west": -13.1722970399999, + "countryName": "Morocco", + "continentName": "Africa", + "currencyCode": "MAD" + }, + { + "continent": "EU", + "capital": "Monaco", + "languages": "fr-MC,en,it", + "geonameId": 2993457, + "south": 43.72472839869377, + "isoAlpha3": "MCO", + "north": 43.75196717037228, + "fipsCode": "MN", + "population": "38682", + "east": 7.439939260482788, + "isoNumeric": "492", + "areaInSqKm": "1.95", + "countryCode": "MC", + "west": 7.408962249755859, + "countryName": "Monaco", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Chișinău", + "languages": "ro,ru,gag,tr", + "geonameId": 617790, + "south": 45.4674379630001, + "isoAlpha3": "MDA", + "north": 48.492029003, + "fipsCode": "MD", + "population": "3545883", + "east": 30.1635900000001, + "isoNumeric": "498", + "areaInSqKm": "33843.0", + "countryCode": "MD", + "west": 26.6164249990001, + "countryName": "Moldova", + "continentName": "Europe", + "currencyCode": "MDL" + }, + { + "continent": "EU", + "capital": "Podgorica", + "languages": "sr,hu,bs,sq,hr,rom", + "geonameId": 3194884, + "south": 41.868751527, + "isoAlpha3": "MNE", + "north": 43.558230232, + "fipsCode": "MJ", + "population": "622345", + "east": 20.352926, + "isoNumeric": "499", + "areaInSqKm": "14026.0", + "countryCode": "ME", + "west": 18.4335595800001, + "countryName": "Montenegro", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "NA", + "capital": "Marigot", + "languages": "fr", + "geonameId": 3578421, + "south": 18.04717219103021, + "isoAlpha3": "MAF", + "north": 18.125295191246206, + "fipsCode": "RN", + "population": "37264", + "east": -63.01059106320133, + "isoNumeric": "663", + "areaInSqKm": "53.0", + "countryCode": "MF", + "west": -63.15036103890611, + "countryName": "Saint Martin", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Antananarivo", + "languages": "fr-MG,mg", + "geonameId": 1062947, + "south": -25.608952, + "isoAlpha3": "MDG", + "north": -11.945433, + "fipsCode": "MA", + "population": "26262368", + "east": 50.48378, + "isoNumeric": "450", + "areaInSqKm": "587040.0", + "countryCode": "MG", + "west": 43.224876, + "countryName": "Madagascar", + "continentName": "Africa", + "currencyCode": "MGA" + }, + { + "continent": "OC", + "capital": "Majuro", + "languages": "mh,en-MH", + "geonameId": 2080185, + "south": 5.587639, + "isoAlpha3": "MHL", + "north": 14.62, + "fipsCode": "RM", + "population": "58413", + "east": 171.931808, + "isoNumeric": "584", + "areaInSqKm": "181.3", + "countryCode": "MH", + "west": 165.524918, + "countryName": "Marshall Islands", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "EU", + "capital": "Skopje", + "languages": "mk,sq,tr,rmm,sr", + "geonameId": 718075, + "south": 40.8539489400001, + "isoAlpha3": "MKD", + "north": 42.3736460000001, + "fipsCode": "MK", + "population": "2082958", + "east": 23.0340440310001, + "isoNumeric": "807", + "areaInSqKm": "25333.0", + "countryCode": "MK", + "west": 20.4524230000001, + "countryName": "North Macedonia", + "continentName": "Europe", + "currencyCode": "MKD" + }, + { + "continent": "AF", + "capital": "Bamako", + "languages": "fr-ML,bm", + "geonameId": 2453866, + "south": 10.147811, + "isoAlpha3": "MLI", + "north": 25.001084, + "fipsCode": "ML", + "population": "19077690", + "east": 4.26666786900006, + "isoNumeric": "466", + "areaInSqKm": "1240000.0", + "countryCode": "ML", + "west": -12.240344643, + "countryName": "Mali", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "AS", + "capital": "Nay Pyi Taw", + "languages": "my", + "geonameId": 1327865, + "south": 9.784583, + "isoAlpha3": "MMR", + "north": 28.543249, + "fipsCode": "BM", + "population": "53708395", + "east": 101.176781, + "isoNumeric": "104", + "areaInSqKm": "678500.0", + "countryCode": "MM", + "west": 92.189278, + "countryName": "Myanmar", + "continentName": "Asia", + "currencyCode": "MMK" + }, + { + "continent": "AS", + "capital": "Ulaanbaatar", + "languages": "mn,ru", + "geonameId": 2029969, + "south": 41.5818330000001, + "isoAlpha3": "MNG", + "north": 52.1483550020001, + "fipsCode": "MG", + "population": "3170208", + "east": 119.931509803, + "isoNumeric": "496", + "areaInSqKm": "1565000.0", + "countryCode": "MN", + "west": 87.7344790560001, + "countryName": "Mongolia", + "continentName": "Asia", + "currencyCode": "MNT" + }, + { + "continent": "AS", + "capital": "Macao", + "languages": "zh,zh-MO,pt", + "geonameId": 1821275, + "south": 22.109952693, + "isoAlpha3": "MAC", + "north": 22.2170590110001, + "fipsCode": "MC", + "population": "631636", + "east": 113.59234495800001, + "isoNumeric": "446", + "areaInSqKm": "254.0", + "countryCode": "MO", + "west": 113.528563856, + "countryName": "Macao", + "continentName": "Asia", + "currencyCode": "MOP" + }, + { + "continent": "OC", + "capital": "Saipan", + "languages": "fil,tl,zh,ch-MP,en-MP", + "geonameId": 4041468, + "south": 14.11023, + "isoAlpha3": "MNP", + "north": 20.55344, + "fipsCode": "CQ", + "population": "56882", + "east": 146.06528, + "isoNumeric": "580", + "areaInSqKm": "477.0", + "countryCode": "MP", + "west": 144.88626, + "countryName": "Northern Mariana Islands", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Fort-de-France", + "languages": "fr-MQ", + "geonameId": 3570311, + "south": 14.3946961023016, + "isoAlpha3": "MTQ", + "north": 14.8787232943029, + "fipsCode": "MB", + "population": "432900", + "east": -60.8096896756103, + "isoNumeric": "474", + "areaInSqKm": "1100.0", + "countryCode": "MQ", + "west": -61.229041406022, + "countryName": "Martinique", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Nouakchott", + "languages": "ar-MR,fuc,snk,fr,mey,wo", + "geonameId": 2378080, + "south": 14.715547, + "isoAlpha3": "MRT", + "north": 27.298073, + "fipsCode": "MR", + "population": "4403319", + "east": -4.827674, + "isoNumeric": "478", + "areaInSqKm": "1030700.0", + "countryCode": "MR", + "west": -17.066521, + "countryName": "Mauritania", + "continentName": "Africa", + "currencyCode": "MRU" + }, + { + "continent": "NA", + "capital": "Plymouth", + "languages": "en-MS", + "geonameId": 3578097, + "south": 16.674768935441556, + "isoAlpha3": "MSR", + "north": 16.824060205313184, + "fipsCode": "MH", + "population": "9341", + "east": -62.144100129608205, + "isoNumeric": "500", + "areaInSqKm": "102.0", + "countryCode": "MS", + "west": -62.24138237036129, + "countryName": "Montserrat", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "EU", + "capital": "Valletta", + "languages": "mt,en-MT", + "geonameId": 2562770, + "south": 35.8061835000002, + "isoAlpha3": "MLT", + "north": 36.0821530995456, + "fipsCode": "MT", + "population": "483530", + "east": 14.5764915000002, + "isoNumeric": "470", + "areaInSqKm": "316.0", + "countryCode": "MT", + "west": 14.1834251000001, + "countryName": "Malta", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Port Louis", + "languages": "en-MU,bho,fr", + "geonameId": 934292, + "south": -20.5255565639999, + "isoAlpha3": "MUS", + "north": -10.336483002, + "fipsCode": "MP", + "population": "1265303", + "east": 63.5028269640001, + "isoNumeric": "480", + "areaInSqKm": "2040.0", + "countryCode": "MU", + "west": 56.584918976, + "countryName": "Mauritius", + "continentName": "Africa", + "currencyCode": "MUR" + }, + { + "continent": "AS", + "capital": "Malé", + "languages": "dv,en", + "geonameId": 1282028, + "south": -0.692694, + "isoAlpha3": "MDV", + "north": 7.091587495414767, + "fipsCode": "MV", + "population": "515696", + "east": 73.637276, + "isoNumeric": "462", + "areaInSqKm": "300.0", + "countryCode": "MV", + "west": 72.693222, + "countryName": "Maldives", + "continentName": "Asia", + "currencyCode": "MVR" + }, + { + "continent": "AF", + "capital": "Lilongwe", + "languages": "ny,yao,tum,swk", + "geonameId": 927384, + "south": -17.1295217059999, + "isoAlpha3": "MWI", + "north": -9.36722739199996, + "fipsCode": "MI", + "population": "17563749", + "east": 35.9185731040001, + "isoNumeric": "454", + "areaInSqKm": "118480.0", + "countryCode": "MW", + "west": 32.6725205490001, + "countryName": "Malawi", + "continentName": "Africa", + "currencyCode": "MWK" + }, + { + "continent": "NA", + "capital": "Mexico City", + "languages": "es-MX", + "geonameId": 3996063, + "south": 14.532866, + "isoAlpha3": "MEX", + "north": 32.716759, + "fipsCode": "MX", + "population": "126190788", + "east": -86.703392, + "isoNumeric": "484", + "areaInSqKm": "1972550.0", + "countryCode": "MX", + "west": -118.453949, + "countryName": "Mexico", + "continentName": "North America", + "currencyCode": "MXN" + }, + { + "continent": "AS", + "capital": "Kuala Lumpur", + "languages": "ms-MY,en,zh,ta,te,ml,pa,th", + "geonameId": 1733045, + "south": 0.855222, + "isoAlpha3": "MYS", + "north": 7.363417, + "fipsCode": "MY", + "population": "31528585", + "east": 119.267502, + "isoNumeric": "458", + "areaInSqKm": "329750.0", + "countryCode": "MY", + "west": 99.643448, + "countryName": "Malaysia", + "continentName": "Asia", + "currencyCode": "MYR" + }, + { + "continent": "AF", + "capital": "Maputo", + "languages": "pt-MZ,vmw", + "geonameId": 1036973, + "south": -26.868162, + "isoAlpha3": "MOZ", + "north": -10.4731756319999, + "fipsCode": "MZ", + "population": "29495962", + "east": 40.838104211, + "isoNumeric": "508", + "areaInSqKm": "801590.0", + "countryCode": "MZ", + "west": 30.2155500000001, + "countryName": "Mozambique", + "continentName": "Africa", + "currencyCode": "MZN" + }, + { + "continent": "AF", + "capital": "Windhoek", + "languages": "en-NA,af,de,hz,naq", + "geonameId": 3355338, + "south": -28.9706389999999, + "isoAlpha3": "NAM", + "north": -16.963488173, + "fipsCode": "WA", + "population": "2448255", + "east": 25.2617520000001, + "isoNumeric": "516", + "areaInSqKm": "825418.0", + "countryCode": "NA", + "west": 11.737502061, + "countryName": "Namibia", + "continentName": "Africa", + "currencyCode": "NAD" + }, + { + "continent": "OC", + "capital": "Noumea", + "languages": "fr-NC", + "geonameId": 2139685, + "south": -22.698, + "isoAlpha3": "NCL", + "north": -19.549778, + "fipsCode": "NC", + "population": "284060", + "east": 168.129135, + "isoNumeric": "540", + "areaInSqKm": "19060.0", + "countryCode": "NC", + "west": 163.564667, + "countryName": "New Caledonia", + "continentName": "Oceania", + "currencyCode": "XPF" + }, + { + "continent": "AF", + "capital": "Niamey", + "languages": "fr-NE,ha,kr,dje", + "geonameId": 2440476, + "south": 11.6937560000001, + "isoAlpha3": "NER", + "north": 23.5149999920001, + "fipsCode": "NG", + "population": "22442948", + "east": 15.9990340000001, + "isoNumeric": "562", + "areaInSqKm": "1267000.0", + "countryCode": "NE", + "west": 0.162193643000023, + "countryName": "Niger", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "OC", + "capital": "Kingston", + "languages": "en-NF", + "geonameId": 2155115, + "south": -29.063076742954735, + "isoAlpha3": "NFK", + "north": -28.995170686948427, + "fipsCode": "NF", + "population": "1828", + "east": 167.99773740209957, + "isoNumeric": "574", + "areaInSqKm": "34.6", + "countryCode": "NF", + "west": 167.91543230151365, + "countryName": "Norfolk Island", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "AF", + "capital": "Abuja", + "languages": "en-NG,ha,yo,ig,ff", + "geonameId": 2328926, + "south": 4.27058531900002, + "isoAlpha3": "NGA", + "north": 13.885645000000068, + "fipsCode": "NI", + "population": "195874740", + "east": 14.677982000000043, + "isoNumeric": "566", + "areaInSqKm": "923768.0", + "countryCode": "NG", + "west": 2.663560999000026, + "countryName": "Nigeria", + "continentName": "Africa", + "currencyCode": "NGN" + }, + { + "continent": "NA", + "capital": "Managua", + "languages": "es-NI,en", + "geonameId": 3617476, + "south": 10.707543, + "isoAlpha3": "NIC", + "north": 15.025909, + "fipsCode": "NU", + "population": "6465513", + "east": -82.738289, + "isoNumeric": "558", + "areaInSqKm": "129494.0", + "countryCode": "NI", + "west": -87.690308, + "countryName": "Nicaragua", + "continentName": "North America", + "currencyCode": "NIO" + }, + { + "continent": "EU", + "capital": "Amsterdam", + "languages": "nl-NL,fy-NL", + "geonameId": 2750405, + "south": 50.7503674993741, + "isoAlpha3": "NLD", + "north": 53.5157125645109, + "fipsCode": "NL", + "population": "17231017", + "east": 7.22749859212922, + "isoNumeric": "528", + "areaInSqKm": "41526.0", + "countryCode": "NL", + "west": 3.35837827202, + "countryName": "Netherlands", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Oslo", + "languages": "no,nb,nn,se,fi", + "geonameId": 3144096, + "south": 57.97987783489344, + "isoAlpha3": "NOR", + "north": 71.1854764998959, + "fipsCode": "NO", + "population": "5314336", + "east": 31.063740342248376, + "isoNumeric": "578", + "areaInSqKm": "324220.0", + "countryCode": "NO", + "west": 4.64182374183584, + "countryName": "Norway", + "continentName": "Europe", + "currencyCode": "NOK" + }, + { + "continent": "AS", + "capital": "Kathmandu", + "languages": "ne,en", + "geonameId": 1282988, + "south": 26.3479660710001, + "isoAlpha3": "NPL", + "north": 30.447389748, + "fipsCode": "NP", + "population": "28087871", + "east": 88.2015257450001, + "isoNumeric": "524", + "areaInSqKm": "140800.0", + "countryCode": "NP", + "west": 80.058450824, + "countryName": "Nepal", + "continentName": "Asia", + "currencyCode": "NPR" + }, + { + "continent": "OC", + "capital": "Yaren District", + "languages": "na,en-NR", + "geonameId": 2110425, + "south": -0.5541467234752249, + "isoAlpha3": "NRU", + "north": -0.502657000000004, + "fipsCode": "NR", + "population": "12704", + "east": 166.95899600000007, + "isoNumeric": "520", + "areaInSqKm": "21.0", + "countryCode": "NR", + "west": 166.90968999999996, + "countryName": "Nauru", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "OC", + "capital": "Alofi", + "languages": "niu,en-NU", + "geonameId": 4036232, + "south": -19.152193, + "isoAlpha3": "NIU", + "north": -18.951069, + "fipsCode": "NE", + "population": "2166", + "east": -169.775177, + "isoNumeric": "570", + "areaInSqKm": "260.0", + "countryCode": "NU", + "west": -169.951004, + "countryName": "Niue", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "OC", + "capital": "Wellington", + "languages": "en-NZ,mi", + "geonameId": 2186224, + "south": -47.286026, + "isoAlpha3": "NZL", + "north": -34.389668, + "fipsCode": "NZ", + "population": "4885500", + "east": -180, + "isoNumeric": "554", + "areaInSqKm": "268680.0", + "countryCode": "NZ", + "west": 166.7155, + "countryName": "New Zealand", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "AS", + "capital": "Muscat", + "languages": "ar-OM,en,bal,ur", + "geonameId": 286963, + "south": 16.6500835430001, + "isoAlpha3": "OMN", + "north": 26.3863334660001, + "fipsCode": "MU", + "population": "4829483", + "east": 59.8379173280001, + "isoNumeric": "512", + "areaInSqKm": "212460.0", + "countryCode": "OM", + "west": 52.0000000000001, + "countryName": "Oman", + "continentName": "Asia", + "currencyCode": "OMR" + }, + { + "continent": "NA", + "capital": "Panama City", + "languages": "es-PA,en", + "geonameId": 3703430, + "south": 7.20236920646422, + "isoAlpha3": "PAN", + "north": 9.6474132494631, + "fipsCode": "PM", + "population": "4176873", + "east": -77.1563637579897, + "isoNumeric": "591", + "areaInSqKm": "78200.0", + "countryCode": "PA", + "west": -83.0523988577088, + "countryName": "Panama", + "continentName": "North America", + "currencyCode": "PAB" + }, + { + "continent": "SA", + "capital": "Lima", + "languages": "es-PE,qu,ay", + "geonameId": 3932488, + "south": -18.3509277356587, + "isoAlpha3": "PER", + "north": -0.0386059686681167, + "fipsCode": "PE", + "population": "31989256", + "east": -68.6522791042853, + "isoNumeric": "604", + "areaInSqKm": "1285220.0", + "countryCode": "PE", + "west": -81.3281953622301, + "countryName": "Peru", + "continentName": "South America", + "currencyCode": "PEN" + }, + { + "continent": "OC", + "capital": "Papeete", + "languages": "fr-PF,ty", + "geonameId": 4030656, + "south": -27.653572, + "isoAlpha3": "PYF", + "north": -7.903573, + "fipsCode": "FP", + "population": "277679", + "east": -134.929825, + "isoNumeric": "258", + "areaInSqKm": "4167.0", + "countryCode": "PF", + "west": -152.877167, + "countryName": "French Polynesia", + "continentName": "Oceania", + "currencyCode": "XPF" + }, + { + "continent": "OC", + "capital": "Port Moresby", + "languages": "en-PG,ho,meu,tpi", + "geonameId": 2088628, + "south": -11.657972335, + "isoAlpha3": "PNG", + "north": -1.31544446799995, + "fipsCode": "PP", + "population": "8606316", + "east": 155.968780519, + "isoNumeric": "598", + "areaInSqKm": "462840.0", + "countryCode": "PG", + "west": 140.841969, + "countryName": "Papua New Guinea", + "continentName": "Oceania", + "currencyCode": "PGK" + }, + { + "continent": "AS", + "capital": "Manila", + "languages": "tl,en-PH,fil,ceb,tgl,ilo,hil,war,pam,bik,bcl,pag,mrw,tsg,mdh,cbk,krj,sgd,msb,akl,ibg,yka,mta,abx", + "geonameId": 1694008, + "south": 4.64209796365014, + "isoAlpha3": "PHL", + "north": 21.1218854788318, + "fipsCode": "RP", + "population": "106651922", + "east": 126.60497402182328, + "isoNumeric": "608", + "areaInSqKm": "300000.0", + "countryCode": "PH", + "west": 116.9288644959, + "countryName": "Philippines", + "continentName": "Asia", + "currencyCode": "PHP" + }, + { + "continent": "AS", + "capital": "Islamabad", + "languages": "ur-PK,en-PK,pa,sd,ps,brh", + "geonameId": 1168579, + "south": 23.769527435, + "isoAlpha3": "PAK", + "north": 37.0841070010001, + "fipsCode": "PK", + "population": "212215030", + "east": 77.0132974640001, + "isoNumeric": "586", + "areaInSqKm": "803940.0", + "countryCode": "PK", + "west": 60.8729720000001, + "countryName": "Pakistan", + "continentName": "Asia", + "currencyCode": "PKR" + }, + { + "continent": "EU", + "capital": "Warsaw", + "languages": "pl", + "geonameId": 798544, + "south": 49.0020465193443, + "isoAlpha3": "POL", + "north": 54.8357886595169, + "fipsCode": "PL", + "population": "37978548", + "east": 24.1457828491313, + "isoNumeric": "616", + "areaInSqKm": "312685.0", + "countryCode": "PL", + "west": 14.1228850233809, + "countryName": "Poland", + "continentName": "Europe", + "currencyCode": "PLN" + }, + { + "continent": "NA", + "capital": "Saint-Pierre", + "languages": "fr-PM", + "geonameId": 3424932, + "south": 46.78264970849848, + "isoAlpha3": "SPM", + "north": 47.14376802942701, + "fipsCode": "SB", + "population": "7012", + "east": -56.1253298443454, + "isoNumeric": "666", + "areaInSqKm": "242.0", + "countryCode": "PM", + "west": -56.40709223087083, + "countryName": "Saint Pierre and Miquelon", + "continentName": "North America", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Adamstown", + "languages": "en-PN", + "geonameId": 4030699, + "south": -24.672565, + "isoAlpha3": "PCN", + "north": -24.3299386198549, + "fipsCode": "PC", + "population": "46", + "east": -124.77285, + "isoNumeric": "612", + "areaInSqKm": "47.0", + "countryCode": "PN", + "west": -128.35699011119425, + "countryName": "Pitcairn Islands", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "NA", + "capital": "San Juan", + "languages": "en-PR,es-PR", + "geonameId": 4566966, + "south": 17.9269004394039, + "isoAlpha3": "PRI", + "north": 18.5159687270238, + "fipsCode": "RQ", + "population": "3195153", + "east": -65.2442099429843, + "isoNumeric": "630", + "areaInSqKm": "9104.0", + "countryCode": "PR", + "west": -67.9461344974432, + "countryName": "Puerto Rico", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "", + "languages": "ar-PS", + "geonameId": 6254930, + "south": 31.2200520000001, + "isoAlpha3": "PSE", + "north": 32.5520881030001, + "fipsCode": "WE", + "population": "4569087", + "east": 35.5740520000001, + "isoNumeric": "275", + "areaInSqKm": "5970.0", + "countryCode": "PS", + "west": 34.2186994300001, + "countryName": "Palestine", + "continentName": "Asia", + "currencyCode": "ILS" + }, + { + "continent": "EU", + "capital": "Lisbon", + "languages": "pt-PT,mwl", + "geonameId": 2264397, + "south": 36.96125, + "isoAlpha3": "PRT", + "north": 42.154311127408, + "fipsCode": "PO", + "population": "10281762", + "east": -6.18915930748288, + "isoNumeric": "620", + "areaInSqKm": "92391.0", + "countryCode": "PT", + "west": -9.50052660716588, + "countryName": "Portugal", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "OC", + "capital": "Ngerulmud", + "languages": "pau,sov,en-PW,tox,ja,fil,zh", + "geonameId": 1559582, + "south": 2.8036, + "isoAlpha3": "PLW", + "north": 8.46966, + "fipsCode": "PS", + "population": "17907", + "east": 134.72307, + "isoNumeric": "585", + "areaInSqKm": "458.0", + "countryCode": "PW", + "west": 131.11788, + "countryName": "Palau", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "SA", + "capital": "Asunción", + "languages": "es-PY,gn", + "geonameId": 3437598, + "south": -27.5918335646318, + "isoAlpha3": "PRY", + "north": -19.2896000004762, + "fipsCode": "PA", + "population": "6956071", + "east": -54.2589239104835, + "isoNumeric": "600", + "areaInSqKm": "406750.0", + "countryCode": "PY", + "west": -62.6446174378624, + "countryName": "Paraguay", + "continentName": "South America", + "currencyCode": "PYG" + }, + { + "continent": "AS", + "capital": "Doha", + "languages": "ar-QA,es", + "geonameId": 289688, + "south": 24.4711111230001, + "isoAlpha3": "QAT", + "north": 26.1578818880001, + "fipsCode": "QA", + "population": "2781677", + "east": 51.6315537500001, + "isoNumeric": "634", + "areaInSqKm": "11437.0", + "countryCode": "QA", + "west": 50.750030995, + "countryName": "Qatar", + "continentName": "Asia", + "currencyCode": "QAR" + }, + { + "continent": "AF", + "capital": "Saint-Denis", + "languages": "fr-RE", + "geonameId": 935317, + "south": -21.3896307613732, + "isoAlpha3": "REU", + "north": -20.8718271541163, + "fipsCode": "RE", + "population": "776948", + "east": 55.8366292267104, + "isoNumeric": "638", + "areaInSqKm": "2517.0", + "countryCode": "RE", + "west": 55.2165259976951, + "countryName": "Réunion", + "continentName": "Africa", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Bucharest", + "languages": "ro,hu,rom", + "geonameId": 798549, + "south": 43.6190166499833, + "isoAlpha3": "ROU", + "north": 48.2653912058468, + "fipsCode": "RO", + "population": "19473936", + "east": 29.7152986907701, + "isoNumeric": "642", + "areaInSqKm": "237500.0", + "countryCode": "RO", + "west": 20.2619949052262, + "countryName": "Romania", + "continentName": "Europe", + "currencyCode": "RON" + }, + { + "continent": "EU", + "capital": "Belgrade", + "languages": "sr,hu,bs,rom", + "geonameId": 6290252, + "south": 42.2315030010001, + "isoAlpha3": "SRB", + "north": 46.189446, + "fipsCode": "RI", + "population": "6982084", + "east": 23.0063870060001, + "isoNumeric": "688", + "areaInSqKm": "88361.0", + "countryCode": "RS", + "west": 18.838044043, + "countryName": "Serbia", + "continentName": "Europe", + "currencyCode": "RSD" + }, + { + "continent": "EU", + "capital": "Moscow", + "languages": "ru,tt,xal,cau,ady,kv,ce,tyv,cv,udm,tut,mns,bua,myv,mdf,chm,ba,inh,tut,kbd,krc,av,sah,nog", + "geonameId": 2017370, + "south": 41.1853530000001, + "isoAlpha3": "RUS", + "north": 81.8616409300001, + "fipsCode": "RS", + "population": "144478050", + "east": -169.05, + "isoNumeric": "643", + "areaInSqKm": "1.71E7", + "countryCode": "RU", + "west": 19.25, + "countryName": "Russia", + "continentName": "Europe", + "currencyCode": "RUB" + }, + { + "continent": "AF", + "capital": "Kigali", + "languages": "rw,en-RW,fr-RW,sw", + "geonameId": 49518, + "south": -2.84023010213747, + "isoAlpha3": "RWA", + "north": -1.04716670707785, + "fipsCode": "RW", + "population": "12301939", + "east": 30.8997466415943, + "isoNumeric": "646", + "areaInSqKm": "26338.0", + "countryCode": "RW", + "west": 28.8617308206209, + "countryName": "Rwanda", + "continentName": "Africa", + "currencyCode": "RWF" + }, + { + "continent": "AS", + "capital": "Riyadh", + "languages": "ar-SA", + "geonameId": 102358, + "south": 16.379528001, + "isoAlpha3": "SAU", + "north": 32.1542840000001, + "fipsCode": "SA", + "population": "33699947", + "east": 55.6667, + "isoNumeric": "682", + "areaInSqKm": "1960582.0", + "countryCode": "SA", + "west": 34.495693, + "countryName": "Saudi Arabia", + "continentName": "Asia", + "currencyCode": "SAR" + }, + { + "continent": "OC", + "capital": "Honiara", + "languages": "en-SB,tpi", + "geonameId": 2103350, + "south": -11.88141903, + "isoAlpha3": "SLB", + "north": -6.58897397999996, + "fipsCode": "BP", + "population": "652858", + "east": 166.99122396, + "isoNumeric": "090", + "areaInSqKm": "28450.0", + "countryCode": "SB", + "west": 155.51227512, + "countryName": "Solomon Islands", + "continentName": "Oceania", + "currencyCode": "SBD" + }, + { + "continent": "AF", + "capital": "Victoria", + "languages": "en-SC,fr-SC", + "geonameId": 241170, + "south": -9.753867, + "isoAlpha3": "SYC", + "north": -4.283717, + "fipsCode": "SE", + "population": "96762", + "east": 56.29770287937299, + "isoNumeric": "690", + "areaInSqKm": "455.0", + "countryCode": "SC", + "west": 46.204769, + "countryName": "Seychelles", + "continentName": "Africa", + "currencyCode": "SCR" + }, + { + "continent": "AF", + "capital": "Khartoum", + "languages": "ar-SD,en,fia", + "geonameId": 366755, + "south": 9.48888700000003, + "isoAlpha3": "SDN", + "north": 23.1464092140001, + "fipsCode": "SU", + "population": "41801533", + "east": 38.5822502880001, + "isoNumeric": "729", + "areaInSqKm": "1861484.0", + "countryCode": "SD", + "west": 21.8146345210001, + "countryName": "Sudan", + "continentName": "Africa", + "currencyCode": "SDG" + }, + { + "continent": "EU", + "capital": "Stockholm", + "languages": "sv-SE,se,sma,fi-SE", + "geonameId": 2661886, + "south": 55.3374438220002, + "isoAlpha3": "SWE", + "north": 69.0599672666879, + "fipsCode": "SW", + "population": "10183175", + "east": 24.155245238099, + "isoNumeric": "752", + "areaInSqKm": "449964.0", + "countryCode": "SE", + "west": 11.109499387126, + "countryName": "Sweden", + "continentName": "Europe", + "currencyCode": "SEK" + }, + { + "continent": "AS", + "capital": "Singapore", + "languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG", + "geonameId": 1880251, + "south": 1.21065456224784, + "isoAlpha3": "SGP", + "north": 1.47077483208476, + "fipsCode": "SN", + "population": "5638676", + "east": 104.043617447514, + "isoNumeric": "702", + "areaInSqKm": "692.7", + "countryCode": "SG", + "west": 103.605700705134, + "countryName": "Singapore", + "continentName": "Asia", + "currencyCode": "SGD" + }, + { + "continent": "AF", + "capital": "Jamestown", + "languages": "en-SH", + "geonameId": 3370751, + "south": -16.019543, + "isoAlpha3": "SHN", + "north": -7.887815, + "fipsCode": "SH", + "population": "7460", + "east": -5.638753, + "isoNumeric": "654", + "areaInSqKm": "410.0", + "countryCode": "SH", + "west": -14.42123, + "countryName": "Saint Helena", + "continentName": "Africa", + "currencyCode": "SHP" + }, + { + "continent": "EU", + "capital": "Ljubljana", + "languages": "sl,sh", + "geonameId": 3190538, + "south": 45.421812998164, + "isoAlpha3": "SVN", + "north": 46.8766275518195, + "fipsCode": "SI", + "population": "2067372", + "east": 16.6106311807, + "isoNumeric": "705", + "areaInSqKm": "20273.0", + "countryCode": "SI", + "west": 13.3753342064709, + "countryName": "Slovenia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "EU", + "capital": "Longyearbyen", + "languages": "no,ru", + "geonameId": 607072, + "south": 79.220306, + "isoAlpha3": "SJM", + "north": 80.762085, + "fipsCode": "SV", + "population": "2550", + "east": 33.287334, + "isoNumeric": "744", + "areaInSqKm": "62049.0", + "countryCode": "SJ", + "west": 17.699389, + "countryName": "Svalbard and Jan Mayen", + "continentName": "Europe", + "currencyCode": "NOK" + }, + { + "continent": "EU", + "capital": "Bratislava", + "languages": "sk,hu", + "geonameId": 3057568, + "south": 47.7313590000001, + "isoAlpha3": "SVK", + "north": 49.6137360000001, + "fipsCode": "LO", + "population": "5447011", + "east": 22.5657383340001, + "isoNumeric": "703", + "areaInSqKm": "48845.0", + "countryCode": "SK", + "west": 16.8334234020001, + "countryName": "Slovakia", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Freetown", + "languages": "en-SL,men,tem", + "geonameId": 2403846, + "south": 6.92343700100002, + "isoAlpha3": "SLE", + "north": 9.99997300000007, + "fipsCode": "SL", + "population": "7650154", + "east": -10.2716829999999, + "isoNumeric": "694", + "areaInSqKm": "71740.0", + "countryCode": "SL", + "west": -13.302128077, + "countryName": "Sierra Leone", + "continentName": "Africa", + "currencyCode": "SLL" + }, + { + "continent": "EU", + "capital": "San Marino", + "languages": "it-SM", + "geonameId": 3168068, + "south": 43.8937002210188, + "isoAlpha3": "SMR", + "north": 43.9920929668161, + "fipsCode": "SM", + "population": "33785", + "east": 12.51584904544211, + "isoNumeric": "674", + "areaInSqKm": "61.2", + "countryCode": "SM", + "west": 12.403605260165023, + "countryName": "San Marino", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Dakar", + "languages": "fr-SN,wo,fuc,mnk", + "geonameId": 2245662, + "south": 12.307289079, + "isoAlpha3": "SEN", + "north": 16.6929572170001, + "fipsCode": "SG", + "population": "15854360", + "east": -11.345768371, + "isoNumeric": "686", + "areaInSqKm": "196190.0", + "countryCode": "SN", + "west": -17.529520035, + "countryName": "Senegal", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "AF", + "capital": "Mogadishu", + "languages": "so-SO,ar-SO,it,en-SO", + "geonameId": 51537, + "south": -1.66203236399997, + "isoAlpha3": "SOM", + "north": 11.9887353730001, + "fipsCode": "SO", + "population": "15008154", + "east": 51.4150313960001, + "isoNumeric": "706", + "areaInSqKm": "637657.0", + "countryCode": "SO", + "west": 40.9943730000001, + "countryName": "Somalia", + "continentName": "Africa", + "currencyCode": "SOS" + }, + { + "continent": "SA", + "capital": "Paramaribo", + "languages": "nl-SR,en,srn,hns,jv", + "geonameId": 3382998, + "south": 1.83730600000007, + "isoAlpha3": "SUR", + "north": 6.01550458300005, + "fipsCode": "NS", + "population": "575991", + "east": -53.978763, + "isoNumeric": "740", + "areaInSqKm": "163270.0", + "countryCode": "SR", + "west": -58.070505999, + "countryName": "Suriname", + "continentName": "South America", + "currencyCode": "SRD" + }, + { + "continent": "AF", + "capital": "Juba", + "languages": "en", + "geonameId": 7909807, + "south": 3.48898000000003, + "isoAlpha3": "SSD", + "north": 12.236389, + "fipsCode": "OD", + "population": "8260490", + "east": 35.9489970000001, + "isoNumeric": "728", + "areaInSqKm": "644329.0", + "countryCode": "SS", + "west": 23.4408490000001, + "countryName": "South Sudan", + "continentName": "Africa", + "currencyCode": "SSP" + }, + { + "continent": "AF", + "capital": "São Tomé", + "languages": "pt-ST", + "geonameId": 2410758, + "south": 0.024766, + "isoAlpha3": "STP", + "north": 1.701323, + "fipsCode": "TP", + "population": "197700", + "east": 7.466374, + "isoNumeric": "678", + "areaInSqKm": "1001.0", + "countryCode": "ST", + "west": 6.47017, + "countryName": "São Tomé and Príncipe", + "continentName": "Africa", + "currencyCode": "STD" + }, + { + "continent": "NA", + "capital": "San Salvador", + "languages": "es-SV", + "geonameId": 3585968, + "south": 13.153004391, + "isoAlpha3": "SLV", + "north": 14.450557001, + "fipsCode": "ES", + "population": "6420744", + "east": -87.692162, + "isoNumeric": "222", + "areaInSqKm": "21040.0", + "countryCode": "SV", + "west": -90.134654476, + "countryName": "El Salvador", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Philipsburg", + "languages": "nl,en", + "geonameId": 7609695, + "south": 18.00509989712575, + "isoAlpha3": "SXM", + "north": 18.0641148010001, + "fipsCode": "NN", + "population": "40654", + "east": -63.01365933767215, + "isoNumeric": "534", + "areaInSqKm": "21.0", + "countryCode": "SX", + "west": -63.13916381600001, + "countryName": "Sint Maarten", + "continentName": "North America", + "currencyCode": "ANG" + }, + { + "continent": "AS", + "capital": "Damascus", + "languages": "ar-SY,ku,hy,arc,fr,en", + "geonameId": 163843, + "south": 32.311136, + "isoAlpha3": "SYR", + "north": 37.3205689060001, + "fipsCode": "SY", + "population": "16906283", + "east": 42.376309, + "isoNumeric": "760", + "areaInSqKm": "185180.0", + "countryCode": "SY", + "west": 35.587211, + "countryName": "Syria", + "continentName": "Asia", + "currencyCode": "SYP" + }, + { + "continent": "AF", + "capital": "Mbabane", + "languages": "en-SZ,ss-SZ", + "geonameId": 934841, + "south": -27.317402, + "isoAlpha3": "SWZ", + "north": -25.7179199999999, + "fipsCode": "WZ", + "population": "1136191", + "east": 32.1349066610001, + "isoNumeric": "748", + "areaInSqKm": "17363.0", + "countryCode": "SZ", + "west": 30.7906400000001, + "countryName": "Eswatini", + "continentName": "Africa", + "currencyCode": "SZL" + }, + { + "continent": "NA", + "capital": "Cockburn Town", + "languages": "en-TC", + "geonameId": 3576916, + "south": 21.422626, + "isoAlpha3": "TCA", + "north": 21.961878, + "fipsCode": "TK", + "population": "37665", + "east": -71.123642, + "isoNumeric": "796", + "areaInSqKm": "430.0", + "countryCode": "TC", + "west": -72.483871, + "countryName": "Turks and Caicos Islands", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "AF", + "capital": "N'Djamena", + "languages": "fr-TD,ar-TD,sre", + "geonameId": 2434508, + "south": 7.44297500000005, + "isoAlpha3": "TCD", + "north": 23.4523611160001, + "fipsCode": "CD", + "population": "15477751", + "east": 24.0000000000001, + "isoNumeric": "148", + "areaInSqKm": "1284000.0", + "countryCode": "TD", + "west": 13.47, + "countryName": "Chad", + "continentName": "Africa", + "currencyCode": "XAF" + }, + { + "continent": "AN", + "capital": "Port-aux-Français", + "languages": "fr", + "geonameId": 1546748, + "south": -49.735184, + "isoAlpha3": "ATF", + "north": -37.790722, + "fipsCode": "FS", + "population": "140", + "east": 77.598808, + "isoNumeric": "260", + "areaInSqKm": "7829.0", + "countryCode": "TF", + "west": 50.170258, + "countryName": "French Southern Territories", + "continentName": "Antarctica", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Lomé", + "languages": "fr-TG,ee,hna,kbp,dag,ha", + "geonameId": 2363686, + "south": 6.11225958700004, + "isoAlpha3": "TGO", + "north": 11.1394984250001, + "fipsCode": "TO", + "population": "7889094", + "east": 1.80890722900006, + "isoNumeric": "768", + "areaInSqKm": "56785.0", + "countryCode": "TG", + "west": -0.144041999999956, + "countryName": "Togo", + "continentName": "Africa", + "currencyCode": "XOF" + }, + { + "continent": "AS", + "capital": "Bangkok", + "languages": "th,en", + "geonameId": 1605651, + "south": 5.61, + "isoAlpha3": "THA", + "north": 20.463194, + "fipsCode": "TH", + "population": "69428524", + "east": 105.639389, + "isoNumeric": "764", + "areaInSqKm": "514000.0", + "countryCode": "TH", + "west": 97.345642, + "countryName": "Thailand", + "continentName": "Asia", + "currencyCode": "THB" + }, + { + "continent": "AS", + "capital": "Dushanbe", + "languages": "tg,ru", + "geonameId": 1220409, + "south": 36.672037001, + "isoAlpha3": "TJK", + "north": 41.0443670000001, + "fipsCode": "TI", + "population": "9100837", + "east": 75.1539560000001, + "isoNumeric": "762", + "areaInSqKm": "143100.0", + "countryCode": "TJ", + "west": 67.3420120000001, + "countryName": "Tajikistan", + "continentName": "Asia", + "currencyCode": "TJS" + }, + { + "continent": "OC", + "capital": "", + "languages": "tkl,en-TK", + "geonameId": 4031074, + "south": -9.381111145019531, + "isoAlpha3": "TKL", + "north": -8.553613662719727, + "fipsCode": "TL", + "population": "1466", + "east": -171.21142578125, + "isoNumeric": "772", + "areaInSqKm": "10.0", + "countryCode": "TK", + "west": -172.50033569335938, + "countryName": "Tokelau", + "continentName": "Oceania", + "currencyCode": "NZD" + }, + { + "continent": "OC", + "capital": "Dili", + "languages": "tet,pt-TL,id,en", + "geonameId": 1966436, + "south": -9.504650115966797, + "isoAlpha3": "TLS", + "north": -8.12687015533447, + "fipsCode": "TT", + "population": "1267972", + "east": 127.34211730957031, + "isoNumeric": "626", + "areaInSqKm": "15007.0", + "countryCode": "TL", + "west": 124.04464721679688, + "countryName": "Timor-Leste", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "Ashgabat", + "languages": "tk,ru,uz", + "geonameId": 1218197, + "south": 35.1290930000001, + "isoAlpha3": "TKM", + "north": 42.7982617260001, + "fipsCode": "TX", + "population": "5850908", + "east": 66.7073530000001, + "isoNumeric": "795", + "areaInSqKm": "488100.0", + "countryCode": "TM", + "west": 52.4455780650001, + "countryName": "Turkmenistan", + "continentName": "Asia", + "currencyCode": "TMT" + }, + { + "continent": "AF", + "capital": "Tunis", + "languages": "ar-TN,fr", + "geonameId": 2464461, + "south": 30.2415834110001, + "isoAlpha3": "TUN", + "north": 37.5419886350001, + "fipsCode": "TS", + "population": "11565204", + "east": 11.608143339, + "isoNumeric": "788", + "areaInSqKm": "163610.0", + "countryCode": "TN", + "west": 7.52252789300007, + "countryName": "Tunisia", + "continentName": "Africa", + "currencyCode": "TND" + }, + { + "continent": "OC", + "capital": "Nuku'alofa", + "languages": "to,en-TO", + "geonameId": 4032283, + "south": -21.4564838739226, + "isoAlpha3": "TON", + "north": -15.566146670329, + "fipsCode": "TN", + "population": "103197", + "east": -173.902137947337, + "isoNumeric": "776", + "areaInSqKm": "748.0", + "countryCode": "TO", + "west": -175.67962556356, + "countryName": "Tonga", + "continentName": "Oceania", + "currencyCode": "TOP" + }, + { + "continent": "AS", + "capital": "Ankara", + "languages": "tr-TR,ku,diq,az,av", + "geonameId": 298795, + "south": 35.8121761290001, + "isoAlpha3": "TUR", + "north": 42.104895001, + "fipsCode": "TU", + "population": "82319724", + "east": 44.81812800000006, + "isoNumeric": "792", + "areaInSqKm": "780580.0", + "countryCode": "TR", + "west": 25.6665057269225, + "countryName": "Turkey", + "continentName": "Asia", + "currencyCode": "TRY" + }, + { + "continent": "NA", + "capital": "Port of Spain", + "languages": "en-TT,hns,fr,es,zh", + "geonameId": 3573591, + "south": 10.0411386500001, + "isoAlpha3": "TTO", + "north": 11.348472596, + "fipsCode": "TD", + "population": "1389858", + "east": -60.519332886, + "isoNumeric": "780", + "areaInSqKm": "5128.0", + "countryCode": "TT", + "west": -61.933723449, + "countryName": "Trinidad and Tobago", + "continentName": "North America", + "currencyCode": "TTD" + }, + { + "continent": "OC", + "capital": "Funafuti", + "languages": "tvl,en,sm,gil", + "geonameId": 2110297, + "south": -10.791580457901, + "isoAlpha3": "TUV", + "north": -5.64246006144929, + "fipsCode": "TV", + "population": "11508", + "east": 179.871049968689, + "isoNumeric": "798", + "areaInSqKm": "26.0", + "countryCode": "TV", + "west": 176.059056543963, + "countryName": "Tuvalu", + "continentName": "Oceania", + "currencyCode": "AUD" + }, + { + "continent": "AS", + "capital": "Taipei", + "languages": "zh-TW,zh,nan,hak", + "geonameId": 1668284, + "south": 21.896606934717, + "isoAlpha3": "TWN", + "north": 25.3002899036181, + "fipsCode": "TW", + "population": "22894384", + "east": 122.006739823315, + "isoNumeric": "158", + "areaInSqKm": "35980.0", + "countryCode": "TW", + "west": 119.534691, + "countryName": "Taiwan", + "continentName": "Asia", + "currencyCode": "TWD" + }, + { + "continent": "AF", + "capital": "Dodoma", + "languages": "sw-TZ,en,ar", + "geonameId": 149590, + "south": -11.761254, + "isoAlpha3": "TZA", + "north": -0.984396999999944, + "fipsCode": "TZ", + "population": "56318348", + "east": 40.4448279960001, + "isoNumeric": "834", + "areaInSqKm": "945087.0", + "countryCode": "TZ", + "west": 29.34, + "countryName": "Tanzania", + "continentName": "Africa", + "currencyCode": "TZS" + }, + { + "continent": "EU", + "capital": "Kyiv", + "languages": "uk,ru-UA,rom,pl,hu", + "geonameId": 690791, + "south": 44.3820571900001, + "isoAlpha3": "UKR", + "north": 52.3793713250001, + "fipsCode": "UP", + "population": "44622516", + "east": 40.22048033, + "isoNumeric": "804", + "areaInSqKm": "603700.0", + "countryCode": "UA", + "west": 22.137078, + "countryName": "Ukraine", + "continentName": "Europe", + "currencyCode": "UAH" + }, + { + "continent": "AF", + "capital": "Kampala", + "languages": "en-UG,lg,sw,ar", + "geonameId": 226074, + "south": -1.48153052848838, + "isoAlpha3": "UGA", + "north": 4.23136926690327, + "fipsCode": "UG", + "population": "42723139", + "east": 35.0010535324228, + "isoNumeric": "800", + "areaInSqKm": "236040.0", + "countryCode": "UG", + "west": 29.573465338129, + "countryName": "Uganda", + "continentName": "Africa", + "currencyCode": "UGX" + }, + { + "continent": "OC", + "capital": "", + "languages": "en-UM", + "geonameId": 5854968, + "south": -0.38256883746907566, + "isoAlpha3": "UMI", + "north": 28.218499990178167, + "fipsCode": "", + "population": "0", + "east": 166.657540716752, + "isoNumeric": "581", + "areaInSqKm": "0.0", + "countryCode": "UM", + "west": -177.39629361298717, + "countryName": "U.S. Minor Outlying Islands", + "continentName": "Oceania", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Washington", + "languages": "en-US,es-US,haw,fr", + "geonameId": 6252001, + "south": 24.544093, + "isoAlpha3": "USA", + "north": 49.384358, + "fipsCode": "US", + "population": "327167434", + "east": -66.949607, + "isoNumeric": "840", + "areaInSqKm": "9629091.0", + "countryCode": "US", + "west": -124.733692, + "countryName": "United States", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "SA", + "capital": "Montevideo", + "languages": "es-UY", + "geonameId": 3439705, + "south": -34.9740543027064, + "isoAlpha3": "URY", + "north": -30.0855024328825, + "fipsCode": "UY", + "population": "3449299", + "east": -53.1810509360802, + "isoNumeric": "858", + "areaInSqKm": "176220.0", + "countryCode": "UY", + "west": -58.4393489790361, + "countryName": "Uruguay", + "continentName": "South America", + "currencyCode": "UYU" + }, + { + "continent": "AS", + "capital": "Tashkent", + "languages": "uz,ru,tg", + "geonameId": 1512440, + "south": 37.172269828, + "isoAlpha3": "UZB", + "north": 45.5900750010001, + "fipsCode": "UZ", + "population": "32955400", + "east": 73.1489460000001, + "isoNumeric": "860", + "areaInSqKm": "447400.0", + "countryCode": "UZ", + "west": 55.9982180000001, + "countryName": "Uzbekistan", + "continentName": "Asia", + "currencyCode": "UZS" + }, + { + "continent": "EU", + "capital": "Vatican City", + "languages": "la,it,fr", + "geonameId": 3164670, + "south": 41.90027960306854, + "isoAlpha3": "VAT", + "north": 41.90743830885576, + "fipsCode": "VT", + "population": "921", + "east": 12.45837546629481, + "isoNumeric": "336", + "areaInSqKm": "0.44", + "countryCode": "VA", + "west": 12.44570678169205, + "countryName": "Vatican City", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "NA", + "capital": "Kingstown", + "languages": "en-VC,fr", + "geonameId": 3577815, + "south": 12.5839734740001, + "isoAlpha3": "VCT", + "north": 13.382421799995889, + "fipsCode": "VC", + "population": "110211", + "east": -61.11340272108896, + "isoNumeric": "670", + "areaInSqKm": "389.0", + "countryCode": "VC", + "west": -61.4608524069999, + "countryName": "St Vincent and Grenadines", + "continentName": "North America", + "currencyCode": "XCD" + }, + { + "continent": "SA", + "capital": "Caracas", + "languages": "es-VE", + "geonameId": 3625428, + "south": 0.626311, + "isoAlpha3": "VEN", + "north": 12.201903, + "fipsCode": "VE", + "population": "28870195", + "east": -59.80378, + "isoNumeric": "862", + "areaInSqKm": "912050.0", + "countryCode": "VE", + "west": -73.354073, + "countryName": "Venezuela", + "continentName": "South America", + "currencyCode": "VES" + }, + { + "continent": "NA", + "capital": "Road Town", + "languages": "en-VG", + "geonameId": 3577718, + "south": 18.383710898211305, + "isoAlpha3": "VGB", + "north": 18.757221, + "fipsCode": "VI", + "population": "29802", + "east": -64.268768, + "isoNumeric": "092", + "areaInSqKm": "153.0", + "countryCode": "VG", + "west": -64.71312752730364, + "countryName": "British Virgin Islands", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "NA", + "capital": "Charlotte Amalie", + "languages": "en-VI", + "geonameId": 4796775, + "south": 17.673931, + "isoAlpha3": "VIR", + "north": 18.415382, + "fipsCode": "VQ", + "population": "106977", + "east": -64.565193, + "isoNumeric": "850", + "areaInSqKm": "352.0", + "countryCode": "VI", + "west": -65.101333, + "countryName": "U.S. Virgin Islands", + "continentName": "North America", + "currencyCode": "USD" + }, + { + "continent": "AS", + "capital": "Hanoi", + "languages": "vi,en,fr,zh,km", + "geonameId": 1562822, + "south": 8.559611, + "isoAlpha3": "VNM", + "north": 23.388834, + "fipsCode": "VM", + "population": "95540395", + "east": 109.464638, + "isoNumeric": "704", + "areaInSqKm": "329560.0", + "countryCode": "VN", + "west": 102.148224, + "countryName": "Vietnam", + "continentName": "Asia", + "currencyCode": "VND" + }, + { + "continent": "OC", + "capital": "Port Vila", + "languages": "bi,en-VU,fr-VU", + "geonameId": 2134431, + "south": -20.2524399918312, + "isoAlpha3": "VUT", + "north": -13.0717069251352, + "fipsCode": "NH", + "population": "292680", + "east": 169.904111113607, + "isoNumeric": "548", + "areaInSqKm": "12200.0", + "countryCode": "VU", + "west": 166.541563758726, + "countryName": "Vanuatu", + "continentName": "Oceania", + "currencyCode": "VUV" + }, + { + "continent": "OC", + "capital": "Mata-Utu", + "languages": "wls,fud,fr-WF", + "geonameId": 4034749, + "south": -14.3124693963595, + "isoAlpha3": "WLF", + "north": -13.2169133113924, + "fipsCode": "WF", + "population": "16025", + "east": -176.161967235958, + "isoNumeric": "876", + "areaInSqKm": "274.0", + "countryCode": "WF", + "west": -178.181766889147, + "countryName": "Wallis and Futuna", + "continentName": "Oceania", + "currencyCode": "XPF" + }, + { + "continent": "OC", + "capital": "Apia", + "languages": "sm,en-WS", + "geonameId": 4034894, + "south": -14.049015687969286, + "isoAlpha3": "WSM", + "north": -13.440157771394277, + "fipsCode": "WS", + "population": "196130", + "east": -171.42329410058596, + "isoNumeric": "882", + "areaInSqKm": "2944.0", + "countryCode": "WS", + "west": -172.8035771799316, + "countryName": "Samoa", + "continentName": "Oceania", + "currencyCode": "WST" + }, + { + "continent": "EU", + "capital": "Pristina", + "languages": "sq,sr", + "geonameId": 831053, + "south": 41.857641001, + "isoAlpha3": "XKX", + "north": 43.2676851730001, + "fipsCode": "KV", + "population": "1845300", + "east": 21.7898670000001, + "isoNumeric": "0", + "areaInSqKm": "10908.0", + "countryCode": "XK", + "west": 20.014284, + "countryName": "Kosovo", + "continentName": "Europe", + "currencyCode": "EUR" + }, + { + "continent": "AS", + "capital": "Sanaa", + "languages": "ar-YE", + "geonameId": 69543, + "south": 12.1110910264462, + "isoAlpha3": "YEM", + "north": 18.9999989031009, + "fipsCode": "YM", + "population": "28498687", + "east": 54.5305388163283, + "isoNumeric": "887", + "areaInSqKm": "527970.0", + "countryCode": "YE", + "west": 42.5325394314234, + "countryName": "Yemen", + "continentName": "Asia", + "currencyCode": "YER" + }, + { + "continent": "AF", + "capital": "Mamoudzou", + "languages": "fr-YT", + "geonameId": 1024031, + "south": -13.0000903911179, + "isoAlpha3": "MYT", + "north": -12.6507257773157, + "fipsCode": "MF", + "population": "159042", + "east": 45.2999850886235, + "isoNumeric": "175", + "areaInSqKm": "374.0", + "countryCode": "YT", + "west": 45.0398136630555, + "countryName": "Mayotte", + "continentName": "Africa", + "currencyCode": "EUR" + }, + { + "continent": "AF", + "capital": "Pretoria", + "languages": "zu,xh,af,nso,en-ZA,tn,st,ts,ss,ve,nr", + "geonameId": 953987, + "south": -34.8341700029999, + "isoAlpha3": "ZAF", + "north": -22.1250300579999, + "fipsCode": "SF", + "population": "57779622", + "east": 32.944984945, + "isoNumeric": "710", + "areaInSqKm": "1219912.0", + "countryCode": "ZA", + "west": 16.45189, + "countryName": "South Africa", + "continentName": "Africa", + "currencyCode": "ZAR" + }, + { + "continent": "AF", + "capital": "Lusaka", + "languages": "en-ZM,bem,loz,lun,lue,ny,toi", + "geonameId": 895949, + "south": -18.077418, + "isoAlpha3": "ZMB", + "north": -8.20328399999994, + "fipsCode": "ZA", + "population": "17351822", + "east": 33.7090304810001, + "isoNumeric": "894", + "areaInSqKm": "752614.0", + "countryCode": "ZM", + "west": 21.999350925, + "countryName": "Zambia", + "continentName": "Africa", + "currencyCode": "ZMW" + }, + { + "continent": "AF", + "capital": "Harare", + "languages": "en-ZW,sn,nr,nd", + "geonameId": 878675, + "south": -22.421998999, + "isoAlpha3": "ZWE", + "north": -15.609318999, + "fipsCode": "ZI", + "population": "14439018", + "east": 33.0682360000001, + "isoNumeric": "716", + "areaInSqKm": "390580.0", + "countryCode": "ZW", + "west": 25.2373680000001, + "countryName": "Zimbabwe", + "continentName": "Africa", + "currencyCode": "ZWL" + } +]} \ No newline at end of file diff --git a/ListCollection/README.md b/ListCollection/README.md new file mode 100644 index 0000000..66c8eaf --- /dev/null +++ b/ListCollection/README.md @@ -0,0 +1,40 @@ +# Creating List Layouts with UICollectionView + +Sample code for using the iOS 14 list layout collection view, diffable data source and cell configurations. See the following post for more details: + +* [Creating lists with collection view](https://useyourloaf.com/blog/creating-lists-with-collection-view/) + +# License + +Copyright © 2020 Keith Harrison. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +## GeoNames + +The [GeoNames](https://www.geonames.org/) geographical data used in this sample code is licenced under [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/). From c77730e4a2b02eb933dd08c67fef35234056fefb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Feb 2021 15:07:20 +0000 Subject: [PATCH 87/98] Minimum target is 12.0 --- GridView/GridView.xcodeproj/project.pbxproj | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index 8324803..58f1176 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -143,7 +143,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 531CCB861EAA45D2008349F4 = { @@ -320,6 +320,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -344,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -380,6 +381,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -398,7 +400,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -414,7 +416,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -432,7 +434,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From 828445fffe248ecd14e7f30a8e4bfa3279dd0251 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Feb 2021 15:09:06 +0000 Subject: [PATCH 88/98] Define launch screen in Info.plist --- .../xcshareddata/xcschemes/List.xcscheme | 78 +++++++++++++++++++ .../BackgroundColor.colorset/Contents.json | 15 ++++ .../Contents.json | 15 ++++ .../List/Base.lproj/LaunchScreen.storyboard | 38 +++++++-- ListCollection/List/Info.plist | 44 ++++++++++- ListCollection/List/ListController.swift | 2 +- 6 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme create mode 100644 ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json create mode 100644 ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json diff --git a/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme b/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme new file mode 100644 index 0000000..370e826 --- /dev/null +++ b/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..db2c315 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemPurpleColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..89b5d90 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemYellowColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Base.lproj/LaunchScreen.storyboard b/ListCollection/List/Base.lproj/LaunchScreen.storyboard index 865e932..1efaf14 100644 --- a/ListCollection/List/Base.lproj/LaunchScreen.storyboard +++ b/ListCollection/List/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,9 @@ - - + + + - + + @@ -11,15 +13,39 @@ - + - + + - + + + + + + + + + + + + + + + + + + +
+ + + + +
diff --git a/ListCollection/List/Info.plist b/ListCollection/List/Info.plist index 5b531f7..dbc1db6 100644 --- a/ListCollection/List/Info.plist +++ b/ListCollection/List/Info.plist @@ -16,6 +16,19 @@ $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + com.useyourloaf.list + CFBundleURLSchemes + + facts + + + CFBundleVersion 1 LSRequiresIPhoneOS @@ -41,8 +54,35 @@ UIApplicationSupportsIndirectInputEvents - UILaunchStoryboardName - LaunchScreen + UILaunchScreens + + UIDefaultLaunchScreen + HomeScreen + UILaunchScreenDefinitions + + + UIColorName + BackgroundColor + UILaunchScreenIdentifier + HomeScreen + UINavigationBar + + + + UIColorName + EditBackgroundColor + UILaunchScreenIdentifier + EditScreen + UINavigationBar + + + + UIURLToLaunchScreenAssociations + + facts://country + EditScreen + + UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/ListCollection/List/ListController.swift b/ListCollection/List/ListController.swift index 5d2fd2b..af95527 100644 --- a/ListCollection/List/ListController.swift +++ b/ListCollection/List/ListController.swift @@ -83,7 +83,7 @@ final class ListController: UICollectionViewController { private func createLayout() { var config = UICollectionLayoutListConfiguration(appearance: .insetGrouped) - config.backgroundColor = .systemPurple + config.backgroundColor = UIColor(named: "BackgroundColor") collectionView.collectionViewLayout = UICollectionViewCompositionalLayout.list(using: config) } From 6e330303a3b79c034b2292ee61e7014ceaac087c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 11 Mar 2021 16:10:50 +0000 Subject: [PATCH 89/98] Updated ScaledFont - now a Swift Package - added a SwiftUI example --- .../{ScaledFont => Fonts}/Noteworthy.plist | 22 +- .../{ScaledFont => Fonts}/NotoSerif.plist | 22 +- .../Noto_Serif/LICENSE.txt | 0 .../Noto_Serif/NotoSerif-Bold.ttf | Bin .../Noto_Serif/NotoSerif-BoldItalic.ttf | Bin .../Noto_Serif/NotoSerif-Italic.ttf | Bin .../Noto_Serif/NotoSerif-Regular.ttf | Bin ScaledFont/README.md | 82 +++- .../{ScaledFont => Sampler}/AppDelegate.swift | 8 +- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 +++++ .../Sampler/Assets.xcassets/Contents.json | 6 + ScaledFont/Sampler/Base.lproj/Main.storyboard | 53 +++ ScaledFont/Sampler/Info.plist | 75 ++++ ScaledFont/Sampler/SceneDelegate.swift | 33 ++ .../StyleViewController.swift} | 6 +- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 +++++ .../SamplerUI/Assets.xcassets/Contents.json | 6 + .../{ScaledFont => SamplerUI}/Info.plist | 31 +- .../Preview Assets.xcassets/Contents.json | 6 + ScaledFont/SamplerUI/SamplerUIApp.swift | 44 +++ ScaledFont/SamplerUI/StyleView.swift | 100 +++++ .../ScaledFont.xcodeproj/project.pbxproj | 355 ++++++++++++++---- .../AppIcon.appiconset/Contents.json | 98 ----- .../Base.lproj/LaunchScreen.storyboard | 25 -- .../ScaledFont/Base.lproj/Main.storyboard | 47 --- ScaledFont/ScaledFont/ScaledFont.swift | 113 ------ 28 files changed, 927 insertions(+), 423 deletions(-) rename ScaledFont/{ScaledFont => Fonts}/Noteworthy.plist (78%) rename ScaledFont/{ScaledFont => Fonts}/NotoSerif.plist (78%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/LICENSE.txt (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-Bold.ttf (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-BoldItalic.ttf (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-Italic.ttf (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-Regular.ttf (100%) rename ScaledFont/{ScaledFont => Sampler}/AppDelegate.swift (87%) create mode 100644 ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScaledFont/Sampler/Assets.xcassets/Contents.json create mode 100644 ScaledFont/Sampler/Base.lproj/Main.storyboard create mode 100644 ScaledFont/Sampler/Info.plist create mode 100644 ScaledFont/Sampler/SceneDelegate.swift rename ScaledFont/{ScaledFont/ViewController.swift => Sampler/StyleViewController.swift} (96%) create mode 100644 ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScaledFont/SamplerUI/Assets.xcassets/Contents.json rename ScaledFont/{ScaledFont => SamplerUI}/Info.plist (82%) create mode 100644 ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 ScaledFont/SamplerUI/SamplerUIApp.swift create mode 100644 ScaledFont/SamplerUI/StyleView.swift delete mode 100644 ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard delete mode 100644 ScaledFont/ScaledFont/Base.lproj/Main.storyboard delete mode 100644 ScaledFont/ScaledFont/ScaledFont.swift diff --git a/ScaledFont/ScaledFont/Noteworthy.plist b/ScaledFont/Fonts/Noteworthy.plist similarity index 78% rename from ScaledFont/ScaledFont/Noteworthy.plist rename to ScaledFont/Fonts/Noteworthy.plist index 4395e75..9714135 100644 --- a/ScaledFont/ScaledFont/Noteworthy.plist +++ b/ScaledFont/Fonts/Noteworthy.plist @@ -2,77 +2,77 @@ - UICTFontTextStyleTitle0 + largeTitle fontName Noteworthy-Light fontSize 34 - UICTFontTextStyleTitle1 + title fontName Noteworthy-Light fontSize 28 - UICTFontTextStyleTitle2 + title2 fontName Noteworthy-Light fontSize 22 - UICTFontTextStyleTitle3 + title3 fontName Noteworthy-Light fontSize 20 - UICTFontTextStyleHeadline + headline fontName Noteworthy-Bold fontSize 17 - UICTFontTextStyleSubhead + subheadline fontName Noteworthy-Light fontSize 15 - UICTFontTextStyleBody + body fontName Noteworthy-Light fontSize 17 - UICTFontTextStyleCallout + callout fontName Noteworthy-Light fontSize 16 - UICTFontTextStyleFootnote + footnote fontName Noteworthy-Light fontSize 13 - UICTFontTextStyleCaption1 + caption fontName Noteworthy-Light fontSize 12 - UICTFontTextStyleCaption2 + caption2 fontName Noteworthy-Light diff --git a/ScaledFont/ScaledFont/NotoSerif.plist b/ScaledFont/Fonts/NotoSerif.plist similarity index 78% rename from ScaledFont/ScaledFont/NotoSerif.plist rename to ScaledFont/Fonts/NotoSerif.plist index 2d35c45..79f5db2 100644 --- a/ScaledFont/ScaledFont/NotoSerif.plist +++ b/ScaledFont/Fonts/NotoSerif.plist @@ -2,77 +2,77 @@ - UICTFontTextStyleTitle0 + largeTitle fontName NotoSerif fontSize 34 - UICTFontTextStyleTitle1 + title fontName NotoSerif fontSize 28 - UICTFontTextStyleTitle2 + title2 fontName NotoSerif fontSize 22 - UICTFontTextStyleTitle3 + title3 fontName NotoSerif fontSize 20 - UICTFontTextStyleHeadline + headline fontName NotoSerif-Bold fontSize 17 - UICTFontTextStyleSubhead + subheadline fontName NotoSerif-Italic fontSize 15 - UICTFontTextStyleBody + body fontName NotoSerif fontSize 17 - UICTFontTextStyleCallout + callout fontName NotoSerif fontSize 16 - UICTFontTextStyleFootnote + footnote fontName NotoSerif fontSize 13 - UICTFontTextStyleCaption1 + caption fontName NotoSerif-Italic fontSize 12 - UICTFontTextStyleCaption2 + caption2 fontName NotoSerif-Italic diff --git a/ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt b/ScaledFont/Fonts/Noto_Serif/LICENSE.txt similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt rename to ScaledFont/Fonts/Noto_Serif/LICENSE.txt diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Bold.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Bold.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-BoldItalic.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-BoldItalic.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Italic.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Italic.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Regular.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Regular.ttf diff --git a/ScaledFont/README.md b/ScaledFont/README.md index d54fccd..84d4e26 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -2,43 +2,85 @@ ## Using Dynamic Type With Custom Fonts -An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the Noto Serif font which was downloaded from google fonts: +An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font that Apple ships built-in to iOS and the Noto Serif font which you can download from google fonts: + [Noto Serif](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif) -*Refer to LICENSE.txt if you plan on using Noto Serif in a shipping application.* +*See the LICENSE.txt file if you plan on using Noto Serif in a shipping application.* -**This project requires iOS 11** +## Sample Targets -### ScaledFont +There are two targets in this project: -A utility class to help you use custom fonts with dynamic type. ++ Sampler - A UIKit example that requires a minimum of iOS 11 ++ SamplerUI - A SwiftUI example that requires a minimum of iOS 14 -To use this class you must supply the name of a style dictionary for the font when creating the class. The style dictionary should be stored as a property list file in the main bundle. +## Swift Package -The style dictionary contains an entry for each text style that uses the raw string value for each `UIFontTextStyle` as the key. +The ScaledFont implementation is now provided as a Swift Package Manager dependency. You can find the GitHub repository for the package here: + ++ [ScaledFont on GitHub](https://github.com/kharrison/ScaledFont) + +## ScaledFont Details + +The `ScaledFont` type is a utility type to help you use custom fonts with dynamic type. You must give the name of a style dictionary for the font when creating the `ScaledFont`. You include the style dictionary as a property list file in the main bundle of your app. + +The style dictionary contains an entry for each text style. The available text styles are: + ++ `largeTitle`, `title`, `title2`, `title3` ++ `headline`, `subheadline`, `body`, `callout` ++ `footnote`, `caption`, `caption2` The value of each entry is a dictionary with two keys: -+ fontName: A String which is the font name. -+ fontSize: A number which is the point size to use at the `.large` content size. ++ `fontName`: A `String` which is the font name. ++ `fontSize`: A number which is the point size to use at the `.large` (base) content size. For example to use a 17 pt Noteworthy-Bold font for the `.headline` style at the `.large` content size: - - UICTFontTextStyleHeadline - - fontName - Noteworthy-Bold - fontSize - 17 - - +``` + + headline + + fontName + Noteworthy-Bold + fontSize + 17 + + +``` You do not need to include an entry for every text style but if you try to use a text style that is not included in the dictionary it will fallback to the system preferred font. -### Further Details +## Using With UIKit + +For `UIKit`, apply the scaled font to text labels, text fields or text views: + + ```swift +let scaledFont = ScaledFont(fontName: "Noteworthy") +label.font = scaledFont.font(forTextStyle: .headline) +label.adjustsFontForContentSizeCategory = true +``` + +Remember to set the `adjustsFontFotContentSizeCategory` property to have the font size adjust automatically when the user changes their preferred content size. + +## Using With SwiftUI + +For `SwiftUI`, add the scaled font to the environment of a view: + + ```swift +ContentView() +.environment(\.scaledFont, scaledFont) +``` + +Then apply the scaled fint view modifier to any view containing text in the view hierarchy: + + ```swift +Text("Headline") +.scaledFont(.headline) +``` +## Further Details -See the following blog post for further details: +See this 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/AppDelegate.swift b/ScaledFont/Sampler/AppDelegate.swift similarity index 87% rename from ScaledFont/ScaledFont/AppDelegate.swift rename to ScaledFont/Sampler/AppDelegate.swift index 6420758..ed37160 100644 --- a/ScaledFont/ScaledFont/AppDelegate.swift +++ b/ScaledFont/Sampler/AppDelegate.swift @@ -1,5 +1,4 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright © 2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -29,7 +28,6 @@ import UIKit -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { } diff --git a/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json b/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Assets.xcassets/Contents.json b/ScaledFont/Sampler/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Base.lproj/Main.storyboard b/ScaledFont/Sampler/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b831831 --- /dev/null +++ b/ScaledFont/Sampler/Base.lproj/Main.storyboard @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScaledFont/Sampler/Info.plist b/ScaledFont/Sampler/Info.plist new file mode 100644 index 0000000..0622451 --- /dev/null +++ b/ScaledFont/Sampler/Info.plist @@ -0,0 +1,75 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UIMainStoryboardFile + Main + UILaunchScreen + + UINavigationBar + + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + + + diff --git a/ScaledFont/Sampler/SceneDelegate.swift b/ScaledFont/Sampler/SceneDelegate.swift new file mode 100644 index 0000000..80bb407 --- /dev/null +++ b/ScaledFont/Sampler/SceneDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/ScaledFont/ScaledFont/ViewController.swift b/ScaledFont/Sampler/StyleViewController.swift similarity index 96% rename from ScaledFont/ScaledFont/ViewController.swift rename to ScaledFont/Sampler/StyleViewController.swift index 315a7fd..d11b721 100644 --- a/ScaledFont/ScaledFont/ViewController.swift +++ b/ScaledFont/Sampler/StyleViewController.swift @@ -1,5 +1,4 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright © 2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -27,9 +26,10 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. +import ScaledFont import UIKit -class ViewController: UIViewController { +final class StyleViewController: UIViewController { // private let fontName = "Default" // private let fontName = "Noteworthy" private let fontName = "NotoSerif" diff --git a/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/Assets.xcassets/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/ScaledFont/Info.plist b/ScaledFont/SamplerUI/Info.plist similarity index 82% rename from ScaledFont/ScaledFont/Info.plist rename to ScaledFont/SamplerUI/Info.plist index 24cd042..d7f7654 100644 --- a/ScaledFont/ScaledFont/Info.plist +++ b/ScaledFont/SamplerUI/Info.plist @@ -13,23 +13,25 @@ CFBundleName $(PRODUCT_NAME) CFBundlePackageType - APPL + $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 CFBundleVersion 1 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIAppFonts - - NotoSerif-Regular.ttf - NotoSerif-Bold.ttf - NotoSerif-Italic.ttf - + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIApplicationSupportsIndirectInputEvents + + UILaunchScreen + + UINavigationBar + + UIRequiredDeviceCapabilities armv7 @@ -39,7 +41,6 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad @@ -48,5 +49,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + diff --git a/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json b/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/SamplerUIApp.swift b/ScaledFont/SamplerUI/SamplerUIApp.swift new file mode 100644 index 0000000..d85ee8e --- /dev/null +++ b/ScaledFont/SamplerUI/SamplerUIApp.swift @@ -0,0 +1,44 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import ScaledFont +import SwiftUI + +@main +struct SamplerUIApp: App { +// let fontName = "Default" + let fontName = "Noteworthy" +// let fontName = "NotoSerif" + + var body: some Scene { + WindowGroup { + StyleView(fontName: fontName) + .environment(\.scaledFont, ScaledFont(fontName: fontName)) + } + } +} diff --git a/ScaledFont/SamplerUI/StyleView.swift b/ScaledFont/SamplerUI/StyleView.swift new file mode 100644 index 0000000..93f6160 --- /dev/null +++ b/ScaledFont/SamplerUI/StyleView.swift @@ -0,0 +1,100 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import ScaledFont +import SwiftUI + +struct StyleView: View { + let fontName: String + + var body: some View { + NavigationView { + ScrollView { + TextStyles() + } + .navigationBarTitle(fontName, displayMode: .inline) + } + } +} + +private struct TextStyles: View { + var defaultSpacing: CGFloat = 8.0 + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: defaultSpacing) { + Text("Title 1") + .scaledFont(.title) + + if #available(iOS 14.0, *) { + Text("Title 2") + .scaledFont(.title2) + } + + if #available(iOS 14.0, *) { + Text("Title 3") + .scaledFont(.title3) + } + + Text("Headline") + .scaledFont(.headline) + + Text("Subheadline") + .scaledFont(.subheadline) + + Text("Body") + .scaledFont(.body) + + Text("Callout") + .scaledFont(.callout) + + Text("Footnote") + .scaledFont(.footnote) + + Text("Caption 1") + .scaledFont(.caption) + + if #available(iOS 14.0, *) { + Text("Caption 2") + .scaledFont(.caption2) + } + } + .padding() + .frame(maxWidth: .infinity, alignment: .leading) + } + } +} + +struct ContentView_Previews: PreviewProvider { + static let fontName = "Noteworthy" + + static var previews: some View { + StyleView(fontName: fontName) + .environment(\.scaledFont, ScaledFont(fontName: fontName)) + } +} diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index 59a6cc6..0454578 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -3,24 +3,41 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ - 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; - 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; - 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; - 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; - 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; - 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */; }; - 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919201F3FA05700FF9E25 /* ViewController.swift */; }; - 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919221F3FA05700FF9E25 /* Main.storyboard */; }; - 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 537919251F3FA05700FF9E25 /* Assets.xcassets */; }; - 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */; }; - 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919301F3FA0B500FF9E25 /* ScaledFont.swift */; }; + 53581E7A25F7D6B6000DAD54 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */; }; + 53581E7C25F7D6B6000DAD54 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */; }; + 53581E7E25F7D6B6000DAD54 /* StyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */; }; + 53581E8125F7D6B6000DAD54 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53581E7F25F7D6B6000DAD54 /* Main.storyboard */; }; + 53581E8325F7D6B6000DAD54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53581E8225F7D6B6000DAD54 /* Assets.xcassets */; }; + 53581E8E25F7D6C0000DAD54 /* ScaledFont in Frameworks */ = {isa = PBXBuildFile; productRef = 53581E8D25F7D6C0000DAD54 /* ScaledFont */; }; + 53581E9325F7DEFF000DAD54 /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 53581E9725F7DF07000DAD54 /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 53581E9925F7DF0A000DAD54 /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; + 53581E9C25F7DF19000DAD54 /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 53581E9E25F7DF1B000DAD54 /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 53A0BBE925F912AF0061BB67 /* SamplerUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */; }; + 53A0BBEB25F912AF0061BB67 /* StyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A0BBEA25F912AF0061BB67 /* StyleView.swift */; }; + 53A0BBED25F912B00061BB67 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A0BBEC25F912B00061BB67 /* Assets.xcassets */; }; + 53A0BBF025F912B00061BB67 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */; }; + 53A0BC0625F916180061BB67 /* ScaledFont in Frameworks */ = {isa = PBXBuildFile; productRef = 53A0BC0525F916180061BB67 /* ScaledFont */; }; + 53A0BC0925F9193F0061BB67 /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 53A0BC0C25F919420061BB67 /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 53A0BC0F25F919480061BB67 /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 53A0BC1225F9194B0061BB67 /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 53A0BC1525F9194F0061BB67 /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 53581E7725F7D6B6000DAD54 /* Sampler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sampler.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleViewController.swift; sourceTree = ""; }; + 53581E8025F7D6B6000DAD54 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53581E8225F7D6B6000DAD54 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53581E8725F7D6B6000DAD54 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 537709DD1F40AFD80041A64F /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Bold.ttf"; sourceTree = ""; }; 537709DF1F40AFD80041A64F /* NotoSerif-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-BoldItalic.ttf"; sourceTree = ""; }; @@ -28,28 +45,55 @@ 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Regular.ttf"; sourceTree = ""; }; 537709E51F40B18B0041A64F /* NotoSerif.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = NotoSerif.plist; sourceTree = ""; }; 537709E71F40F3B80041A64F /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 5379191B1F3FA05700FF9E25 /* ScaledFont.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScaledFont.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 537919201F3FA05700FF9E25 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 537919231F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 537919251F3FA05700FF9E25 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 537919281F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 5379192A1F3FA05700FF9E25 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 537919301F3FA0B500FF9E25 /* ScaledFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScaledFont.swift; sourceTree = ""; }; 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Noteworthy.plist; sourceTree = ""; }; + 53A0BBE625F912AF0061BB67 /* SamplerUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SamplerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplerUIApp.swift; sourceTree = ""; }; + 53A0BBEA25F912AF0061BB67 /* StyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleView.swift; sourceTree = ""; }; + 53A0BBEC25F912B00061BB67 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 53A0BBF125F912B00061BB67 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 537919181F3FA05700FF9E25 /* Frameworks */ = { + 53581E7425F7D6B6000DAD54 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 53581E8E25F7D6C0000DAD54 /* ScaledFont in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE325F912AF0061BB67 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A0BC0625F916180061BB67 /* ScaledFont in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53581E7825F7D6B6000DAD54 /* Sampler */ = { + isa = PBXGroup; + children = ( + 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */, + 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */, + 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */, + 53581E7F25F7D6B6000DAD54 /* Main.storyboard */, + 53581E8225F7D6B6000DAD54 /* Assets.xcassets */, + 53581E8725F7D6B6000DAD54 /* Info.plist */, + ); + path = Sampler; + sourceTree = ""; + }; + 53581E8C25F7D6C0000DAD54 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; 537709DC1F40AFD80041A64F /* Noto_Serif */ = { isa = PBXGroup; children = ( @@ -66,54 +110,94 @@ isa = PBXGroup; children = ( 537709E71F40F3B80041A64F /* README.md */, - 5379191D1F3FA05700FF9E25 /* ScaledFont */, + 5379191D1F3FA05700FF9E25 /* Fonts */, + 53581E7825F7D6B6000DAD54 /* Sampler */, + 53A0BBE725F912AF0061BB67 /* SamplerUI */, 5379191C1F3FA05700FF9E25 /* Products */, + 53581E8C25F7D6C0000DAD54 /* Frameworks */, ); sourceTree = ""; }; 5379191C1F3FA05700FF9E25 /* Products */ = { isa = PBXGroup; children = ( - 5379191B1F3FA05700FF9E25 /* ScaledFont.app */, + 53581E7725F7D6B6000DAD54 /* Sampler.app */, + 53A0BBE625F912AF0061BB67 /* SamplerUI.app */, ); name = Products; sourceTree = ""; }; - 5379191D1F3FA05700FF9E25 /* ScaledFont */ = { + 5379191D1F3FA05700FF9E25 /* Fonts */ = { isa = PBXGroup; children = ( 537709DC1F40AFD80041A64F /* Noto_Serif */, - 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */, - 537919201F3FA05700FF9E25 /* ViewController.swift */, - 537919301F3FA0B500FF9E25 /* ScaledFont.swift */, 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */, 537709E51F40B18B0041A64F /* NotoSerif.plist */, - 537919221F3FA05700FF9E25 /* Main.storyboard */, - 537919251F3FA05700FF9E25 /* Assets.xcassets */, - 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */, - 5379192A1F3FA05700FF9E25 /* Info.plist */, ); - path = ScaledFont; + path = Fonts; + sourceTree = ""; + }; + 53A0BBE725F912AF0061BB67 /* SamplerUI */ = { + isa = PBXGroup; + children = ( + 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */, + 53A0BBEA25F912AF0061BB67 /* StyleView.swift */, + 53A0BBEC25F912B00061BB67 /* Assets.xcassets */, + 53A0BBF125F912B00061BB67 /* Info.plist */, + 53A0BBEE25F912B00061BB67 /* Preview Content */, + ); + path = SamplerUI; + sourceTree = ""; + }; + 53A0BBEE25F912B00061BB67 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 5379191A1F3FA05700FF9E25 /* ScaledFont */ = { + 53581E7625F7D6B6000DAD54 /* Sampler */ = { isa = PBXNativeTarget; - buildConfigurationList = 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */; + buildConfigurationList = 53581E8825F7D6B6000DAD54 /* Build configuration list for PBXNativeTarget "Sampler" */; buildPhases = ( - 537919171F3FA05700FF9E25 /* Sources */, - 537919181F3FA05700FF9E25 /* Frameworks */, - 537919191F3FA05700FF9E25 /* Resources */, + 53581E7325F7D6B6000DAD54 /* Sources */, + 53581E7425F7D6B6000DAD54 /* Frameworks */, + 53581E7525F7D6B6000DAD54 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = ScaledFont; - productName = ScaledFont; - productReference = 5379191B1F3FA05700FF9E25 /* ScaledFont.app */; + name = Sampler; + packageProductDependencies = ( + 53581E8D25F7D6C0000DAD54 /* ScaledFont */, + ); + productName = Sampler; + productReference = 53581E7725F7D6B6000DAD54 /* Sampler.app */; + productType = "com.apple.product-type.application"; + }; + 53A0BBE525F912AF0061BB67 /* SamplerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53A0BBF225F912B00061BB67 /* Build configuration list for PBXNativeTarget "SamplerUI" */; + buildPhases = ( + 53A0BBE225F912AF0061BB67 /* Sources */, + 53A0BBE325F912AF0061BB67 /* Frameworks */, + 53A0BBE425F912AF0061BB67 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SamplerUI; + packageProductDependencies = ( + 53A0BC0525F916180061BB67 /* ScaledFont */, + ); + productName = SamplerUI; + productReference = 53A0BBE625F912AF0061BB67 /* SamplerUI.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -122,13 +206,15 @@ 537919131F3FA05700FF9E25 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0940; + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { - 5379191A1F3FA05700FF9E25 = { - CreatedOnToolsVersion = 9.0; - LastSwiftMigration = 1020; + 53581E7625F7D6B6000DAD54 = { + CreatedOnToolsVersion = 12.4; + }; + 53A0BBE525F912AF0061BB67 = { + CreatedOnToolsVersion = 12.4; }; }; }; @@ -141,66 +227,129 @@ Base, ); mainGroup = 537919121F3FA05700FF9E25; + packageReferences = ( + 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */, + ); productRefGroup = 5379191C1F3FA05700FF9E25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 5379191A1F3FA05700FF9E25 /* ScaledFont */, + 53581E7625F7D6B6000DAD54 /* Sampler */, + 53A0BBE525F912AF0061BB67 /* SamplerUI */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 537919191F3FA05700FF9E25 /* Resources */ = { + 53581E7525F7D6B6000DAD54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53581E8325F7D6B6000DAD54 /* Assets.xcassets in Resources */, + 53581E9925F7DF0A000DAD54 /* NotoSerif-Regular.ttf in Resources */, + 53581E9725F7DF07000DAD54 /* NotoSerif-Italic.ttf in Resources */, + 53581E9C25F7DF19000DAD54 /* Noteworthy.plist in Resources */, + 53581E9325F7DEFF000DAD54 /* NotoSerif-Bold.ttf in Resources */, + 53581E9E25F7DF1B000DAD54 /* NotoSerif.plist in Resources */, + 53581E8125F7D6B6000DAD54 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE425F912AF0061BB67 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */, - 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */, - 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */, - 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */, - 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */, - 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */, - 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */, - 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */, + 53A0BC0925F9193F0061BB67 /* Noteworthy.plist in Resources */, + 53A0BBF025F912B00061BB67 /* Preview Assets.xcassets in Resources */, + 53A0BC1225F9194B0061BB67 /* NotoSerif-Italic.ttf in Resources */, + 53A0BC1525F9194F0061BB67 /* NotoSerif-Regular.ttf in Resources */, + 53A0BC0F25F919480061BB67 /* NotoSerif-Bold.ttf in Resources */, + 53A0BC0C25F919420061BB67 /* NotoSerif.plist in Resources */, + 53A0BBED25F912B00061BB67 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 537919171F3FA05700FF9E25 /* Sources */ = { + 53581E7325F7D6B6000DAD54 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */, - 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */, - 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */, + 53581E7E25F7D6B6000DAD54 /* StyleViewController.swift in Sources */, + 53581E7A25F7D6B6000DAD54 /* AppDelegate.swift in Sources */, + 53581E7C25F7D6B6000DAD54 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE225F912AF0061BB67 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A0BBEB25F912AF0061BB67 /* StyleView.swift in Sources */, + 53A0BBE925F912AF0061BB67 /* SamplerUIApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 537919221F3FA05700FF9E25 /* Main.storyboard */ = { + 53581E7F25F7D6B6000DAD54 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 537919231F3FA05700FF9E25 /* Base */, + 53581E8025F7D6B6000DAD54 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 537919281F3FA05700FF9E25 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 53581E8925F7D6B6000DAD54 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Sampler/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Sampler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53581E8A25F7D6B6000DAD54 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Sampler/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Sampler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 5379192B1F3FA05700FF9E25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -226,6 +375,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -285,6 +435,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -313,34 +464,49 @@ }; name = Release; }; - 5379192E1F3FA05700FF9E25 /* Debug */ = { + 53A0BBF325F912B00061BB67 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"SamplerUI/Preview Content\""; DEVELOPMENT_TEAM = LCC2J94N44; - INFOPLIST_FILE = ScaledFont/Info.plist; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SamplerUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.SamplerUI; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 5379192F1F3FA05700FF9E25 /* Release */ = { + 53A0BBF425F912B00061BB67 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"SamplerUI/Preview Content\""; DEVELOPMENT_TEAM = LCC2J94N44; - INFOPLIST_FILE = ScaledFont/Info.plist; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SamplerUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.SamplerUI; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -350,6 +516,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 53581E8825F7D6B6000DAD54 /* Build configuration list for PBXNativeTarget "Sampler" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53581E8925F7D6B6000DAD54 /* Debug */, + 53581E8A25F7D6B6000DAD54 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 537919161F3FA05700FF9E25 /* Build configuration list for PBXProject "ScaledFont" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -359,16 +534,40 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */ = { + 53A0BBF225F912B00061BB67 /* Build configuration list for PBXNativeTarget "SamplerUI" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5379192E1F3FA05700FF9E25 /* Debug */, - 5379192F1F3FA05700FF9E25 /* Release */, + 53A0BBF325F912B00061BB67 /* Debug */, + 53A0BBF425F912B00061BB67 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "git@github.com:kharrison/ScaledFont.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 53581E8D25F7D6C0000DAD54 /* ScaledFont */ = { + isa = XCSwiftPackageProductDependency; + package = 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */; + productName = ScaledFont; + }; + 53A0BC0525F916180061BB67 /* ScaledFont */ = { + isa = XCSwiftPackageProductDependency; + package = 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */; + productName = ScaledFont; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 537919131F3FA05700FF9E25 /* Project object */; } diff --git a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d8db8d6..0000000 --- a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "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 deleted file mode 100644 index f83f6fd..0000000 --- a/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard b/ScaledFont/ScaledFont/Base.lproj/Main.storyboard deleted file mode 100644 index f995ddd..0000000 --- a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScaledFont/ScaledFont/ScaledFont.swift b/ScaledFont/ScaledFont/ScaledFont.swift deleted file mode 100644 index 09b8b81..0000000 --- a/ScaledFont/ScaledFont/ScaledFont.swift +++ /dev/null @@ -1,113 +0,0 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -import UIKit - -/// A utility class to help you use custom fonts with -/// dynamic type. -/// -/// To use this class you must supply the name of a style -/// dictionary for the font when creating the class. The -/// style dictionary should be stored as a property list -/// file in the main bundle. -/// -/// The style dictionary contains an entry for each text -/// style that uses the raw string value for each -/// `UIFontTextStyle` as the key. -/// -/// The value of each entry is a dictionary with two keys: -/// -/// + fontName: A String which is the font name. -/// + fontSize: A number which is the point size to use -/// at the `.large` content size. -/// -/// For example to use a 17 pt Noteworthy-Bold font -/// for the `.headline` style at the `.large` content size: -/// -/// -/// UICTFontTextStyleHeadline -/// -/// fontName -/// Noteworthy-Bold -/// fontSize -/// 17 -/// -/// -/// -/// You do not need to include an entry for every text style -/// but if you try to use a text style that is not included -/// in the dictionary it will fallback to the system preferred -/// font. - -public final class ScaledFont { - private struct FontDescription: Decodable { - let fontSize: CGFloat - let fontName: String - } - - private typealias StyleDictionary = [UIFont.TextStyle.RawValue: FontDescription] - private var styleDictionary: StyleDictionary? - - /// Create a `ScaledFont` - /// - /// - Parameter fontName: Name of a plist file (without the extension) - /// in the main bundle that contains the style dictionary used to - /// scale fonts for each text style. - - public init(fontName: String) { - if let url = Bundle.main.url(forResource: fontName, withExtension: "plist"), - let data = try? Data(contentsOf: url) { - let decoder = PropertyListDecoder() - styleDictionary = try? decoder.decode(StyleDictionary.self, from: data) - } - } - - /// Get the scaled font for the given text style using the - /// style dictionary supplied at initialization. - /// - /// - Parameter textStyle: The `UIFontTextStyle` for the - /// font. - /// - Returns: A `UIFont` of the custom font that has been - /// scaled for the users currently selected preferred - /// text size. - /// - /// - Note: If the style dictionary does not have - /// a font for this text style the default preferred - /// font is returned. - - public func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { - guard let fontDescription = styleDictionary?[textStyle.rawValue], - let font = UIFont(name: fontDescription.fontName, size: fontDescription.fontSize) else { - return UIFont.preferredFont(forTextStyle: textStyle) - } - - let fontMetrics = UIFontMetrics(forTextStyle: textStyle) - return fontMetrics.scaledFont(for: font) - } -} From 3d8975a73630ced475d783237d9bc1270205cfaf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Mar 2021 14:13:22 +0000 Subject: [PATCH 90/98] Add link to blog post on using ScaledFont with SwiftUI --- ScaledFont/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ScaledFont/README.md b/ScaledFont/README.md index 84d4e26..2e30463 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -81,6 +81,7 @@ Text("Headline") ``` ## Further Details -See this blog post for further details: +See these blog posts for further details: + [Using A Custom Font With Dynamic Type](https://useyourloaf.com/blog/using-a-custom-font-with-dynamic-type/) ++ [Scaling Custom SwiftUI Fonts With Dynamic Type](https://useyourloaf.com/blog/scaling-custom-swiftui-fonts-with-dynamic-type/) From 12c43b8e793cc920cfc311dd33af6d503b6a17ea Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 2 Apr 2021 16:30:02 +0100 Subject: [PATCH 91/98] Updated for Xcode 12.4 --- DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index 995fc45..f94e69b 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -119,7 +119,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53A2B5361F94DBE500095FAD = { @@ -223,6 +223,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -248,7 +249,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -282,6 +283,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -301,7 +303,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; From 35882ef4925345c3e5f2ef18cf9482bf2fa7101f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 5 Apr 2021 16:03:34 +0100 Subject: [PATCH 92/98] Add App Bound Domains (iOS 14) --- .../DynamicWebKit.xcodeproj/project.pbxproj | 14 +- .../AppIcon.appiconset/Contents.json | 79 +++++---- .../Assets.xcassets/Contents.json | 6 + .../chevron.backward.symbolset/Contents.json | 13 ++ .../chevron.backward.symbolset/backward.svg | 161 ++++++++++++++++++ .../chevron.forward.symbolset/Contents.json | 13 ++ .../chevron.forward.symbolset/forward.svg | 161 ++++++++++++++++++ .../DynamicWebKit/Base.lproj/Main.storyboard | 29 +++- DynamicWebKit/DynamicWebKit/Info.plist | 6 + .../DynamicWebKit/WebViewController.swift | 60 ++++++- DynamicWebKit/README.md | 5 +- 11 files changed, 498 insertions(+), 49 deletions(-) create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index f94e69b..aa1b646 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -31,6 +31,7 @@ 53A2B54C1F94DC9700095FAD /* default.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = default.html; sourceTree = ""; }; 53A2B54E1F94DD8200095FAD /* stylesheet.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = stylesheet.css; sourceTree = ""; }; 53A2B5501F94F14800095FAD /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53C25DE92617A45300E8BC02 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 53E34DFF2403D67600EE575E /* 001-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001-dark@2x.png"; sourceTree = ""; }; 53E34E002403D67600EE575E /* 001@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001@2x.png"; sourceTree = ""; }; 53E34E012403D67600EE575E /* 001.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 001.png; sourceTree = ""; }; @@ -54,6 +55,7 @@ 53A2B5501F94F14800095FAD /* README.md */, 53A2B5391F94DBE500095FAD /* DynamicWebKit */, 53A2B5381F94DBE500095FAD /* Products */, + 53C25DE82617A45300E8BC02 /* Frameworks */, ); sourceTree = ""; }; @@ -79,6 +81,14 @@ path = DynamicWebKit; sourceTree = ""; }; + 53C25DE82617A45300E8BC02 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 53C25DE92617A45300E8BC02 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 53E34DFE2403D58400EE575E /* HTML */ = { isa = PBXGroup; children = ( @@ -249,7 +259,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -303,7 +313,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json index 1d060ed..9221b9b 100644 --- a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -2,92 +2,97 @@ "images" : [ { "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" + "scale" : "3x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" + "scale" : "3x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" + "scale" : "2x", + "size" : "60x60" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" + "scale" : "3x", + "size" : "60x60" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" + "scale" : "1x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" + "scale" : "1x", + "size" : "29x29" }, { "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" + "scale" : "1x", + "size" : "40x40" }, { "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" + "scale" : "1x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" + "scale" : "2x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json new file mode 100644 index 0000000..3aee322 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json @@ -0,0 +1,13 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "backward.svg", + "idiom" : "universal", + "language-direction" : "left-to-right" + } + ] +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg new file mode 100644 index 0000000..f32a098 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg @@ -0,0 +1,161 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.2.0 + Requires Xcode 12 or greater + Generated from chevron.backward + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json new file mode 100644 index 0000000..b8b271f --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json @@ -0,0 +1,13 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "forward.svg", + "idiom" : "universal", + "language-direction" : "left-to-right" + } + ] +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg new file mode 100644 index 0000000..c387b82 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg @@ -0,0 +1,161 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.2.0 + Requires Xcode 12 or greater + Generated from chevron.forward + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard index c0a6762..97443bd 100644 --- a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard +++ b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -15,10 +15,27 @@ - + - + + + + + + + + + + + + + + + + + + @@ -43,4 +60,8 @@ + + + + diff --git a/DynamicWebKit/DynamicWebKit/Info.plist b/DynamicWebKit/DynamicWebKit/Info.plist index 16be3b6..cf8aa00 100644 --- a/DynamicWebKit/DynamicWebKit/Info.plist +++ b/DynamicWebKit/DynamicWebKit/Info.plist @@ -41,5 +41,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + WKAppBoundDomains + + useyourloaf.com + github.com + apple.com + diff --git a/DynamicWebKit/DynamicWebKit/WebViewController.swift b/DynamicWebKit/DynamicWebKit/WebViewController.swift index 90b5382..91632b7 100644 --- a/DynamicWebKit/DynamicWebKit/WebViewController.swift +++ b/DynamicWebKit/DynamicWebKit/WebViewController.swift @@ -31,6 +31,9 @@ import UIKit import WebKit final class WebViewController: UIViewController { + @IBOutlet private var backwardButton: UIBarButtonItem! + @IBOutlet private var forwardButton: UIBarButtonItem! + var html: String = "default" { didSet { loadHTML(html) @@ -38,11 +41,24 @@ final class WebViewController: UIViewController { } private lazy var webView: WKWebView = { - let preferences = WKPreferences() - preferences.javaScriptEnabled = false let configuration = WKWebViewConfiguration() - configuration.preferences = preferences - return WKWebView(frame: .zero, configuration: configuration) + + if #available(iOS 14.0, *) { + // Allow restricted API access on the + // app-bound domains (cookies, etc). + // Doesn't seem to be required + // configuration.limitsNavigationsToAppBoundDomains = true + } else { + // Fallback to WKPreferences for iOS 13 to + // disable javascript. + let preferences = WKPreferences() + // preferences.javaScriptEnabled = false + configuration.preferences = preferences + } + + let webView = WKWebView(frame: .zero, configuration: configuration) + webView.navigationDelegate = self + return webView }() override func loadView() { @@ -51,6 +67,14 @@ final class WebViewController: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } + @IBAction func forwardAction(_ sender: UIBarButtonItem) { + webView.goForward() + } + + @IBAction func backwardAction(_ sender: UIBarButtonItem) { + webView.goBack() + } + @objc private func contentSizeDidChange(_ notification: Notification) { webView.reload() } @@ -61,3 +85,31 @@ final class WebViewController: UIViewController { } } } + +extension WebViewController: WKNavigationDelegate { + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) { + if #available(iOS 14.0, *) { + // To disable all javascript content + // preferences.allowsContentJavaScript = true + } + decisionHandler(.allow, preferences) + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + print(error) + updateNavigationState(webView) + } + + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + updateNavigationState(webView) + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + updateNavigationState(webView) + } + + private func updateNavigationState(_ webView: WKWebView) { + backwardButton.isEnabled = webView.canGoBack + forwardButton.isEnabled = webView.canGoForward + } +} diff --git a/DynamicWebKit/README.md b/DynamicWebKit/README.md index 3f59978..40310c5 100644 --- a/DynamicWebKit/README.md +++ b/DynamicWebKit/README.md @@ -2,9 +2,9 @@ An example of how to use the Apple system fonts in a CSS stylesheet so static HTML content in a web view respects the user's choice of content size. -## Adding Support For Dark Mode +## Adding Support For Dark Mode And App Bound Domains -I've updated this project to support dark mode (requires iOS 13). +I've updated this project to support dark mode (requires iOS 13) and app bound domains (iOS 14). ## Further Details @@ -12,3 +12,4 @@ For further details see the following blog posts: + [Using Dynamic Type With Web Views](https://useyourloaf.com/blog/using-dynamic-type-with-web-views/) + [Supporting Dark Mode In WkWebView](https://useyourloaf.com/blog/supporting-dark-mode-in-wkwebview/) ++ [App Bound Domains](https://useyourloaf.com/blog/app-bound-domains/) From a8f39bb8f76ab314acaad36dcbe72337ba0f584d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 14 May 2021 14:38:19 +0100 Subject: [PATCH 93/98] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..dfe500f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [kharrison] From 217ff38ee40b6dc2f484249d8c3450d2d4839ad8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 19 May 2021 22:32:54 +0100 Subject: [PATCH 94/98] Update DynamicText for Xcode 12 and add Swift version --- .../DynamicText.xcodeproj/project.pbxproj | 233 ++++++++-- .../AccentColor.colorset/Contents.json | 38 ++ .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/icon-1024.png | Bin .../AppIcon.appiconset/icon-120.png | Bin .../AppIcon.appiconset/icon-167.png | Bin .../AppIcon.appiconset/icon-180.png | Bin .../AppIcon.appiconset/icon-20.png | Bin .../AppIcon.appiconset/icon-29.png | Bin .../AppIcon.appiconset/icon-29@2x-1.png | Bin .../AppIcon.appiconset/icon-29@2x.png | Bin .../AppIcon.appiconset/icon-29@3x.png | Bin .../AppIcon.appiconset/icon-40.png | Bin .../AppIcon.appiconset/icon-40@2x-1.png | Bin .../AppIcon.appiconset/icon-40@2x.png | Bin .../AppIcon.appiconset/icon-41.png | Bin .../AppIcon.appiconset/icon-42.png | Bin .../AppIcon.appiconset/icon-60.png | Bin .../AppIcon.appiconset/icon-60@2x.png | Bin .../AppIcon.appiconset/icon-76.png | Bin .../AppIcon.appiconset/icon-76@2x.png | Bin .../DynamicText/Assets.xcassets/Contents.json | 6 + .../Tab Bar/First.imageset/Contents.json | 0 .../Tab Bar/First.imageset/first30.png | Bin .../Tab Bar/First.imageset/first60.png | Bin .../Tab Bar/First.imageset/first90.png | Bin .../Tab Bar/Second.imageset/Contents.json | 0 .../Tab Bar/Second.imageset/second30.png | Bin .../Tab Bar/Second.imageset/second60.png | Bin .../Tab Bar/Second.imageset/second90.png | Bin .../Base.lproj/LaunchScreen.storyboard | 72 ++- .../DynamicText/Base.lproj/Main.storyboard | 409 +++++++++++------- .../DynamicText/DynamicText-Prefix.pch | 16 - .../DynamicText/Images.xcassets/Contents.json | 6 - .../{DynamicText-Info.plist => Info.plist} | 0 .../DynamicText/UIFont+UYLScaledFont.h | 13 +- .../DynamicText/UIFont+UYLScaledFont.m | 15 +- DynamicText/DynamicText/UYLAppDelegate.h | 11 +- DynamicText/DynamicText/UYLAppDelegate.m | 10 +- .../UYLScaledTextStyleViewController.h | 33 +- .../UYLScaledTextStyleViewController.m | 52 ++- .../DynamicText/UYLTextStyleViewController.h | 19 +- .../DynamicText/UYLTextStyleViewController.m | 110 ++--- .../DynamicText/en.lproj/InfoPlist.strings | 2 - DynamicText/DynamicText/main.m | 7 +- .../DynamicTextSwift/AppDelegate.swift | 33 ++ .../AccentColor.colorset/Contents.json | 15 + .../AppIcon.appiconset/Contents.json | 116 +++++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 56305 bytes .../AppIcon.appiconset/icon-120.png | Bin 0 -> 11031 bytes .../AppIcon.appiconset/icon-167.png | Bin 0 -> 11276 bytes .../AppIcon.appiconset/icon-180.png | Bin 0 -> 17230 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-29@2x.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 5904 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-40@2x-1.png | Bin 0 -> 4680 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 4710 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 .../AppIcon.appiconset/icon-60@2x.png | Bin 0 -> 18310 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4136 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17726 bytes .../Assets.xcassets/Contents.json | 6 + .../Tab Bar/First.imageset/Contents.json | 23 + .../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/Second.imageset/Contents.json | 23 + .../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 .../Base.lproj/LaunchScreen.storyboard | 115 +++++ .../Base.lproj/Main.storyboard | 315 ++++++++++++++ DynamicText/DynamicTextSwift/Info.plist | 66 +++ .../DynamicTextSwift/SceneDelegate.swift | 33 ++ .../DynamicTextSwift/UIFont+Extension.swift | 36 ++ .../UYLScaledTextStyleViewController.swift | 68 +++ .../UYLTextStyleViewController.swift | 68 +++ DynamicText/README.md | 7 +- 83 files changed, 1615 insertions(+), 361 deletions(-) create mode 100644 DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/Contents.json (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-1024.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-120.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-167.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-180.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-20.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29@2x-1.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29@2x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29@3x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-40.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-40@2x-1.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-40@2x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-41.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-42.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-60.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-60@2x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-76.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-76@2x.png (100%) create mode 100644 DynamicText/DynamicText/Assets.xcassets/Contents.json rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/Contents.json (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/first30.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/first60.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/first90.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/Contents.json (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/second30.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/second60.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/second90.png (100%) delete mode 100644 DynamicText/DynamicText/DynamicText-Prefix.pch delete mode 100644 DynamicText/DynamicText/Images.xcassets/Contents.json rename DynamicText/DynamicText/{DynamicText-Info.plist => Info.plist} (100%) delete mode 100644 DynamicText/DynamicText/en.lproj/InfoPlist.strings create mode 100644 DynamicText/DynamicTextSwift/AppDelegate.swift create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-41.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-42.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first30.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second30.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second60.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png create mode 100644 DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard create mode 100644 DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard create mode 100644 DynamicText/DynamicTextSwift/Info.plist create mode 100644 DynamicText/DynamicTextSwift/SceneDelegate.swift create mode 100644 DynamicText/DynamicTextSwift/UIFont+Extension.swift create mode 100644 DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift create mode 100644 DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 8707dce..cf90168 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -9,14 +9,18 @@ /* Begin PBXBuildFile section */ 531B320A1861EFB6005F2332 /* UYLScaledTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */; }; 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */; }; - 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52D17F83CB600AD2292 /* Foundation.framework */; }; - 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */; }; - 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B53117F83CB600AD2292 /* UIKit.framework */; }; - 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53617F83CB600AD2292 /* InfoPlist.strings */; }; - 5393B53A17F83CB600AD2292 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53917F83CB600AD2292 /* main.m */; }; + 53855AB82655769D0033DD1E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AB72655769D0033DD1E /* AppDelegate.swift */; }; + 53855ABA2655769D0033DD1E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AB92655769D0033DD1E /* SceneDelegate.swift */; }; + 53855ABC2655769D0033DD1E /* UYLTextStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */; }; + 53855ACA265577880033DD1E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53855AC9265577880033DD1E /* main.m */; }; + 53855AD026557D590033DD1E /* UYLScaledTextStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */; }; + 53855AD3265581DE0033DD1E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD1265581DE0033DD1E /* Main.storyboard */; }; + 53855AD52655834B0033DD1E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD42655834B0033DD1E /* Assets.xcassets */; }; + 53855AD8265583680033DD1E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD6265583680033DD1E /* LaunchScreen.storyboard */; }; + 53855ADA2655AAA70033DD1E /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */; }; 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */; }; 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53F17F83CB600AD2292 /* Main.storyboard */; }; - 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Images.xcassets */; }; + 5393B54617F83CB600AD2292 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Assets.xcassets */; }; 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */; }; 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */; }; /* End PBXBuildFile section */ @@ -26,18 +30,26 @@ 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLScaledTextStyleViewController.m; sourceTree = ""; }; 5325F8AD18020B0B0000A32A /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 53615D2E1F41B67900C7D904 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53855AB52655769D0033DD1E /* DynamicTextSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicTextSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53855AB72655769D0033DD1E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53855AB92655769D0033DD1E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UYLTextStyleViewController.swift; sourceTree = ""; }; + 53855AC52655769E0033DD1E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53855AC9265577880033DD1E /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UYLScaledTextStyleViewController.swift; sourceTree = ""; }; + 53855AD2265581DE0033DD1E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53855AD42655834B0033DD1E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53855AD7265583680033DD1E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Extension.swift"; sourceTree = ""; }; 5393B52A17F83CB600AD2292 /* DynamicText.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicText.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5393B52D17F83CB600AD2292 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 5393B53117F83CB600AD2292 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 5393B53517F83CB600AD2292 /* DynamicText-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DynamicText-Info.plist"; sourceTree = ""; }; - 5393B53717F83CB600AD2292 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5393B53917F83CB600AD2292 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 5393B53B17F83CB600AD2292 /* DynamicText-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DynamicText-Prefix.pch"; sourceTree = ""; }; + 5393B53517F83CB600AD2292 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5393B53C17F83CB600AD2292 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 5393B54017F83CB600AD2292 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 5393B54517F83CB600AD2292 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5393B54517F83CB600AD2292 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 5393B54C17F83CB600AD2292 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTextStyleViewController.h; sourceTree = ""; }; 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTextStyleViewController.m; sourceTree = ""; }; @@ -46,24 +58,45 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 53855AB22655769D0033DD1E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52717F83CB600AD2292 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */, - 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */, - 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53855AB62655769D0033DD1E /* DynamicTextSwift */ = { + isa = PBXGroup; + children = ( + 53855AD42655834B0033DD1E /* Assets.xcassets */, + 53855AD1265581DE0033DD1E /* Main.storyboard */, + 53855AD6265583680033DD1E /* LaunchScreen.storyboard */, + 53855AB72655769D0033DD1E /* AppDelegate.swift */, + 53855AB92655769D0033DD1E /* SceneDelegate.swift */, + 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */, + 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */, + 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */, + 53855AC52655769E0033DD1E /* Info.plist */, + ); + path = DynamicTextSwift; + sourceTree = ""; + }; 5393B52117F83CB600AD2292 = { isa = PBXGroup; children = ( 5325F8AD18020B0B0000A32A /* README.md */, 5393B53317F83CB600AD2292 /* DynamicText */, + 53855AB62655769D0033DD1E /* DynamicTextSwift */, 5393B52C17F83CB600AD2292 /* Frameworks */, 5393B52B17F83CB600AD2292 /* Products */, ); @@ -73,6 +106,7 @@ isa = PBXGroup; children = ( 5393B52A17F83CB600AD2292 /* DynamicText.app */, + 53855AB52655769D0033DD1E /* DynamicTextSwift.app */, ); name = Products; sourceTree = ""; @@ -91,6 +125,7 @@ 5393B53317F83CB600AD2292 /* DynamicText */ = { isa = PBXGroup; children = ( + 5393B53F17F83CB600AD2292 /* Main.storyboard */, 5393B53C17F83CB600AD2292 /* UYLAppDelegate.h */, 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */, 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */, @@ -99,9 +134,8 @@ 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */, 53FE524A1871CDB700DE5F24 /* UIFont+UYLScaledFont.h */, 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */, - 5393B53F17F83CB600AD2292 /* Main.storyboard */, + 5393B54517F83CB600AD2292 /* Assets.xcassets */, 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */, - 5393B54517F83CB600AD2292 /* Images.xcassets */, 5393B53417F83CB600AD2292 /* Supporting Files */, ); path = DynamicText; @@ -110,10 +144,8 @@ 5393B53417F83CB600AD2292 /* Supporting Files */ = { isa = PBXGroup; children = ( - 5393B53517F83CB600AD2292 /* DynamicText-Info.plist */, - 5393B53617F83CB600AD2292 /* InfoPlist.strings */, - 5393B53917F83CB600AD2292 /* main.m */, - 5393B53B17F83CB600AD2292 /* DynamicText-Prefix.pch */, + 53855AC9265577880033DD1E /* main.m */, + 5393B53517F83CB600AD2292 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -121,6 +153,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 53855AB42655769D0033DD1E /* DynamicTextSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53855AC62655769E0033DD1E /* Build configuration list for PBXNativeTarget "DynamicTextSwift" */; + buildPhases = ( + 53855AB12655769D0033DD1E /* Sources */, + 53855AB22655769D0033DD1E /* Frameworks */, + 53855AB32655769D0033DD1E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DynamicTextSwift; + productName = DynamicTextSwift; + productReference = 53855AB52655769D0033DD1E /* DynamicTextSwift.app */; + productType = "com.apple.product-type.application"; + }; 5393B52917F83CB600AD2292 /* DynamicText */ = { isa = PBXNativeTarget; buildConfigurationList = 5393B55C17F83CB600AD2292 /* Build configuration list for PBXNativeTarget "DynamicText" */; @@ -145,8 +194,14 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 1120; + LastSwiftUpdateCheck = 1250; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53855AB42655769D0033DD1E = { + CreatedOnToolsVersion = 12.5; + }; + }; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; compatibilityVersion = "Xcode 11.0"; @@ -162,18 +217,28 @@ projectRoot = ""; targets = ( 5393B52917F83CB600AD2292 /* DynamicText */, + 53855AB42655769D0033DD1E /* DynamicTextSwift */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 53855AB32655769D0033DD1E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53855AD8265583680033DD1E /* LaunchScreen.storyboard in Resources */, + 53855AD52655834B0033DD1E /* Assets.xcassets in Resources */, + 53855AD3265581DE0033DD1E /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52817F83CB600AD2292 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */, + 5393B54617F83CB600AD2292 /* Assets.xcassets in Resources */, 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */, - 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */, 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -181,11 +246,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 53855AB12655769D0033DD1E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53855AD026557D590033DD1E /* UYLScaledTextStyleViewController.swift in Sources */, + 53855ABC2655769D0033DD1E /* UYLTextStyleViewController.swift in Sources */, + 53855AB82655769D0033DD1E /* AppDelegate.swift in Sources */, + 53855ADA2655AAA70033DD1E /* UIFont+Extension.swift in Sources */, + 53855ABA2655769D0033DD1E /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52617F83CB600AD2292 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5393B53A17F83CB600AD2292 /* main.m in Sources */, + 53855ACA265577880033DD1E /* main.m in Sources */, 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */, 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */, 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */, @@ -204,12 +281,20 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; - 5393B53617F83CB600AD2292 /* InfoPlist.strings */ = { + 53855AD1265581DE0033DD1E /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53855AD2265581DE0033DD1E /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53855AD6265583680033DD1E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 5393B53717F83CB600AD2292 /* en */, + 53855AD7265583680033DD1E /* Base */, ); - name = InfoPlist.strings; + name = LaunchScreen.storyboard; sourceTree = ""; }; 5393B53F17F83CB600AD2292 /* Main.storyboard */ = { @@ -223,6 +308,73 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 53855AC72655769E0033DD1E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = DynamicTextSwift/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicTextSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53855AC82655769E0033DD1E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = DynamicTextSwift/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicTextSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 5393B55A17F83CB600AD2292 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -246,6 +398,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -299,6 +452,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -326,12 +480,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1.3; + CURRENT_PROJECT_VERSION = 1.4; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; - MARKETING_VERSION = 1.3; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = DynamicText/Info.plist; + MARKETING_VERSION = 1.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -343,12 +497,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1.3; + CURRENT_PROJECT_VERSION = 1.4; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; - MARKETING_VERSION = 1.3; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = DynamicText/Info.plist; + MARKETING_VERSION = 1.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -359,6 +513,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 53855AC62655769E0033DD1E /* Build configuration list for PBXNativeTarget "DynamicTextSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53855AC72655769E0033DD1E /* Debug */, + 53855AC82655769E0033DD1E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..22c4bb0 --- /dev/null +++ b/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-1024.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-1024.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-120.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-120.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-167.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-167.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-180.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-180.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-20.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-20.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-41.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-41.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-42.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-42.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png diff --git a/DynamicText/DynamicText/Assets.xcassets/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicText/DynamicText/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first30.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first30.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first60.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first90.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first90.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second30.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second30.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second60.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second90.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second90.png diff --git a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard index f746012..e16eba7 100644 --- a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard +++ b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard @@ -1,15 +1,14 @@ - - - - + + - + + - + @@ -18,18 +17,17 @@ - + - + - - + - + @@ -38,16 +36,15 @@ - + - + - - + @@ -61,17 +58,58 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/Base.lproj/Main.storyboard b/DynamicText/DynamicText/Base.lproj/Main.storyboard index f069627..2606c66 100644 --- a/DynamicText/DynamicText/Base.lproj/Main.storyboard +++ b/DynamicText/DynamicText/Base.lproj/Main.storyboard @@ -1,200 +1,260 @@ - + - + + + + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + + - + + + + + + + + + + + + + - + @@ -208,17 +268,58 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/DynamicText-Prefix.pch b/DynamicText/DynamicText/DynamicText-Prefix.pch deleted file mode 100644 index 82a2bb4..0000000 --- a/DynamicText/DynamicText/DynamicText-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/DynamicText/DynamicText/Images.xcassets/Contents.json b/DynamicText/DynamicText/Images.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/DynamicText/DynamicText/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/DynamicText/DynamicText/DynamicText-Info.plist b/DynamicText/DynamicText/Info.plist similarity index 100% rename from DynamicText/DynamicText/DynamicText-Info.plist rename to DynamicText/DynamicText/Info.plist diff --git a/DynamicText/DynamicText/UIFont+UYLScaledFont.h b/DynamicText/DynamicText/UIFont+UYLScaledFont.h index 3dc52dd..3704d97 100644 --- a/DynamicText/DynamicText/UIFont+UYLScaledFont.h +++ b/DynamicText/DynamicText/UIFont+UYLScaledFont.h @@ -1,9 +1,4 @@ -// -// UIFont+UYLScaledFont.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,11 +26,11 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UIFont (UYLScaledFont) -// +uylPreferredFontForTextStyle:scale: +// +preferredFontForTextStyle:scale: // // Return a UIFont object for the specified text style that is scaled by the // speficied scale factor. @@ -45,6 +40,6 @@ // The scaleFactor modifies the default point size of the text style. So for // a font that is twice the default size specify a scaleFactor of 2.0. -+ (UIFont *)uylPreferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor; ++ (UIFont *)preferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor; @end diff --git a/DynamicText/DynamicText/UIFont+UYLScaledFont.m b/DynamicText/DynamicText/UIFont+UYLScaledFont.m index 0efddd2..781264b 100644 --- a/DynamicText/DynamicText/UIFont+UYLScaledFont.m +++ b/DynamicText/DynamicText/UIFont+UYLScaledFont.m @@ -1,9 +1,4 @@ -// -// UIFont+UYLScaledFont.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -35,12 +30,10 @@ @implementation UIFont (UYLScaledFont) -+ (UIFont *)uylPreferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor ++ (UIFont *)preferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor { - UIFontDescriptor *descriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:style]; - CGFloat pointSize = descriptor.pointSize * scaleFactor; - UIFont *font = [UIFont fontWithDescriptor:descriptor size:pointSize]; - return font; + UIFont *font = [UIFont preferredFontForTextStyle:style]; + return [font fontWithSize:font.pointSize * scaleFactor]; } @end diff --git a/DynamicText/DynamicText/UYLAppDelegate.h b/DynamicText/DynamicText/UYLAppDelegate.h index 5efc6de..920cfe0 100644 --- a/DynamicText/DynamicText/UYLAppDelegate.h +++ b/DynamicText/DynamicText/UYLAppDelegate.h @@ -1,9 +1,4 @@ -// -// UYLAppDelegate.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,10 +26,8 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UYLAppDelegate : UIResponder - @property (strong, nonatomic) UIWindow *window; - @end diff --git a/DynamicText/DynamicText/UYLAppDelegate.m b/DynamicText/DynamicText/UYLAppDelegate.m index 59ba911..5a307a4 100644 --- a/DynamicText/DynamicText/UYLAppDelegate.m +++ b/DynamicText/DynamicText/UYLAppDelegate.m @@ -1,9 +1,4 @@ -// -// UYLAppDelegate.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -33,5 +28,4 @@ #import "UYLAppDelegate.h" @implementation UYLAppDelegate - -@end \ No newline at end of file +@end diff --git a/DynamicText/DynamicText/UYLScaledTextStyleViewController.h b/DynamicText/DynamicText/UYLScaledTextStyleViewController.h index 3c408b4..986a63c 100644 --- a/DynamicText/DynamicText/UYLScaledTextStyleViewController.h +++ b/DynamicText/DynamicText/UYLScaledTextStyleViewController.h @@ -1,13 +1,32 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. // -// UYLScaledTextStyleViewController.h -// DynamicText +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Created by Keith Harrison on 18/12/2013. -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. -#import "UYLTextStyleViewController.h" - -@interface UYLScaledTextStyleViewController : UYLTextStyleViewController +@import UIKit; +@interface UYLScaledTextStyleViewController : UIViewController @end diff --git a/DynamicText/DynamicText/UYLScaledTextStyleViewController.m b/DynamicText/DynamicText/UYLScaledTextStyleViewController.m index 5214e5e..b706e52 100644 --- a/DynamicText/DynamicText/UYLScaledTextStyleViewController.m +++ b/DynamicText/DynamicText/UYLScaledTextStyleViewController.m @@ -9,22 +9,56 @@ #import "UYLScaledTextStyleViewController.h" #import "UIFont+UYLScaledFont.h" +@interface UYLScaledTextStyleViewController () +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *allLabels; + +@property (weak, nonatomic) IBOutlet UILabel *title1Label; +@property (weak, nonatomic) IBOutlet UILabel *title2Label; +@property (weak, nonatomic) IBOutlet UILabel *title3Label; +@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; +@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; +@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; +@property (weak, nonatomic) IBOutlet UILabel *calloutLabel; +@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; +@property (weak, nonatomic) IBOutlet UILabel *caption1Label; +@property (weak, nonatomic) IBOutlet UILabel *caption2Label; +@end + @implementation UYLScaledTextStyleViewController #pragma mark - #pragma mark === View Life Cycle === #pragma mark - -- (void)configureView -{ +- (void)viewDidLoad { + [super viewDidLoad]; + [self configureView]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateTextStyles:) + name:UIContentSizeCategoryDidChangeNotification + object:nil]; +} + +- (void)configureView { CGFloat scaleFactor = 2.0; - self.textSizeLabel.text = [[UIApplication sharedApplication] preferredContentSizeCategory]; - self.headlineLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleHeadline scale:scaleFactor]; - self.subheadLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleSubheadline scale:scaleFactor]; - self.bodyLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleBody scale:scaleFactor]; - self.caption1Label.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleCaption1 scale:scaleFactor]; - self.caption2Label.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleCaption2 scale:scaleFactor]; - self.footnoteLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleFootnote scale:scaleFactor]; + + self.title1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1 scale:scaleFactor]; + self.title2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2 scale:scaleFactor]; + self.title3Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3 scale:scaleFactor]; + self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline scale:scaleFactor]; + self.subheadLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline scale:scaleFactor]; + self.bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody scale:scaleFactor]; + self.calloutLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout scale:scaleFactor]; + self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote scale:scaleFactor]; + self.caption1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1 scale:scaleFactor]; + self.caption2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2 scale:scaleFactor]; } +#pragma mark - +#pragma mark === Notification Methods === +#pragma mark - + +- (void)updateTextStyles:(NSNotification *)notification { + [self configureView]; +} @end diff --git a/DynamicText/DynamicText/UYLTextStyleViewController.h b/DynamicText/DynamicText/UYLTextStyleViewController.h index 88bbcef..6c64a99 100644 --- a/DynamicText/DynamicText/UYLTextStyleViewController.h +++ b/DynamicText/DynamicText/UYLTextStyleViewController.h @@ -1,9 +1,4 @@ -// -// UYLTableViewController.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -30,17 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import +@import UIKit; @interface UYLTextStyleViewController : UIViewController - -@property (weak, nonatomic) IBOutlet UILabel *textSizeLabel; -@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; -@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; -@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; -@property (weak, nonatomic) IBOutlet UILabel *caption1Label; -@property (weak, nonatomic) IBOutlet UILabel *caption2Label; -@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; - @end diff --git a/DynamicText/DynamicText/UYLTextStyleViewController.m b/DynamicText/DynamicText/UYLTextStyleViewController.m index 6871248..98b752d 100644 --- a/DynamicText/DynamicText/UYLTextStyleViewController.m +++ b/DynamicText/DynamicText/UYLTextStyleViewController.m @@ -1,77 +1,83 @@ +// Copyright © 2013-2021 Keith Harrison. All rights reserved. // -// UYLTableViewController.m -// DynamicText +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. // -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. // -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. #import "UYLTextStyleViewController.h" +@interface UYLTextStyleViewController () +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *allLabels; + +@property (weak, nonatomic) IBOutlet UILabel *title1Label; +@property (weak, nonatomic) IBOutlet UILabel *title2Label; +@property (weak, nonatomic) IBOutlet UILabel *title3Label; +@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; +@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; +@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; +@property (weak, nonatomic) IBOutlet UILabel *calloutLabel; +@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; +@property (weak, nonatomic) IBOutlet UILabel *caption1Label; +@property (weak, nonatomic) IBOutlet UILabel *caption2Label; +@end + @implementation UYLTextStyleViewController #pragma mark - #pragma mark === View Life Cycle === #pragma mark - -- (void)viewDidLoad -{ - [super viewDidLoad]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(didChangePreferredContentSize:) - name:UIContentSizeCategoryDidChangeNotification - object:nil]; +- (void)viewDidLoad { + [super viewDidLoad]; + if (@available(iOS 10, *)) { + for (UILabel *label in self.allLabels) { + label.adjustsFontForContentSizeCategory = YES; + } + } else { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateTextStyles:) + name:UIContentSizeCategoryDidChangeNotification + object:nil]; + } } -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - [self configureView]; -} +#pragma mark - +#pragma mark === Notification Methods === +#pragma mark - -- (void)configureView -{ - self.textSizeLabel.text = [[UIApplication sharedApplication] preferredContentSizeCategory]; +- (void)updateTextStyles:(NSNotification *)notification { + self.title1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1]; + self.title2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2]; + self.title3Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3]; self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; self.subheadLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; self.bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + self.calloutLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout]; + self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; self.caption1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; self.caption2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; - self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; -} - -#pragma mark - -#pragma mark === Notification Methods === -#pragma mark - - -- (void)didChangePreferredContentSize:(NSNotification *)notification -{ - [self configureView]; } @end diff --git a/DynamicText/DynamicText/en.lproj/InfoPlist.strings b/DynamicText/DynamicText/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/DynamicText/DynamicText/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/DynamicText/DynamicText/main.m b/DynamicText/DynamicText/main.m index 94553a1..0530728 100644 --- a/DynamicText/DynamicText/main.m +++ b/DynamicText/DynamicText/main.m @@ -1,9 +1,4 @@ -// -// main.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: diff --git a/DynamicText/DynamicTextSwift/AppDelegate.swift b/DynamicText/DynamicTextSwift/AppDelegate.swift new file mode 100644 index 0000000..972061e --- /dev/null +++ b/DynamicText/DynamicTextSwift/AppDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { +} diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..9b711cb --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemBlueColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1120389 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "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" + }, + { + "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" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 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/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicTextSwift/Assets.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/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicTextSwift/Assets.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/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png new file mode 100644 index 0000000000000000000000000000000000000000..3c16adf7399bfbac2f393af203271775d21ea91d GIT binary patch literal 736 zcmV<60w4W}P)xN#0004uP)t-s0dL;; z?1cC2iu~#){puI`>r?&e5&h~C`0a%J>oEH3UH9#f_wA4T>K^**Sp4cH`0a}L>~{I= zb^Pib{puF@>~;I=IsEH6{OU0H?0o#{FZt|t`s-Z!>r(maXZh=B`Rii)>O%bMC;IDQ z{OS_@>K^&*Z~E(5{pub2>pJ)Cll$vK`|C{k>~8z(OZe=4`0bEbnze(muQ7+r>gSGw zu%Gzti#LkI`0RcRblEb8$CSFD7kbs|<7Hf(vO$l*_U)7U>tgrqlK1SA=iy@6+jslx zQ~B#*BY@Af%98u*P4w%FiL;JqqoK>xeWSvo`|CvV=UiZ(qac3DE``ECj<@jWfUw7W zkhYEych)(Jx)FEOiL-_D=sx-CJDa}dPyFnz3u`|3LT z>oD@=Hh-;#@#Q!B>Mwn*qx}UAwgZ%3z_UU6!mbW*G!|ml~>ES*6>K6Iy zUH$74^ypwplesd7#r*0K_w9@O>q7nM5&r8D*|JoE0003GNkl$lC?wr$(CZN7N3*K5DoOtL8Y)4{5XRW~XO!?4-dSWV!n<9YsrGF(IDa`80aR8{3v zj^oCw=rCQOq1;m4GH32^I1D$5x}(uSpxN*7dx#%-mUduZtMnI=yUE_#w)#bo#-_@% zu|(n$sm|2RE&kozXZy2w(slji6_&TwSS+T)kxwSKVcO|&FpwmvPm<-7# zGXm3S8FPV&VrB}Mo&jdlpCpZgLS|`sWp!1v427>`;nidM}?LUOHL+$AJ!U_FOv+3oWm=fC7;`ilR^S(X-%Lkrg5?m$B|0HhMw#Y;*RcKaH4`+6CI?mc+I`X#^YBi%zEO5BUo zOuc84yCAxk#)~(VCarsPr?;v1Fz@z266J_)_yxONRCkf8-N%Q%)ac^a_0vPVkzu!k zq`fGL5@Xk6_s6aW4US`Y*llg;txdg^2Oaz_=gD(DUTJ(DyD)eAC|n9Ak&cwuZDy&O zQi@V@$`Trdlzn&MCM?a;8zyVuLE#N7PDd}VU1{}Z)3Y>6)*a}L`(Qk&V7HEkd#GQ( z(rm+l9;4QdYCLmx-eGG$>u^{eg?C$@$U1mqooVw1uN=2>PoE1HTAHl3#eKS$Hm{>u zyaw1v9a+8YylL`8gbIvUZQiMF@#-pa34#R7;O>ewwE=-KVE zg-0z7G5SZ39e1u)vU#ZhdMWG{_mw~@HtcT^Vt2rbK{hWY9-|ZL*e&cUMCky!Z^Y`} zA$Ds_nQlvu9SM$_!}2*iZ=m|qCx+Nf-+!&c^8h_Yp(L8ab2vOZP?2RHyi6YYvFpy4 z8(k2`_gWv39+Pau<=OCiGdesYrQ*}}2WaAlt~(ZPZ-|>+M=E6)uu4qdyn_EVLjaaR zb6IMKr*;^ma=FJl@>F-PXU1Q?-}>;-l^u**X>cRV-&XJYF5B^S)4ob{<1+sfqmmL` zbNSyMMxOVB#|pQa)BoPJw2pWD3-`XiD9u~{3|ZNB?$+A)L~u#yh~N8bkY8N>3l$>w z@c1v-{my0I6ZG(S=m+0YYH{pKmwibo`9c;a3Uvin-XK56?k92VW09^nQVGeGx&piJ z$Lc+~gIu&Y{!Sbd-c~vi#8J5c*DuOtJbyb8(SyWh4HWAp00000NkvXXu0mjfk&l*@ literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3c599a552c33fae613e1ab51f03e7e7434bbcb81 GIT binary patch literal 2535 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7759c83f4b10efb32e7c54af86c6cfd0adc14e64 GIT binary patch literal 2561 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 KMNUMnLSTa7Rs$~p literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..611f339f038e238579905363c9ebca267886fe79 GIT binary patch literal 4710 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 LNkvXXu0mjf{o2?p literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..515d2b6dedfd7a88dc9b5ca7c610af06da0cdfb8 GIT binary patch literal 18310 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..90d600a7aa8aeaaa2bcb278003fc7037805b61f1 GIT binary patch literal 4136 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png new file mode 100644 index 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/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png new file mode 100644 index 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&h70000^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/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png new file mode 100644 index 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/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e16eba7 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard b/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52c8196 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicTextSwift/Info.plist b/DynamicText/DynamicTextSwift/Info.plist new file mode 100644 index 0000000..5b531f7 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Info.plist @@ -0,0 +1,66 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/DynamicText/DynamicTextSwift/SceneDelegate.swift b/DynamicText/DynamicTextSwift/SceneDelegate.swift new file mode 100644 index 0000000..8b6fc47 --- /dev/null +++ b/DynamicText/DynamicTextSwift/SceneDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/DynamicText/DynamicTextSwift/UIFont+Extension.swift b/DynamicText/DynamicTextSwift/UIFont+Extension.swift new file mode 100644 index 0000000..3174e89 --- /dev/null +++ b/DynamicText/DynamicTextSwift/UIFont+Extension.swift @@ -0,0 +1,36 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +extension UIFont { + static func preferredFont(forTextStyle style: UIFont.TextStyle, scaleFactor: CGFloat) -> UIFont { + let font = UIFont.preferredFont(forTextStyle: style) + return font.withSize(font.pointSize * scaleFactor) + } +} diff --git a/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift b/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift new file mode 100644 index 0000000..9812038 --- /dev/null +++ b/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift @@ -0,0 +1,68 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class UYLScaledTextStyleViewController: UIViewController { + @IBOutlet private var allLabels: [UILabel]! + @IBOutlet private var title1Label: UILabel! + @IBOutlet private var title2Label: UILabel! + @IBOutlet private var title3Label: UILabel! + @IBOutlet private var headlineLabel: UILabel! + @IBOutlet private var subheadLabel: UILabel! + @IBOutlet private var bodyLabel: UILabel! + @IBOutlet private var calloutLabel: UILabel! + @IBOutlet private var footnoteLabel: UILabel! + @IBOutlet private var caption1Label: UILabel! + @IBOutlet private var caption2Label: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + configureView() + NotificationCenter.default.addObserver(self, selector: #selector(updateTextStyles(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + } + + @objc private func updateTextStyles(_ notification: Notification) { + configureView() + } + + private func configureView() { + let scaleFactor: CGFloat = 2.0 + + title1Label.font = UIFont.preferredFont(forTextStyle: .title1, scaleFactor: scaleFactor) + title2Label.font = UIFont.preferredFont(forTextStyle: .title2, scaleFactor: scaleFactor) + title3Label.font = UIFont.preferredFont(forTextStyle: .title3, scaleFactor: scaleFactor) + headlineLabel.font = UIFont.preferredFont(forTextStyle: .headline, scaleFactor: scaleFactor) + subheadLabel.font = UIFont.preferredFont(forTextStyle: .subheadline, scaleFactor: scaleFactor) + bodyLabel.font = UIFont.preferredFont(forTextStyle: .body, scaleFactor: scaleFactor) + calloutLabel.font = UIFont.preferredFont(forTextStyle: .callout, scaleFactor: scaleFactor) + footnoteLabel.font = UIFont.preferredFont(forTextStyle: .footnote, scaleFactor: scaleFactor) + caption1Label.font = UIFont.preferredFont(forTextStyle: .caption1, scaleFactor: scaleFactor) + caption2Label.font = UIFont.preferredFont(forTextStyle: .caption2, scaleFactor: scaleFactor) + } +} diff --git a/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift b/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift new file mode 100644 index 0000000..ecff87a --- /dev/null +++ b/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift @@ -0,0 +1,68 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class UYLTextStyleViewController: UIViewController { + @IBOutlet private var allLabels: [UILabel]! + @IBOutlet private weak var title1Label: UILabel! + @IBOutlet private weak var title2Label: UILabel! + @IBOutlet private weak var title3Label: UILabel! + @IBOutlet private weak var headlineLabel: UILabel! + @IBOutlet private weak var subheadLabel: UILabel! + @IBOutlet private weak var bodyLabel: UILabel! + @IBOutlet private weak var calloutLabel: UILabel! + @IBOutlet private weak var footnoteLabel: UILabel! + @IBOutlet private weak var caption1Label: UILabel! + @IBOutlet private weak var caption2Label: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + + if #available(iOS 10, *) { + allLabels.forEach { + $0.adjustsFontForContentSizeCategory = true + } + } else { + NotificationCenter.default.addObserver(self, selector: #selector(updateTextStyles(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + } + } + + @objc private func updateTextStyles(_ notification: Notification) { + title1Label.font = UIFont.preferredFont(forTextStyle: .title1) + title2Label.font = UIFont.preferredFont(forTextStyle: .title2) + title3Label.font = UIFont.preferredFont(forTextStyle: .title3) + headlineLabel.font = UIFont.preferredFont(forTextStyle: .headline) + subheadLabel.font = UIFont.preferredFont(forTextStyle: .subheadline) + bodyLabel.font = UIFont.preferredFont(forTextStyle: .body) + calloutLabel.font = UIFont.preferredFont(forTextStyle: .callout) + footnoteLabel.font = UIFont.preferredFont(forTextStyle: .footnote) + caption1Label.font = UIFont.preferredFont(forTextStyle: .caption1) + caption2Label.font = UIFont.preferredFont(forTextStyle: .caption2) + } +} diff --git a/DynamicText/README.md b/DynamicText/README.md index 14c9d11..c1e8637 100644 --- a/DynamicText/README.md +++ b/DynamicText/README.md @@ -5,7 +5,7 @@ This is a example project showing how to respond to the user changing the preferred text size. -**Minimum deployment target is now iOS 9.0 using Xcode 11** +**Minimum deployment target is now iOS 9.0 using Xcode 12** The `UYLTextStyleViewController` shows the standard way to listen for and respond to changes to the users preferred text size using the @@ -22,11 +22,12 @@ category of `UIFont` for this purpose. For further details see the following blog post: -+ [Scaling Synamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) ++ [Scaling Dynamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) ## History -Version 1.3 11 January 2020 Updated for Xcode 11 +Version 1.4 19 May 2021 Updated for Xcode 12 and Swift +Version 1.3 11 January 2020 Updated for Xcode 11 Version 1.2 14 August 2017 Updated for Xcode 8 and iOS 10 Version 1.1 30 December 2013 Added UYLScaledTextViewController Version 1.0 06 October 2013 Initial version. From a0a0d2951ef3348857851d84a46dead5fd543245 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Nov 2021 11:16:35 +0000 Subject: [PATCH 95/98] Update ScaledFont for Xcode 13 recommended settings --- ScaledFont/ScaledFont.xcodeproj/project.pbxproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index 0454578..c209d8b 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -207,7 +207,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1240; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1310; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53581E7625F7D6B6000DAD54 = { @@ -314,7 +314,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = Sampler/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -337,7 +337,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = Sampler/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -401,7 +401,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -455,7 +455,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; From 85af9ff835f99c4df25cbeefec36f348c1cb8c47 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 9 Mar 2022 16:42:18 +0000 Subject: [PATCH 96/98] Updated gitignore so now saving more of the workspace files --- .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 6 ++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 10 ++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../xcshareddata/swiftpm/Package.resolved | 16 ++++++++++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 112 files changed, 849 insertions(+) create mode 100644 AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..330b13d --- /dev/null +++ b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..997f1a0 --- /dev/null +++ b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..00f2aca --- /dev/null +++ b/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..78219e1 --- /dev/null +++ b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..729e605 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ce2a0d9 --- /dev/null +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5fc5b6e --- /dev/null +++ b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..948f33d --- /dev/null +++ b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..05bb496 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2c11c20 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7c537ff --- /dev/null +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,6 @@ + + + + + diff --git a/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0502574 --- /dev/null +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a339ef4 --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8ac9b61 --- /dev/null +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..edc712f --- /dev/null +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ef00988 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..82063ef --- /dev/null +++ b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ea9b143 --- /dev/null +++ b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..dc746e2 --- /dev/null +++ b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..3f19229 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d8ef532 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d8ef532 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c73bb89 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..31c29ea --- /dev/null +++ b/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e92800f --- /dev/null +++ b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e92800f --- /dev/null +++ b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0f1a28d --- /dev/null +++ b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..df636b7 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cb96726 --- /dev/null +++ b/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0540ebe --- /dev/null +++ b/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..774407d --- /dev/null +++ b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..911133b --- /dev/null +++ b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..82343ea --- /dev/null +++ b/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8816e0d --- /dev/null +++ b/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2508c96 --- /dev/null +++ b/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1a89b2a --- /dev/null +++ b/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..502ca7c --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..04b85c1 --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..939427d --- /dev/null +++ b/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a861032 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7c6899c --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "ScaledFont", + "repositoryURL": "git@github.com:kharrison/ScaledFont.git", + "state": { + "branch": null, + "revision": "1dd4fad0ef73a62141231b604a4b1f2e50f71152", + "version": "1.0.4" + } + } + ] + }, + "version": 1 +} diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c1131c3 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fe07a26 --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..347c940 --- /dev/null +++ b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6e6878a --- /dev/null +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6bfc5e4 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8da2040 --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0502574 --- /dev/null +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..683cb83 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..29776e6 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b52f47c --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5d56381 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..43c56f3 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c3a4c72 --- /dev/null +++ b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 0a88c7e509c6ba88409953ae49197ed11fd83750 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 7 Feb 2025 13:07:19 +0000 Subject: [PATCH 97/98] Update minimum target to iOS 12 Update to Xcode 16 recommended settings --- .../AllVisible.xcodeproj/project.pbxproj | 8 ++-- RemindMe10/RemindMe.xcodeproj/project.pbxproj | 44 +++++++++++++------ RemindMe10/RemindMe/AppDelegate.swift | 2 +- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/AllVisible/AllVisible.xcodeproj/project.pbxproj b/AllVisible/AllVisible.xcodeproj/project.pbxproj index 6c1007d..68c02d2 100644 --- a/AllVisible/AllVisible.xcodeproj/project.pbxproj +++ b/AllVisible/AllVisible.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53AA2EB11DA2A957008EBF84 = { @@ -310,6 +310,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -335,7 +336,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -370,6 +371,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -389,7 +391,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/RemindMe10/RemindMe.xcodeproj/project.pbxproj b/RemindMe10/RemindMe.xcodeproj/project.pbxproj index f91d866..1302899 100644 --- a/RemindMe10/RemindMe.xcodeproj/project.pbxproj +++ b/RemindMe10/RemindMe.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -175,8 +175,9 @@ 53BA9AED1DB283D7000BD07D /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1620; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 539D5EB81DC4DBF500130F2F = { @@ -302,7 +303,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMeObjc/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -314,7 +318,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMeObjc/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -345,6 +352,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -356,6 +364,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -370,13 +379,13 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -406,6 +415,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -417,6 +427,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -425,11 +436,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -441,10 +453,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMe/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -454,10 +469,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMe/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Release; }; diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift index 85e52f5..f0150c2 100644 --- a/RemindMe10/RemindMe/AppDelegate.swift +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -34,7 +34,7 @@ import UIKit import UserNotifications -@UIApplicationMain +@main class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? From 5a2f47fdb4596a3b0850850469931a86b35ba27d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 10 Feb 2025 14:59:38 +0000 Subject: [PATCH 98/98] Remove surplus ; --- RemindMe10/RemindMe/AppDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift index f0150c2..1de436b 100644 --- a/RemindMe10/RemindMe/AppDelegate.swift +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -41,7 +41,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let notificationDelegate = UYLNotificationDelegate() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { - let options: UNAuthorizationOptions = [.alert, .sound]; + let options: UNAuthorizationOptions = [.alert, .sound] registerForLocalNotifications(options: options) let center = UNUserNotificationCenter.current() center.delegate = notificationDelegate