フレームワークとの統合

UIKit とのインターフェース






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







    PageViewController.swift


  1. import SwiftUI
  2. import UIKit
  3. struct PageViewController<Page: View>: UIViewControllerRepresentable {
  4. var pages: [Page]
  5. @Binding var currentPage: Int
  6. func makeCoordinator() -> Coordinator {
  7. Coordinator(self)
  8. }
  9. func makeUIViewController(context: Context) -> UIPageViewController {
  10. let pageViewController = UIPageViewController(
  11. transitionStyle: .scroll,
  12. navigationOrientation: .horizontal)
  13. pageViewController.dataSource = context.coordinator
  14. return pageViewController
  15. }
  16. func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
  17. pageViewController.setViewControllers(
  18. [context.coordinator.controllers[currentPage]], direction: .forward, animated: true)
  19. }
  20. class Coordinator: NSObject, UIPageViewControllerDataSource {
  21. var parent: PageViewController
  22. var controllers = [UIViewController]()
  23. init(_ pageViewController: PageViewController) {
  24. parent = pageViewController
  25. controllers = parent.pages.map { UIHostingController(rootView: $0) }
  26. }
  27. func pageViewController(
  28. _ pageViewController: UIPageViewController,
  29. viewControllerBefore viewController: UIViewController) -> UIViewController?
  30. {
  31. guard let index = controllers.firstIndex(of: viewController) else {
  32. return nil
  33. }
  34. if index == 0 {
  35. return controllers.last
  36. }
  37. return controllers[index - 1]
  38. }
  39. func pageViewController(
  40. _ pageViewController: UIPageViewController,
  41. viewControllerAfter viewController: UIViewController) -> UIViewController?
  42. {
  43. guard let index = controllers.firstIndex(of: viewController) else {
  44. return nil
  45. }
  46. if index + 1 == controllers.count {
  47. return controllers.first
  48. }
  49. return controllers[index + 1]
  50. }
  51. }
  52. }


    PageView.swift


  1. import SwiftUI
  2. struct PageView<Page: View>: View {
  3. var pages: [Page]
  4. @State private var currentPage = 0
  5. var body: some View {
  6. PageViewController(pages: pages, currentPage: $currentPage)
  7. }
  8. }
  9. struct PageView_Previews: PreviewProvider {
  10. static var previews: some View {
  11. PageView(pages: ModelData().features.map { FeatureCard(landmark: $0) })
  12. .aspectRatio(3 / 2, contentMode: .fit)
  13. }
  14. }


プレビューその 1



    PageView.swift


  1. struct PageView<Page: View>: View {
  2. var pages: [Page]
  3. @State private var currentPage = 1
  4. var body: some View {


プレビューその 2



    PageView.swift


  1. struct PageView<Page: View>: View {
  2. var pages: [Page]
  3. @State private var currentPage = 0
  4. var body: some View {
  5. VStack {
  6. PageViewController(pages: pages, currentPage: $currentPage)
  7. Text("Current Page: \(currentPage)")
  8. }
  9. }
  10. }
  11. struct PageView_Previews: PreviewProvider {
  12. static var previews: some View {
  13. PageView(pages: ModelData().features.map { FeatureCard(landmark: $0) })
  14. .aspectRatio(3 / 2, contentMode: .fit)
  15. }
  16. }


プレビューその 3



    PageViewController.swift


  1. [context.coordinator.controllers[currentPage]], direction: .forward, animated: true)
  2. }
  3. class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
  4. var parent: PageViewController
  5. var controllers = [UIViewController]()



  1. return controllers[index + 1]
  2. }
  3. func pageViewController(
  4. _ pageViewController: UIPageViewController,
  5. didFinishAnimating finished: Bool,
  6. previousViewControllers: [UIViewController],
  7. transitionCompleted completed: Bool) {
  8. if completed,
  9. let visibleViewController = pageViewController.viewControllers?.first,
  10. let index = controllers.firstIndex(of: visibleViewController) {
  11. parent.currentPage = index
  12. }
  13. }
  14. }
  15. }


    PageViewController.swift


  1. navigationOrientation: .horizontal)
  2. pageViewController.dataSource = context.coordinator
  3. pageViewController.delegate = context.coordinator
  4. return pageViewController


プログラム全体








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