From 596cce502a603e4c948ec0c58540eabe820a8ea8 Mon Sep 17 00:00:00 2001 From: Dominic Go <18517029+dominicstop@users.noreply.github.com> Date: Mon, 1 May 2023 14:21:15 +0800 Subject: [PATCH] =?UTF-8?q?=E2=AD=90=EF=B8=8F=20Impl:=20Add=20`CAAnimation?= =?UTF-8?q?+Block`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/CAAnimation+Block.swift | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 ios/src_library/Extensions/CAAnimation+Block.swift diff --git a/ios/src_library/Extensions/CAAnimation+Block.swift b/ios/src_library/Extensions/CAAnimation+Block.swift new file mode 100644 index 00000000..2daf366d --- /dev/null +++ b/ios/src_library/Extensions/CAAnimation+Block.swift @@ -0,0 +1,61 @@ +// +// CAAnimation+Block.swift +// react-native-ios-modal +// +// Created by Dominic Go on 5/1/23. +// + +import Foundation + + +public class CAAnimationBlockDelegate: NSObject, CAAnimationDelegate { + + public typealias StartBlock = (CAAnimation) -> (); + public typealias EndBlock = (CAAnimation, Bool) -> (); + + var onStartBlock: StartBlock? + var onEndBlock: EndBlock? + + public func animationDidStart(_ anim: CAAnimation) { + self.onStartBlock?(anim); + }; + + public func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { + self.onEndBlock?(anim, flag); + }; +}; + +public extension CAAnimation { + + private var multicastDelegate: CAAnimationMulticastDelegate { + guard let delegate = self.delegate else { + return CAAnimationMulticastDelegate(); + }; + + guard let multicastDelegate = delegate as? CAAnimationMulticastDelegate else { + let multicastDelegate = CAAnimationMulticastDelegate(); + multicastDelegate.emitter.add(delegate); + + self.speed = 0; + + self.delegate = multicastDelegate; + return multicastDelegate; + }; + + return multicastDelegate; + }; + + func startBlock(_ callback: @escaping CAAnimationBlockDelegate.StartBlock) { + let blockDelegate = CAAnimationBlockDelegate(); + self.multicastDelegate.emitter.add(blockDelegate); + + blockDelegate.onStartBlock = callback; + }; + + func endBlock(_ callback: @escaping CAAnimationBlockDelegate.EndBlock) { + let blockDelegate = CAAnimationBlockDelegate(); + self.multicastDelegate.emitter.add(blockDelegate); + + blockDelegate.onEndBlock = callback; + }; +};