SwiftUIの複雑なレイアウト
余白をつけて、3分割する
GeometryReader { geometry in VStack { GeometryReader { geometry1 in HStack(spacing: 0) { Text("1").frame(width: geometry1.size.width / 3) .background(Color.green) Text("2").frame(width: geometry1.size.width / 3) .background(Color.orange) Text("3").frame(width: geometry1.size.width / 3) .background(Color.yellow) } .background(Color.blue) } } .frame(width: geometry.size.width * 0.9) .frame(width: geometry.size.width) } }
さらに分割
struct Main_Footer: View { var body: some View { GeometryReader { geometry in VStack { GeometryReader { geometry in HStack(spacing: 0) { Text("1").frame(width: geometry.size.width * 0.3) .background(Color.green) Text("2").frame(width: geometry.size.width * 0.4) .background(Color.orange) HStack(spacing: 0) { Text("3") .frame(maxWidth: .infinity) .background(Color.blue) Text("4") .frame(maxWidth: .infinity) .background(Color.black) } .frame(width: geometry.size.width * 0.3) .background(Color.yellow) } .background(Color.blue) } } .frame(width: geometry.size.width * 0.9) .frame(width: geometry.size.width) } } }
GeometryReader { geometry in VStack { GeometryReader { geometry in HStack(spacing: geometry.size.width * 0.03) { Text("1") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) Text("2") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white ) } } } .frame(width: geometry.size.width * 0.9, height: geometry.size.height) .frame(width: geometry.size.width) }
Bindingでデフォルト設定
struct Row: View { let title: String @Binding var value: String init(title: String , value: Binding<String> = .constant("未")) { self.title = title _value = value } var body: some View { HStack { Text(title) .font(.caption) Text(value) } } }
Codableでクラス継承対応
import UIKit var data = """ { "A": "A", "B": "B", "C": "C", } """ class A : Codable { var A:String = "A" enum CodingKeys: String, CodingKey { case A = "A" } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(A, forKey: .A) } } class B: A { var B:String = "B" enum CodingKeys: String, CodingKey { case B = "B" case A = "A" } override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(B, forKey: .B) try container.encode(A, forKey: .A) } } var b = B() b.A = "やべい" b.B = "すごい" var enc = try! JSONEncoder().encode(b) print(String(data: enc, encoding: .utf8)!) var a = A() a.A = "どすこい" var enc1 = try! JSONEncoder().encode(a) print(String(data: enc1, encoding: .utf8)!)