Skip to content

Commit e893970

Browse files
committed
Add all the Image struct method into WebImage
1 parent a37f209 commit e893970

File tree

4 files changed

+68
-24
lines changed

4 files changed

+68
-24
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

SDWebImageSwiftUI/Classes/ImageManager.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ class ImageManager : ObservableObject {
1414

1515
var objectWillChange = PassthroughSubject<ImageManager, Never>()
1616

17-
private var manager = SDWebImageManager.shared
18-
private weak var currentOperation: SDWebImageOperation? = nil
17+
var manager = SDWebImageManager.shared
18+
weak var currentOperation: SDWebImageOperation? = nil
1919

20-
var image: Image? {
20+
var image: PlatformImage? {
2121
willSet {
2222
objectWillChange.send(self)
2323
}
@@ -36,11 +36,7 @@ class ImageManager : ObservableObject {
3636
func load() {
3737
currentOperation = manager.loadImage(with: url, options: options, context: context, progress: nil) { (image, data, error, cacheType, _, _) in
3838
if let image = image {
39-
#if os(macOS)
40-
self.image = Image(nsImage: image)
41-
#else
42-
self.image = Image(uiImage: image)
43-
#endif
39+
self.image = image
4440
}
4541
}
4642
}

SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@
99
import Foundation
1010
import SwiftUI
1111

12+
#if os(macOS)
13+
typealias PlatformImage = NSImage
14+
#else
15+
typealias PlatformImage = UIImage
16+
#endif
17+
18+
extension Image {
19+
init(platformImage: PlatformImage) {
20+
#if os(macOS)
21+
self.init(nsImage: platformImage)
22+
#else
23+
self.init(uiImage: platformImage)
24+
#endif
25+
}
26+
}
27+
1228
#if !os(watchOS)
1329

1430
#if os(macOS)

SDWebImageSwiftUI/Classes/WebImage.swift

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public struct WebImage : View {
1515
public var options: SDWebImageOptions
1616
public var context: [SDWebImageContextOption : Any]?
1717

18+
var configurations: [(Image) -> Image] = []
19+
1820
@ObservedObject var imageManager: ImageManager
1921

2022
public init(url: URL?, placeholder: Image? = nil, options: SDWebImageOptions = [], context: [SDWebImageContextOption : Any]? = nil) {
@@ -26,26 +28,56 @@ public struct WebImage : View {
2628
}
2729

2830
public var body: some View {
29-
if let image = imageManager.image {
30-
return image
31-
.resizable()
32-
.onAppear {}
33-
.onDisappear {}
34-
} else if let image = placeholder {
35-
return image
36-
.resizable()
37-
.onAppear { self.imageManager.load() }
38-
.onDisappear { self.imageManager.cancel() }
31+
let image: Image
32+
if let platformImage = imageManager.image {
33+
image = Image(platformImage: platformImage)
34+
} else if let placeholder = placeholder {
35+
image = placeholder
3936
} else {
4037
#if os(macOS)
4138
let emptyImage = Image(nsImage: NSImage())
4239
#else
4340
let emptyImage = Image(uiImage: UIImage())
4441
#endif
45-
return emptyImage
46-
.resizable()
47-
.onAppear { self.imageManager.load() }
48-
.onDisappear { self.imageManager.cancel() }
42+
image = emptyImage
43+
}
44+
return configurations.reduce(image) { (previous, configuration) in
45+
configuration(previous)
46+
}
47+
.onAppear {
48+
if self.imageManager.image == nil {
49+
self.imageManager.load()
50+
}
51+
}
52+
.onDisappear {
53+
self.imageManager.cancel()
4954
}
5055
}
5156
}
57+
58+
extension WebImage {
59+
func configure(_ block: @escaping (Image) -> Image) -> WebImage {
60+
var result = self
61+
result.configurations.append(block)
62+
return result
63+
}
64+
65+
public func resizable(
66+
capInsets: EdgeInsets = EdgeInsets(),
67+
resizingMode: Image.ResizingMode = .stretch) -> WebImage
68+
{
69+
configure { $0.resizable(capInsets: capInsets, resizingMode: resizingMode) }
70+
}
71+
72+
public func renderingMode(_ renderingMode: Image.TemplateRenderingMode?) -> WebImage {
73+
configure { $0.renderingMode(renderingMode) }
74+
}
75+
76+
public func interpolation(_ interpolation: Image.Interpolation) -> WebImage {
77+
configure { $0.interpolation(interpolation) }
78+
}
79+
80+
public func antialiased(_ isAntialiased: Bool) -> WebImage {
81+
configure { $0.antialiased(isAntialiased) }
82+
}
83+
}

0 commit comments

Comments
 (0)