Skip to content

Commit 5b658b0

Browse files
authored
Merge pull request #178 from SDWebImage/remove_placeholder_maxWidth_limit
Remove the WebImage placeholder maxWidth/maxHeight modifier, this maybreak some use case like `TabView`. If user want to use placeholder, limit themselves
2 parents e19c35a + 2935e2b commit 5b658b0

File tree

2 files changed

+75
-50
lines changed

2 files changed

+75
-50
lines changed

Diff for: SDWebImageSwiftUI/Classes/ImagePlayer.swift

+44-23
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ public final class ImagePlayer : ObservableObject {
3737
/// Current playing frame image
3838
@Published public var currentFrame: PlatformImage?
3939

40+
/// Current playing frame index
41+
@Published public var currentFrameIndex: UInt = 0
42+
43+
/// Current playing loop count
44+
@Published public var currentLoopCount: UInt = 0
45+
46+
/// Whether current player is valid for playing. This will check the internal player exist or not
47+
public var isValid: Bool {
48+
player != nil
49+
}
50+
51+
/// Current playing status
52+
public var isPlaying: Bool {
53+
player?.isPlaying ?? false
54+
}
55+
4056
/// Start the animation
4157
public func startPlaying() {
4258
player?.startPlaying()
@@ -52,38 +68,43 @@ public final class ImagePlayer : ObservableObject {
5268
player?.stopPlaying()
5369
}
5470

71+
/// Seek to frame and loop count
72+
public func seekToFrame(at: UInt, loopCount: UInt) {
73+
player?.seekToFrame(at: at, loopCount: loopCount)
74+
}
75+
5576
/// Clear the frame buffer
5677
public func clearFrameBuffer() {
5778
player?.clearFrameBuffer()
5879
}
5980

60-
61-
/// Setup the player using Animated Image
81+
/// Setup the player using Animated Image.
82+
/// After setup, you can always check `isValid` status, or call `startPlaying` to play the animation.
6283
/// - Parameter image: animated image
63-
public func setupPlayer(image: PlatformImage?) {
64-
if player != nil {
84+
public func setupPlayer(animatedImage: SDAnimatedImageProvider) {
85+
if isValid {
6586
return
6687
}
67-
if let animatedImage = image as? SDAnimatedImageProvider & PlatformImage {
68-
if let imagePlayer = SDAnimatedImagePlayer(provider: animatedImage) {
69-
imagePlayer.animationFrameHandler = { [weak self] (_, frame) in
70-
self?.currentFrame = frame
71-
}
72-
// Setup configuration
73-
if let maxBufferSize = maxBufferSize {
74-
imagePlayer.maxBufferSize = maxBufferSize
75-
}
76-
if let customLoopCount = customLoopCount {
77-
imagePlayer.totalLoopCount = customLoopCount
78-
}
79-
imagePlayer.runLoopMode = runLoopMode
80-
imagePlayer.playbackRate = playbackRate
81-
imagePlayer.playbackMode = playbackMode
82-
83-
self.player = imagePlayer
84-
85-
imagePlayer.startPlaying()
88+
if let imagePlayer = SDAnimatedImagePlayer(provider: animatedImage) {
89+
imagePlayer.animationFrameHandler = { [weak self] (index, frame) in
90+
self?.currentFrameIndex = index
91+
self?.currentFrame = frame
92+
}
93+
imagePlayer.animationLoopHandler = { [weak self] (loopCount) in
94+
self?.currentLoopCount = loopCount
95+
}
96+
// Setup configuration
97+
if let maxBufferSize = maxBufferSize {
98+
imagePlayer.maxBufferSize = maxBufferSize
99+
}
100+
if let customLoopCount = customLoopCount {
101+
imagePlayer.totalLoopCount = customLoopCount
86102
}
103+
imagePlayer.runLoopMode = runLoopMode
104+
imagePlayer.playbackRate = playbackRate
105+
imagePlayer.playbackMode = playbackMode
106+
107+
self.player = imagePlayer
87108
}
88109
}
89110
}

Diff for: SDWebImageSwiftUI/Classes/WebImage.swift

+31-27
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public struct WebImage : View {
1717
var placeholder: AnyView?
1818
var retryOnAppear: Bool = true
1919
var cancelOnDisappear: Bool = true
20+
var pausable: Bool = true
21+
var purgeable: Bool = false
2022

2123
@ObservedObject var imageManager: ImageManager
2224

@@ -26,9 +28,6 @@ public struct WebImage : View {
2628

2729
@ObservedObject var imagePlayer: ImagePlayer
2830

29-
var pausable: Bool = true
30-
var purgeable: Bool = false
31-
3231
/// Create a web image with url, placeholder, custom options and context.
3332
/// - Parameter url: The image url
3433
/// - Parameter options: The options to use when downloading the image. See `SDWebImageOptions` for the possible values.
@@ -61,38 +60,30 @@ public struct WebImage : View {
6160
imageManager.load()
6261
}
6362
return Group {
64-
if imageManager.image != nil {
63+
if let image = imageManager.image {
6564
if isAnimating && !imageManager.isIncremental {
66-
if imagePlayer.currentFrame != nil {
67-
configure(image: imagePlayer.currentFrame!)
68-
.onPlatformAppear(appear: {
69-
self.imagePlayer.startPlaying()
70-
}, disappear: {
71-
if self.pausable {
72-
self.imagePlayer.pausePlaying()
73-
} else {
74-
self.imagePlayer.stopPlaying()
75-
}
76-
if self.purgeable {
77-
self.imagePlayer.clearFrameBuffer()
78-
}
79-
})
80-
} else {
81-
configure(image: imageManager.image!)
82-
.onReceive(imageManager.$image) { image in
83-
self.imagePlayer.setupPlayer(image: image)
65+
setupPlayer()
66+
.onPlatformAppear(appear: {
67+
self.imagePlayer.startPlaying()
68+
}, disappear: {
69+
if self.pausable {
70+
self.imagePlayer.pausePlaying()
71+
} else {
72+
self.imagePlayer.stopPlaying()
8473
}
85-
}
74+
if self.purgeable {
75+
self.imagePlayer.clearFrameBuffer()
76+
}
77+
})
8678
} else {
87-
if imagePlayer.currentFrame != nil {
88-
configure(image: imagePlayer.currentFrame!)
79+
if let currentFrame = imagePlayer.currentFrame {
80+
configure(image: currentFrame)
8981
} else {
90-
configure(image: imageManager.image!)
82+
configure(image: image)
9183
}
9284
}
9385
} else {
9486
setupPlaceholder()
95-
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
9687
.onPlatformAppear(appear: {
9788
// Load remote image when first appear
9889
if self.imageManager.isFirstLoad {
@@ -164,6 +155,19 @@ public struct WebImage : View {
164155
}
165156
}
166157

158+
/// Animated Image Support
159+
func setupPlayer() -> some View {
160+
if let currentFrame = imagePlayer.currentFrame {
161+
return configure(image: currentFrame)
162+
} else {
163+
if let animatedImage = imageManager.image as? SDAnimatedImageProvider {
164+
self.imagePlayer.setupPlayer(animatedImage: animatedImage)
165+
self.imagePlayer.startPlaying()
166+
}
167+
return configure(image: imageManager.image!)
168+
}
169+
}
170+
167171
/// Placeholder View Support
168172
func setupPlaceholder() -> some View {
169173
// Don't use `Group` because it will trigger `.onAppear` and `.onDisappear` when condition view removed, treat placeholder as an entire component

0 commit comments

Comments
 (0)