質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

1回答

549閲覧

SwiftUIで動く破線の実装においてdashPhaseの指定部分の挙動が分からない

IKEH

総合スコア6

0グッド

0クリップ

投稿2022/08/07 12:49

編集2022/08/07 13:06

前提

発生している問題・エラーメッセージ

  • 下記のdashPhaseの指定でなぜうまく動いているのかがわかりません。
  • 私の考えでは今回dashPattern.reduce(0){$0 + $1} = 26なので、以下のように動くように思います。
    • dashPhase-26からスタートする
    • dashPhase26となり右に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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

marching.toggle() の直後に print(marching) を入れるとわかると思いますが、 withAnimation に指定するクロージャは、1秒に1回呼ばれるのではなく、最初に1回しか呼ばれません。クロージャで指定したアニメーションの変化を .linear(duration: 1.0).repeatForever(autoreverses: false) の指定で、1秒に1回無限に繰り返す(逆再生なし)ということだと思います。

つまり、marchingの初期値をfalseにし、 withAnimation のクロージャの中でtrueにすれば、dashPhaseを26から-26に変化させるアニメーションを作成したことになり、それを逆再生なしで1秒に1回繰り返すため、常に左から右に移動するアニメーションになるのだと思います。

投稿2022/08/08 03:53

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IKEH

2022/08/08 04:33

>1秒に1回呼ばれるのではなく、最初に1回しか呼ばれません。 まさにこの部分が分かっていなかったです。 ありがとうございます、理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問