import UIKit private final class NullActionClass: NSObject, CAAction { @objc public func run(forKey event: String, object anObject: Any, arguments dict: [AnyHashable : Any]?) { } } private let nullAction = NullActionClass() open class HierarchyTrackingLayer: CALayer { public var didEnterHierarchy: (() -> Void)? public var didExitHierarchy: (() -> Void)? override open func action(forKey event: String) -> CAAction? { if event == kCAOnOrderIn { self.didEnterHierarchy?() } else if event == kCAOnOrderOut { self.didExitHierarchy?() } return nullAction } }