@@ -11,12 +11,24 @@ import SDWebImage
11
11
12
12
#if !os(watchOS)
13
13
14
- public struct AnimatedImage : ViewRepresentable {
15
- var url : URL ?
16
- var name : String ?
17
- var bundle : Bundle ?
18
- var data : Data ?
19
- var scale : CGFloat = 0
14
+ // Data Binding Object
15
+ final class AnimatedImageModel : ObservableObject {
16
+ @Published var image : SDAnimatedImage ?
17
+ @Published var url : URL ?
18
+ }
19
+
20
+ // Layout Binding Object
21
+ final class AnimatedImageLayout : ObservableObject {
22
+ @Published var contentMode : ContentMode = . fill
23
+ }
24
+
25
+ // View
26
+ public struct AnimatedImage : ViewRepresentable {
27
+ @ObservedObject var imageModel = AnimatedImageModel ( )
28
+ @ObservedObject var imageLayout = AnimatedImageLayout ( )
29
+
30
+ var webOptions : SDWebImageOptions = [ ]
31
+ var webContext : [ SDWebImageContextOption : Any ] ? = nil
20
32
21
33
#if os(macOS)
22
34
public typealias NSViewType = SDAnimatedImageView
@@ -47,36 +59,67 @@ public struct AnimatedImage: ViewRepresentable {
47
59
}
48
60
49
61
func updateView( _ view: SDAnimatedImageView , context: ViewRepresentableContext < AnimatedImage > ) {
50
- if let url = url {
51
- view . sd_setImage ( with : url)
52
- return
62
+ view . image = imageModel . image
63
+ if let url = imageModel . url {
64
+ view . sd_setImage ( with : url , placeholderImage : view . image , options : webOptions , context : webContext )
53
65
}
54
- if let name = name {
66
+
67
+ switch imageLayout. contentMode {
68
+ case . fit:
55
69
#if os(macOS)
56
- view. image = SDAnimatedImage ( named : name , in : bundle )
70
+ view. imageScaling = . scaleProportionallyUpOrDown
57
71
#else
58
- view. image = SDAnimatedImage ( named: name, in: bundle, compatibleWith: nil )
72
+ view. contentMode = . scaleAspectFit
73
+ #endif
74
+ case . fill:
75
+ #if os(macOS)
76
+ view. imageScaling = . scaleAxesIndependently
77
+ #else
78
+ view. contentMode = . scaleToFill
59
79
#endif
60
- return
61
- }
62
- if let data = data {
63
- view. image = SDAnimatedImage ( data: data, scale: scale)
64
- return
65
80
}
66
81
}
67
82
68
- public init ( url: URL ? , placeholder: Image ? = nil , options: SDWebImageOptions = [ ] , context: [ SDWebImageContextOption : Any ] ? = nil ) {
69
- self . url = url
83
+ public func image( _ image: SDAnimatedImage ? ) -> Self {
84
+ imageModel. image = image
85
+ return self
70
86
}
71
87
72
- public init ( name : String , bundle : Bundle ? = nil ) {
73
- self . name = name
74
- self . bundle = bundle
88
+ public func imageUrl ( _ url : URL ? ) -> Self {
89
+ imageModel . url = url
90
+ return self
75
91
}
76
92
93
+ public func scaledToFit( ) -> Self {
94
+ imageLayout. contentMode = . fit
95
+ return self
96
+ }
97
+
98
+ public func scaledToFill( ) -> Self {
99
+ imageLayout. contentMode = . fill
100
+ return self
101
+ }
102
+ }
103
+
104
+ extension AnimatedImage {
105
+ public init ( url: URL ? , placeholder: SDAnimatedImage ? = nil , options: SDWebImageOptions = [ ] , context: [ SDWebImageContextOption : Any ] ? = nil ) {
106
+ self . webOptions = options
107
+ self . webContext = context
108
+ self . imageModel. url = url
109
+ }
110
+
111
+ public init ( name: String , bundle: Bundle ? = nil ) {
112
+ #if os(macOS)
113
+ let image = SDAnimatedImage ( named: name, in: bundle)
114
+ #else
115
+ let image = SDAnimatedImage ( named: name, in: bundle, compatibleWith: nil )
116
+ #endif
117
+ self . imageModel. image = image
118
+ }
119
+
77
120
public init ( data: Data , scale: CGFloat = 0 ) {
78
- self . data = data
79
- self . scale = scale
121
+ let image = SDAnimatedImage ( data: data , scale : scale )
122
+ self . imageModel . image = image
80
123
}
81
124
}
82
125
0 commit comments