GeometryReader3D 始终在 VisionOS 上的体积窗口中读取 1280x1280x1280,无论我将 defaultWindowSize 设置为多少

问题描述 投票:0回答:1

我多年来第一次选择 Swift 开发来与 VisionOS 一起玩。 SwiftUI 对我来说是新的,所以我不确定我是否遗漏了某些东西或者这是否是一个错误。

运行以下代码的结果是:

(width: 1280.0, height: 1280.0, depth: 1280.0) (width: 1280.0, height: 1280.0, depth: 1280.0)

无论我将

.defaultSize
设置为什么,我都会得到相同的数字。如果我切换到窗口而不是卷,我会得到与预期不同的数字。有趣的是,体积的实际大小和红/蓝色确实发生了正确的变化,但
GeometryReader3D
似乎没有正确地看到它。

我错过了什么还是这是一个错误?

顺便说一句,我的实际目标是放大使用

MeshDescriptor
以编程方式创建的模型来填充体积。我的模型生成工作正常,但我花了一天的大部分时间试图弄清楚为什么我的转换没有按预期工作,直到我最终意识到我从
GometryReader3D
之外的
RealityView
获得的信息正在给我错误信息。

import SwiftUI

@main
struct app: App {
    var body: some Scene {
        WindowGroup {
            GeometryReader3D { outer in
                ZStack {
                    GeometryReader3D { inner in
                        Color.blue.frame(maxDepth: .infinity).onAppear() {
                            print(inner.size, outer.size)
                        }
                    }
                    Color.red
                }
            }
        }
        .windowStyle(.volumetric)
        .defaultSize(width: 2000, height: 1000, depth: 1000)
    }
}

我昨天写了这个,然后发现我可以使用

.frame
(如下所示)和我设置的窗口大小的副本来获得我期望的行为。我仍然觉得它应该在没有
.frame
调用的情况下以这种方式工作,所以问题仍然存在。这是错误还是预期行为?

import SwiftUI

let windowSize = Size3D(SIMD3(repeating: Double(500)))

@main
struct app: App {
    @Environment(\.physicalMetrics) var physicalMetrics

    var body: some Scene {
        WindowGroup {
            ContentView().frame(width: windowSize.width, height: windowSize.height).frame(depth: windowSize.depth)
        }
        .windowStyle(.volumetric)
        .defaultSize(windowSize)
    }
}
swift swiftui geometry geometryreader visionos
1个回答
0
投票

打印时使用延迟

proxy3D.size
并且不要忘记结果显示在
pt
中。

import SwiftUI
import RealityKit

@main struct YourApp : App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .windowStyle(.volumetric)
        .defaultSize(width: 0.51, height: 0.51, depth: 0.51, in: .meters)
    }
}

struct ContentView : View {
    var body: some View {
        GeometryReader3D { proxy3D in
            RealityView { content in
                let box = ModelEntity(mesh: .generateBox(size: 0.49))
                content.add(box)
            }
            .onAppear {
                Task {
                    try await Task.sleep(nanoseconds: 900_000_000)
                    print("The size is:", proxy3D.size)
                }
            }
        }
    }
}

// Result:

// The size is: (width: 694.0, height: 694.0, depth: 694.0)
© www.soinside.com 2019 - 2024. All rights reserved.