前回記事で紹介した、空間にメモを配置するアプリの制作で工夫した点の続きを紹介します。
今回は「標準ウインドウや操作音」についてです。
メモウインドウの開閉
フルイマーシブ空間のアプリでも VisionOS 標準のウインドウを表示することができます。これによりメモ画面を SwiftUI で効率よく構築できます。
以下は付箋ピンがタップされた場合に、 `openWindow
` でウインドウを開くコードの抜粋です。ここでは開くメモウインドウを1つに限定したかったため、先に `dismissWindow
` を呼んでいます。しかし当時は `dismissWindow
` 直後に `openWindow
` すると前のWindowが開いていた位置に新しい Window を表示する挙動をしていたため、 ここでは 250 ms の遅延を入れています。
struct StickyNoteRealityView: View {
@Environment(AppState.self) private var appState
@Environment(\.openWindow) private var openWindow
@Environment(\.dismissWindow) private var dismissWindow
@Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace
:
:
var body: some View {
RealityView { content in
:
:
.gesture(
SpatialTapGesture(count: 1)
.targetedToAnyEntity()
.onEnded { value in
.gesture(
SpatialTapGesture(count: 1)
.targetedToAnyEntity()
.onEnded { value in
// 付箋ピンの場合の処理
if (value.entity.name == ObjectIdentifier.stickyPin) {
AudioServicesPlaySystemSound(SystemSound.SCREEN_SHARING_STARTED)
let pinEntity = value.entity as! ModelEntity
Task {
dismissWindow(id: UIIdentifier.noteWindow)
try! await Task.sleep(for: .milliseconds(250))
let linkId = pinEntity.getLinkId() as! String?
if linkId != nil {
openWindow(id: UIIdentifier.noteWindow, value: linkId!)
showTargetPlane = false
}
}
}
:
操作音について
視線とハンドジェスチャによる操作は、特に開発中は、ハンドジェスチャによるタップイベントが認識されないためプログラムが動作しないのか、タップイベントは入力されていてその先のプログラムに不具合があるのか切り分けが難しく困ることがあります。
そのような時はタップのようなユーザー操作に対して操作音を付けると判別が容易になります。
デバッグ目的で、完成度に拘らないのであれば下記のように`AudioServicesPlaySystemSound
` を使ってシステム音を鳴らすことができます。
:
.gesture(
SpatialTapGesture(count: 1)
.targetedToAnyEntity()
.onEnded { value in
AudioServicesPlaySystemSound(SystemSound.SCREEN_SHARING_STARTED)
:
参考情報など
3回に渡りお送りしてきましたが、次回は別の記事を投稿予定です。