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

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

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

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

Swift

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

Q&A

1回答

509閲覧

【Swift】 SceneKitで立体を表示した後画面遷移すると、遷移先でボタンが押せなくなる

lyzmfeqpxs54

総合スコア237

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/04/07 12:42

いつもお世話になっております。

タイトルどおりなのですが、現在以下のようにコーディングし、六面体を表示して回転してアニメーション表示している状態です。面には文字を画像化したものを貼り付けています。

この状態から画面遷移を行うと遷移先で、表示しているボタン(UIButton)が押せなくなってしまいます。どういったことが考えられますでしょうか。

遷移先の画面は、以下のようにSCNSnapWindowというのが残っているのですがこれが直接の原因になっているのでしょうか。とくに画面自体には表示されてはいない状態です。
イメージ説明

ご教示いただけますと幸いです。
よろしくお願いいたします。

Swift

1// 六面体を表示して回転 2let view = SCNView(frame: CGRect(x: scWid*0.2, y: scHei*0.1, width: scWid*0.6, height: scWid*0.6)) 3 self.view.addSubview(view) 4 view.tag = 50 5 // Sceneを生成して、Viewに追加 6 let scene = SCNScene() 7 view.scene = scene 8 view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0) 9 10 // カメラ 11 //let camera = SCNCamera() 12 //let cameraNode = SCNNode() 13 camera = SCNCamera() 14 cameraNode = SCNNode() 15 16 cameraNode.camera = camera 17 cameraNode.position = SCNVector3(x: 0, y: 0, z: 3) 18 scene.rootNode.addChildNode(cameraNode) 19 // ライティング 20 view.autoenablesDefaultLighting = true 21 // ライトを設定しシーンに追加 22 //let lightNode = SCNNode() 23 lightNode = SCNNode() 24 lightNode.light = SCNLight() 25 lightNode.light!.type = SCNLight.LightType.omni 26 lightNode.position = SCNVector3(x: 0, y: 10, z: 10) 27 scene.rootNode.addChildNode(lightNode) 28 // アンビエントライトを設定しシーンに追加 29 //let ambientLightNode = SCNNode() 30 ambientLightNode = SCNNode() 31 ambientLightNode.light = SCNLight() 32 ambientLightNode.light!.type = SCNLight.LightType.ambient 33 ambientLightNode.light!.color = UIColor.darkGray 34 scene.rootNode.addChildNode(ambientLightNode) 35 let MPI:Float = Float(M_PI) 36 // 立方体のジオメトリを生成 37 let length:CGFloat = 0.7 //一辺の長さ 38 //let box = SCNBox(width: length, height: length, length: length, chamferRadius: 0.1) 39 box = SCNBox(width: length, height: length, length: length, chamferRadius: 0.1) 40 //let pyramid = SCNPyramid(width: length, height: length, length: length) 41 // マテリアルを変更 42 box.firstMaterial!.diffuse.contents = UIColor.blue 43 box.firstMaterial!.specular.contents = UIColor.white 44 // ノードに追加 45 //let boxNode = SCNNode(geometry: box) 46 boxNode = SCNNode(geometry: box) 47 var materials = [SCNMaterial]() 48 for i in 1...6 { 49 let material = SCNMaterial() 50 if i == 1 { material.diffuse.contents = imageViewArray[0] } 51 if i == 2 { material.diffuse.contents = imageViewArray[1] } 52 if i == 3 { material.diffuse.contents = imageViewArray[2] } 53 if i == 4 { material.diffuse.contents = imageViewArray[3] } 54 if i == 5 { material.diffuse.contents = imageViewArray[4] } 55 if i == 6 && imageViewArray.count == 6 { material.diffuse.contents = imageViewArray[5] } 56 if i == 6 && imageViewArray.count == 5 { material.diffuse.contents = UIColor.white } 57 materials.append(material) 58 } 59 boxNode.geometry?.materials = materials 60 scene.rootNode.addChildNode(boxNode) 61 // 立体が見えるように少し回転 62 boxNode.rotation = SCNVector4(x: 1.0, y: 1.0, z: 0.0, w: (MPI * 0.25)) 63 //アニメーション 0.5 1 0.2 mpi8 64 let spin = CABasicAnimation(keyPath: "rotation") 65 spin.toValue = NSValue(scnVector4:SCNVector4(x: 0.8 , y: 1 , z: 0.6 , w: MPI * 12.0)) 66 spin.duration = 21 67 spin.repeatCount = HUGE 68 boxNode.addAnimation(spin, forKey: "spin") 69 // ノードをシーンに追加 70 scene.rootNode.addChildNode(boxNode) 71 // SCNViewを探して取得 72 let scnView = self.view as! SCNView 73 // シーンをviewに追加 74 scnView.scene = scene 75 76

