From 436c53050656cf49f526ca67700d020c26799c70 Mon Sep 17 00:00:00 2001 From: Johnnie Date: Wed, 28 Feb 2018 11:13:47 +1300 Subject: [PATCH 1/4] Support customisation in Objective-C --- .../ARSLineProgress.xcodeproj/project.pbxproj | 4 + .../ARSLineProgressCustomizationObjcExt.swift | 144 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 Source/ARSLineProgressCustomizationObjcExt.swift diff --git a/Demo/ARSLineProgress.xcodeproj/project.pbxproj b/Demo/ARSLineProgress.xcodeproj/project.pbxproj index 75a1bd6..2b47d90 100644 --- a/Demo/ARSLineProgress.xcodeproj/project.pbxproj +++ b/Demo/ARSLineProgress.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ 276406C21C3832B700BCE105 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 276406C11C3832B700BCE105 /* Assets.xcassets */; }; 276406C51C3832B700BCE105 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 276406C31C3832B700BCE105 /* LaunchScreen.storyboard */; }; 27E116281C55844300661F75 /* ARSLineProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E116271C55844300661F75 /* ARSLineProgress.swift */; }; + 938FA74420460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 938FA74320460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -55,6 +56,7 @@ 276406C41C3832B700BCE105 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 276406C61C3832B700BCE105 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 27E116271C55844300661F75 /* ARSLineProgress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ARSLineProgress.swift; path = ../../Source/ARSLineProgress.swift; sourceTree = ""; }; + 938FA74320460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ARSLineProgressCustomizationObjcExt.swift; path = ../../Source/ARSLineProgressCustomizationObjcExt.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -89,6 +91,7 @@ children = ( 27E116271C55844300661F75 /* ARSLineProgress.swift */, 2734519E1DAA807000D53326 /* ARSLineProgressCustomization.swift */, + 938FA74320460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift */, 2734519C1DAA807000D53326 /* ARSInfiniteLoader.swift */, 273451AC1DAA85A500D53326 /* ARSProgressLoader.swift */, 273451AE1DAA85DE00D53326 /* ARSStatus.swift */, @@ -190,6 +193,7 @@ 273451A71DAA82C800D53326 /* ARSLineProgressHelpers.swift in Sources */, 27E116281C55844300661F75 /* ARSLineProgress.swift in Sources */, 273451AD1DAA85A500D53326 /* ARSProgressLoader.swift in Sources */, + 938FA74420460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift in Sources */, 276406BB1C3832B600BCE105 /* AppDelegate.swift in Sources */, 273451AB1DAA84AE00D53326 /* ARSLineProgressExtensions.swift in Sources */, ); diff --git a/Source/ARSLineProgressCustomizationObjcExt.swift b/Source/ARSLineProgressCustomizationObjcExt.swift new file mode 100644 index 0000000..033c60f --- /dev/null +++ b/Source/ARSLineProgressCustomizationObjcExt.swift @@ -0,0 +1,144 @@ +// +// ARSLineProgressCustomizationObjcExt.swift +// ARSLineProgress +// +// Created by Johnnie on 28/02/18. +// Copyright © 2018 Iaroslav Arsenkin. All rights reserved. +// + +import UIKit + +extension ARSLineProgressConfiguration { + @objc static func ars_setShowSuccessCheckmark(show : Bool){ + showSuccessCheckmark = show; + } + + // MARK: background view + @objc static func ars_setBackgroundViewDismissTransformScale(scale : CGFloat){ + backgroundViewDismissTransformScale = scale; + } + + @objc static func ars_setBackgroundViewColor(color : CGColor){ + backgroundViewColor = color; + } + + + /// setBackgroundViewStyle + /// + /// - Parameter style: 0:blur, 1:simple, 2:full, default:blur + @objc static func ars_setBackgroundViewStyle(style : NSInteger){ + switch style { + + case 0: + backgroundViewStyle = .blur; + break; + + case 1: + backgroundViewStyle = .simple; + break; + + case 2: + backgroundViewStyle = .full; + break; + + + default: + backgroundViewStyle = .blur; + break; + } + } + + @objc static func ars_setBackgroundViewCornerRadius(radius : CGFloat){ + backgroundViewCornerRadius = radius; + } + + @objc static func ars_setBackgroundViewPresentAnimationDuration(duration : CFTimeInterval){ + backgroundViewPresentAnimationDuration = duration; + } + + @objc static func ars_setBackgroundViewDismissAnimationDuration(duration : CFTimeInterval){ + backgroundViewDismissAnimationDuration = duration; + } + + @objc static func ars_setBlurStyle(style : UIBlurEffectStyle){ + blurStyle = style; + } + + // MARK: circles + @objc static func ars_setcircleColorOuter(color : CGColor){ + circleColorOuter = color; + } + + @objc static func ars_setcircleColorMiddle(color : CGColor){ + circleColorMiddle = color; + } + + @objc static func ars_setCircleColorInner(color : CGColor){ + circleColorInner = color; + } + + @objc static func ars_setCircleRotationDurationOuter(duration : CFTimeInterval){ + circleRotationDurationOuter = duration; + } + + @objc static func ars_setCircleRotationDurationMiddle(duration : CFTimeInterval){ + circleRotationDurationMiddle = duration; + } + + @objc static func ars_setCircleRotationDurationInner(duration : CFTimeInterval){ + circleRotationDurationInner = duration; + } + + + // MARK: check mark + @objc static func ars_setCheckmarkAnimationDrawDuration(duration : CFTimeInterval){ + checkmarkAnimationDrawDuration = duration; + } + + @objc static func ars_setCheckmarkLineWidth(width : CGFloat){ + checkmarkLineWidth = width; + } + + @objc static func ars_setCheckmarkColor(color : CGColor){ + checkmarkColor = color; + } + + // MARK: success circle + @objc static func ars_setSuccessCircleAnimationDrawDuration(duration : CFTimeInterval){ + successCircleAnimationDrawDuration = duration; + } + + @objc static func ars_setSuccessCircleLineWidth(width : CGFloat){ + successCircleLineWidth = width; + } + + @objc static func ars_setSuccessCircleColor(color : CGColor){ + successCircleColor = color; + } + + // MARK: fail cross + @objc static func ars_setFailCrossAnimationDrawDuration(duration : CFTimeInterval){ + failCrossAnimationDrawDuration = duration; + } + + @objc static func ars_setFailCrossLineWidth(width : CGFloat){ + failCrossLineWidth = width; + } + + @objc static func ars_setFailCrossColor(color : CGColor){ + failCrossColor = color; + } + + // MARK: fail circel + @objc static func ars_setFailCircleAnimationDrawDuration(duration : CFTimeInterval){ + failCircleAnimationDrawDuration = duration; + } + + @objc static func ars_setFailCircleLineWidth(width : CGFloat){ + failCircleLineWidth = width; + } + + @objc static func ars_setFailCircleColor(color : CGColor){ + failCircleColor = color; + } +} From adcb5f6763004b862929e8555740606f3a5363ba Mon Sep 17 00:00:00 2001 From: Johnnie Date: Wed, 28 Feb 2018 18:01:53 +1300 Subject: [PATCH 2/4] WIP: allow to have title for loader --- Demo/ARSLineProgress.xcodeproj/project.pbxproj | 2 +- .../UserInterfaceState.xcuserstate | Bin 0 -> 32315 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++++++++++ Source/ARSInfiniteLoader.swift | 8 +++++--- Source/ARSLineProgress.swift | 11 +++++++++-- Source/ARSLineProgressConstants.swift | 5 +++++ Source/ARSLineProgressHelpers.swift | 15 ++++++++++++++- Source/ARSLineProgressProtocols.swift | 1 + Source/ARSProgressLoader.swift | 12 +++++++----- Source/ARSStatus.swift | 10 ++++++---- 10 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/Demo/ARSLineProgress.xcodeproj/project.pbxproj b/Demo/ARSLineProgress.xcodeproj/project.pbxproj index 2b47d90..a2f720a 100644 --- a/Demo/ARSLineProgress.xcodeproj/project.pbxproj +++ b/Demo/ARSLineProgress.xcodeproj/project.pbxproj @@ -89,9 +89,9 @@ 276406B91C3832B600BCE105 /* ARSLineProgress */ = { isa = PBXGroup; children = ( - 27E116271C55844300661F75 /* ARSLineProgress.swift */, 2734519E1DAA807000D53326 /* ARSLineProgressCustomization.swift */, 938FA74320460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift */, + 27E116271C55844300661F75 /* ARSLineProgress.swift */, 2734519C1DAA807000D53326 /* ARSInfiniteLoader.swift */, 273451AC1DAA85A500D53326 /* ARSProgressLoader.swift */, 273451AE1DAA85DE00D53326 /* ARSStatus.swift */, diff --git a/Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate b/Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..30dbc05ecda0d9e40f3b112775ddf691384e4db7 GIT binary patch literal 32315 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 + + + + SchemeUserState + + ARSLineProgress.xcscheme + + orderHint + 0 + + + + diff --git a/Source/ARSInfiniteLoader.swift b/Source/ARSInfiniteLoader.swift index dba58e1..ebb465d 100644 --- a/Source/ARSInfiniteLoader.swift +++ b/Source/ARSInfiniteLoader.swift @@ -16,6 +16,7 @@ final class ARSInfiniteLoader: ARSLoader { @objc var backgroundBlurView: UIVisualEffectView @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView + @objc var title: NSString @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -32,6 +33,7 @@ final class ARSInfiniteLoader: ARSLoader { @objc weak var targetView: UIView? init() { + title = "" backgroundBlurView = ARSBlurredBackgroundRect().view backgroundSimpleView = ARSSimpleBackgroundRect().view backgroundFullView = ARSFullBackgroundRect().view @@ -51,9 +53,9 @@ final class ARSInfiniteLoader: ARSLoader { ars_dispatchOnMainQueue { if let loader = ars_currentLoader { if let targetView = loader.targetView { - ars_createdFrameForBackgroundView(loader.backgroundView, onView: targetView) + ars_createdFrameForBackgroundView(loader.backgroundView, title:loader.title, onView: targetView) } else { - ars_createdFrameForBackgroundView(loader.backgroundView, onView: nil) + ars_createdFrameForBackgroundView(loader.backgroundView, title:loader.title, onView: nil) } } } @@ -64,7 +66,7 @@ final class ARSInfiniteLoader: ARSLoader { extension ARSInfiniteLoader { func ars_showOnView(_ view: UIView?, completionBlock: (() -> Void)?) { - if ars_createdFrameForBackgroundView(backgroundView, onView: view) == false { return } + if ars_createdFrameForBackgroundView(backgroundView, title:self.title, onView: view) == false { return } targetView = view diff --git a/Source/ARSLineProgress.swift b/Source/ARSLineProgress.swift index 22c9f46..2986bd7 100644 --- a/Source/ARSLineProgress.swift +++ b/Source/ARSLineProgress.swift @@ -23,16 +23,23 @@ public final class ARSLineProgress: NSObject { Will interrupt the current .Infinite loader progress and show success animation instead. */ public static func showSuccess() { - if !statusShown { ARSStatus.show(.success) } + if !statusShown { ARSStatus.show(.success, title: "") } + } + + public static func showSuccess(title: NSString) { + if !statusShown { ARSStatus.show(.success, title: title) } } /** Will interrupt the current .Infinite loader progress and show fail animation instead. */ public static func showFail() { - if !statusShown { ARSStatus.show(.fail) } + if !statusShown { ARSStatus.show(.success, title: "") } } + public static func showFail(title: NSString) { + if !statusShown { ARSStatus.show(.success, title: title) } + } // MARK: Show Infinite Loader diff --git a/Source/ARSLineProgressConstants.swift b/Source/ARSLineProgressConstants.swift index 8b3dbe0..7a60bde 100644 --- a/Source/ARSLineProgressConstants.swift +++ b/Source/ARSLineProgressConstants.swift @@ -22,6 +22,11 @@ let ARS_CIRCLE_LINE_WIDTH: CGFloat = 2.0 let ARS_CIRCLE_START_ANGLE: CGFloat = -CGFloat.pi / 2 let ARS_CIRCLE_END_ANGLE: CGFloat = 0.0 +let ARS_TITLE_SIZE: CGFloat = 12.0 +let ARS_TITLE_MARGIN: CGFloat = 3.0 +let ARS_TITLE_COLOR: UIColor = UIColor.white; + + weak var ars_currentStatus: ARSLoader? var ars_currentLoader: ARSLoader? var ars_currentCompletionBlock: (() -> Void)? diff --git a/Source/ARSLineProgressHelpers.swift b/Source/ARSLineProgressHelpers.swift index 4cbcfe7..6e406b9 100644 --- a/Source/ARSLineProgressHelpers.swift +++ b/Source/ARSLineProgressHelpers.swift @@ -37,9 +37,22 @@ func ars_window() -> UIWindow? { return targetWindow } -@discardableResult func ars_createdFrameForBackgroundView(_ backgroundView: UIView, onView view: UIView?) -> Bool { +func sizeForTitle(_ title : NSString?) -> CGSize{ + if title != nil{ + return title!.boundingRect(with:CGSize(width:0, height:0), + options:NSStringDrawingOptions.usesLineFragmentOrigin, + attributes:[NSFontAttributeName: UIFont.systemFont(ofSize: ARS_TITLE_SIZE)], + context:nil) + .size + } + + return CGSize(width:0, height:0) +} + +@discardableResult func ars_createdFrameForBackgroundView(_ backgroundView: UIView, title: NSString?, onView view: UIView?) -> Bool { let center: CGPoint let bounds: CGRect + let lbSize = sizeForTitle(title) if view == nil { guard let window = ars_window() else { return false } diff --git a/Source/ARSLineProgressProtocols.swift b/Source/ARSLineProgressProtocols.swift index 42b931a..63f5f4a 100644 --- a/Source/ARSLineProgressProtocols.swift +++ b/Source/ARSLineProgressProtocols.swift @@ -13,6 +13,7 @@ import UIKit @objc protocol ARSLoader { var emptyView: UIView { get } var backgroundView: UIView { get } + @objc var title: NSString { get set } @objc optional var outerCircle: CAShapeLayer { get set } @objc optional var middleCircle: CAShapeLayer { get set } @objc optional var innerCircle: CAShapeLayer { get set } diff --git a/Source/ARSProgressLoader.swift b/Source/ARSProgressLoader.swift index 6e61ef4..cd14a13 100644 --- a/Source/ARSProgressLoader.swift +++ b/Source/ARSProgressLoader.swift @@ -16,6 +16,7 @@ final class ARSProgressLoader: ARSLoader { @objc var backgroundBlurView: UIView @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView + @objc var title: NSString @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -38,6 +39,7 @@ final class ARSProgressLoader: ARSLoader { @objc weak var targetView: UIView? init() { + title = "" backgroundBlurView = ARSBlurredBackgroundRect().view backgroundSimpleView = ARSSimpleBackgroundRect().view backgroundFullView = ARSFullBackgroundRect().view @@ -58,9 +60,9 @@ final class ARSProgressLoader: ARSLoader { ars_dispatchOnMainQueue { if let loader = ars_currentLoader { if let targetView = loader.targetView { - ars_createdFrameForBackgroundView(loader.backgroundView, onView: targetView) + ars_createdFrameForBackgroundView(loader.backgroundView, title:loader.title, onView: targetView) } else { - ars_createdFrameForBackgroundView(loader.backgroundView, onView: nil) + ars_createdFrameForBackgroundView(loader.backgroundView, title:loader.title, onView: nil) } } } @@ -73,7 +75,7 @@ extension ARSProgressLoader { // MARK: Show/Cancel func ars_showWithValue(_ value: CGFloat, onView view: UIView?, progress: Progress?, completionBlock: (() -> Void)?) { - if ars_createdFrameForBackgroundView(backgroundView, onView: view) == false { return } + if ars_createdFrameForBackgroundView(backgroundView, title:title, onView: view) == false { return } if let progress = progress { self.progress = progress } ars_currentCompletionBlock = completionBlock @@ -188,7 +190,7 @@ extension ARSProgressLoader { ars_dispatchAfter(0.9) { if ARSLineProgressConfiguration.showSuccessCheckmark { - ARSStatus.show(.success) + ARSStatus.show(.success, title: self.title) let dismissDelay = 0.5 + max(ARSLineProgressConfiguration.successCircleAnimationDrawDuration, ARSLineProgressConfiguration.checkmarkAnimationDrawDuration) @@ -202,7 +204,7 @@ extension ARSProgressLoader { } func ars_failedLoading() { - ARSStatus.show(.fail) + ARSStatus.show(.fail, title: self.title) let dismissDelay = 0.5 + max(ARSLineProgressConfiguration.failCircleAnimationDrawDuration, ARSLineProgressConfiguration.failCrossAnimationDrawDuration) ars_dispatchAfter(dismissDelay) { diff --git a/Source/ARSStatus.swift b/Source/ARSStatus.swift index 0f7a529..a2dbc4f 100644 --- a/Source/ARSStatus.swift +++ b/Source/ARSStatus.swift @@ -21,6 +21,7 @@ final class ARSStatus: ARSLoader { @objc var backgroundBlurView: UIVisualEffectView @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView + @objc var title: NSString @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -33,10 +34,11 @@ final class ARSStatus: ARSLoader { } init() { + title = "" backgroundBlurView = ARSBlurredBackgroundRect().view backgroundSimpleView = ARSSimpleBackgroundRect().view backgroundFullView = ARSFullBackgroundRect().view - ars_createdFrameForBackgroundView(backgroundView, onView: nil) + ars_createdFrameForBackgroundView(backgroundView, title:title, onView: nil) NotificationCenter.default.addObserver(self, selector: #selector(ARSInfiniteLoader.orientationChanged(_:)), name: NSNotification.Name.UIDeviceOrientationDidChange, @@ -53,15 +55,15 @@ final class ARSStatus: ARSLoader { ars_dispatchOnMainQueue { if let loader = ars_currentLoader { if let targetView = loader.targetView { - ars_createdFrameForBackgroundView(loader.backgroundView, onView: targetView) + ars_createdFrameForBackgroundView(loader.backgroundView, title:loader.title, onView: targetView) } else { - ars_createdFrameForBackgroundView(loader.backgroundView, onView: nil) + ars_createdFrameForBackgroundView(loader.backgroundView, title:loader.title, onView: nil) } } } } - static func show(_ type: ARSStatusType) { + static func show(_ type: ARSStatusType, title: NSString) { if let loader = ars_currentLoader { ars_stopCircleAnimations(loader, completionBlock: { drawStatus(type, loader: loader) From 62609959a585be7dbf8d54332216b99765cf0969 Mon Sep 17 00:00:00 2001 From: Johnnie Cheng Date: Thu, 1 Mar 2018 22:33:04 +1300 Subject: [PATCH 3/4] Implement Infinite loader with title --- .../ARSLineProgress.xcodeproj/project.pbxproj | 2 +- .../UserInterfaceState.xcuserstate | Bin 32315 -> 31949 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 23 ++++++++++++ Demo/ARSLineProgress/ViewController.swift | 5 +-- Source/ARSInfiniteLoader.swift | 25 +++++++++++-- Source/ARSLineProgress.swift | 34 ++++++++++++++---- Source/ARSLineProgressConstants.swift | 4 +-- Source/ARSLineProgressHelpers.swift | 17 ++++++--- Source/ARSLineProgressProtocols.swift | 3 +- Source/ARSProgressLoader.swift | 4 ++- Source/ARSStatus.swift | 5 +-- 11 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/Demo/ARSLineProgress.xcodeproj/project.pbxproj b/Demo/ARSLineProgress.xcodeproj/project.pbxproj index a2f720a..050a635 100644 --- a/Demo/ARSLineProgress.xcodeproj/project.pbxproj +++ b/Demo/ARSLineProgress.xcodeproj/project.pbxproj @@ -92,6 +92,7 @@ 2734519E1DAA807000D53326 /* ARSLineProgressCustomization.swift */, 938FA74320460F6D00B968F1 /* ARSLineProgressCustomizationObjcExt.swift */, 27E116271C55844300661F75 /* ARSLineProgress.swift */, + 273451A41DAA81FB00D53326 /* ARSLineProgressProtocols.swift */, 2734519C1DAA807000D53326 /* ARSInfiniteLoader.swift */, 273451AC1DAA85A500D53326 /* ARSProgressLoader.swift */, 273451AE1DAA85DE00D53326 /* ARSStatus.swift */, @@ -99,7 +100,6 @@ 273451A81DAA831500D53326 /* ARSLineProgressConstants.swift */, 273451AA1DAA84AE00D53326 /* ARSLineProgressExtensions.swift */, 273451A21DAA80CD00D53326 /* ARSLineProgressTypeAliases.swift */, - 273451A41DAA81FB00D53326 /* ARSLineProgressProtocols.swift */, 276406BC1C3832B600BCE105 /* ViewController.swift */, 276406BA1C3832B600BCE105 /* AppDelegate.swift */, 276406BE1C3832B700BCE105 /* Main.storyboard */, diff --git a/Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate b/Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate index 30dbc05ecda0d9e40f3b112775ddf691384e4db7..32ee68230be7182f6e61add1b61439c14335db51 100644 GIT binary patch delta 13697 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 f+8R0s>0&!Il6%Ykt0r$v#ZtFHyJ6wQU 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

