我多年来第一次选择 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)
}
}
打印时使用延迟
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)