SwiftUI Essentials (SwiftUI の本質)

パスとシェイプの描画





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








    BadgeBackground.swift


  1. import SwiftUI
  2. struct BadgeBackground: View {
  3. var body: some View {
  4. Path { path in
  5. }
  6. .fill(Color.black)
  7. }
  8. }
  9. struct BadgeBackground_Previews: PreviewProvider {
  10. static var previews: some View {
  11. BadgeBackground()
  12. }
  13. }



上に示したリストの 6 行目以下を、下のように書き換えます。


    BadgeBackground.swift


  1. Path { path in
  2. var width: CGFloat = 100.0
  3. let height = width
  4. path.move(
  5. to: CGPoint(
  6. x: width * 0.95,
  7. y: height * 0.20
  8. )
  9. )
  10. HexagonParameters.segments.forEach { segment in
  11. path.addLine(
  12. to: CGPoint(
  13. x: width * segment.line.x,
  14. y: height * segment.line.y
  15. )
  16. )
  17. }
  18. }
  19. .fill(Color.black)



プレビュー



上に示したリストの 11 行目、及び 22 行目以下を、下のように書き換えます。


    BadgeBackground.swift


  1. x: width * 0.95,
  2. y: height * (0.20 + HexagonParameters.adjustment)
  3. )



  1. )
  2. path.addQuadCurve(
  3. to: CGPoint(
  4. x: width * segment.curve.x,
  5. y: height * segment.curve.y
  6. ),
  7. control: CGPoint(
  8. x: width * segment.control.x,
  9. y: height * segment.control.y
  10. )
  11. )
  12. }



プレビューその 1



    BadgeBackground.swift


  1. import SwiftUI
  2. struct BadgeBackground: View {
  3. var body: some View {
  4. GeometryReader { geometry in
  5. Path { path in
  6. var width: CGFloat = min(geometry.size.width, geometry.size.height)
  7. let height = width
  8. path.move(
  9. to: CGPoint(
  10. x: width * 0.95,
  11. y: height * (0.20 + HexagonParameters.adjustment)
  12. )
  13. )
  14. HexagonParameters.segments.forEach { segment in
  15. path.addLine(
  16. to: CGPoint(
  17. x: width * segment.line.x,
  18. y: height * segment.line.y
  19. )
  20. )
  21. path.addQuadCurve(
  22. to: CGPoint(
  23. x: width * segment.curve.x,
  24. y: height * segment.curve.y
  25. ),
  26. control: CGPoint(
  27. x: width * segment.control.x,
  28. y: height * segment.control.y
  29. )
  30. )
  31. }
  32. }
  33. .fill(Color.black)
  34. }
  35. }
  36. }
  37. struct BadgeBackground_Previews: PreviewProvider {
  38. static var previews: some View {
  39. BadgeBackground()
  40. }
  41. }


プレビューその 2



上記のリストの 9 行目以下、11 行目、19 行目、26 行目、30 行目を下のように書き換えます。全体としてリストは こちらのリスト 1 のようになります。


    BadgeBackground.swift


  1. let height = width
  2. let xScale: CGFloat = 0.832
  3. let xOffset = (width * (1.0 - xScale)) / 2.0
  4. width *= xScale
  5. path.move(
  6. to: CGPoint(
  7. x: width * 0.95 + xOffset,
  8. y: height * (0.20 + HexagonParameters.adjustment)
  9. )



  1. to: CGPoint(
  2. x: width * segment.line.x + xOffset,
  3. y: height * segment.line.y



  1. to: CGPoint(
  2. x: width * segment.curve.x + xOffset,
  3. y: height * segment.curve.y
  4. ),
  5. control: CGPoint(
  6. x: width * segment.control.x + xOffset,
  7. y: height * segment.control.y



プレビューその 3



リスト 1 の、39 行目以下をこのように書き足します。


    BadgeBackground.swift


  1. }
  2. .fill(LinearGradient(
  3. gradient: Gradient(colors: [Self.gradientStart, Self.gradientEnd]),
  4. startPoint: UnitPoint(x: 0.5, y: 0),
  5. endPoint: UnitPoint(x: 0.5, y: 0.6)
  6. ))
  7. }
  8. }
  9. static let gradientStart = Color(red: 239.0 / 255, green: 120.0 / 255, blue: 221.0 / 255)
  10. static let gradientEnd = Color(red: 239.0 / 255, green: 172.0 / 255, blue: 120.0 / 255)
  11. }
  12. struct BadgeBackground_Previews: PreviewProvider {



プレビューその 4



上記のリストの 44 行目と 45 行目の間に、以下のように書き足します。


    BadgeBackground.swift


  1. }
  2. .aspectRatio(1, contentMode: .fit)
  3. }



プレビューその 5



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

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    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