Swift

1 2// 画面遷移 3// 遷移するViewを定義する. 4 let mySecondViewController: UIViewController = ScoreViewController() 5 let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate //AppDelegateのインスタンスを取得 6 appDelegate.correctRec = correctCount //appDelegateの変数を操作 7 appDelegate.totalscoreRec = totalscore 8 // アニメーションを設定する. 9 mySecondViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical 10 11 // Viewの移動する. 12 self.present(mySecondViewController, animated: true, completion: nil) 13

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

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

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

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

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

dsuzuki

2018/04/09 09:27

SCNSnapWindowのframeサイズを確認してみてください。見えないだけで画面全体を覆っているかを確認したいので。
lyzmfeqpxs54

2018/04/09 11:46

ご回答ありがとうございます。ご教示いただきましたとおり、どうやら全体を覆っていそうです。不勉強で申し訳ないのですがSCNSnapWindowを削除するにはどのようにすればよいのでしょうか。ご教示いただけますと幸いです。よろしくお願いいたします。
guest

回答1

0

図を元に説明すると、
下のview(SCNSnapWindow)が上のview(UIViewController)よりも手前に表示されます。
storyboard上のdrag操作で、UIViewControllerをSCNSnapWindowよりも下に移動できれば、
画面の最前面がUIViewControllerになるので、操作イベントをUIViewControllerでキャッチできます。

不要なら、storyboard上で、SCNSnapWindowを選択して、delete。または、Attribute inspectorの一番下にあるinstallのチェックを外す。

もしくは、SCNSnapWindowでイベントをキャッチせずにスルーする方法もあったと思います。

-- 追記 --
storyboardを使用しない場合、以下のサイトが参考になるかと。
swift viewを最背面、最前面に移動

投稿2018/04/09 12:28

編集2018/04/10 12:28
dsuzuki

総合スコア1682

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

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

lyzmfeqpxs54

2018/04/10 12:21

ご回答ありがとうございます。 storyboardは使用しておらず、画面上のSCNSnapWindowを取得し削除するということをコーディングで行いたいのですがどのようにすればよいのでしょうか。 SCNSnapWindowという単語がググっても出てこず……。 度々の質問で申し訳ございませんが、ご教示いただけますと幸いです。 よろしくお願いいたします。
dsuzuki

2018/04/10 12:29

上記の通り、コードで最前面に持ってくることが出来るのではないかと。
lyzmfeqpxs54

2018/04/11 01:13

度々のご回答ありがとうございます。 ご教示いただいたように対象のボタンを以下のように手前に持ってこようとしたのですが、押せない状況です(startBackはUIbuttonです)。 self.view.bringSubview(toFront: startBack) SCNSnapWindowよりもUIwindowを手前に持ってこなくてはいけないということでしょうか。 またUIWindowを手前に持ってくることは可能なのでしょうか。
dsuzuki

2018/04/11 03:40

すいません。回答が適切ではなかったです。Windowの操作は別ですね。 アプリの最前面のWindowはUIApplication.shared.keyWindow?.rootViewControllerで取得できたと思います。 このrootViewControllerを変更すると画面が切り替わります。 ただ、SCNSnapWindowがどうなるかわからず、SceneKitの作法を勉強しないといけないかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問