Skip to content

Commit 97d862c

Browse files
committed
Remove the WebImage placeholder maxWidth/maxHeight modifier, this may break some use case like TabView. If user want to use placeholder, limit themselves
1 parent e19c35a commit 97d862c

File tree

2 files changed

+62
-41
lines changed

2 files changed

+62
-41
lines changed

SDWebImageSwiftUI/Classes/ImagePlayer.swift

+38-21
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ 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+
/// Current playing status
47+
public var isPlaying: Bool {
48+
player?.isPlaying ?? false
49+
}
50+
4051
/// Start the animation
4152
public func startPlaying() {
4253
player?.startPlaying()
@@ -52,38 +63,44 @@ public final class ImagePlayer : ObservableObject {
5263
player?.stopPlaying()
5364
}
5465

66+
/// Seek to frame and loop count
67+
public func seekToFrame(at: UInt, loopCount: UInt) {
68+
player?.seekToFrame(at: at, loopCount: loopCount)
69+
}
70+
5571
/// Clear the frame buffer
5672
public func clearFrameBuffer() {
5773
player?.clearFrameBuffer()
5874
}
5975

60-
6176
/// Setup the player using Animated Image
6277
/// - Parameter image: animated image
63-
public func setupPlayer(image: PlatformImage?) {
78+
public func setupPlayer(animatedImage: SDAnimatedImageProvider) {
6479
if player != nil {
6580
return
6681
}
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()
82+
if let imagePlayer = SDAnimatedImagePlayer(provider: animatedImage) {
83+
imagePlayer.animationFrameHandler = { [weak self] (index, frame) in
84+
self?.currentFrameIndex = index
85+
self?.currentFrame = frame
86+
}
87+
imagePlayer.animationLoopHandler = { [weak self] (loopCount) in
88+
self?.currentLoopCount = loopCount
89+
}
90+
// Setup configuration
91+
if let maxBufferSize = maxBufferSize {
92+
imagePlayer.maxBufferSize = maxBufferSize
93+
}
94+
if let customLoopCount = customLoopCount {
95+
imagePlayer.totalLoopCount = customLoopCount
8696
}
97+
imagePlayer.runLoopMode = runLoopMode
98+
imagePlayer.playbackRate = playbackRate
99+
imagePlayer.playbackMode = playbackMode
100+
101+
self.player = imagePlayer
102+
103+
imagePlayer.startPlaying()
87104
}
88105
}
89106
}

SDWebImageSwiftUI/Classes/WebImage.swift

+24-20
Original file line numberDiff line numberDiff line change
@@ -63,26 +63,19 @@ public struct WebImage : View {
6363
return Group {
6464
if imageManager.image != nil {
6565
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)
66+
setupPlayer()
67+
.onPlatformAppear(appear: {
68+
self.imagePlayer.startPlaying()
69+
}, disappear: {
70+
if self.pausable {
71+
self.imagePlayer.pausePlaying()
72+
} else {
73+
self.imagePlayer.stopPlaying()
8474
}
85-
}
75+
if self.purgeable {
76+
self.imagePlayer.clearFrameBuffer()
77+
}
78+
})
8679
} else {
8780
if imagePlayer.currentFrame != nil {
8881
configure(image: imagePlayer.currentFrame!)
@@ -92,7 +85,6 @@ public struct WebImage : View {
9285
}
9386
} else {
9487
setupPlaceholder()
95-
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
9688
.onPlatformAppear(appear: {
9789
// Load remote image when first appear
9890
if self.imageManager.isFirstLoad {
@@ -164,6 +156,18 @@ public struct WebImage : View {
164156
}
165157
}
166158

159+
/// Animated Image Support
160+
func setupPlayer() -> some View {
161+
if let currentFrame = imagePlayer.currentFrame {
162+
return configure(image: currentFrame)
163+
} else if let animatedImage = imageManager.image as? SDAnimatedImageProvider & PlatformImage {
164+
self.imagePlayer.setupPlayer(animatedImage: animatedImage)
165+
return configure(image: animatedImage)
166+
} else {
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)