画面遷移をつける
チュートリアルより ホーム画面から遷移するコードを書く。
struct CategoryHome: View { // リストをcategory名をキーに辞書化している。 var categories: [String :[Landmark]] { Dictionary ( grouping: landmarkData, by: { $0.category.rawValue } ) } // お気に入りリスト var featuered : [Landmark] { landmarkData.filter { $0.isFeatured } } @State var showingProfile = false // プロフィールボタン var profileButton: some View { Button(action: { self.showingProfile.toggle() }) { Image(systemName: "person.crop.circle") .imageScale(.large) .accessibility(label: Text("User Profile")) .padding() } } var body: some View { // ここで囲まれている部分が画面遷移する。 NavigationView { List { // お気に入りは大きめにする。 FeaturedLandmarks(landmarks: featuered) .scaledToFill() .frame(height:200) .clipped() .listRowInsets(EdgeInsets()) // 各カテゴリーごとに縦にリスト ForEach(categories.keys.sorted(), id: \.self) {key in CategoryRow(categoryName: key, items: self.categories[key]!) } .listRowInsets(EdgeInsets()) // 画面の左右の余白の削除 // 画面遷移 NavigationLink(destination: LandmarkList()) { Text("See All") } } .navigationBarTitle("Featured") .navigationBarItems(trailing: profileButton) // プロフィールボタンをナビバーの右側に配置 .sheet(isPresented: $showingProfile) { Text("User Profile") // プロフィール画面をシートで出す } } } } // お気にいりの画像はリサイズ struct FeaturedLandmarks: View { var landmarks: [Landmark] var body: some View { landmarks[0].image.resizable() } } struct CategoryHome_Previews: PreviewProvider { static var previews: some View { CategoryHome() } }
struct CategoryRow: View { var categoryName: String var items: [Landmark] var body: some View { VStack { // カテゴリ名 Text(self.categoryName) .font(.headline) .padding(.leading, 15) .padding(.top, 5) // 横スクロール ScrollView(.horizontal, showsIndicators: false) { HStack(alignment: .top, spacing: 0.0 ) { ForEach(self.items) { landmark in // 詳細画面へのリンク NavigationLink(destination: LandmarkDetail(landmark: landmark)) { CategoryItem(landmark:landmark) } } } } .frame(height:185) } } } struct CategoryItem: View { var landmark: Landmark var body: some View { VStack(alignment: .leading) { landmark.image .renderingMode(.original) .resizable() .frame(width: 155, height: 155) .cornerRadius(5) Text(landmark.name) .foregroundColor(.primary) .font(.caption) } .padding(.leading, 15) } } struct CategoryRow_Previews: PreviewProvider { static var previews: some View { CategoryRow(categoryName: landmarkData[0].category.rawValue, items: Array(landmarkData.prefix(3)) ) } }