@@ -14,6 +14,62 @@ protocol PresenterDelegate: AnimationDelegate {
14
14
15
15
class Presenter : NSObject {
16
16
17
+ // MARK: - API
18
+
19
+ init ( config: SwiftMessages . Config , view: UIView , delegate: PresenterDelegate ) {
20
+ self . config = config
21
+ self . view = view
22
+ self . delegate = delegate
23
+ self . animator = Presenter . animator ( forPresentationStyle: config. presentationStyle, delegate: delegate)
24
+ if let identifiable = view as? Identifiable {
25
+ id = identifiable. id
26
+ } else {
27
+ var mutableView = view
28
+ id = withUnsafePointer ( to: & mutableView) { " \( $0) " }
29
+ }
30
+
31
+ super. init ( )
32
+ }
33
+
34
+ var id : String
35
+ var config : SwiftMessages . Config
36
+ let maskingView = MaskingView ( )
37
+ let animator : Animator
38
+ var isHiding = false
39
+ let view : UIView
40
+
41
+ var delayShow : TimeInterval ? {
42
+ if case . indefinite( let opts) = config. duration { return opts. delay }
43
+ return nil
44
+ }
45
+
46
+ var showDate : CFTimeInterval ?
47
+
48
+ /// Returns the required delay for hiding based on time shown
49
+ var delayHide : TimeInterval ? {
50
+ if interactivelyHidden { return 0 }
51
+ if case . indefinite( let opts) = config. duration, let showDate = showDate {
52
+ let timeIntervalShown = CACurrentMediaTime ( ) - showDate
53
+ return max ( 0 , opts. minimum - timeIntervalShown)
54
+ }
55
+ return nil
56
+ }
57
+
58
+ var pauseDuration : TimeInterval ? {
59
+ let duration : TimeInterval ?
60
+ switch self . config. duration {
61
+ case . automatic:
62
+ duration = 2
63
+ case . seconds( let seconds) :
64
+ duration = seconds
65
+ case . forever, . indefinite:
66
+ duration = nil
67
+ }
68
+ return duration
69
+ }
70
+
71
+ // MARK: - Constants
72
+
17
73
enum PresentationContext {
18
74
case viewController( _: Weak < UIViewController > )
19
75
case view( _: Weak < UIView > )
@@ -36,29 +92,24 @@ class Presenter: NSObject {
36
92
}
37
93
}
38
94
}
39
-
40
- var config : SwiftMessages . Config
41
- let view : UIView
42
- weak var delegate : PresenterDelegate ?
43
- let maskingView = MaskingView ( )
44
- var presentationContext = PresentationContext . viewController ( Weak < UIViewController > ( value: nil ) )
45
- let animator : Animator
46
95
47
- init ( config: SwiftMessages . Config , view: UIView , delegate: PresenterDelegate ) {
48
- self . config = config
49
- self . view = view
50
- self . delegate = delegate
51
- self . animator = Presenter . animator ( forPresentationStyle: config. presentationStyle, delegate: delegate)
52
- if let identifiable = view as? Identifiable {
53
- id = identifiable. id
54
- } else {
55
- var mutableView = view
56
- id = withUnsafePointer ( to: & mutableView) { " \( $0) " }
57
- }
96
+ // MARK: - Variables
58
97
59
- super. init ( )
98
+ private weak var delegate : PresenterDelegate ?
99
+ private var presentationContext = PresentationContext . viewController ( Weak < UIViewController > ( value: nil ) )
100
+
101
+ @available ( iOS 13 . 0 , * )
102
+ private var windowScene : UIWindowScene ? {
103
+ switch config. presentationContext {
104
+ case . windowScene( let scene, _) : return scene
105
+ default : return UIApplication . shared. keyWindow? . windowScene
106
+ }
60
107
}
61
108
109
+ private var interactivelyHidden = false ;
110
+
111
+ // MARK: - Showing and hiding
112
+
62
113
private static func animator( forPresentationStyle style: SwiftMessages . PresentationStyle , delegate: AnimationDelegate ) -> Animator {
63
114
switch style {
64
115
case . top:
@@ -73,44 +124,6 @@ class Presenter: NSObject {
73
124
}
74
125
}
75
126
76
- var id : String
77
-
78
- var pauseDuration : TimeInterval ? {
79
- let duration : TimeInterval ?
80
- switch self . config. duration {
81
- case . automatic:
82
- duration = 2
83
- case . seconds( let seconds) :
84
- duration = seconds
85
- case . forever, . indefinite:
86
- duration = nil
87
- }
88
- return duration
89
- }
90
-
91
- var showDate : CFTimeInterval ?
92
-
93
- private var interactivelyHidden = false ;
94
-
95
- var delayShow : TimeInterval ? {
96
- if case . indefinite( let opts) = config. duration { return opts. delay }
97
- return nil
98
- }
99
-
100
- /// Returns the required delay for hiding based on time shown
101
- var delayHide : TimeInterval ? {
102
- if interactivelyHidden { return 0 }
103
- if case . indefinite( let opts) = config. duration, let showDate = showDate {
104
- let timeIntervalShown = CACurrentMediaTime ( ) - showDate
105
- return max ( 0 , opts. minimum - timeIntervalShown)
106
- }
107
- return nil
108
- }
109
-
110
- /*
111
- MARK: - Showing and hiding
112
- */
113
-
114
127
func show( completion: @escaping AnimationCompletion ) throws {
115
128
try presentationContext = getPresentationContext ( )
116
129
install ( )
@@ -174,8 +187,6 @@ class Presenter: NSObject {
174
187
UIAccessibility . post ( notification: UIAccessibility . Notification. layoutChanged, argument: focus)
175
188
}
176
189
177
- var isHiding = false
178
-
179
190
func hide( animated: Bool , completion: @escaping AnimationCompletion ) {
180
191
isHiding = true
181
192
self . config. eventListeners. forEach { $0 ( . willHide) }
@@ -308,6 +319,9 @@ class Presenter: NSObject {
308
319
case . window( let level) :
309
320
let viewController = newWindowViewController ( level)
310
321
return . viewController( Weak ( value: viewController) )
322
+ case . windowScene( _, let level) :
323
+ let viewController = newWindowViewController ( level)
324
+ return . viewController( Weak ( value: viewController) )
311
325
case . viewController( let viewController) :
312
326
let viewController = viewController. sm_selectPresentationContextBottomUp ( config)
313
327
return . viewController( Weak ( value: viewController) )
@@ -409,8 +423,7 @@ class Presenter: NSObject {
409
423
guard let containerView = presentationContext. viewValue ( ) else { return }
410
424
if let windowViewController = presentationContext. viewControllerValue ( ) as? WindowViewController {
411
425
if #available( iOS 13 , * ) {
412
- let scene = UIApplication . shared. keyWindow? . windowScene
413
- windowViewController. install ( becomeKey: becomeKeyWindow, scene: scene)
426
+ windowViewController. install ( becomeKey: becomeKeyWindow, scene: windowScene)
414
427
} else {
415
428
windowViewController. install ( becomeKey: becomeKeyWindow)
416
429
}
0 commit comments