VisionPro开发 - 装饰物Ornaments


首页:漫游Apple Vision Pro

Code Repo: Github - VisionOS Workshop


基本概念

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

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

  • 系统组件:如 Tab bar,通常展示在窗口左侧,用于导航;Tool bar,通常悬浮在底部,用来放置常用工具
  • 自定义控件:如音乐、视频播放器,根据需求提供不同的功能,可以放在不同的位置,通常在底部

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

在外观设计方面

  • 通常 ornament 总是可见的,这样用户操作更方便
  • Ornament 的宽度不超过其所关联的窗口,否则可能影响到其他窗口
  • Ornament 中的按钮不需要边框,用户注视按钮时系统会自动提供注视、点击动效
  • 常用的功能使用系统自定的 Tab bar 或 Tool bar 即可,必要情况下才自定义

基本实现

最基本的 ornament 实现如下:

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

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

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 实现功能及外观。

欢迎关注公众号

请添加图片描述

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值