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 {
@Published var contentMode: ContentMode = .fill
@Published var aspectRatio: CGFloat?
@Published var capInsets: EdgeInsets = EdgeInsets()
@Published var resizingMode: Image.ResizingMode?
@Published var renderingMode: Image.TemplateRenderingMode?
@Published var interpolation: Image.Interpolation?
@Published var antialiased: Bool = false
@ -93,24 +95,55 @@ public struct AnimatedImage : ViewRepresentable {
#endif
}
// RenderingMode
if let renderingMode = imageLayout.renderingMode {
switch renderingMode {
case .template:
// Animated Image does not support resizing mode and rendering mode
if let image = view.wrapped.image, !image.sd_isAnimated, !image.conforms(to: SDAnimatedImageProtocol.self) {
// ResizingMode
if let resizingMode = imageLayout.resizingMode {
#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
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
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
switch resizingMode {
case .stretch:
#if os(macOS)
view.wrapped.image?.resizingMode = .stretch
view.wrapped.image?.capInsets = capInsets
#else
view.wrapped.image = view.wrapped.image?.resizableImage(withCapInsets: capInsets, resizingMode: .stretch)
#endif
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(),
resizingMode: Image.ResizingMode = .stretch) -> AnimatedImage
{
imageLayout.capInsets = capInsets
imageLayout.resizingMode = resizingMode
return self
}