import Foundation import UIKit import Display final class ContentOverlayLayer: SimpleLayer { private struct Params: Equatable { var size: CGSize var contentInsets: UIEdgeInsets init(size: CGSize, contentInsets: UIEdgeInsets) { self.size = size self.contentInsets = contentInsets } } var contentsLayer: CALayer? { didSet { if self.contentsLayer !== oldValue { oldValue?.mask = nil oldValue?.removeFromSuperlayer() if let contentsLayer = self.contentsLayer { contentsLayer.mask = self.maskContentLayer self.addSublayer(contentsLayer) if let params = self.params { let size = params.size let contentInsets = params.contentInsets self.params = nil self.update(size: size, contentInsets: contentInsets) } } } } } let maskContentLayer: SimpleLayer private var params: Params? override init() { self.maskContentLayer = SimpleLayer() super.init() } override init(layer: Any) { self.maskContentLayer = SimpleLayer() super.init(layer: layer) } required public init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func update(size: CGSize, contentInsets: UIEdgeInsets) { let params = Params(size: size, contentInsets: contentInsets) if self.params == params { return } self.params = params let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0) self.maskContentLayer.frame = CGRect(origin: CGPoint(x: contentInsets.left, y: contentInsets.top), size: size) if let contentsLayer = self.contentsLayer { contentsLayer.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: size.width - (contentInsets.left + contentInsets.right), height: size.height - (contentInsets.top + contentInsets.bottom))) } } }