ProgressView はタスクが進行中であることを表現するための View です。
今回は、ProgressView の使用方法について説明します。
OS: macOS Big Sur 11.5.2
Xcode: 12.5.1
Swift: 5.2.4
ProgressView の基本的な構文は以下の通りです。
第1引数には進捗状況を表す文字列、第2引数は現在の進捗状況を表す値を指定します。
ProgressView は100% という値を「1.0」という値で持っていますので、value に0.5 を指定すると 50% 進捗していることを表すことができます。
Picker("進捗状況を表す文字列", value: 現在値) {
// 選択可能な複数の項目
}
以下は、「Downloading…」という文字列を表示し、進捗率を50%で表示する ProgressView の例です。
struct ContentView: View {
@State private var progressValue = 0.5
var body: some View {
VStack {
ProgressView("Downloading…", value: progressValue)
}
}
}
progressViewStyle モディファイアの引き数に「CircularProgressViewStyle()」を指定すると、スタイルを円形ゲージに変更することができます。
struct ContentView: View {
@State private var progressValue = 0.5
var body: some View {
VStack {
ProgressView("Downloading…", value: progressValue)
.progressViewStyle(CircularProgressViewStyle())
}
}
}
ここでは、タイマーを使用して、進捗していく様子を確認できるようにした例を示します。
タイマーは Timer.publish を使用することとしました。引数の every はタイマーが何秒おきに起動するか、on引数はタイマーが起動するスレッドがどこか(.main、.current)、in引数はタイマーを実行する時のループモードを指定します。
作成したタイマーは onReceive で受け取ることができます。この例では、progressValue が100 未満の間、タイマーが起動し続けます。
struct ContentView: View {
@State private var progressValue = 0.0
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
ProgressView("Downloading…", value: progressValue, total: 100)
.onReceive(timer) { _ in
if progressValue < 100 {
progressValue += 1
}
}
}
}