VisionPro开发 - 装饰物Ornaments


首页:漫游Apple Vision Pro

Code Repo: github.com/xuchi16/vis...

Project Path: github.com/xuchi16/vis...


基本概念

装饰物(ornament)利用了 visionOS 无边画布的特性,将与特定窗口相关的功能组合成小工具条,通过悬浮的形式呈现在窗口周围。它不会占据窗口空间,也不会影响窗口展现的内容。

我们比较容易将其与 Tab bar、Tool bar 等混淆。实际上 ornament 指的是 visionOS 中特有的这种将小工具条悬浮展现在窗口上的形式,它可以是:

  • 系统组件:如 Tab bar,通常展示在窗口左侧,用于导航;Tool bar,通常悬浮在底部,用来放置常用工具

  • 自定义控件:如音乐、视频播放器,根据需求提供不同的功能,可以放在不同的位置,通常在底部

由于 ornament 附着在一个窗口上,因此它会与关联的窗口一同移动。相对于窗口,ornament 的位置在 z 轴上会有一定偏移,同时在 y 轴方向会有一定重叠,从而体现两者的关联性。

在外观设计方面

  • 通常 ornament 总是可见的,这样用户操作更方便

  • Ornament 的宽度不超过其所关联的窗口,否则可能影响到其他窗口

  • Ornament 中的按钮不需要边框,用户注视按钮时系统会自动提供注视、点击动效

  • 常用的功能使用系统自定的 Tab bar 或 Tool bar 即可,必要情况下才自定义

基本实现

最基本的 ornament 实现如下:

swift 复制代码
struct ContentView: View {
    
    var body: some View {
        Text("A view with an ornament")
            .ornament(
                visibility: .visible,
                attachmentAnchor: .scene(.bottom)
            ) {
                OrnamentControl()
            }
    }
}

OrnamentControl控制 ornament 中对应的交互控件。

swift 复制代码
struct OrnamentControl: View {
    
    @State var isPencilOn = true
    @State var isEraserOn = false

    var body: some View {
        VStack() {
            HStack {
                Toggle(isOn: $isPencilOn) {
                    Label("Pencil", systemImage: "pencil")
                }
                .help("Pencil")
                .padding(12)
                
                Toggle(isOn: $isEraserOn) {
                    Label("Eraser", systemImage: "eraser")
                }
                .help("Eraser")
                .padding(12)
            }
            .glassBackgroundEffect(in: .rect(cornerRadius: 50))
            .toggleStyle(.button)
            .buttonStyle(.borderless)
            .labelStyle(.iconOnly)
        }
    }
}

实现效果如下:

我们还可以通过 4 个参数进一步控制 ornament:

  • visibility:控制是否可见,根据设计推荐应该总是可见的

  • attachmentAnchor:控制附着在窗口的位置,一共有 9 个位置可选

  • contentAlignment:控制窗口与 ornament 如何对齐

  • content:Ornament 中需要展示的内容

通过attachmentAlignment控制不同位置效果如下:

.topLeading .top .topTrailing
.leading .center .trailing
.bottomLeading .bottom .bottomTrailing

上表中,可以发现如.leading位置的效果很别扭。如果想达到与类似原生 Tab bar 在左侧的展示类似,则可以

  • 将 ornament 放置在窗口左侧,
  • 使用 trailing 对齐,从而与窗口分开
  • 将图标使用 VStack 竖向排列

这样设置后效果如下。但正如上文提到的设计推荐原则,通常使用系统自定的 Tab bar 或 Tool bar 即可,只有在自定义的情况下才需要自己通过 ornament 实现功能及外观。

相关推荐
HarderCoder7 个月前
Apple Vision Pro 学习资料
visionos
苹果API搬运工7 个月前
试玩 RealityComposerPro 中的 Shader Graph:用圆环制作一个 Meta Logo
visionos·增强现实
苹果API搬运工7 个月前
我开源了个手势匹配框架,让你在模拟器调试 visionOS 手部追踪功能!
visionos·增强现实
苹果API搬运工7 个月前
只需三板斧!带你入门 visionOS 空间计算的数学与几何基础
visionos·增强现实
-九月新辰-7 个月前
Unity VisionOS开发流程
unity·游戏引擎·visionos
XR基地8 个月前
XR 世界导览021 | AVP App Store上线网页版、如何在AVP上快速匹配手势、AVP开发岗位
visionos
XR基地8 个月前
XR 世界导览#020-visionOS 1.1/Xcode 17.3/PICO 5.9.0 更新了!
unity3d·visionos
xChester8 个月前
visionOS 应用图标设计
前端·ios·visionos
XR基地8 个月前
XR 世界导览#019-Let's visionOS 大会/在 AVP 上玩手机或查看Spline的3D模型/用代码写ShaderGraph
unity3d·visionos
xChester9 个月前
VisionPro开发 - 轻松实现天空盒并添加光照
前端·ios·visionos