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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

622閲覧

[SwiftUI] DragGesture() & .rotation3DEffectで、Rectangle()を3D回転させたいです。

taichi_dm_

総合スコア60

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/02/19 16:34

編集2020/02/19 16:44

#実現したいこと
SwiftUIで、(他のフレームワークが必要ならそれを用い、)触って動かせる立方体、cubeを表示したいです。
https://medium.com/flawless-app-stories/swiftui-animations-3d-rotation-effect-fb8dd5b86df
このサイトで立方体がグルグル回っているのを拝見し、 これを作りたい!と思いました。
しかし、SwiftUIで立方体の作り方がわからないので、
とりあえずRectangle()一面だけでもドラッグで動かしてみようと思っても思うようにいきませんでした。

##ソースコード
一度以下のコードをコピペして実行してみて欲しいです。

SwiftUI

1import SwiftUI 2 3struct RotaionCubeView: View { 4 @State var viewState: CGSize = .zero 5 var body: some View { 6 ZStack { 7 /*Rectangle() 8 .fill(Color.yellow) 9 .frame(width: 100, height: 100) 10 Rectangle() 11 .fill(Color.blue) 12 .frame(width: 100, height: 100) 13 Rectangle() 14 .fill(Color.green) 15 .frame(width: 100, height: 100) 16 Rectangle() 17 .fill(Color.pink) 18 .frame(width: 100, height: 100) 19 Rectangle() 20 .fill(Color.purple) 21 .frame(width: 100, height: 100) 22 .rotation3DEffect(Angle.init(degrees: 80), axis: (x: 0, y: 1, z: 0)) 23 .offset(x: -50, y: 0)*/ 24 25 Rectangle() 26 .fill(Color.red) 27 .frame(width: 100, height: 100) 28 .rotation3DEffect(Angle.init(degrees: 0), axis: (x: 0, y: 0, z: 0)) 29 .gesture ( 30 DragGesture() 31 .onChanged { value in 32 self.viewState = value.translation 33 } 34 .onEnded { value in 35 self.viewState = .zero 36 } 37 ) 38 .rotation3DEffect(Angle(degrees: Double(-self.viewState.height)), axis: (x: 1, y: 0, z: 0)) 39 .rotation3DEffect(Angle(degrees: Double(self.viewState.width)), axis: (x: 0, y: 1, z: 0)) 40 .animation(.spring()) 41 VStack { 42 Spacer() 43 Text("(self.viewState.height)") 44 .padding() 45 } 46 } 47 } 48} 49 50struct RotaionCubeView_Previews: PreviewProvider { 51 static var previews: some View { 52 RotaionCubeView() 53 } 54} 55

赤いRectangle()をドラッグすると、
上記のコードを実行したときのライブプレビュー
伸びるし挙動がバグりまくる...

SwiftUI

1@State var viewState: CGSize = .zero 2 3 .gesture ( 4 DragGesture() 5 .onChanged { value in 6 self.viewState = value.translation 7 } 8 .onEnded { value in 9 self.viewState = .zero 10 } 11 ) 12 .rotation3DEffect(Angle(degrees: Double(-self.viewState.height)), axis: (x: 1, y: 0, z: 0)) 13 .rotation3DEffect(Angle(degrees: Double(self.viewState.width)), axis: (x: 0, y: 1, z: 0)) 14 .animation(.spring())

の作用で、立方体が3D回転するはずなのですが、
rotation3DEffectを2回使用しているせいか、角が伸びます。めっちゃ伸びます。
しかも、viewStateがとても荒ぶります。

どうすれば理想通りに動くでしょうか。

どなたかヒントをください!
よろしくお願いいたします。

イメージ説明
この画像の立方体だけを作りたい...

##環境
Xcode11.3.1
Swift5
SwiftUI
macOS10.15.3

画像はライブプレビューです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問