Only apply resizable and rendering mode for non-animated image, since SDAnimatedImageView does not support this type of modification

This commit is contained in:
DreamPiggy 2019-10-01 16:24:19 +08:00
parent 95edc90787
commit e9c28e59ce
1 changed files with 50 additions and 15 deletions

View File

@ -21,6 +21,8 @@ final class AnimatedImageModel : ObservableObject {
final class AnimatedImageLayout : ObservableObject { final class AnimatedImageLayout : ObservableObject {
@Published var contentMode: ContentMode = .fill @Published var contentMode: ContentMode = .fill
@Published var aspectRatio: CGFloat? @Published var aspectRatio: CGFloat?
@Published var capInsets: EdgeInsets = EdgeInsets()
@Published var resizingMode: Image.ResizingMode?
@Published var renderingMode: Image.TemplateRenderingMode? @Published var renderingMode: Image.TemplateRenderingMode?
@Published var interpolation: Image.Interpolation? @Published var interpolation: Image.Interpolation?
@Published var antialiased: Bool = false @Published var antialiased: Bool = false
@ -93,24 +95,55 @@ public struct AnimatedImage : ViewRepresentable {
#endif #endif
} }
// RenderingMode // Animated Image does not support resizing mode and rendering mode
if let renderingMode = imageLayout.renderingMode { if let image = view.wrapped.image, !image.sd_isAnimated, !image.conforms(to: SDAnimatedImageProtocol.self) {
switch renderingMode { // ResizingMode
case .template: if let resizingMode = imageLayout.resizingMode {
#if os(macOS) #if os(macOS)
view.wrapped.image?.isTemplate = true let capInsets = NSEdgeInsets(top: imageLayout.capInsets.top, left: imageLayout.capInsets.leading, bottom: imageLayout.capInsets.bottom, right: imageLayout.capInsets.trailing)
#else #else
view.wrapped.image = view.wrapped.image?.withRenderingMode(.alwaysTemplate) let capInsets = UIEdgeInsets(top: imageLayout.capInsets.top, left: imageLayout.capInsets.leading, bottom: imageLayout.capInsets.bottom, right: imageLayout.capInsets.trailing)
#endif #endif
case .original: switch resizingMode {
#if os(macOS) case .stretch:
view.wrapped.image?.isTemplate = false #if os(macOS)
#else view.wrapped.image?.resizingMode = .stretch
view.wrapped.image = view.wrapped.image?.withRenderingMode(.alwaysOriginal) view.wrapped.image?.capInsets = capInsets
#endif #else
@unknown default: view.wrapped.image = view.wrapped.image?.resizableImage(withCapInsets: capInsets, resizingMode: .stretch)
// Future cases, not implements #endif
break case .tile:
#if os(macOS)
view.wrapped.image?.resizingMode = .tile
view.wrapped.image?.capInsets = capInsets
#else
view.wrapped.image = view.wrapped.image?.resizableImage(withCapInsets: capInsets, resizingMode: .tile)
#endif
@unknown default:
// Future cases, not implements
break
}
}
// RenderingMode
if let renderingMode = imageLayout.renderingMode {
switch renderingMode {
case .template:
#if os(macOS)
view.wrapped.image?.isTemplate = true
#else
view.wrapped.image = view.wrapped.image?.withRenderingMode(.alwaysTemplate)
#endif
case .original:
#if os(macOS)
view.wrapped.image?.isTemplate = false
#else
view.wrapped.image = view.wrapped.image?.withRenderingMode(.alwaysOriginal)
#endif
@unknown default:
// Future cases, not implements
break
}
} }
} }
@ -160,6 +193,8 @@ public struct AnimatedImage : ViewRepresentable {
capInsets: EdgeInsets = EdgeInsets(), capInsets: EdgeInsets = EdgeInsets(),
resizingMode: Image.ResizingMode = .stretch) -> AnimatedImage resizingMode: Image.ResizingMode = .stretch) -> AnimatedImage
{ {
imageLayout.capInsets = capInsets
imageLayout.resizingMode = resizingMode
return self return self
} }