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

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

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

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

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

Swift

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

Q&A

2回答

1553閲覧

[swift]AR物体のピンチジェスチャー

fokurofechi

総合スコア10

ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/02/20 02:15

編集2019/04/25 13:34

前提・実現したいこと

ARKitでカメラロールの写真を空間に置き、その写真を拡大縮小させるアプリを作っています。
ビルドが通り、写真を空間上に置けたのですが、ピンチジェスチャーをするとコンソールに以下のエラーが表示され、アプリがクラッシュします。
また、"Thread1:EXC_BAD_ACCESS","UI API calles from background thread"というエラーもでています。

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

[discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}

該当のソースコード

@objc func scenePinchGesture(_ recognizer: UIPinchGestureRecognizer, image: UIImage) { if recognizer.state == .began { lastGestureScale = 1 } let newGestureScale: Float = Float(recognizer.scale) let diff = newGestureScale - lastGestureScale let boxNode = setImageToScene(image: image) let currentScale = boxNode.scale boxNode.scale = SCNVector3Make( currentScale.x * (1 + diff), currentScale.y * (1 + diff), currentScale.z * (1 + diff) ) lastGestureScale = newGestureScale } var lastGestureScale: Float = 1
### 補足情報(FW/ツールのバージョンなど) ライブラリやフレームワーク等は使っていません。

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

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

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

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

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

guest

回答2

0

いろいろと気になったポイントを挙げます。

@objc func scenePinchGesture(_ recognizer: UIPinchGestureRecognizer, image: UIImage)

これの第二引数を勝手に追加していませんか?
(たしかUIGestureRecognizerの引数は0か1つだったはずです)

つまり
@objc func scenePinchGesture(_ recognizer: UIPinchGestureRecognizer)が正解のはずです。

次、にこの関数の中で

let boxNode = setImageToScene(image: image)

などと関数を呼び出してboxNodeのスケール値を変えていますが、これは中で新たなノードを生成してそれを返す関数に見えます。

fokurofechiさんがやりたいのは、すでに作成されているノードに対してスケール値を変える事ではありませんか?

であれば、最初に作成したノードをメンバ変数などで覚えておき、そのノードのスケール値を変えるべきでしょう。

投稿2019/03/07 05:02

takabosoft

総合スコア8356

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

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

0

UI API calles from background thread と言われている通り、UI操作はメインスレッドで行わなければなりません。

(スレッドというのは工場でいうラインみたいなもので、そのライン上では、順番にプログラムコードが実行されます。複数スレッドを使うと同時に複数の処理を実行できます。iOSアプリには複数スレッドがあって、UIはメインスレッドで操作しなければならないというルールがあります)

ということで、落ちる箇所を以下で囲んでみてください。

DispatchQueue.main.async { }

そしたらメインスレッドで実行されるので、エラーが消えるのでないかと思います。

投稿2019/02/20 02:30

KBOY

総合スコア54

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

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

fokurofechi

2019/02/24 13:38

ご丁寧で分かりやすいご回答誠にありがとうございます! k-boy様のサンプルコードを使用させていただいておりますので大変感動しております! スレッドやGCD等についても学ぶことができました! しかし、DispatchQueueをあてて見ましたが、最初の質問の際記載したエラーが出続けてしまいます、、 コンソールに Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState] PID: 40855, TID: ‪8906898‬, Thread name: com.apple.CoreMotion.MotionThread, Queue name: com.apple.root.default-qos.overcommit, QoS: 0 とあり、Energy Impactがvery highで大半がGPUとなっているのも原因なのでしょうか。 Core Motionについても調べましたが、どのように対処したら良いかが分かりません。 swift初心者で大変お恥ずかしいですが、ご回答くださいます様よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問