From 77f21c7ed9f36cc62d4aff18b1b1f7882ced8275 Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Wed, 10 Mar 2021 16:02:06 +0800 Subject: [PATCH 1/2] Fix the issue that using `Image(uiimage:)` will result wrong rendering mode in some component like `TabbarItem`, while using `Image(decorative:sclae:orientation:)` works well --- SDWebImageSwiftUI/Classes/WebImage.swift | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/SDWebImageSwiftUI/Classes/WebImage.swift b/SDWebImageSwiftUI/Classes/WebImage.swift index ba1fad04..f6d65f4f 100644 --- a/SDWebImageSwiftUI/Classes/WebImage.swift +++ b/SDWebImageSwiftUI/Classes/WebImage.swift @@ -123,8 +123,8 @@ public struct WebImage : View { #if os(macOS) result = Image(nsImage: image) #else - // Fix the SwiftUI.Image rendering issue, like when use EXIF UIImage, the `.aspectRatio` does not works. SwiftUI's Bug :) - // See issue #101 + // Fix the SwiftUI.Image rendering issue, like when use EXIF UIImage, the `.aspectRatio` does not works. SwiftUI's Bug :). See #101 + // Always prefers `Image(decorative:scale:)` but not `Image(uiImage:scale:) to avoid bug on `TabbarItem`. See #175 var cgImage: CGImage? // Case 1: Vector Image, draw bitmap image if image.sd_isVector { @@ -144,15 +144,8 @@ public struct WebImage : View { cgImage = image.cgImage } } else { - // Case 2: Image with EXIF orientation (only EXIF 5-8 contains bug) - if [.left, .leftMirrored, .right, .rightMirrored].contains(image.imageOrientation) { - // Fixed by Apple in iOS 14+ - if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) { - // Do nothing - } else { - cgImage = image.cgImage - } - } + // Case 2: EXIF Image and Bitmap Image, prefers CGImage + cgImage = image.cgImage } // If we have CGImage, use CGImage based API, else use UIImage based API if let cgImage = cgImage { From f6074c2e5d8be0511e91aea483a7ad024c77dea2 Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Wed, 10 Mar 2021 17:09:37 +0800 Subject: [PATCH 2/2] Update the test case for the CGImage based --- Tests/WebImageTests.swift | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/Tests/WebImageTests.swift b/Tests/WebImageTests.swift index bb098674..1ba29b2a 100644 --- a/Tests/WebImageTests.swift +++ b/Tests/WebImageTests.swift @@ -22,10 +22,10 @@ class WebImageTests: XCTestCase { let imageUrl = URL(string: "https://nr-platform.s3.amazonaws.com/uploads/platform/published_extension/branding_icon/275/AmazonS3.png") let imageView = WebImage(url: imageUrl) let introspectView = imageView.onSuccess { image, data, cacheType in - #if os(iOS) || os(tvOS) - let displayImage = try? imageView.inspect().group().image(0).uiImage() - #else + #if os(macOS) let displayImage = try? imageView.inspect().group().image(0).nsImage() + #else + let displayImage = try? imageView.inspect().group().image(0).cgImage() #endif XCTAssertNotNil(displayImage) expectation.fulfill() @@ -46,15 +46,17 @@ class WebImageTests: XCTestCase { let introspectView = imageView.onSuccess { image, data, cacheType in if let animatedImage = image as? SDAnimatedImage { XCTAssertTrue(imageView.isAnimating) - #if os(iOS) || os(tvOS) - let displayImage = try? imageView.inspect().group().image(0).uiImage() - #else + #if os(macOS) let displayImage = try? imageView.inspect().group().image(0).nsImage() + let size = displayImage?.size + #else + let displayImage = try? imageView.inspect().group().image(0).cgImage() + let size = CGSize(width: displayImage?.width ?? 0, height: displayImage?.height ?? 0) #endif XCTAssertNotNil(displayImage) // Check display image should match the animated poster frame let posterImage = animatedImage.animatedImageFrame(at: 0) - XCTAssertEqual(displayImage?.size, posterImage?.size) + XCTAssertEqual(size, posterImage?.size) expectation.fulfill() } else { XCTFail("WebImage animated image invalid") @@ -162,15 +164,10 @@ class WebImageTests: XCTestCase { let displayImage = try? imageView.inspect().group().image(0).nsImage() XCTAssertNotNil(displayImage) #else - if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) { - let displayImage = try? imageView.inspect().group().image(0).uiImage() - XCTAssertEqual(displayImage, image) - } else { - let displayImage = try? imageView.inspect().group().image(0).cgImage() - let orientation = try? imageView.inspect().group().image(0).orientation() - XCTAssertNotNil(displayImage) - XCTAssertEqual(orientation, .leftMirrored) - } + let displayImage = try? imageView.inspect().group().image(0).cgImage() + let orientation = try? imageView.inspect().group().image(0).orientation() + XCTAssertNotNil(displayImage) + XCTAssertEqual(orientation, .leftMirrored) #endif expectation.fulfill() }.onFailure { error in