@@ -5,48 +5,77 @@ class ScaleAnimation: BaseWindowAnimation, WindowAnimation {
55
66 // MARK: - WindowAnimation
77 func animateIn( window: NSWindow , duration: TimeInterval , completion: ( ( ) -> Void ) ? ) {
8+ guard let layer = prepareLayer ( from: window) else {
9+ completion ? ( )
10+ return
11+ }
812 setupWindow ( window)
9-
10- let originalFrame = window. frame
11- let centerX = originalFrame. midX
12- let centerY = originalFrame. midY
13-
14- // Start with small scale
15- let startScale : CGFloat = 0.3
16- var startFrame = originalFrame
17- startFrame. size. width *= startScale
18- startFrame. size. height *= startScale
19- startFrame. origin. x = centerX - startFrame. width / 2
20- startFrame. origin. y = centerY - startFrame. height / 2
21-
22- window. setFrame ( startFrame, display: false , animate: false )
23-
24- NSAnimationContext . runAnimationGroup ( { context in
13+
14+ // Hide window initially so we can fade it in
15+ window. alphaValue = 0
16+
17+ let oldAnchor = layer. anchorPoint
18+ let oldPosition = layer. position
19+
20+ layer. anchorPoint = CGPoint ( x: 0.5 , y: 0.5 )
21+ layer. position = CGPoint ( x: layer. bounds. midX, y: layer. bounds. midY)
22+
23+ let scaleAnim = createAnimation ( keyPath: " transform.scale " ,
24+ from: 0.3 ,
25+ to: 1.0 ,
26+ duration: duration)
27+ scaleAnim. fillMode = . forwards
28+ scaleAnim. isRemovedOnCompletion = false
29+
30+ scaleAnim. delegate = AnimationCompletionDelegate { [ weak layer] finished in
31+ layer? . transform = CATransform3DIdentity
32+ layer? . anchorPoint = oldAnchor
33+ layer? . position = oldPosition
34+ completion ? ( )
35+ }
36+
37+ layer. add ( scaleAnim, forKey: " scaleIn " )
38+
39+ NSAnimationContext . runAnimationGroup { context in
2540 context. duration = duration
2641 context. timingFunction = AnimationTiming . easeOut
27- window. animator ( ) . setFrame ( originalFrame, display: true )
2842 window. animator ( ) . alphaValue = CGFloat ( UserPreferences . shared. opacity)
29- } , completionHandler : completion )
43+ }
3044 }
31-
45+
3246 func animateOut( window: NSWindow , duration: TimeInterval , completion: ( ( ) -> Void ) ? ) {
33- let currentFrame = window. frame
34- let centerX = currentFrame. midX
35- let centerY = currentFrame. midY
36-
37- // End with small scale
38- let endScale : CGFloat = 0.3
39- var endFrame = currentFrame
40- endFrame. size. width *= endScale
41- endFrame. size. height *= endScale
42- endFrame. origin. x = centerX - endFrame. width / 2
43- endFrame. origin. y = centerY - endFrame. height / 2
44-
45- NSAnimationContext . runAnimationGroup ( { context in
47+ guard let layer = window. contentView? . layer else {
48+ completion ? ( )
49+ return
50+ }
51+
52+ let oldAnchor = layer. anchorPoint
53+ let oldPosition = layer. position
54+
55+ layer. anchorPoint = CGPoint ( x: 0.5 , y: 0.5 )
56+ layer. position = CGPoint ( x: layer. bounds. midX, y: layer. bounds. midY)
57+
58+ let scaleAnim = createAnimation ( keyPath: " transform.scale " ,
59+ from: 1.0 ,
60+ to: 0.3 ,
61+ duration: duration,
62+ timing: CAMediaTimingFunction ( name: . easeIn) )
63+ scaleAnim. fillMode = . forwards
64+ scaleAnim. isRemovedOnCompletion = false
65+
66+ scaleAnim. delegate = AnimationCompletionDelegate { [ weak layer] finished in
67+ layer? . transform = CATransform3DIdentity
68+ layer? . anchorPoint = oldAnchor
69+ layer? . position = oldPosition
70+ completion ? ( )
71+ }
72+
73+ layer. add ( scaleAnim, forKey: " scaleOut " )
74+
75+ NSAnimationContext . runAnimationGroup { context in
4676 context. duration = duration
4777 context. timingFunction = AnimationTiming . easeIn
48- window. animator ( ) . setFrame ( endFrame, display: true )
4978 window. animator ( ) . alphaValue = 0
50- } , completionHandler : completion )
79+ }
5180 }
5281}
0 commit comments