Using binding to support the animation control. This API design is the same as SwiftUI's Toggle/Sheet

This commit is contained in:
DreamPiggy 2019-10-05 15:39:30 +08:00
parent d23f9b4bb0
commit 35190d2c0a
1 changed files with 47 additions and 24 deletions

View File

@ -48,6 +48,46 @@ public struct AnimatedImage : PlatformViewRepresentable {
var webOptions: SDWebImageOptions = []
var webContext: [SDWebImageContextOption : Any]? = nil
/// A Binding to control the animation. You can bind external logic to control the animation status.
/// True to start animation, false to stop animation.
@Binding public var isAnimating: Bool
public init(url: URL?, placeholder: PlatformImage? = nil, options: SDWebImageOptions = [], context: [SDWebImageContextOption : Any]? = nil) {
self.init(url: url, placeholder: placeholder, options: options, context: context, isAnimating: .constant(true))
}
public init(url: URL?, placeholder: PlatformImage? = nil, options: SDWebImageOptions = [], context: [SDWebImageContextOption : Any]? = nil, isAnimating: Binding<Bool>) {
self._isAnimating = isAnimating
self.placeholder = placeholder
self.webOptions = options
self.webContext = context
self.imageModel.url = url
}
public init(name: String, bundle: Bundle? = nil) {
self.init(name: name, bundle: bundle, isAnimating: .constant(true))
}
public init(name: String, bundle: Bundle? = nil, isAnimating: Binding<Bool>) {
self._isAnimating = isAnimating
#if os(macOS)
let image = SDAnimatedImage(named: name, in: bundle)
#else
let image = SDAnimatedImage(named: name, in: bundle, compatibleWith: nil)
#endif
self.imageModel.image = image
}
public init(data: Data, scale: CGFloat = 0) {
self.init(data: data, scale: scale, isAnimating: .constant(true))
}
public init(data: Data, scale: CGFloat = 0, isAnimating: Binding<Bool>) {
self._isAnimating = isAnimating
let image = SDAnimatedImage(data: data, scale: scale)
self.imageModel.image = image
}
#if os(macOS)
public typealias NSViewType = AnimatedImageViewWrapper
#else
@ -89,6 +129,13 @@ public struct AnimatedImage : PlatformViewRepresentable {
}
}
}
if self.isAnimating != view.wrapped.isAnimating {
if self.isAnimating {
view.wrapped.startAnimating()
} else {
view.wrapped.stopAnimating()
}
}
configureView(view, context: context)
layoutView(view, context: context)
@ -310,30 +357,6 @@ extension AnimatedImage {
}
}
// Initializer
extension AnimatedImage {
public init(url: URL?, placeholder: PlatformImage? = nil, options: SDWebImageOptions = [], context: [SDWebImageContextOption : Any]? = nil) {
self.placeholder = placeholder
self.webOptions = options
self.webContext = context
self.imageModel.url = url
}
public init(name: String, bundle: Bundle? = nil) {
#if os(macOS)
let image = SDAnimatedImage(named: name, in: bundle)
#else
let image = SDAnimatedImage(named: name, in: bundle, compatibleWith: nil)
#endif
self.imageModel.image = image
}
public init(data: Data, scale: CGFloat = 0) {
let image = SDAnimatedImage(data: data, scale: scale)
self.imageModel.image = image
}
}
#if DEBUG
struct AnimatedImage_Previews : PreviewProvider {
static var previews: some View {