Pada Xcode 12 beta ( iOS 14 ), pandangan baru yang disebut ProgressViewadalah tersedia untuk pengembang , dan yang dapat menampilkan baik determinate dan kemajuan tak tentu.
Gayanya ditetapkan secara default CircularProgressViewStyle, persis seperti yang kita cari.
var body: some View {
VStack {
ProgressView()
}
}
Xcode 11.x
Cukup banyak tampilan yang belum terwakili SwiftUI, tetapi mudah untuk memasukkannya ke dalam sistem. Anda perlu membungkus UIActivityIndicatordan membuatnya UIViewRepresentable.
(Lebih lanjut tentang ini dapat ditemukan dalam pembicaraan WWDC 2019 yang luar biasa - Mengintegrasikan SwiftUI )
struct ActivityIndicator: UIViewRepresentable {
@Binding var isAnimating: Bool
let style: UIActivityIndicatorView.Style
func makeUIView(context: UIViewRepresentableContext<ActivityIndicator>) -> UIActivityIndicatorView {
return UIActivityIndicatorView(style: style)
}
func updateUIView(_ uiView: UIActivityIndicatorView, context: UIViewRepresentableContext<ActivityIndicator>) {
isAnimating ? uiView.startAnimating() : uiView.stopAnimating()
}
}
Kemudian Anda dapat menggunakannya sebagai berikut - berikut adalah contoh overlay pemuatan.
Catatan: Saya lebih suka menggunakan ZStack, daripada overlay(:_), jadi saya tahu persis apa yang terjadi dalam implementasi saya.
struct LoadingView<Content>: View where Content: View {
@Binding var isShowing: Bool
var content: () -> Content
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .center) {
self.content()
.disabled(self.isShowing)
.blur(radius: self.isShowing ? 3 : 0)
VStack {
Text("Loading...")
ActivityIndicator(isAnimating: .constant(true), style: .large)
}
.frame(width: geometry.size.width / 2,
height: geometry.size.height / 5)
.background(Color.secondary.colorInvert())
.foregroundColor(Color.primary)
.cornerRadius(20)
.opacity(self.isShowing ? 1 : 0)
}
}
}
}
Untuk mengujinya, Anda dapat menggunakan kode contoh ini:
struct ContentView: View {
var body: some View {
LoadingView(isShowing: .constant(true)) {
NavigationView {
List(["1", "2", "3", "4", "5"], id: \.self) { row in
Text(row)
}.navigationBarTitle(Text("A List"), displayMode: .large)
}
}
}
}
Hasil:
