フレームワークとの統合

UIKit とのインターフェース


SwiftUI は、すべての Apple プラットフォームの既存の UI フレームワークとシームレスに連携します。たとえば、UIKit ビューとビューコントローラを SwiftUI ビュー内に配置したり、その逆を行うことができます。


このチュートリアルでは、注目のランドマークをホームスクリーンから変換して、UIPageViewControllerUIPageControl のインスタンスを包み込む方法を示します。 UIPageViewController を使用して SwiftUI ビューの盛り上がりを表示し、状態変数と拘束を使用して、ユーザインターフェイス全体でのデータの更新を調整します。


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



25min


予想される時間

プロジェクト
ファイル

Xcode 12





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







    PageViewController.swift


  1. import SwiftUI
  2. import UIKit
  3. struct PageViewController<Page: View>: UIViewControllerRepresentable {
  4. var pages: [Page]
  5. }


上記のリストの 7 行目を以下のように書き足します。



    PageViewController.swift


  1. var pages: [Page]
  2. func makeUIViewController(context: Context) -> UIPageViewController {
  3. let pageViewController = UIPageViewController(
  4. transitionStyle: .scroll,
  5. navigationOrientation: .horizontal)
  6. return pageViewController
  7. }
  8. }







上記のリストの 14 行目を以下のように書き足します。



    PageViewController.swift


  1. return pageViewController
  2. }
  3. func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
  4. pageViewController.setViewControllers(
  5. [UIHostingController(rootView: pages[0])], direction: .forward, animated: true)
  6. }
  7. }




    Landmark.swift


  1. import Foundation
  2. import SwiftUI
  3. import CoreLocation
  4. struct Landmark: Hashable, Codable, Identifiable {
  5. var id: Int
  6. var name: String
  7. var park: String
  8. var state: String
  9. var description: String
  10. var isFavorite: Bool
  11. var isFeatured: Bool
  12. var category: Category
  13. enum Category: String, CaseIterable, Codable, Hashable {
  14. case lakes = "Lakes"
  15. case rivers = "Rivers"
  16. case mountains = "Mountains"
  17. }
  18. private var imageName: String
  19. var image: Image {
  20. Image(imageName)
  21. }
  22. var featureImage: Image? {
  23. isFeatured ? Image(imageName + "_feature") : nil
  24. }
  25. private var coordinates: Coordinates
  26. var locationCoordinate: CLLocationCoordinate2D {
  27. CLLocationCoordinate2D(
  28. latitude: coordinates.latitude,
  29. longitude: coordinates.longitude)
  30. }
  31. struct Coordinates: Hashable, Codable {
  32. var latitude: Double
  33. var longitude: Double
  34. }
  35. }


    FeatureCard.swift


  1. import SwiftUI
  2. struct FeatureCard: View {
  3. var landmark: Landmark
  4. var body: some View {
  5. landmark.featureImage?
  6. .resizable()
  7. .aspectRatio(3 / 2, contentMode: .fit)
  8. }
  9. }
  10. struct FeatureCard_Previews: PreviewProvider {
  11. static var previews: some View {
  12. FeatureCard(landmark: ModelData().features[0])
  13. }
  14. }


プレビューその 1


    FeatureCard.swift


  1. .resizable()
  2. .aspectRatio(3 / 2, contentMode: .fit)
  3. .overlay(TextOverlay(landmark: landmark))
  4. }
  5. }
  6. struct TextOverlay: View {
  7. var landmark: Landmark
  8. var gradient: LinearGradient {
  9. LinearGradient(
  10. gradient: Gradient(
  11. colors: [Color.black.opacity(0.6), Color.black.opacity(0)]),
  12. startPoint: .bottom,
  13. endPoint: .center)
  14. }
  15. var body: some View {
  16. ZStack(alignment: .bottomLeading) {
  17. Rectangle().fill(gradient)
  18. VStack(alignment: .leading) {
  19. Text(landmark.name)
  20. .font(.title)
  21. .bold()
  22. Text(landmark.park)
  23. }
  24. .padding()
  25. }
  26. .foregroundColor(.white)
  27. }
  28. }
  29. struct FeatureCard_Previews: PreviewProvider {
  30. static var previews: some View {
  31. FeatureCard(landmark: ModelData().features[0])
  32. }
  33. }


プレビューその 2


    PageView.swift


  1. import SwiftUI
  2. struct PageView<Page: View>: View {
  3. var pages: [Page]
  4. var body: some View {
  5. PageViewController(pages: pages)
  6. }
  7. }
  8. struct PageView_Previews: PreviewProvider {
  9. static var previews: some View {
  10. PageView()
  11. }
  12. }


    PageView.swift


  1. struct PageView_Previews: PreviewProvider {
  2. static var previews: some View {
  3. PageView(pages: ModelData().features.map { FeatureCard(landmark: $0) })
  4. .aspectRatio(3 / 2, contentMode: .fit)
  5. }
  6. }


プレビューその 3






セクション 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