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シミュレーターを使用しているときにこのバグが存在しない場合は、解決されている可能性があります。