@@ -40,9 +40,16 @@ public final class FloatingDisplayTarget {
4040 left: . activeWindow
4141 )
4242 }
43+
44+ fileprivate var containsActiveWindowEdge : Bool {
45+ top == . activeWindow
46+ || right == . activeWindow
47+ || bottom == . activeWindow
48+ || left == . activeWindow
49+ }
4350 }
4451
45- public enum TargetSafeArea {
52+ public enum TargetSafeArea : Equatable {
4653 case notificationWindow
4754 case activeWindow
4855 }
@@ -70,54 +77,17 @@ public final class FloatingDisplayTarget {
7077 }
7178
7279 public func makeWindowVisible( ) {
80+ _ = notificationViewController. view
7381 notificationWindow. isHidden = false
74- }
7582
76- public func hideWindow( ) {
77- notificationWindow. isHidden = true
78- }
79-
80- public init ( edgeTargetSafeArea: EdgeTargetSafeArea ) {
81-
82- if #available( iOS 13 , * ) {
83- let windowScene = UIApplication . shared
84- . connectedScenes
85- . lazy
86- . filter ( { $0. activationState == . foregroundActive } )
87- . compactMap ( { $0 as? UIWindowScene } )
88- . first
89- if let windowScene {
90- self . safeAreaFinder = . init( windowScene: windowScene)
91- self . notificationViewController = . init(
92- edgeTargetSafeArea: edgeTargetSafeArea,
93- safeAreaFinder: safeAreaFinder
94- )
95- notificationWindow = . init( windowScene: windowScene)
96- } else {
97- self . safeAreaFinder = . init( )
98- self . notificationViewController = . init(
99- edgeTargetSafeArea: edgeTargetSafeArea,
100- safeAreaFinder: safeAreaFinder
101- )
102- notificationWindow = . init( frame: . zero)
103- }
104-
105- } else {
106- self . safeAreaFinder = . init( )
107- self . notificationViewController = . init(
108- edgeTargetSafeArea: edgeTargetSafeArea,
109- safeAreaFinder: safeAreaFinder
110- )
111- notificationWindow = . init( frame: . zero)
83+ if notificationViewController. needsActiveWindowSafeArea {
84+ safeAreaFinder. start ( )
11285 }
86+ }
11387
114- notificationWindow . windowLevel = UIWindow . Level ( rawValue : 5 )
88+ public func hideWindow ( ) {
11589 notificationWindow. isHidden = true
116- notificationWindow. backgroundColor = UIColor . clear
117- notificationWindow. frame = UIScreen . main. bounds
118- notificationViewController. beginAppearanceTransition ( true , animated: false )
119- notificationWindow. rootViewController = notificationViewController
120- notificationViewController. endAppearanceTransition ( )
90+ safeAreaFinder. stop ( )
12191 }
12292
12393 @available ( iOS 13 . 0 , * )
@@ -142,11 +112,11 @@ public final class FloatingDisplayTarget {
142112 notificationViewController. endAppearanceTransition ( )
143113 }
144114
145- deinit {
146- Task { @MainActor [ notificationWindow] in
115+ deinit {
116+ Task { @MainActor [ safeAreaFinder, notificationWindow] in
117+ safeAreaFinder. stop ( )
147118 notificationWindow. isHidden = false
148119 }
149-
150120 }
151121
152122}
@@ -185,6 +155,10 @@ extension FloatingDisplayTarget {
185155 private let edgeTargetSafeArea : EdgeTargetSafeArea
186156 private let safeAreaFinder : SafeAreaFinder
187157
158+ fileprivate var needsActiveWindowSafeArea : Bool {
159+ edgeTargetSafeArea. containsActiveWindowEdge
160+ }
161+
188162 init (
189163 edgeTargetSafeArea: EdgeTargetSafeArea ,
190164 safeAreaFinder: SafeAreaFinder
@@ -236,7 +210,7 @@ extension FloatingDisplayTarget {
236210
237211 addLayoutGuide ( _safeAreaLayoutGuide)
238212
239- var containsActievWindowSafeAreaEdge : Bool = false
213+ var containsActiveWindowSafeAreaEdge : Bool = false
240214
241215 switch edgeTargetSafeArea. top {
242216 case . notificationWindow:
@@ -245,7 +219,7 @@ extension FloatingDisplayTarget {
245219 case . activeWindow:
246220 activeWindowSafeAreaLayoutGuideConstraintTop = topAnchor. constraint (
247221 equalTo: _safeAreaLayoutGuide. topAnchor)
248- containsActievWindowSafeAreaEdge = true
222+ containsActiveWindowSafeAreaEdge = true
249223 }
250224
251225 switch edgeTargetSafeArea. right {
@@ -256,7 +230,7 @@ extension FloatingDisplayTarget {
256230 case . activeWindow:
257231 activeWindowSafeAreaLayoutGuideConstraintRight = rightAnchor. constraint (
258232 equalTo: _safeAreaLayoutGuide. rightAnchor)
259- containsActievWindowSafeAreaEdge = true
233+ containsActiveWindowSafeAreaEdge = true
260234 }
261235
262236 switch edgeTargetSafeArea. bottom {
@@ -267,7 +241,7 @@ extension FloatingDisplayTarget {
267241 case . activeWindow:
268242 activeWindowSafeAreaLayoutGuideConstraintBottom = bottomAnchor. constraint (
269243 equalTo: _safeAreaLayoutGuide. bottomAnchor)
270- containsActievWindowSafeAreaEdge = true
244+ containsActiveWindowSafeAreaEdge = true
271245 }
272246
273247 switch edgeTargetSafeArea. left {
@@ -277,10 +251,10 @@ extension FloatingDisplayTarget {
277251 case . activeWindow:
278252 activeWindowSafeAreaLayoutGuideConstraintLeft = leftAnchor. constraint (
279253 equalTo: _safeAreaLayoutGuide. leftAnchor)
280- containsActievWindowSafeAreaEdge = true
254+ containsActiveWindowSafeAreaEdge = true
281255 }
282256
283- if containsActievWindowSafeAreaEdge {
257+ if containsActiveWindowSafeAreaEdge {
284258
285259 NSLayoutConstraint . activate (
286260 [
@@ -295,7 +269,6 @@ extension FloatingDisplayTarget {
295269 NotificationCenter . default. addObserver (
296270 self , selector: #selector( handleInsetsUpdate) , name: SafeAreaFinder . notificationName,
297271 object: nil )
298- safeAreaFinder. start ( )
299272 }
300273 }
301274
@@ -335,10 +308,9 @@ extension FloatingDisplayTarget {
335308 }
336309
337310 deinit {
338- Task { @MainActor [ hasSafeAreaFinderActivated, safeAreaFinder] in
339- if hasSafeAreaFinderActivated {
340- safeAreaFinder. pause ( )
341- }
311+ NotificationCenter . default. removeObserver ( self )
312+ Task { @MainActor [ safeAreaFinder] in
313+ safeAreaFinder. stop ( )
342314 }
343315 }
344316 }
0 commit comments