ScrollViewとGeometryReaderでミッションの詳細を表示する
Showing mission details with ScrollView and GeometryReader
MissionView.swift</strong
import SwiftUI struct MissionView: View { let mission: Mission var body: some View { GeometryReader { geometry in ScrollView(.vertical) { VStack { Image(self.mission.image) .resizable() .scaledToFit() .frame(maxWidth: geometry.size.width * 0.7) .padding(.top) Text(self.mission.description) .padding() Spacer(minLength: 25) } } } .navigationBarTitle(Text(mission.displayName), displayMode: .inline) } } struct MissionView_Previews: PreviewProvider { static let missions: [Mission] = Bundle.main.decode("missions.json") static var previews: some View { MissionView(mission: missions[0]) } }
first(where :)を使用したCodable構造体のマージ
Merging Codable structs using first(where:)
first(where:)
import SwiftUI struct MissionView: View { //---------------- struct CrewMember { let role: String let astronaut: Astronaut } let astronauts: [CrewMember] let mission: Mission //---------------- init(mission: Mission, astronauts: [Astronaut]) { self.mission = mission var matches = [CrewMember]() for member in mission.crew { if let match = astronauts.first(where: { $0.id == member.name }) { matches.append(CrewMember(role: member.role, astronaut: match)) } else { fatalError("Missing \(member)") } } self.astronauts = matches } //---------------- var body: some View { GeometryReader { geometry in ScrollView(.vertical) { VStack { Image(self.mission.image) .resizable() .scaledToFit() .frame(maxWidth: geometry.size.width * 0.7) .padding(.top) Text(self.mission.description) .padding() ForEach(self.astronauts, id: \.role) { crewMember in NavigationLink(destination: AstronautView(astronaut: crewMember.astronaut)) { HStack { Image(crewMember.astronaut.id) .resizable() .frame(width: 83, height: 60) .clipShape(Capsule()) .overlay(Capsule().stroke(Color.primary, lineWidth: 1)) VStack(alignment: .leading) { Text(crewMember.astronaut.name) .font(.headline) Text(crewMember.role) .foregroundColor(.secondary) } Spacer() } .padding(.horizontal) }.buttonStyle(PlainButtonStyle()) } Spacer(minLength: 25) } } } .navigationBarTitle(Text(mission.displayName), displayMode: .inline) } } struct MissionView_Previews: PreviewProvider { static let missions: [Mission] = Bundle.main.decode("missions.json") static let astronauts: [Astronaut] = Bundle.main.decode("astronauts.json") static var previews: some View { MissionView(mission: missions[0], astronauts: astronauts) } }
buttonStyle()およびlayoutPriority()の問題の修正
Fixing problems with buttonStyle() and layoutPriority()
↑
2番目のバグについては、まったく表示されなかった可能性もあります。これは、SwiftUI自体のバグのようです。そのため、将来のリリースで修正されるか、特定のデバイスにのみ影響する可能性があります構成。したがって、私と同じiPhoneシミュレーターを使用しているときにこのバグが存在しない場合は、解決されている可能性があります。