From 2c0b60fe0632a7d18c34b148555cbd33a3c65f77 Mon Sep 17 00:00:00 2001 From: Alexey Strokin Date: Wed, 5 Jun 2024 18:10:48 +0300 Subject: [PATCH 1/2] Fix for flipped origins: iOS (top-left) vs CG (bottom-left). Applies to gradient images from `init(patternImage:)`. --- .../TranslucentOverlayStyleManager.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift b/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift index 22a74405..3f5578da 100644 --- a/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift +++ b/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift @@ -68,6 +68,14 @@ class TranslucentOverlayStyleManager: OverlayStyleManager { if show { self.overlayLayer.removeFromSuperlayer() self.overlayLayer.frame = overlay.bounds + /* + Fix for flipped origins: iOS (top-left) vs CG (bottom-left). + Applies to gradient images from `init(patternImage:)`. + Non-gradient images as background must not be used + */ + if type(of: self.color) == NSClassFromString("UIDynamicPatternColor") { + self.overlayLayer.transform = CATransform3DMakeScale(1, -1, 1) + } self.overlayLayer.backgroundColor = self.color.cgColor overlay.holder.layer.addSublayer(self.overlayLayer) overlay.holder.backgroundColor = UIColor.clear From a5ec1f780382627aa6f0f52e2868be88927e07c2 Mon Sep 17 00:00:00 2001 From: Alexey Strokin Date: Wed, 5 Jun 2024 19:11:43 +0300 Subject: [PATCH 2/2] Fix for flipped origins: iOS (top-left) vs CG (bottom-left). Applies to gradient images from `init(patternImage:)`. --- .../TranslucentOverlayStyleManager.swift | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift b/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift index 3f5578da..8b7803aa 100644 --- a/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift +++ b/Sources/Instructions/Managers/Internal/OverlayStyleManager/TranslucentOverlayStyleManager.swift @@ -68,14 +68,7 @@ class TranslucentOverlayStyleManager: OverlayStyleManager { if show { self.overlayLayer.removeFromSuperlayer() self.overlayLayer.frame = overlay.bounds - /* - Fix for flipped origins: iOS (top-left) vs CG (bottom-left). - Applies to gradient images from `init(patternImage:)`. - Non-gradient images as background must not be used - */ - if type(of: self.color) == NSClassFromString("UIDynamicPatternColor") { - self.overlayLayer.transform = CATransform3DMakeScale(1, -1, 1) - } + self.fixColorFromPatternImageIfNeeded(for: self.overlayLayer) self.overlayLayer.backgroundColor = self.color.cgColor overlay.holder.layer.addSublayer(self.overlayLayer) overlay.holder.backgroundColor = UIColor.clear @@ -130,6 +123,7 @@ class TranslucentOverlayStyleManager: OverlayStyleManager { let maskLayer = CALayer() maskLayer.frame = overlayLayer.bounds + fixColorFromPatternImageIfNeeded(for: self.cutoutMaskLayer) maskLayer.addSublayer(self.cutoutMaskLayer) maskLayer.addSublayer(self.fullMaskLayer) @@ -168,4 +162,16 @@ class TranslucentOverlayStyleManager: OverlayStyleManager { return layer } + + /* + // Adjust for flipped origins between CG and iOS. + // iOS origin: top left. CG origin: bottom left. + // This fix ensures proper rendering of gradient images and cutout layers + // created with `init(patternImage image: UIImage)`. + */ + private func fixColorFromPatternImageIfNeeded(for layer: CALayer) { + if type(of: self.color) == NSClassFromString("UIDynamicPatternColor") { + layer.transform = CATransform3DMakeScale(1, -1, 1) + } + } }