アプリのデザインとレイアウト

UI コントロールを扱う


ランドマークアプリでは、ユーザは自分の個性を表現するためのプロファイルを作成できます。ユーザがプロフィールを変更できるようにするには、編集モードを追加して設定スクリーンをデザインします。


データ入力用のさまざまな一般的なユーザーインターフェースコントロールを使用して、ユーザが変更を保存するたびにランドマークモデルの型を更新します。


手順に従ってこのプロジェクトをビルドするか、完成したプロジェクトをダウンロードして自分で探索してください。



25min


予想される時間

プロジェクト
ファイル

Xcode 12





訳注:以下、必要な場所においては Mac と iPhone 両方のセクションを提供しています。
Mac → セクション 1、iPhone → セクション 101 とします。






    Profile.swift


  1. import Foundation
  2. struct Profile {
  3. var username: String
  4. var prefersNotifications = true
  5. var seasonalPhoto = Season.winter
  6. var goalDate = Date()
  7. static let `default` = Profile(username: "g_kumar")
  8. enum Season: String, CaseIterable, Identifiable {
  9. case spring = "🌷"
  10. case summer = "🌞"
  11. case autumn = "🍂"
  12. case winter = "☃️"
  13. var id: String { self.rawValue }
  14. }
  15. }


    ProfileHost.swift


  1. import SwiftUI
  2. struct ProfileHost: View {
  3. @State private var draftProfile = Profile.default
  4. var body: some View {
  5. Text("Profile for: \(draftProfile.username)")
  6. }
  7. }
  8. struct ProfileHost_Previews: PreviewProvider {
  9. static var previews: some View {
  10. ProfileHost()
  11. }
  12. }


プレビュー その 1



    ProfileSummary.swift


  1. import SwiftUI
  2. struct ProfileSummary: View {
  3. var profile: Profile
  4. var body: some View {
  5. ScrollView {
  6. VStack(alignment: .leading, spacing: 10) {
  7. Text(profile.username)
  8. .bold()
  9. .font(.title)
  10. Text("Notifications: \(profile.prefersNotifications ? "On": "Off" )")
  11. Text("Seasonal Photos:
    \(profile.seasonalPhoto.rawValue)"
    )
  12. Text("Goal Date: ") + Text(profile.goalDate, style: .date)
  13. }
  14. }
  15. }
  16. }
  17. struct ProfileSummary_Previews: PreviewProvider {
  18. static var previews: some View {
  19. ProfileSummary(profile: Profile.default)
  20. }
  21. }


プレビュー その 2



    ProfileHost.swift


  1. @State private var draftProfile = Profile.default
  2. var body: some View {
  3. VStack(alignment: .leading, spacing: 20) {
  4. ProfileSummary(profile: draftProfile)
  5. }
  6. .padding()
  7. }
  8. }


プレビュー その 3



    HikeBadge.swift


  1. import SwiftUI
  2. struct HikeBadge: View {
  3. var name: String
  4. var body: some View {
  5. VStack(alignment: .center) {
  6. Badge()
  7. .frame(width: 300, height: 300)
  8. .scaleEffect(1.0 / 3.0)
  9. .frame(width: 100, height: 100)
  10. Text(name)
  11. .font(.caption)
  12. .accessibilityLabel("Badge for \(name).")
  13. }
  14. }
  15. }
  16. struct HikeBadge_Previews: PreviewProvider {
  17. static var previews: some View {
  18. HikeBadge(name: "Preview Testing")
  19. }
  20. }


プレビュー その 4



    ProfileSummary.swift


  1. import SwiftUI
  2. struct ProfileSummary: View {
  3. var profile: Profile
  4. var body: some View {
  5. ScrollView {
  6. VStack(alignment: .leading, spacing: 10) {
  7. Text(profile.username)
  8. .bold()
  9. .font(.title)
  10. Text("Notifications: \(profile.prefersNotifications ? "On": "Off" )")
  11. Text("Seasonal Photos:
    \(profile.seasonalPhoto.rawValue)"
    )
  12. Text("Goal Date: ") + Text(profile.goalDate, style: .date)
  13. Divider()
  14. VStack(alignment: .leading) {
  15. Text("Completed Badges")
  16. .font(.headline)
  17. ScrollView(.horizontal) {
  18. HStack {
  19. HikeBadge(name: "First Hike")
  20. HikeBadge(name: "Earth Day")
  21. .hueRotation(Angle(degrees: 90))
  22. HikeBadge(name: "Tenth Hike")
  23. .grayscale(0.5)
  24. .hueRotation(Angle(degrees: 45))
  25. }
  26. .padding(.bottom)
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }
  33. struct ProfileSummary_Previews: PreviewProvider {
  34. static var previews: some View {
  35. ProfileSummary(profile: Profile.default)
  36. }
  37. }


プレビュー その 5



    ProfileSummary.swift


  1. import SwiftUI
  2. struct ProfileSummary: View {
  3. @EnvironmentObject var modelData: ModelData
  4. var profile: Profile



  1. }
  2. }
  3. Divider()
  4. VStack(alignment: .leading) {
  5. Text("Recent Hikes")
  6. .font(.headline)
  7. HikeView(hike: modelData.hikes[0])
  8. }
  9. }
  10. }



  1. static var previews: some View {
  2. ProfileSummary(profile: Profile.default)
  3. .environmentObject(ModelData())
  4. }
  5. }


プログラム全体 その 1


プレビュー その 6



    CategoryHome.swift


  1. import SwiftUI
  2. struct CategoryHome: View {
  3. @EnvironmentObject var modelData: ModelData
  4. @State private var showingProfile = false
  5. var body: some View {
  6. NavigationView {
  7. List {
  8. modelData.features[0].image
  9. .resizable()
  10. .scaledToFill()
  11. .frame(height: 200)
  12. .clipped()
  13. .listRowInsets(EdgeInsets())
  14. ForEach(modelData.categories.keys.sorted(), id: \.self) { key in
  15. CategoryRow(categoryName: key, items: modelData.categories[key]!)
  16. }
  17. .listRowInsets(EdgeInsets())
  18. }
  19. .navigationTitle("Featured")
  20. .toolbar {
  21. Button(action: { showingProfile.toggle() }) {
  22. Image(systemName: "person.crop.circle")
  23. .accessibilityLabel("User Profile")
  24. }
  25. }
  26. .sheet(isPresented: $showingProfile) {
  27. ProfileHost()
  28. .environmentObject(modelData)
  29. }
  30. }
  31. }
  32. }
  33. struct CategoryHome_Previews: PreviewProvider {
  34. static var previews: some View {
  35. CategoryHome()
  36. .environmentObject(ModelData())
  37. }
  38. }


プレビュー その 7



    CategoryHome.swift


  1. .listRowInsets(EdgeInsets())
  2. }
  3. .listStyle(InsetListStyle())
  4. .navigationTitle("Featured")
  5. .toolbar {


プレビュー その 8







セクション 1セクション 2
セクション 3セクション 4
セクション 101セクション 102
セクション 103セクション 104






目次
Xcode の新機能

フレームワーク

  • SwiftUI

  • ビューの作成と結合

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    ビルドリストとナビゲーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7

    セクション 8


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107

    セクション 108

    ユーザー入力の処理

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    パスとシェイプの描画

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    ビューと移行のアニメーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    複雑なインターフェースの構成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    UI コントロールを扱う

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    UIKit とのインターフェース

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    watchOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    macOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107