はじめに
こんにちは!
アプリ開発が好きで、Swiftの勉強をしている大学生です。
温かい目で見ていただけると幸いです。
解決したい問題
HStack内
にImage
とText
を並べる際はLabel
を使って表現すると、なんだかいい感じです👍
struct HogeView: View {
var body: some View {
// ① 🔺
HStack {
Image(systemName: "person")
.resizable()
.frame(width: 50, height: 50)
.background(.red)
.clipShape(Circle())
Text("hoge")
.font(.system(size: 24))
}
// ② ⭕️
Label {
Text("hoge")
.font(.system(size: 24))
} icon: {
Image(systemName: "person")
.resizable()
.frame(width: 50, height: 50)
.background(.red)
.clipShape(Circl
}
}
}
しかし、上記のようにLabelを使った書き方の時に、以下のような場合で不便に感じました。
-
Label
のtitle
クロージャー内でText
を二つを並べたい時にAligment
がずれてしまう -
Image
とText
の間隔をさらに広げたい時。
例: ☟
struct HogeView: View {
var body: some View {
Label {
VStack {
Text("テスト")
.font(.system(size: 24))
Text("テスト")
.font(.system(size: 24))
}
} icon: {
Image(systemName: "person")
.resizable()
.frame(width: 50, height: 50)
.background(.red)
.clipShape(Circle())
}
}
}
もちろんLabel
を使わなければ解決できますが、どうせならLabel
を利用したまま解決していきたいと思います。
解決方法
下記のコードを実装します。
struct MyLabelStyle: LabelStyle {
func makeBody(configuration: Configuration) -> some View {
HStack(alignment: .center, spacing: 30) {
configuration.icon
configuration.title
}
}
}
LabelStyle
を準拠させたMyLabelStyle
を作り、引数のconfiguration
を必要に応じていじったり、HStack
のalignment
やspacing
を変えることによって自由にLabel
を変えることができます!
今回はspacing
とalignment
を変えたいので、上記のようなコードを定義しました。
これを先ほどのコードで呼び出します
struct Test02View: View {
var body: some View {
Label {
VStack {
Text("テスト")
.font(.system(size: 24))
Text("テスト")
.font(.system(size: 24))
}
} icon: {
Image(systemName: "person")
.resizable()
.frame(width: 50, height: 50)
.background(.red)
.clipShape(Circle())
}
.labelStyle(MyLabelStyle()) // <- 追加
}
}
下記のように期待通りの結果となります。
Label
だけでなく、様々なView
にHogeHogeStyle
が用意されてるので、色々できそうです!
終わりに
誰かの役に立つことができていれば幸いです。
間違い等がありましたらご指摘していただけると幸いです🙏
参考