nLjiC{rq$JPfaRQ zm?^=OVrpmVXi7I3Oh!|-sk^C{=`~Yd(-6~W(>N10O*Bn0O*hRn%`q)CEjP88R+-kA z)|)n(Hk-DZzA-&6P!t#nstaZp>?k-;aH!x&!SRAq1!oG*7kpiCz2H{Cqe4NUTcKy6 zu+X;<`pd{T3FOlw6bV*(Ym6GMYoH7DY{qmpy*N2lVVA+ zqByiTtT>{$V{t)o&*ImL`xciK_b;v}t}mWa{C4r;;+4gli+2>;_7@*5{;~L$nKlQQ zBh1m}ICH!?(X2Nc%%$f3<_7a{^CAcbfrHe}6DQzlUQM$TxUFn9>vlhytwWM0Q zSc)utEftnQmLZlp%P`AG%NWae3${$KOtZXcS!`KmX|}AiY_M#yY_V*&?6mB)9I%|V zT(;b>+_wB;xo3H7`NQ(OJL*n%_v|k29#p%gc3thx+Jm*9*V>NM95>!fh&LhHNMCg;u{A?K%{qw~}CzqRH60QxA|f&c&j diff --git a/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..e8a64bf --- /dev/null +++ b/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/Demo/ARSLineProgress/ViewController.swift b/Demo/ARSLineProgress/ViewController.swift index 20e7769..d2f7aaa 100644 --- a/Demo/ARSLineProgress/ViewController.swift +++ b/Demo/ARSLineProgress/ViewController.swift @@ -13,11 +13,12 @@ final class ViewController: UIViewController { @IBAction func showInfiniteLoader(_ sender: AnyObject) { if ARSLineProgress.shown { return } - - ARSLineProgress.showWithPresentCompetionBlock { () -> Void in + + ARSLineProgress.showWithPresentCompetionBlock("I am title") { print("Showed with completion block") } + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: { () -> Void in ARSLineProgress.hideWithCompletionBlock({ () -> Void in print("Hidden with completion block") diff --git a/Source/ARSInfiniteLoader.swift b/Source/ARSInfiniteLoader.swift index ebb465d..499b6f1 100644 --- a/Source/ARSInfiniteLoader.swift +++ b/Source/ARSInfiniteLoader.swift @@ -16,7 +16,8 @@ final class ARSInfiniteLoader: ARSLoader { @objc var backgroundBlurView: UIVisualEffectView @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView - @objc var title: NSString + @objc var lbTitle: UILabel = UILabel() + @objc var title: NSString? @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -37,6 +38,10 @@ final class ARSInfiniteLoader: ARSLoader { backgroundBlurView = ARSBlurredBackgroundRect().view backgroundSimpleView = ARSSimpleBackgroundRect().view backgroundFullView = ARSFullBackgroundRect().view + + lbTitle.textColor = ARS_TITLE_COLOR + lbTitle.font = UIFont.systemFont(ofSize: ARS_TITLE_SIZE) + NotificationCenter.default.addObserver(self, selector: #selector(ARSInfiniteLoader.orientationChanged(_:)), name: NSNotification.Name.UIDeviceOrientationDidChange, @@ -65,14 +70,28 @@ final class ARSInfiniteLoader: ARSLoader { extension ARSInfiniteLoader { - func ars_showOnView(_ view: UIView?, completionBlock: (() -> Void)?) { + func ars_showOnView(_ view: UIView?, title: NSString?, completionBlock: (() -> Void)?) { + self.title = title + if ars_createdFrameForBackgroundView(backgroundView, title:self.title, onView: view) == false { return } - + + if(title != nil && title!.length > 0){ + lbTitle.text = self.title! as String; + lbTitle.sizeToFit(); + let parentView = ((backgroundView as? UIVisualEffectView)?.contentView) ?? backgroundView; + parentView.addSubview(lbTitle); + + lbTitle.center = CGPoint(x:parentView.center.x, + y:parentView.frame.origin.y + backgroundView.frame.size.height - ARS_TITLE_MARGIN - lbTitle.frame.size.height); + } + + targetView = view ars_createCircles(outerCircle, middleCircle: middleCircle, innerCircle: innerCircle, + title: title, onView: ((backgroundView as? UIVisualEffectView)?.contentView) ?? backgroundView, loaderType: .infinite) ars_animateCircles(outerCircle, middleCircle: middleCircle, innerCircle: innerCircle) diff --git a/Source/ARSLineProgress.swift b/Source/ARSLineProgress.swift index 2986bd7..d0e83ec 100644 --- a/Source/ARSLineProgress.swift +++ b/Source/ARSLineProgress.swift @@ -26,7 +26,7 @@ public final class ARSLineProgress: NSObject { if !statusShown { ARSStatus.show(.success, title: "") } } - public static func showSuccess(title: NSString) { + public static func showSuccess(_ title: NSString?) { if !statusShown { ARSStatus.show(.success, title: title) } } @@ -37,7 +37,7 @@ public final class ARSLineProgress: NSObject { if !statusShown { ARSStatus.show(.success, title: "") } } - public static func showFail(title: NSString) { + public static func showFail(_ title: NSString?) { if !statusShown { ARSStatus.show(.success, title: title) } } @@ -45,19 +45,41 @@ public final class ARSLineProgress: NSObject { public static func show() { - if !shown { ARSInfiniteLoader().ars_showOnView(nil, completionBlock: nil) } + show(nil) } + public static func show(_ title: NSString?) { + if !shown { ARSInfiniteLoader().ars_showOnView(nil, title:title, completionBlock: nil) } + } + + + public static func showWithPresentCompetionBlock(_ block: @escaping () -> Void) { - if !shown { ARSInfiniteLoader().ars_showOnView(nil, completionBlock: block) } + showWithPresentCompetionBlock(nil, block: block) } + public static func showWithPresentCompetionBlock(_ title: NSString?, block: @escaping () -> Void) { + if !shown { ARSInfiniteLoader().ars_showOnView(nil, title:title, completionBlock: block) } + } + + + public static func ars_showOnView(_ view: UIView) { - if !shown { ARSInfiniteLoader().ars_showOnView(view, completionBlock: nil) } + ars_showOnView(view, title:nil) + } + + public static func ars_showOnView(_ view: UIView, title: NSString?) { + if !shown { ARSInfiniteLoader().ars_showOnView(view, title: title, completionBlock: nil) } } + + public static func ars_showOnView(_ view: UIView, completionBlock: @escaping () -> Void) { - if !shown { ARSInfiniteLoader().ars_showOnView(view, completionBlock: completionBlock) } + ars_showOnView(view, title:nil, completionBlock:completionBlock) + } + + public static func ars_showOnView(_ view: UIView, title: NSString?, completionBlock: @escaping () -> Void) { + if !shown { ARSInfiniteLoader().ars_showOnView(view, title: title, completionBlock: completionBlock) } } diff --git a/Source/ARSLineProgressConstants.swift b/Source/ARSLineProgressConstants.swift index 7a60bde..d1028cf 100644 --- a/Source/ARSLineProgressConstants.swift +++ b/Source/ARSLineProgressConstants.swift @@ -10,8 +10,8 @@ import UIKit -let ARS_BACKGROUND_VIEW_SIDE_LENGTH: CGFloat = 125.0 -let ARS_STATUS_PATH_SIDE_LENGTH: CGFloat = 125.0 +let ARS_BACKGROUND_VIEW_SIDE_LENGTH: CGFloat = 110.0 +let ARS_STATUS_PATH_SIDE_LENGTH: CGFloat = 110.0 let ARS_CIRCLE_ROTATION_TO_VALUE = 2 * CGFloat.pi let ARS_CIRCLE_ROTATION_REPEAT_COUNT = Float(UINT64_MAX) diff --git a/Source/ARSLineProgressHelpers.swift b/Source/ARSLineProgressHelpers.swift index 6e406b9..4d41725 100644 --- a/Source/ARSLineProgressHelpers.swift +++ b/Source/ARSLineProgressHelpers.swift @@ -38,7 +38,7 @@ func ars_window() -> UIWindow? { } func sizeForTitle(_ title : NSString?) -> CGSize{ - if title != nil{ + if (title != nil && title!.length > 0){ return title!.boundingRect(with:CGSize(width:0, height:0), options:NSStringDrawingOptions.usesLineFragmentOrigin, attributes:[NSFontAttributeName: UIFont.systemFont(ofSize: ARS_TITLE_SIZE)], @@ -64,10 +64,15 @@ func sizeForTitle(_ title : NSString?) -> CGSize{ center = CGPoint(x: bounds.midX, y: bounds.midY) let sideLengths = ARS_BACKGROUND_VIEW_SIDE_LENGTH - + let width = max(sideLengths, lbSize.width + 2 * ARS_TITLE_MARGIN) + let height = sideLengths + (lbSize.height > 0 ? lbSize.height + ARS_TITLE_MARGIN : 0) + switch ars_config.backgroundViewStyle { case .blur, .simple: - backgroundView.frame = CGRect(x: center.x - sideLengths / 2, y: center.y - sideLengths / 2, width: sideLengths, height: sideLengths) + backgroundView.frame = CGRect(x: center.x - width / 2, + y: center.y - height / 2, + width: width, + height: height) backgroundView.layer.cornerRadius = ars_config.backgroundViewCornerRadius case .full: backgroundView.frame = CGRect(x: bounds.minX, y: bounds.minY, width: bounds.width, height: bounds.height) @@ -117,11 +122,13 @@ class ARSFullBackgroundRect { } } -func ars_createCircles(_ outerCircle: CAShapeLayer, middleCircle: CAShapeLayer, innerCircle: CAShapeLayer, onView view: UIView, loaderType: ARSLoaderType) { +func ars_createCircles(_ outerCircle: CAShapeLayer, middleCircle: CAShapeLayer, innerCircle: CAShapeLayer, title: NSString?, onView view: UIView, loaderType: ARSLoaderType) { let circleRadiusOuter = ARS_CIRCLE_RADIUS_OUTER let circleRadiusMiddle = ARS_CIRCLE_RADIUS_MIDDLE let circleRadiusInner = ARS_CIRCLE_RADIUS_INNER - let viewBounds = view.bounds + let lbSize = sizeForTitle(title) + let heightDiff = lbSize.height > 0 ? lbSize.height + ARS_TITLE_MARGIN : 0; + let viewBounds = CGRect(x:0, y:0, width:view.bounds.size.width, height:view.bounds.size.height - heightDiff); let arcCenter = CGPoint(x: viewBounds.midX, y: viewBounds.midY) var path: UIBezierPath diff --git a/Source/ARSLineProgressProtocols.swift b/Source/ARSLineProgressProtocols.swift index 63f5f4a..bcd425e 100644 --- a/Source/ARSLineProgressProtocols.swift +++ b/Source/ARSLineProgressProtocols.swift @@ -13,7 +13,8 @@ import UIKit @objc protocol ARSLoader { var emptyView: UIView { get } var backgroundView: UIView { get } - @objc var title: NSString { get set } + @objc var title: NSString? { get set } + @objc var lbTitle: UILabel { get set } @objc optional var outerCircle: CAShapeLayer { get set } @objc optional var middleCircle: CAShapeLayer { get set } @objc optional var innerCircle: CAShapeLayer { get set } diff --git a/Source/ARSProgressLoader.swift b/Source/ARSProgressLoader.swift index cd14a13..397df05 100644 --- a/Source/ARSProgressLoader.swift +++ b/Source/ARSProgressLoader.swift @@ -16,7 +16,8 @@ final class ARSProgressLoader: ARSLoader { @objc var backgroundBlurView: UIView @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView - @objc var title: NSString + @objc var lbTitle: UILabel = UILabel() + @objc var title: NSString? @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -84,6 +85,7 @@ extension ARSProgressLoader { ars_createCircles(outerCircle, middleCircle: middleCircle, innerCircle: innerCircle, + title: title, onView: ((backgroundView as? UIVisualEffectView)?.contentView) ?? backgroundView, loaderType: .progress) ars_animateCircles(outerCircle, middleCircle: middleCircle, innerCircle: innerCircle) diff --git a/Source/ARSStatus.swift b/Source/ARSStatus.swift index a2dbc4f..6e9af27 100644 --- a/Source/ARSStatus.swift +++ b/Source/ARSStatus.swift @@ -21,7 +21,8 @@ final class ARSStatus: ARSLoader { @objc var backgroundBlurView: UIVisualEffectView @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView - @objc var title: NSString + @objc var lbTitle: UILabel = UILabel() + @objc var title: NSString? @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -63,7 +64,7 @@ final class ARSStatus: ARSLoader { } } - static func show(_ type: ARSStatusType, title: NSString) { + static func show(_ type: ARSStatusType, title: NSString?) { if let loader = ars_currentLoader { ars_stopCircleAnimations(loader, completionBlock: { drawStatus(type, loader: loader) From 404638e0a254ebe4a42780ebedb8c7d7650b4750 Mon Sep 17 00:00:00 2001 From: Johnnie Cheng Date: Thu, 1 Mar 2018 23:49:30 +1300 Subject: [PATCH 4/4] Fix bug and improve status loader --- .../UserInterfaceState.xcuserstate | Bin 31949 -> 38782 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 50 +++++++++++++++++- Demo/ARSLineProgress/ViewController.swift | 12 +++-- Source/ARSInfiniteLoader.swift | 8 +-- Source/ARSLineProgress.swift | 26 ++++----- Source/ARSLineProgressHelpers.swift | 12 ++--- Source/ARSLineProgressProtocols.swift | 2 +- Source/ARSProgressLoader.swift | 2 +- Source/ARSStatus.swift | 16 +++--- 9 files changed, 90 insertions(+), 38 deletions(-) diff --git a/Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate b/Demo/ARSLineProgress.xcodeproj/project.xcworkspace/xcuserdata/Johnnie.xcuserdatad/UserInterfaceState.xcuserstate index 32ee68230be7182f6e61add1b61439c14335db51..eea8accba273c33331dd996956a967d93734a3fa 100644 GIT binary patch delta 14838 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%0A|CA}p29+7g=9KL$yQru1Q17Dm(0l2{ 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 SAmse!AHBMMc=c6v@c#g96FDCM diff --git a/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e8a64bf..5663282 100644 --- a/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Demo/ARSLineProgress.xcodeproj/xcuserdata/Johnnie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -10,7 +10,7 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "../Source/ARSInfiniteLoader.swift" - timestampString = "541589511.849974" + timestampString = "541594035.350356" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "89" @@ -19,5 +19,53 @@ landmarkType = "7"> + + + + + + + + + + + + diff --git a/Demo/ARSLineProgress/ViewController.swift b/Demo/ARSLineProgress/ViewController.swift index d2f7aaa..6913aa4 100644 --- a/Demo/ARSLineProgress/ViewController.swift +++ b/Demo/ARSLineProgress/ViewController.swift @@ -20,9 +20,11 @@ final class ViewController: UIViewController { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: { () -> Void in - ARSLineProgress.hideWithCompletionBlock({ () -> Void in - print("Hidden with completion block") - }) + + ARSLineProgress.showSuccess() +// ARSLineProgress.hideWithCompletionBlock({ () -> Void in +// print("Hidden with completion block") +// }) }) } @@ -66,11 +68,11 @@ final class ViewController: UIViewController { } @IBAction func didTapShowSuccessButton(_ sender: AnyObject) { - ARSLineProgress.showSuccess() + ARSLineProgress.showSuccess("Success") } @IBAction func didTapShowFailButton(_ sender: AnyObject) { - ARSLineProgress.showFail() + ARSLineProgress.showFail("Fail") } @IBAction func showFullBackgroundLoader(_ sender: AnyObject) { diff --git a/Source/ARSInfiniteLoader.swift b/Source/ARSInfiniteLoader.swift index 499b6f1..f787ead 100644 --- a/Source/ARSInfiniteLoader.swift +++ b/Source/ARSInfiniteLoader.swift @@ -17,7 +17,7 @@ final class ARSInfiniteLoader: ARSLoader { @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView @objc var lbTitle: UILabel = UILabel() - @objc var title: NSString? + @objc var title: String @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -70,13 +70,13 @@ final class ARSInfiniteLoader: ARSLoader { extension ARSInfiniteLoader { - func ars_showOnView(_ view: UIView?, title: NSString?, completionBlock: (() -> Void)?) { + func ars_showOnView(_ view: UIView?, title: String, completionBlock: (() -> Void)?) { self.title = title if ars_createdFrameForBackgroundView(backgroundView, title:self.title, onView: view) == false { return } - if(title != nil && title!.length > 0){ - lbTitle.text = self.title! as String; + if(title.count > 0){ + lbTitle.text = self.title; lbTitle.sizeToFit(); let parentView = ((backgroundView as? UIVisualEffectView)?.contentView) ?? backgroundView; parentView.addSubview(lbTitle); diff --git a/Source/ARSLineProgress.swift b/Source/ARSLineProgress.swift index d0e83ec..11e3cd0 100644 --- a/Source/ARSLineProgress.swift +++ b/Source/ARSLineProgress.swift @@ -23,10 +23,10 @@ public final class ARSLineProgress: NSObject { Will interrupt the current .Infinite loader progress and show success animation instead. */ public static func showSuccess() { - if !statusShown { ARSStatus.show(.success, title: "") } + showSuccess("") } - public static func showSuccess(_ title: NSString?) { + public static func showSuccess(_ title: String) { if !statusShown { ARSStatus.show(.success, title: title) } } @@ -34,51 +34,51 @@ public final class ARSLineProgress: NSObject { Will interrupt the current .Infinite loader progress and show fail animation instead. */ public static func showFail() { - if !statusShown { ARSStatus.show(.success, title: "") } + showFail("") } - public static func showFail(_ title: NSString?) { - if !statusShown { ARSStatus.show(.success, title: title) } + public static func showFail(_ title: String) { + if !statusShown { ARSStatus.show(.fail, title: title) } } // MARK: Show Infinite Loader public static func show() { - show(nil) + show("") } - public static func show(_ title: NSString?) { + public static func show(_ title: String) { if !shown { ARSInfiniteLoader().ars_showOnView(nil, title:title, completionBlock: nil) } } public static func showWithPresentCompetionBlock(_ block: @escaping () -> Void) { - showWithPresentCompetionBlock(nil, block: block) + showWithPresentCompetionBlock("", block: block) } - public static func showWithPresentCompetionBlock(_ title: NSString?, block: @escaping () -> Void) { + public static func showWithPresentCompetionBlock(_ title: String, block: @escaping () -> Void) { if !shown { ARSInfiniteLoader().ars_showOnView(nil, title:title, completionBlock: block) } } public static func ars_showOnView(_ view: UIView) { - ars_showOnView(view, title:nil) + ars_showOnView(view, title:"") } - public static func ars_showOnView(_ view: UIView, title: NSString?) { + public static func ars_showOnView(_ view: UIView, title: String) { if !shown { ARSInfiniteLoader().ars_showOnView(view, title: title, completionBlock: nil) } } public static func ars_showOnView(_ view: UIView, completionBlock: @escaping () -> Void) { - ars_showOnView(view, title:nil, completionBlock:completionBlock) + ars_showOnView(view, title:"", completionBlock:completionBlock) } - public static func ars_showOnView(_ view: UIView, title: NSString?, completionBlock: @escaping () -> Void) { + public static func ars_showOnView(_ view: UIView, title: String, completionBlock: @escaping () -> Void) { if !shown { ARSInfiniteLoader().ars_showOnView(view, title: title, completionBlock: completionBlock) } } diff --git a/Source/ARSLineProgressHelpers.swift b/Source/ARSLineProgressHelpers.swift index 4d41725..9092708 100644 --- a/Source/ARSLineProgressHelpers.swift +++ b/Source/ARSLineProgressHelpers.swift @@ -37,9 +37,9 @@ func ars_window() -> UIWindow? { return targetWindow } -func sizeForTitle(_ title : NSString?) -> CGSize{ - if (title != nil && title!.length > 0){ - return title!.boundingRect(with:CGSize(width:0, height:0), +func sizeForTitle(_ title : String) -> CGSize{ + if (title.count > 0){ + return title.boundingRect(with:CGSize(width:0, height:0), options:NSStringDrawingOptions.usesLineFragmentOrigin, attributes:[NSFontAttributeName: UIFont.systemFont(ofSize: ARS_TITLE_SIZE)], context:nil) @@ -49,7 +49,7 @@ func sizeForTitle(_ title : NSString?) -> CGSize{ return CGSize(width:0, height:0) } -@discardableResult func ars_createdFrameForBackgroundView(_ backgroundView: UIView, title: NSString?, onView view: UIView?) -> Bool { +@discardableResult func ars_createdFrameForBackgroundView(_ backgroundView: UIView, title: String, onView view: UIView?) -> Bool { let center: CGPoint let bounds: CGRect let lbSize = sizeForTitle(title) @@ -64,8 +64,8 @@ func sizeForTitle(_ title : NSString?) -> CGSize{ center = CGPoint(x: bounds.midX, y: bounds.midY) let sideLengths = ARS_BACKGROUND_VIEW_SIDE_LENGTH - let width = max(sideLengths, lbSize.width + 2 * ARS_TITLE_MARGIN) let height = sideLengths + (lbSize.height > 0 ? lbSize.height + ARS_TITLE_MARGIN : 0) + let width = max(sideLengths, height) switch ars_config.backgroundViewStyle { case .blur, .simple: @@ -122,7 +122,7 @@ class ARSFullBackgroundRect { } } -func ars_createCircles(_ outerCircle: CAShapeLayer, middleCircle: CAShapeLayer, innerCircle: CAShapeLayer, title: NSString?, onView view: UIView, loaderType: ARSLoaderType) { +func ars_createCircles(_ outerCircle: CAShapeLayer, middleCircle: CAShapeLayer, innerCircle: CAShapeLayer, title: String, onView view: UIView, loaderType: ARSLoaderType) { let circleRadiusOuter = ARS_CIRCLE_RADIUS_OUTER let circleRadiusMiddle = ARS_CIRCLE_RADIUS_MIDDLE let circleRadiusInner = ARS_CIRCLE_RADIUS_INNER diff --git a/Source/ARSLineProgressProtocols.swift b/Source/ARSLineProgressProtocols.swift index bcd425e..44c118e 100644 --- a/Source/ARSLineProgressProtocols.swift +++ b/Source/ARSLineProgressProtocols.swift @@ -13,7 +13,7 @@ import UIKit @objc protocol ARSLoader { var emptyView: UIView { get } var backgroundView: UIView { get } - @objc var title: NSString? { get set } + @objc var title: String { get set } @objc var lbTitle: UILabel { get set } @objc optional var outerCircle: CAShapeLayer { get set } @objc optional var middleCircle: CAShapeLayer { get set } diff --git a/Source/ARSProgressLoader.swift b/Source/ARSProgressLoader.swift index 397df05..e706615 100644 --- a/Source/ARSProgressLoader.swift +++ b/Source/ARSProgressLoader.swift @@ -17,7 +17,7 @@ final class ARSProgressLoader: ARSLoader { @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView @objc var lbTitle: UILabel = UILabel() - @objc var title: NSString? + @objc var title: String @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: diff --git a/Source/ARSStatus.swift b/Source/ARSStatus.swift index 6e9af27..fb08599 100644 --- a/Source/ARSStatus.swift +++ b/Source/ARSStatus.swift @@ -22,7 +22,7 @@ final class ARSStatus: ARSLoader { @objc var backgroundSimpleView: UIView @objc var backgroundFullView: UIView @objc var lbTitle: UILabel = UILabel() - @objc var title: NSString? + @objc var title: String @objc var backgroundView: UIView { switch ars_config.backgroundViewStyle { case .blur: @@ -64,22 +64,24 @@ final class ARSStatus: ARSLoader { } } - static func show(_ type: ARSStatusType, title: NSString?) { + static func show(_ type: ARSStatusType, title: String) { if let loader = ars_currentLoader { - ars_stopCircleAnimations(loader, completionBlock: { - drawStatus(type, loader: loader) + ars_stopCircleAnimations(loader, completionBlock: { + drawStatus(type, title:title, loader: loader) }) } else { let loader = ARSStatus() ars_presentLoader(loader, onView: nil, completionBlock: { - drawStatus(type, loader: loader) + drawStatus(type, title:title, loader: loader) }) } } - static func drawStatus(_ type: ARSStatusType, loader: ARSLoader) { + static func drawStatus(_ type: ARSStatusType, title: String, loader: ARSLoader) { ars_currentStatus = loader - + loader.title = title; + loader.lbTitle.text = title + switch type { case .success: ARSStatus.drawSuccess(loader.backgroundView)