Remove the legacy ActivityIndicator/ProgressIndicator, use ProrgessView
This commit is contained in:
parent
2909b0027a
commit
63e1aebbf6
|
@ -54,10 +54,8 @@
|
||||||
debugDocumentVersioning = "YES"
|
debugDocumentVersioning = "YES"
|
||||||
debugServiceExtension = "internal"
|
debugServiceExtension = "internal"
|
||||||
allowLocationSimulation = "YES">
|
allowLocationSimulation = "YES">
|
||||||
<RemoteRunnable
|
<BuildableProductRunnable
|
||||||
runnableDebuggingMode = "2"
|
runnableDebuggingMode = "0">
|
||||||
BundleIdentifier = "com.apple.Carousel"
|
|
||||||
RemotePath = "/SDWebImageSwiftUIDemo-watchOS WatchKit App">
|
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "32E529362348A0DD00EA46FF"
|
BlueprintIdentifier = "32E529362348A0DD00EA46FF"
|
||||||
|
@ -65,7 +63,7 @@
|
||||||
BlueprintName = "SDWebImageSwiftUIDemo-watchOS WatchKit App"
|
BlueprintName = "SDWebImageSwiftUIDemo-watchOS WatchKit App"
|
||||||
ReferencedContainer = "container:SDWebImageSwiftUI.xcodeproj">
|
ReferencedContainer = "container:SDWebImageSwiftUI.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</RemoteRunnable>
|
</BuildableProductRunnable>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
|
@ -73,10 +71,8 @@
|
||||||
savedToolIdentifier = ""
|
savedToolIdentifier = ""
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
debugDocumentVersioning = "YES">
|
debugDocumentVersioning = "YES">
|
||||||
<RemoteRunnable
|
<BuildableProductRunnable
|
||||||
runnableDebuggingMode = "2"
|
runnableDebuggingMode = "0">
|
||||||
BundleIdentifier = "com.apple.Carousel"
|
|
||||||
RemotePath = "/SDWebImageSwiftUIDemo-watchOS WatchKit App">
|
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "32E529362348A0DD00EA46FF"
|
BlueprintIdentifier = "32E529362348A0DD00EA46FF"
|
||||||
|
@ -84,16 +80,7 @@
|
||||||
BlueprintName = "SDWebImageSwiftUIDemo-watchOS WatchKit App"
|
BlueprintName = "SDWebImageSwiftUIDemo-watchOS WatchKit App"
|
||||||
ReferencedContainer = "container:SDWebImageSwiftUI.xcodeproj">
|
ReferencedContainer = "container:SDWebImageSwiftUI.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</RemoteRunnable>
|
</BuildableProductRunnable>
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "32E529362348A0DD00EA46FF"
|
|
||||||
BuildableName = "SDWebImageSwiftUIDemo-watchOS WatchKit App.app"
|
|
||||||
BlueprintName = "SDWebImageSwiftUIDemo-watchOS WatchKit App"
|
|
||||||
ReferencedContainer = "container:SDWebImageSwiftUI.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
<AnalyzeAction
|
<AnalyzeAction
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Debug">
|
||||||
|
|
|
@ -17,23 +17,6 @@ class UserSettings: ObservableObject {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if os(watchOS)
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
|
||||||
extension Indicator where T == ProgressView<EmptyView, EmptyView> {
|
|
||||||
static var activity: Indicator {
|
|
||||||
Indicator { isAnimating, progress in
|
|
||||||
ProgressView()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static var progress: Indicator {
|
|
||||||
Indicator { isAnimating, progress in
|
|
||||||
ProgressView(value: progress.wrappedValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Test Switching url using @State
|
// Test Switching url using @State
|
||||||
struct ContentView2: View {
|
struct ContentView2: View {
|
||||||
@State var imageURLs = [
|
@State var imageURLs = [
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the SDWebImage package.
|
|
||||||
* (c) DreamPiggy <lizhuoli1126@126.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
#if os(macOS) || os(iOS) || os(tvOS)
|
|
||||||
/// An activity indicator (system style)
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
|
||||||
public struct ActivityIndicator: PlatformViewRepresentable {
|
|
||||||
@Binding var isAnimating: Bool
|
|
||||||
var style: Style
|
|
||||||
|
|
||||||
/// Create the indicator with animation binding and style
|
|
||||||
/// - Parameters:
|
|
||||||
/// - isAnimating: The binding to control the animation
|
|
||||||
/// - style: The indicator style
|
|
||||||
public init(_ isAnimating: Binding<Bool>, style: Style = .medium) {
|
|
||||||
self._isAnimating = isAnimating
|
|
||||||
self.style = style
|
|
||||||
}
|
|
||||||
|
|
||||||
#if os(macOS)
|
|
||||||
public typealias NSViewType = NSProgressIndicator
|
|
||||||
#elseif os(iOS) || os(tvOS)
|
|
||||||
public typealias UIViewType = UIActivityIndicatorView
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if os(iOS) || os(tvOS)
|
|
||||||
public func makeUIView(context: UIViewRepresentableContext<ActivityIndicator>) -> UIActivityIndicatorView {
|
|
||||||
let activityStyle: UIActivityIndicatorView.Style
|
|
||||||
switch style {
|
|
||||||
case .medium:
|
|
||||||
activityStyle = .medium
|
|
||||||
case .large:
|
|
||||||
activityStyle = .large
|
|
||||||
}
|
|
||||||
let indicator = UIActivityIndicatorView(style: activityStyle)
|
|
||||||
indicator.hidesWhenStopped = true
|
|
||||||
return indicator
|
|
||||||
}
|
|
||||||
|
|
||||||
public func updateUIView(_ uiView: UIActivityIndicatorView, context: UIViewRepresentableContext<ActivityIndicator>) {
|
|
||||||
isAnimating ? uiView.startAnimating() : uiView.stopAnimating()
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if os(macOS)
|
|
||||||
public func makeNSView(context: NSViewRepresentableContext<ActivityIndicator>) -> NSProgressIndicator {
|
|
||||||
let controlSize: NSControl.ControlSize
|
|
||||||
switch style {
|
|
||||||
case .medium:
|
|
||||||
controlSize = .small
|
|
||||||
case .large:
|
|
||||||
controlSize = .regular
|
|
||||||
}
|
|
||||||
let indicator = NSProgressIndicator()
|
|
||||||
indicator.style = .spinning
|
|
||||||
indicator.controlSize = controlSize
|
|
||||||
indicator.isDisplayedWhenStopped = false
|
|
||||||
return indicator
|
|
||||||
}
|
|
||||||
|
|
||||||
public func updateNSView(_ nsView: NSProgressIndicator, context: NSViewRepresentableContext<ActivityIndicator>) {
|
|
||||||
isAnimating ? nsView.startAnimation(nil) : nsView.stopAnimation(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
|
||||||
extension ActivityIndicator {
|
|
||||||
public enum Style {
|
|
||||||
case medium
|
|
||||||
case large
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -54,45 +54,44 @@ public struct IndicatorViewModifier<T> : ViewModifier where T : View {
|
||||||
|
|
||||||
public func body(content: Content) -> some View {
|
public func body(content: Content) -> some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
content.overlay(overlay, alignment: .center)
|
content
|
||||||
|
overlay
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if os(macOS) || os(iOS) || os(tvOS)
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
||||||
extension Indicator where T == ActivityIndicator {
|
extension Indicator where T == AnyView {
|
||||||
/// Activity Indicator
|
/// Activity Indicator
|
||||||
public static var activity: Indicator {
|
public static var activity: Indicator<T> {
|
||||||
Indicator { isAnimating, _ in
|
Indicator { isAnimating, _ in
|
||||||
ActivityIndicator(isAnimating)
|
AnyView(ProgressView().opacity(isAnimating.wrappedValue ? 1 : 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Activity Indicator with style
|
/// Activity Indicator with style
|
||||||
/// - Parameter style: style
|
/// - Parameter style: style
|
||||||
public static func activity(style: ActivityIndicator.Style) -> Indicator {
|
public static func activity(style: any ProgressViewStyle) -> Indicator<T> {
|
||||||
Indicator { isAnimating, _ in
|
Indicator { isAnimating, _ in
|
||||||
ActivityIndicator(isAnimating, style: style)
|
AnyView(ProgressView().progressViewStyle(style).opacity(isAnimating.wrappedValue ? 1 : 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
||||||
extension Indicator where T == ProgressIndicator {
|
extension Indicator where T == AnyView {
|
||||||
/// Progress Indicator
|
/// Progress Indicator
|
||||||
public static var progress: Indicator {
|
public static var progress: Indicator<T> {
|
||||||
Indicator { isAnimating, progress in
|
Indicator { isAnimating, progress in
|
||||||
ProgressIndicator(isAnimating, progress: progress)
|
AnyView(ProgressView(value: progress.wrappedValue).opacity(isAnimating.wrappedValue ? 1 : 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Progress Indicator with style
|
/// Progress Indicator with style
|
||||||
/// - Parameter style: style
|
/// - Parameter style: style
|
||||||
public static func progress(style: ProgressIndicator.Style) -> Indicator {
|
public static func progress(style: any ProgressViewStyle) -> Indicator<T> {
|
||||||
Indicator { isAnimating, progress in
|
Indicator { isAnimating, progress in
|
||||||
ProgressIndicator(isAnimating, progress: progress, style: style)
|
AnyView(ProgressView(value: progress.wrappedValue).progressViewStyle(style).opacity(isAnimating.wrappedValue ? 1 : 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the SDWebImage package.
|
|
||||||
* (c) DreamPiggy <lizhuoli1126@126.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
#if os(macOS) || os(iOS) || os(tvOS)
|
|
||||||
/// A progress bar indicator (system style)
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
|
||||||
public struct ProgressIndicator: PlatformViewRepresentable {
|
|
||||||
@Binding var isAnimating: Bool
|
|
||||||
@Binding var progress: Double
|
|
||||||
var style: Style
|
|
||||||
|
|
||||||
/// Create indicator with animation binding, progress binding and the style
|
|
||||||
/// - Parameters:
|
|
||||||
/// - isAnimating: The binding to control the animation
|
|
||||||
/// - progress: The binding to update the progress
|
|
||||||
/// - style: The indicator style
|
|
||||||
public init(_ isAnimating: Binding<Bool>, progress: Binding<Double>, style: Style = .default) {
|
|
||||||
self._isAnimating = isAnimating
|
|
||||||
self._progress = progress
|
|
||||||
self.style = style
|
|
||||||
}
|
|
||||||
|
|
||||||
#if os(macOS)
|
|
||||||
public typealias NSViewType = ProgressIndicatorWrapper
|
|
||||||
#elseif os(iOS) || os(tvOS)
|
|
||||||
public typealias UIViewType = ProgressIndicatorWrapper
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if os(iOS) || os(tvOS)
|
|
||||||
public func makeUIView(context: UIViewRepresentableContext<ProgressIndicator>) -> ProgressIndicatorWrapper {
|
|
||||||
let progressStyle: UIProgressView.Style
|
|
||||||
switch style {
|
|
||||||
#if os(iOS)
|
|
||||||
case .bar:
|
|
||||||
progressStyle = .bar
|
|
||||||
#endif
|
|
||||||
case .default:
|
|
||||||
progressStyle = .default
|
|
||||||
}
|
|
||||||
let uiView = ProgressIndicatorWrapper()
|
|
||||||
let view = uiView.wrapped
|
|
||||||
view.progressViewStyle = progressStyle
|
|
||||||
return uiView
|
|
||||||
}
|
|
||||||
|
|
||||||
public func updateUIView(_ uiView: ProgressIndicatorWrapper, context: UIViewRepresentableContext<ProgressIndicator>) {
|
|
||||||
let view = uiView.wrapped
|
|
||||||
if isAnimating {
|
|
||||||
view.setProgress(Float(progress), animated: true)
|
|
||||||
} else {
|
|
||||||
if progress == 0 {
|
|
||||||
view.isHidden = false
|
|
||||||
view.progress = 0
|
|
||||||
} else {
|
|
||||||
view.isHidden = true
|
|
||||||
view.progress = 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if os(macOS)
|
|
||||||
public func makeNSView(context: NSViewRepresentableContext<ProgressIndicator>) -> ProgressIndicatorWrapper {
|
|
||||||
let nsView = ProgressIndicatorWrapper()
|
|
||||||
let view = nsView.wrapped
|
|
||||||
view.style = .bar
|
|
||||||
view.isDisplayedWhenStopped = false
|
|
||||||
view.controlSize = .small
|
|
||||||
view.frame = CGRect(x: 0, y: 0, width: 160, height: 0) // Width from `UIProgressView` default width
|
|
||||||
view.sizeToFit()
|
|
||||||
view.autoresizingMask = [.maxXMargin, .minXMargin, .maxYMargin, .minYMargin]
|
|
||||||
return nsView
|
|
||||||
}
|
|
||||||
|
|
||||||
public func updateNSView(_ nsView: ProgressIndicatorWrapper, context: NSViewRepresentableContext<ProgressIndicator>) {
|
|
||||||
let view = nsView.wrapped
|
|
||||||
if isAnimating {
|
|
||||||
view.isIndeterminate = false
|
|
||||||
view.doubleValue = Double(progress) * 100
|
|
||||||
view.startAnimation(nil)
|
|
||||||
} else {
|
|
||||||
if progress == 0 {
|
|
||||||
view.isHidden = false
|
|
||||||
view.isIndeterminate = true
|
|
||||||
view.doubleValue = 0
|
|
||||||
view.stopAnimation(nil)
|
|
||||||
} else {
|
|
||||||
view.isHidden = true
|
|
||||||
view.isIndeterminate = false
|
|
||||||
view.doubleValue = 100
|
|
||||||
view.stopAnimation(nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
@available(iOS 14.0, OSX 11.0, tvOS 14.0, watchOS 7.0, *)
|
|
||||||
extension ProgressIndicator {
|
|
||||||
public enum Style {
|
|
||||||
case `default`
|
|
||||||
#if os(iOS)
|
|
||||||
case bar
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue