From 5f2c531991050044a947738b5c9d3c326581f2df Mon Sep 17 00:00:00 2001 From: Marko Tadic Date: Mon, 7 Oct 2024 20:44:09 +0200 Subject: [PATCH] Fixes + improvements - fix bug with debug gesture - fix build warnings in Xcode 16 - add / update a few snippets --- Sources/Minions/Extensions/Foundation.swift | 2 +- Sources/Minions/Extensions/Swift.swift | 2 +- Sources/Minions/Extensions/SwiftUI.swift | 40 ++++++++++++++++++++- Sources/Minions/Extensions/UIKit.swift | 18 +++++----- Sources/Minions/Haptics.swift | 2 +- Sources/Minions/Log.swift | 4 +-- Sources/Minions/RestAPI.swift | 2 +- Sources/Minions/Screen.swift | 10 ++++-- 8 files changed, 62 insertions(+), 18 deletions(-) diff --git a/Sources/Minions/Extensions/Foundation.swift b/Sources/Minions/Extensions/Foundation.swift index ed5dfcf..a8fd58c 100644 --- a/Sources/Minions/Extensions/Foundation.swift +++ b/Sources/Minions/Extensions/Foundation.swift @@ -212,7 +212,7 @@ public extension Locale { // MARK: - String Helpers -extension String: LocalizedError { +extension String: @retroactive LocalizedError { public var errorDescription: String? { self } diff --git a/Sources/Minions/Extensions/Swift.swift b/Sources/Minions/Extensions/Swift.swift index 28a1a46..a09a9b2 100644 --- a/Sources/Minions/Extensions/Swift.swift +++ b/Sources/Minions/Extensions/Swift.swift @@ -79,7 +79,7 @@ public extension Array { // MARK: - String Helpers /// - See: https://twitter.com/jckarter/status/1230987212730167296 -extension String: Error {} +extension String: @retroactive Error {} /// - See: https://www.hackingwithswift.com/example-code/strings/how-to-capitalize-the-first-letter-of-a-string public extension String { diff --git a/Sources/Minions/Extensions/SwiftUI.swift b/Sources/Minions/Extensions/SwiftUI.swift index 377455c..2988f20 100644 --- a/Sources/Minions/Extensions/SwiftUI.swift +++ b/Sources/Minions/Extensions/SwiftUI.swift @@ -64,6 +64,18 @@ public extension View { self } } + + /// - See: https://stackoverflow.com/a/71203870/2165585 + @ViewBuilder + func modify(@ViewBuilder _ transform: (Self) -> (some View)?) -> some View { + if let view = transform(self), !(view is EmptyView) { + view + } + else { + self + } + } + } // MARK: - View+Debug @@ -107,7 +119,7 @@ public extension View { func debugGesture(_ gesture: G) -> some View { debugModifier { - $0.gesture(gesture) + $0.simultaneousGesture(gesture) } } } @@ -173,6 +185,32 @@ public struct ScaleButtonStyle: ButtonStyle { } } +// MARK: - Custom transition + +extension AnyTransition { + static var verticalScale: AnyTransition { + .modifier( + active: VerticalScaleEffect(scale: 0), + identity: VerticalScaleEffect(scale: 1) + ) + } +} + +public struct VerticalScaleEffect: GeometryEffect { + + public var scale: CGFloat + + public var animatableData: CGFloat { + get { scale } + set { scale = newValue } + } + + public func effectValue(size: CGSize) -> ProjectionTransform { + let scaleTransform: CGAffineTransform = .init(scaleX: 1, y: scale) + return ProjectionTransform(scaleTransform) + } +} + // MARK: - LabelStyle public extension LabelStyle where Self == VerticalLabelStyle { diff --git a/Sources/Minions/Extensions/UIKit.swift b/Sources/Minions/Extensions/UIKit.swift index 49e91d1..c740ac1 100644 --- a/Sources/Minions/Extensions/UIKit.swift +++ b/Sources/Minions/Extensions/UIKit.swift @@ -467,10 +467,16 @@ public extension UIWindow { .compactMap { $0 as? UIWindowScene } } - static var first: UIWindow? { + static var firstWindow: UIWindow? { allScenes.first?.windows.first } + static var activeScene: UIWindowScene? { + allScenes + .filter { $0.activationState == .foregroundActive } + .first + } + static var keyWindow: UIWindow? { activeScene?.keyWindow } @@ -499,8 +505,8 @@ public extension UIWindow { #if os(visionOS) false #else - guard let first else { return false } - return !first.frame.equalTo(first.screen.bounds) + guard let firstWindow else { return false } + return !firstWindow.frame.equalTo(firstWindow.screen.bounds) #endif } @@ -544,12 +550,6 @@ public extension UIWindow { activeScene?.statusBarManager?.statusBarFrame #endif } - - private static var activeScene: UIWindowScene? { - allScenes - .filter { $0.activationState == .foregroundActive } - .first - } } // MARK: - Custom Types diff --git a/Sources/Minions/Haptics.swift b/Sources/Minions/Haptics.swift index 9fe10d9..2475085 100644 --- a/Sources/Minions/Haptics.swift +++ b/Sources/Minions/Haptics.swift @@ -70,7 +70,7 @@ public struct Haptics { } #if os(watchOS) -extension WKHapticType: CaseIterable { +extension WKHapticType: @retroactive CaseIterable { public static var allCases: [WKHapticType] {[ .notification, .directionUp, diff --git a/Sources/Minions/Log.swift b/Sources/Minions/Log.swift index cc3655d..4b1b62e 100644 --- a/Sources/Minions/Log.swift +++ b/Sources/Minions/Log.swift @@ -99,7 +99,7 @@ public final class Log { // MARK: Internal API static func write( - thread: Thread = .current, + thread: String = getThreadName(.current), fileID: String, line: Int, function: String, @@ -107,7 +107,7 @@ public final class Log { ) { DispatchQueue.global(qos: .utility).async { let line = Line( - thread: getThreadName(thread), + thread: thread, file: extractFilename(fileID), number: line, function: function, diff --git a/Sources/Minions/RestAPI.swift b/Sources/Minions/RestAPI.swift index 1c171a6..f88e52e 100644 --- a/Sources/Minions/RestAPI.swift +++ b/Sources/Minions/RestAPI.swift @@ -275,7 +275,7 @@ public extension RestAPIResponse { // MARK: - Helpers -extension URL: ExpressibleByStringLiteral, Identifiable { +extension URL: @retroactive ExpressibleByStringLiteral, @retroactive Identifiable { /// Helper for constructing `URL` using `String` literals. public init(stringLiteral value: String) { diff --git a/Sources/Minions/Screen.swift b/Sources/Minions/Screen.swift index 738c14c..92a36a8 100644 --- a/Sources/Minions/Screen.swift +++ b/Sources/Minions/Screen.swift @@ -139,8 +139,11 @@ private extension Device { /// 12, 12 Pro, 13, 13 Pro, 14 return 6.06 case 2556: - /// 14 Pro, 15, 15 Pro + /// 14 Pro, 15, 15 Pro, 16 return 6.1 + case 2622: + /// 16 Pro + return 6.3 case 2688: /// Xs Max, 11 Pro Max return 6.5 @@ -148,8 +151,11 @@ private extension Device { /// 12 Pro Max, 13 Pro Max, 14 Plus return 6.7 case 2796: - /// 14 Pro Max, 15+, 15 Pro Max + /// 14 Pro Max, 15+, 15 Pro Max, 16+ return 6.7 + case 2868: + /// 16 Pro Max + return 6.9 /// - Note: iPads