はじめに
通信するアプリには必ずローディング画面があると思います。
ローディング画面で必須になってくるのがProgressView
だと思います。
しかし、SwiftUIのProgressView
ちっさすぎません???
いまいちイケてないのでもうちょっと大きくしたいです。
大きくした時のことをここに記録しておきます。
実装
import SwiftUI
struct ScaleEffectProgressView: View {
private let scaleEffect: CGFloat
init(_ scaleEffect: CGFloat) {
self.scaleEffect = scaleEffect
}
var body: some View {
ProgressView()
.progressViewStyle(.circular)
.scaleEffect(scaleEffect)
.frame(width: scaleEffect * 20, height: scaleEffect * 20)
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
ScaleEffectProgressView(3)
}
}
解説
ProgressView
はframe
では大きさが変わりません。
大きさを変更するにはscaleEffect
を使用する必要があります。
struct ScaleEffectProgressView: View {
private let scaleEffect: CGFloat
init(_ scaleEffect: CGFloat) {
self.scaleEffect = scaleEffect
}
var body: some View {
ProgressView()
.progressViewStyle(.circular)
+ .scaleEffect(scaleEffect)
}
}
これでもいい感じに思います。
しかし、これでは問題があります。
以下のように縦に並べてみます。
struct ContentView: View {
var body: some View {
VStack(spacing: 0) {
ScaleEffectProgressView(3)
Text("テスト")
}
}
}
そうすると重なってしまいます。
ProgressView
に背景色をつけて確認してみます。
このようにscaleEffect
はコンポーネント自体の領域は広がらないみたいです。
ですのでframe
を使用してコンポーネント自体の領域を広げる必要があります。
scaleEffect
で指定した数値の20倍でちょうどいい大きさになります。
struct ScaleEffectProgressView: View {
private let scaleEffect: CGFloat
init(_ scaleEffect: CGFloat) {
self.scaleEffect = scaleEffect
}
var body: some View {
ProgressView()
.progressViewStyle(.circular)
.scaleEffect(scaleEffect)
.frame(width: scaleEffect * 20, height: scaleEffect * 20)
.background(Color.red)
}
}
おわり
ProgressView
にラベルなどをつける場合にはもう少し考えないといけなそうです。