前提
- 動く破線の実装をしており、参考にしたコードの中で分からない記述があります。
発生している問題・エラーメッセージ
- 下記の
dashPhase
の指定でなぜうまく動いているのかがわかりません。 - 私の考えでは今回
dashPattern.reduce(0){$0 + $1} = 26
なので、以下のように動くように思います。dashPhase
が-26
からスタートするdashPhase
が26
となり右に52
だけアニメーションして動く(順方向に動く)dashPhase
が-26
となり左に52
だけアニメーションして動く(逆向きに動く)- (以上を繰り返し)
- しかし実際はずっと右方向に動いているようなアニメーションとして動作します。コード中でどのような処理になっているのでしょうか。
swift
1dashPhase: marching 2? -dashPattern.reduce(0){$0 + $1} 3: dashPattern.reduce(0){$0 + $1}))
該当のソースコード
swift
1import SwiftUI 2 3struct RopeView: View { 4 5 // MARK: - Properties 6 7 let startPoint: CGPoint = .init(x: 50, y: 100) 8 let endPoint: CGPoint = .init(x: 400, y: 100) 9 private let dashPattern: [CGFloat] = [12, 14] 10 @State private var marching = true 11 12 // MARK: - LifeCycle 13 14 // MARK: - View 15 16 var body: some View { 17 Path { path in 18 path.move(to: startPoint) 19 path.addLine(to: endPoint) 20 } 21 .stroke(style: StrokeStyle( 22 lineWidth: 8, 23 miterLimit: 10, 24 dash: dashPattern, 25 dashPhase: marching 26 ? -dashPattern.reduce(0){$0 + $1} 27 : dashPattern.reduce(0){$0 + $1})) 28 .foregroundColor(.blue) 29 .onAppear { 30 marching = false 31 withAnimation(.linear(duration: 1.0).repeatForever(autoreverses: false)) { 32 marching.toggle() 33 } 34 } 35 .background(.gray.opacity(0.3)) 36 } 37 38} 39 40struct RopeView_Previews: PreviewProvider { 41 static var previews: some View { 42 RopeView() 43 } 44}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/08 04:33