From 05bbae665525d52f455deb48b7c0d089aeb035e8 Mon Sep 17 00:00:00 2001 From: Ivan Vorobei Date: Tue, 26 Nov 2019 22:03:54 +0300 Subject: [PATCH] Add `.moon` & `.star` presets --- Assets/Readme/Miniature - Add.svg | 6 +- Assets/Readme/Miniature - Moon.svg | 10 ++ Assets/Readme/Miniature - Star.svg | 10 ++ Assets/Sketch/Presets.sketch | Bin 16643 -> 22457 bytes Example/Controllers/ViewController.swift | 2 + Readme.md | 2 + SPAlert.podspec | 2 +- SPAlert.xcodeproj/project.pbxproj | 8 ++ Source/SPAlert/Models/SPAlertPreset.swift | 28 ++++- .../Views/Icons/SPAlertIconDocView.swift | 3 - .../Views/Icons/SPAlertIconDoneView.swift | 1 - .../Views/Icons/SPAlertIconHeartView.swift | 1 - .../Views/Icons/SPAlertIconMoonView.swift | 110 +++++++++++++++++ .../Views/Icons/SPAlertIconStarView.swift | 116 ++++++++++++++++++ Source/SPAlert/Views/SPAlertView.swift | 6 +- 15 files changed, 293 insertions(+), 12 deletions(-) create mode 100644 Assets/Readme/Miniature - Moon.svg create mode 100644 Assets/Readme/Miniature - Star.svg create mode 100644 Source/SPAlert/Views/Icons/SPAlertIconMoonView.swift create mode 100644 Source/SPAlert/Views/Icons/SPAlertIconStarView.swift diff --git a/Assets/Readme/Miniature - Add.svg b/Assets/Readme/Miniature - Add.svg index b5cd23f..8bf13fd 100644 --- a/Assets/Readme/Miniature - Add.svg +++ b/Assets/Readme/Miniature - Add.svg @@ -5,9 +5,9 @@ Created with Sketch. - - - + + + \ No newline at end of file diff --git a/Assets/Readme/Miniature - Moon.svg b/Assets/Readme/Miniature - Moon.svg new file mode 100644 index 0000000..423a876 --- /dev/null +++ b/Assets/Readme/Miniature - Moon.svg @@ -0,0 +1,10 @@ + + + + Miniature - Moon + Created with Sketch. + + + + + \ No newline at end of file diff --git a/Assets/Readme/Miniature - Star.svg b/Assets/Readme/Miniature - Star.svg new file mode 100644 index 0000000..bec5ab6 --- /dev/null +++ b/Assets/Readme/Miniature - Star.svg @@ -0,0 +1,10 @@ + + + + Miniature - Star + Created with Sketch. + + + + + \ No newline at end of file diff --git a/Assets/Sketch/Presets.sketch b/Assets/Sketch/Presets.sketch index d58ac968bf07ed6bdfce97affdff75d7b0a48ff1..9efc281c0d9d62c155b8caa380d4d2a0b82d9a12 100644 GIT binary patch literal 22457 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 KG}pv{^y?r0k=;rF literal 16643 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 NlL8GlSMcrb{{s>V+0g(1 diff --git a/Example/Controllers/ViewController.swift b/Example/Controllers/ViewController.swift index 20e63be..629763c 100644 --- a/Example/Controllers/ViewController.swift +++ b/Example/Controllers/ViewController.swift @@ -8,6 +8,8 @@ class ViewController: UITableViewController { Alert(key: "Heart", preset: .heart, title: "Love", subtitle: "We'll recommend more like this for you"), Alert(key: "Doc", preset: .doc, title: "Document saved", subtitle: "See in folder new file"), Alert(key: "Bookmark", preset: .bookmark, title: "Added to bookmark", subtitle: "See bookmarks screen"), + Alert(key: "Moon", preset: .moon, title: "Night Mode", subtitle: "You can disable it in settings"), + Alert(key: "Star", preset: .star, title: "Added to favorite", subtitle: nil), Alert(key: "Add", preset: .add, title: "Added to Folder", subtitle: nil), Alert(key: "Error", preset: .error, title: "Oops", subtitle: "Please try again later"), Alert(key: "Message", preset: nil, title: nil, subtitle: "Email required") diff --git a/Readme.md b/Readme.md index fb3ef9c..04dd661 100644 --- a/Readme.md +++ b/Readme.md @@ -80,6 +80,8 @@ For now supporting `Done`, `Add`, `Heart`, `Doc`, `Error`, `Bookmark` & `Message + +

diff --git a/SPAlert.podspec b/SPAlert.podspec index 79d044d..f395849 100644 --- a/SPAlert.podspec +++ b/SPAlert.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SPAlert" - s.version = "2.0.5" + s.version = "2.0.6" s.summary = "Native alert from Apple Music & Feedback. Contains Done, Heart & Message presets." s.homepage = "https://github.com/IvanVorobei/SPAlert" s.source = { :git => "https://github.com/IvanVorobei/SPAlert.git", :tag => s.version } diff --git a/SPAlert.xcodeproj/project.pbxproj b/SPAlert.xcodeproj/project.pbxproj index bc034d8..15b791c 100644 --- a/SPAlert.xcodeproj/project.pbxproj +++ b/SPAlert.xcodeproj/project.pbxproj @@ -26,6 +26,8 @@ F4A5A92C2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4A5A92B2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift */; }; F4A8361A2385588300EB32E0 /* SPAlertIconDocView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4A836192385588300EB32E0 /* SPAlertIconDocView.swift */; }; F4CA67B5238ABD0100E72F79 /* SPAlertIconAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4CA67B4238ABD0100E72F79 /* SPAlertIconAddView.swift */; }; + F4D3CD58238DA9FE006C3DE2 /* SPAlertIconMoonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4D3CD57238DA9FE006C3DE2 /* SPAlertIconMoonView.swift */; }; + F4D3CD5A238DAA49006C3DE2 /* SPAlertIconStarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4D3CD59238DAA49006C3DE2 /* SPAlertIconStarView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -80,6 +82,8 @@ F4A5A92B2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconBookmarkView.swift; sourceTree = ""; }; F4A836192385588300EB32E0 /* SPAlertIconDocView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconDocView.swift; sourceTree = ""; }; F4CA67B4238ABD0100E72F79 /* SPAlertIconAddView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconAddView.swift; sourceTree = ""; }; + F4D3CD57238DA9FE006C3DE2 /* SPAlertIconMoonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconMoonView.swift; sourceTree = ""; }; + F4D3CD59238DAA49006C3DE2 /* SPAlertIconStarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconStarView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -163,6 +167,8 @@ F4A836192385588300EB32E0 /* SPAlertIconDocView.swift */, F4A5A92B2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift */, F4CA67B4238ABD0100E72F79 /* SPAlertIconAddView.swift */, + F4D3CD57238DA9FE006C3DE2 /* SPAlertIconMoonView.swift */, + F4D3CD59238DAA49006C3DE2 /* SPAlertIconStarView.swift */, ); path = Icons; sourceTree = ""; @@ -364,6 +370,8 @@ F4A5A92C2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift in Sources */, F41204EC2382AC9B009C2AC7 /* SPAlertIconDoneView.swift in Sources */, F41204E92382AC9B009C2AC7 /* SPAlertView.swift in Sources */, + F4D3CD58238DA9FE006C3DE2 /* SPAlertIconMoonView.swift in Sources */, + F4D3CD5A238DAA49006C3DE2 /* SPAlertIconStarView.swift in Sources */, 706F894A2383277500ECF5D1 /* SPAlertIconErrorView.swift in Sources */, F41205292382AF5C009C2AC7 /* SPAlertIconAnimatable.swift in Sources */, F4CA67B5238ABD0100E72F79 /* SPAlertIconAddView.swift in Sources */, diff --git a/Source/SPAlert/Models/SPAlertPreset.swift b/Source/SPAlert/Models/SPAlertPreset.swift index 832c418..e25df84 100644 --- a/Source/SPAlert/Models/SPAlertPreset.swift +++ b/Source/SPAlert/Models/SPAlertPreset.swift @@ -30,6 +30,8 @@ public enum SPAlertPreset { case heart case doc case bookmark + case moon + case star case add case error @@ -48,6 +50,10 @@ public enum SPAlertPreset { return SPAlertIconBookmarkView() case .add: return SPAlertIconAddView() + case .moon: + return SPAlertIconMoonView() + case .star: + return SPAlertIconStarView() case .error: return SPAlertIconErrorView() } @@ -87,9 +93,25 @@ public enum SPAlertPreset { layout.topSpace = 57 layout.bottomSpace = 29 layout.iconWidth = 112 - layout.iconHeight = 94 + layout.iconHeight = 90 layout.bottomIconSpace = 36 return layout + case .moon: + var layout = SPAlertLayout() + layout.topSpace = 49 + layout.bottomSpace = 27 + layout.iconWidth = 112 + layout.iconHeight = 88 + layout.bottomIconSpace = 35 + return layout + case .star: + var layout = SPAlertLayout() + layout.topSpace = 49 + layout.bottomSpace = 31 + layout.iconWidth = 112 + layout.iconHeight = 92 + layout.bottomIconSpace = 35 + return layout case .add: var layout = SPAlertLayout() layout.topSpace = 63 @@ -124,6 +146,10 @@ public enum SPAlertPreset { return .success case .add: return .success + case .star: + return .success + case .moon: + return .success case .error: return .error } diff --git a/Source/SPAlert/Views/Icons/SPAlertIconDocView.swift b/Source/SPAlert/Views/Icons/SPAlertIconDocView.swift index dd54a94..b60ef67 100644 --- a/Source/SPAlert/Views/Icons/SPAlertIconDocView.swift +++ b/Source/SPAlert/Views/Icons/SPAlertIconDocView.swift @@ -40,14 +40,11 @@ public class SPAlertIconDocView: UIView { class DocDraw: NSObject { @objc dynamic public class func draw(frame targetFrame: CGRect = CGRect(x: 0, y: 0, width: 70, height: 87), resizing: ResizingBehavior = .aspectFit, fillColor: UIColor = UIColor(red: 0.349, green: 0.345, blue: 0.353, alpha: 1.000)) { - let context = UIGraphicsGetCurrentContext()! - context.saveGState() let resizedFrame: CGRect = resizing.apply(rect: CGRect(x: 0, y: 0, width: 70, height: 87), target: targetFrame) context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY) context.scaleBy(x: resizedFrame.width / 70, y: resizedFrame.height / 87) - let bezierPath = UIBezierPath() bezierPath.move(to: CGPoint(x: 13.73, y: 86.65)) bezierPath.addLine(to: CGPoint(x: 55.38, y: 86.65)) diff --git a/Source/SPAlert/Views/Icons/SPAlertIconDoneView.swift b/Source/SPAlert/Views/Icons/SPAlertIconDoneView.swift index cbc6916..39e5df6 100644 --- a/Source/SPAlert/Views/Icons/SPAlertIconDoneView.swift +++ b/Source/SPAlert/Views/Icons/SPAlertIconDoneView.swift @@ -24,7 +24,6 @@ import UIKit public class SPAlertIconDoneView: UIView, SPAlertIconAnimatable { public func animate() { - let length = frame.width let animatablePath = UIBezierPath() animatablePath.move(to: CGPoint(x: length * 0.196, y: length * 0.527)) diff --git a/Source/SPAlert/Views/Icons/SPAlertIconHeartView.swift b/Source/SPAlert/Views/Icons/SPAlertIconHeartView.swift index 33f8965..760b1c7 100644 --- a/Source/SPAlert/Views/Icons/SPAlertIconHeartView.swift +++ b/Source/SPAlert/Views/Icons/SPAlertIconHeartView.swift @@ -45,7 +45,6 @@ public class SPAlertIconHeartView: UIView { let resizedFrame: CGRect = resizing.apply(rect: CGRect(x: 0, y: 0, width: 510, height: 470), target: targetFrame) context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY) context.scaleBy(x: resizedFrame.width / 510, y: resizedFrame.height / 470) - let bezierPath = UIBezierPath() bezierPath.move(to: CGPoint(x: 255, y: 469.6)) bezierPath.addLine(to: CGPoint(x: 219.3, y: 433.9)) diff --git a/Source/SPAlert/Views/Icons/SPAlertIconMoonView.swift b/Source/SPAlert/Views/Icons/SPAlertIconMoonView.swift new file mode 100644 index 0000000..4e93cd0 --- /dev/null +++ b/Source/SPAlert/Views/Icons/SPAlertIconMoonView.swift @@ -0,0 +1,110 @@ +// The MIT License (MIT) +// Copyright © 2019 Ivan Vorobei (ivanvorobei@icloud.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +public class SPAlertIconMoonView: UIView { + + init() { + super.init(frame: .zero) + self.backgroundColor = .clear + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func draw(_ rect: CGRect) { + super.draw(rect) + MoonDraw.draw(frame: rect, resizing: .aspectFit, fillColor: self.tintColor) + } + + class MoonDraw: NSObject { + + @objc dynamic public class func draw(frame targetFrame: CGRect = CGRect(x: 0, y: 0, width: 53, height: 52), resizing: ResizingBehavior = .aspectFit, fillColor: UIColor = UIColor(red: 0.349, green: 0.345, blue: 0.353, alpha: 1.000)) { + let context = UIGraphicsGetCurrentContext()! + context.saveGState() + let resizedFrame: CGRect = resizing.apply(rect: CGRect(x: 0, y: 0, width: 53, height: 52), target: targetFrame) + context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY) + context.scaleBy(x: resizedFrame.width / 53, y: resizedFrame.height / 52) + let bezierPath = UIBezierPath() + bezierPath.move(to: CGPoint(x: 40.82, y: 34.76)) + bezierPath.addCurve(to: CGPoint(x: 48.45, y: 33.58), controlPoint1: CGPoint(x: 43.67, y: 34.76), controlPoint2: CGPoint(x: 46.55, y: 34.16)) + bezierPath.addLine(to: CGPoint(x: 48.74, y: 33.49)) + bezierPath.addCurve(to: CGPoint(x: 49.79, y: 33.27), controlPoint1: CGPoint(x: 49.2, y: 33.34), controlPoint2: CGPoint(x: 49.47, y: 33.27)) + bezierPath.addCurve(to: CGPoint(x: 51.23, y: 34.78), controlPoint1: CGPoint(x: 50.47, y: 33.27), controlPoint2: CGPoint(x: 51.23, y: 33.88)) + bezierPath.addLine(to: CGPoint(x: 51.22, y: 34.95)) + bezierPath.addCurve(to: CGPoint(x: 50.96, y: 36.15), controlPoint1: CGPoint(x: 51.2, y: 35.24), controlPoint2: CGPoint(x: 51.14, y: 35.7)) + bezierPath.addCurve(to: CGPoint(x: 28.28, y: 50.5), controlPoint1: CGPoint(x: 47.93, y: 44.12), controlPoint2: CGPoint(x: 38.81, y: 50.5)) + bezierPath.addCurve(to: CGPoint(x: 3, y: 25.86), controlPoint1: CGPoint(x: 13.95, y: 50.5), controlPoint2: CGPoint(x: 3, y: 40.23)) + bezierPath.addCurve(to: CGPoint(x: 18.11, y: 2.27), controlPoint1: CGPoint(x: 3, y: 15.62), controlPoint2: CGPoint(x: 9.06, y: 5.89)) + bezierPath.addCurve(to: CGPoint(x: 19.5, y: 2), controlPoint1: CGPoint(x: 18.65, y: 2.07), controlPoint2: CGPoint(x: 19.23, y: 2)) + bezierPath.addCurve(to: CGPoint(x: 20.94, y: 3.39), controlPoint1: CGPoint(x: 20.45, y: 2), controlPoint2: CGPoint(x: 20.94, y: 2.73)) + bezierPath.addCurve(to: CGPoint(x: 20.67, y: 4.54), controlPoint1: CGPoint(x: 20.94, y: 3.64), controlPoint2: CGPoint(x: 20.89, y: 3.98)) + bezierPath.addCurve(to: CGPoint(x: 19.13, y: 13.22), controlPoint1: CGPoint(x: 19.79, y: 6.57), controlPoint2: CGPoint(x: 19.13, y: 10.48)) + bezierPath.addCurve(to: CGPoint(x: 40.82, y: 34.76), controlPoint1: CGPoint(x: 19.13, y: 26.47), controlPoint2: CGPoint(x: 27.59, y: 34.76)) + bezierPath.close() + fillColor.setFill() + bezierPath.fill() + context.restoreGState() + } + + @objc(StyleKitNameResizingBehavior) + public enum ResizingBehavior: Int { + + case aspectFit + case aspectFill + case stretch + case center + + public func apply(rect: CGRect, target: CGRect) -> CGRect { + if rect == target || target == CGRect.zero { + return rect + } + + var scales = CGSize.zero + scales.width = abs(target.width / rect.width) + scales.height = abs(target.height / rect.height) + + switch self { + case .aspectFit: + scales.width = min(scales.width, scales.height) + scales.height = scales.width + case .aspectFill: + scales.width = max(scales.width, scales.height) + scales.height = scales.width + case .stretch: + break + case .center: + scales.width = 1 + scales.height = 1 + } + + var result = rect.standardized + result.size.width *= scales.width + result.size.height *= scales.height + result.origin.x = target.minX + (target.width - result.width) / 2 + result.origin.y = target.minY + (target.height - result.height) / 2 + return result + } + } + } +} diff --git a/Source/SPAlert/Views/Icons/SPAlertIconStarView.swift b/Source/SPAlert/Views/Icons/SPAlertIconStarView.swift new file mode 100644 index 0000000..e13bcb2 --- /dev/null +++ b/Source/SPAlert/Views/Icons/SPAlertIconStarView.swift @@ -0,0 +1,116 @@ +// The MIT License (MIT) +// Copyright © 2019 Ivan Vorobei (ivanvorobei@icloud.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +public class SPAlertIconStarView: UIView { + + init() { + super.init(frame: .zero) + self.backgroundColor = .clear + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func draw(_ rect: CGRect) { + super.draw(rect) + StarDraw.draw(frame: rect, resizing: .aspectFit, fillColor: self.tintColor) + } + + class StarDraw: NSObject { + + @objc dynamic public class func draw(frame targetFrame: CGRect = CGRect(x: 0, y: 0, width: 65, height: 65), resizing: ResizingBehavior = .aspectFit, fillColor: UIColor = UIColor(red: 0.349, green: 0.345, blue: 0.353, alpha: 1.000)) { + let context = UIGraphicsGetCurrentContext()! + context.saveGState() + let resizedFrame: CGRect = resizing.apply(rect: CGRect(x: 0, y: 0, width: 65, height: 65), target: targetFrame) + context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY) + context.scaleBy(x: resizedFrame.width / 65, y: resizedFrame.height / 65) + let bezierPath = UIBezierPath() + bezierPath.move(to: CGPoint(x: 12.85, y: 61.49)) + bezierPath.addCurve(to: CGPoint(x: 12.06, y: 57.48), controlPoint1: CGPoint(x: 11.76, y: 60.67), controlPoint2: CGPoint(x: 11.48, y: 59.34)) + bezierPath.addLine(to: CGPoint(x: 17.96, y: 39.89)) + bezierPath.addLine(to: CGPoint(x: 3.12, y: 29.24)) + bezierPath.addCurve(to: CGPoint(x: 1.14, y: 25.35), controlPoint1: CGPoint(x: 1.39, y: 28.02), controlPoint2: CGPoint(x: 0.67, y: 26.71)) + bezierPath.addCurve(to: CGPoint(x: 5.03, y: 23.35), controlPoint1: CGPoint(x: 1.59, y: 23.99), controlPoint2: CGPoint(x: 2.89, y: 23.32)) + bezierPath.addLine(to: CGPoint(x: 23.24, y: 23.49)) + bezierPath.addLine(to: CGPoint(x: 28.77, y: 6.09)) + bezierPath.addCurve(to: CGPoint(x: 31.86, y: 3), controlPoint1: CGPoint(x: 29.44, y: 4.06), controlPoint2: CGPoint(x: 30.44, y: 3)) + bezierPath.addCurve(to: CGPoint(x: 34.97, y: 6.09), controlPoint1: CGPoint(x: 33.31, y: 3), controlPoint2: CGPoint(x: 34.31, y: 4.06)) + bezierPath.addLine(to: CGPoint(x: 40.51, y: 23.49)) + bezierPath.addLine(to: CGPoint(x: 58.71, y: 23.35)) + bezierPath.addCurve(to: CGPoint(x: 62.61, y: 25.35), controlPoint1: CGPoint(x: 60.85, y: 23.32), controlPoint2: CGPoint(x: 62.16, y: 23.99)) + bezierPath.addCurve(to: CGPoint(x: 60.63, y: 29.24), controlPoint1: CGPoint(x: 63.05, y: 26.71), controlPoint2: CGPoint(x: 62.36, y: 28.02)) + bezierPath.addLine(to: CGPoint(x: 45.79, y: 39.89)) + bezierPath.addLine(to: CGPoint(x: 51.6, y: 57.21)) + bezierPath.addCurve(to: CGPoint(x: 50.9, y: 61.49), controlPoint1: CGPoint(x: 52.29, y: 59.21), controlPoint2: CGPoint(x: 52.04, y: 60.63)) + bezierPath.addCurve(to: CGPoint(x: 46.59, y: 60.82), controlPoint1: CGPoint(x: 49.73, y: 62.38), controlPoint2: CGPoint(x: 48.32, y: 62.07)) + bezierPath.addLine(to: CGPoint(x: 31.86, y: 50.01)) + bezierPath.addLine(to: CGPoint(x: 17.15, y: 60.82)) + bezierPath.addCurve(to: CGPoint(x: 12.85, y: 61.49), controlPoint1: CGPoint(x: 15.43, y: 62.07), controlPoint2: CGPoint(x: 13.98, y: 62.38)) + bezierPath.close() + fillColor.setFill() + bezierPath.fill() + context.restoreGState() + } + + @objc(StyleKitNameResizingBehavior) + public enum ResizingBehavior: Int { + + case aspectFit + case aspectFill + case stretch + case center + + public func apply(rect: CGRect, target: CGRect) -> CGRect { + if rect == target || target == CGRect.zero { + return rect + } + + var scales = CGSize.zero + scales.width = abs(target.width / rect.width) + scales.height = abs(target.height / rect.height) + + switch self { + case .aspectFit: + scales.width = min(scales.width, scales.height) + scales.height = scales.width + case .aspectFill: + scales.width = max(scales.width, scales.height) + scales.height = scales.width + case .stretch: + break + case .center: + scales.width = 1 + scales.height = 1 + } + + var result = rect.standardized + result.size.width *= scales.width + result.size.height *= scales.height + result.origin.x = target.minX + (target.width - result.width) / 2 + result.origin.y = target.minY + (target.height - result.height) / 2 + return result + } + } + } +} diff --git a/Source/SPAlert/Views/SPAlertView.swift b/Source/SPAlert/Views/SPAlertView.swift index b73f92e..dcf7640 100644 --- a/Source/SPAlert/Views/SPAlertView.swift +++ b/Source/SPAlert/Views/SPAlertView.swift @@ -72,6 +72,8 @@ open class SPAlertView: UIView { */ public var keyWindow: UIView = (UIApplication.shared.keyWindow ?? UIWindow()) + // MARK: Init + public init(title: String, message: String?, preset: SPAlertPreset) { super.init(frame: CGRect.zero) iconView = preset.iconView @@ -175,7 +177,7 @@ open class SPAlertView: UIView { subtitleLabel?.textColor = color } - // MARK: - Public + // MARK: Public /** Use this method for present controller. No need pass any controller, alert appear on `keyWindow`. @@ -213,7 +215,7 @@ open class SPAlertView: UIView { }) } - // MARK: - Layout + // MARK: Layout open override func layoutSubviews() { super.layoutSubviews()