iOS14以降であれば、以下のように書くことで Text
を使ってテキストと画像をひとかたまりの View
として表示できます。
Text("Moon \(Image(systemName: "moon"))")
テキストと画像が混在したものを 動的 に作り出したい場合、以下のように LocalizedStringKey
を生成する必要があります。
import SwiftUI
struct Item {
let label: String
let symbol: String
}
struct ContentView: View {
let items: [Item]
var body: some View {
Text(string())
.font(.system(size: 40))
.foregroundColor(.blue)
}
private func string() -> LocalizedStringKey {
// LocalizedStringKey.StringInterpolationでフォーマット
var interpolation = LocalizedStringKey.StringInterpolation(literalCapacity: 100, interpolationCount: items.count * 2)
items.forEach { item in
interpolation.appendInterpolation(Image(systemName: item.symbol))
interpolation.appendInterpolation("\(item.label) ")
}
return .init(stringInterpolation: interpolation)
}
}
struct ContentView_Previews: PreviewProvider {
private static let items: [Item] = [
.init(label: "Sun", symbol: "sun.max"),
.init(label: "Moon", symbol: "moon"),
.init(label: "Globe", symbol: "globe")
]
static var previews: some View {
ContentView(items: items)
}
}
ちなみに Text
は +
で連結することもできるので、以下のようにもできます。
private func text() -> Text {
return items.reduce(Text("")) { text, item in
return text + Text(Image(systemName: item.symbol)) + Text("\(item.label) ")
}
}
折り返しにも対応できていいですね!