如何使用 SwiftUI 構建 visionOS 應用

在這里插入圖片描述

在這里插入圖片描述

文章目錄

    • 前言
    • Windows
    • Volumes
    • 沉浸式空間
    • 結論

前言

Apple Vision Pro 即將推出,現在是看看 SwiftUI API 的完美時機,這使我們能夠將我們的應用程序適應 visionOS 提供的沉浸式世界。蘋果表示,構建應用程序的最佳方式是使用 Swift 和 SwiftUI。下面,我們將學習如何使用 SwiftUI 構建 visionOS 應用程序。

Windows

我喜歡 SwiftUI 的一點是它如何自動適應平臺。你無需執行任何操作即可在 visionOS 上運行使用 SwiftUI 編寫的應用程序。它可以即插即用。但是,你始終可以通過向前移動并適應平臺功能來改進用戶體驗。

struct ContentView: View {var body: some View {NavigationSplitView {List {// 列表內容}.navigationTitle("Models").toolbar {ToolbarItem(placement: .bottomOrnament) {Button("open", systemImage: "doc.badge.plus") {}}ToolbarItem(placement: .bottomOrnament) {Button("open", systemImage: "link.badge.plus") {}}}} detail: {Text("Choose something from the sidebar")}}
}

在上面的示例中,我們使用了稱為 bottomOrnament 的新工具欄放置。 visionOS 中的裝飾是位于窗口外部的位置,用于呈現與窗口連接的控件。你還可以通過使用新的 ornament 視圖修改器手動創建它們。

struct ContentView: View {var body: some View {NavigationSplitView {List {// 列表內容}.navigationTitle("Models").ornament(attachmentAnchor: .scene(.leading)) {// 在此處放置你的視圖}} detail: {Text("Choose something from the sidebar")}}
}

新的 ornament 視圖修改器允許我們為其連接的窗口創建一個具有特定錨點的裝飾。將你的應用內容適應 visionOS 提供的沉浸式體驗的另一種方法是使用 transform3DEffectrotation3DEffect 視圖修改器來加入深度效果。如下圖:

Volumes

你的應用程序可以在 visionOS 上的同一場景中并排顯示 2D 和 3D 內容。在這種情況下,我們可以使用 RealityKit 框架來呈現 3D 內容。例如,RealityKit 為我們提供了 Model3D SwiftUI 視圖,允許我們從 USDZ 或實際文件中顯示 3D 模型。

struct ContentView: View {var body: some View {NavigationSplitView {List(Model.all) { model inNavigationLink {Model3D(named: model.name)} label: {Text(verbatim: model.name)}}.navigationTitle("Models")} detail: {Model3D(named: "robot")}}
}

Model3D 視圖的工作方式類似于 AsyncImage 視圖,并異步加載模型。你還可以使用 Model3D 初始化器的另一種變體,它允許你自定義模型配置并添加占位視圖。

struct ContentView: View {var body: some View {NavigationSplitView {List(Model.all) { model inNavigationLink {Model3D(url: Bundle.main.url(forResource: model.name,withExtension: "usdz")!) { resolved inresolved.resizable().aspectRatio(contentMode: .fit)} placeholder: {ProgressView()}} label: {Text(verbatim: model.name)}}.navigationTitle("Models")} detail: {Model3D(named: "robot")}}
}

在你的應用程序中呈現 3D 內容時,你可以使用 windowStyle 修飾符來啟用內容的體積顯示。體積樣式允許你的內容在第三維中增長,以匹配模型的大小。

對于更復雜的 3D 場景,我們可以使用 RealityView 并填充它以 3D 內容。

struct ContentView: View {var body: some View {NavigationSplitView {List(Model.all) { model inNavigationLink {RealityView { content in// load the content and add to the scene}} label: {Text(verbatim: model.name)}}.navigationTitle("Models")} detail: {Text("Choose something from the sidebar")}}
}

沉浸式空間

visionOS 的第三個選項是完全沉浸式體驗,允許我們通過隱藏周圍的所有內容來專注于你的場景。

@main
struct MyApp: App {var body: some Scene {WindowGroup {ContentView()}ImmersiveSpace(id: "solar-system") {SolarSystemView()}}
}

正如你在上面的示例中所看到的,我們通過使用 ImmersiveSpace 類型來定義場景。它允許我們通過使用 openImmersiveSpace 環境值來啟用它。

struct MyMenuView: View {@Environment(\.openImmersiveSpace) private var openImmersiveSpacevar body: some View {Button("Enjoy immersive space") {Task {await openImmersiveSpace(id: "solar-system")}}}
}

我們還可以使用 dismissImmersiveSpace 環境值來關閉沉浸式空間。請記住,你一次只能顯示一個沉浸式空間。

struct SolarSystemView: View {@Environment(\.dismissImmersiveSpace) private var dismissvar body: some View {// Immersive experienceButton("Dismiss") {Task {await dismiss()}}}
}

結論

在介紹了 SwiftUI 在 visionOS 上的應用之后,我們了解到 SwiftUI 可以幫助我們輕松構建適應 visionOS 的應用程序。不僅如此,SwiftUI 還提供了許多方便的工具和修飾符,例如 windowStyle 修飾符,可用于在應用程序中呈現 3D 內容,并使內容根據模型的大小自動適應。通過引入沉浸式空間,我們可以將用戶帶入全新的體驗,讓他們沉浸在應用程序的世界中。總的來說,SwiftUI 為構建 visionOS 應用程序提供了強大而靈活的工具,我們可以期待在這個全新的平臺上開發出令人驚嘆的應用體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40276.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40276.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40276.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年軟件測試崗必問的100+個面試題【含答案】

一、基礎理論 1、開場介紹 介紹要領:個人基本信息、工作經歷、之前所做過的工作及個人專長或者技能優勢。揚長避短,一定要口語化,語速適中。溝通好的就多說幾句,溝通不好的話就盡量少說兩句。舉例如下: 面試官你好&…

Java中Predicate(謂詞),方法引用,以及正則的一些講解

1.Predicate接口簡述 FunctionalInterface public interface Predicate<T> {boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Pred…

速盾:cdn加速效果

CDN&#xff08;Content Delivery Network&#xff09;即內容分發網絡&#xff0c;是一種通過在全球多個節點服務器上緩存網站的靜態資源&#xff0c;并將用戶請求導向離用戶最近的服務器節點&#xff0c;從而提供更快速的訪問體驗的技術。 在傳統的網絡架構中&#xff0c;用戶…

鴻蒙 HarmonyOs 網絡請求 快速入門

官方文檔&#xff1a; ArkUI簡介-ArkUI&#xff08;方舟UI框架&#xff09;-應用框架 | 華為開發者聯盟 (huawei.com) 一、通過原有的http組件進行網絡請求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名稱類型描述methodRequestMethod請求方式&#xff…

12款超良心好用APP推薦,每一款都值得下載!

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/分享是奉獻的果實&#xff0c;分享是快樂的前提。每天給小伙伴們分享自己認可的軟件&#xff0c;也是莫大的幸福&#xff0c;今天獲得12款好用的軟…

class類和style內聯樣式的綁定

這里的綁定其實就是v-bind的綁定&#xff0c;如代碼所示&#xff0c;div后面的引號就是v-bind綁定&#xff0c;然后大括號將整個對象括起來&#xff0c;對象內先是屬性&#xff0c;屬性后接的是變量&#xff0c;這個變量是定義在script中的&#xff0c;后通過這個變量&#xff…

flutter:監聽路由的變化

問題 當從路由B頁面返回路由A頁面后&#xff0c;A頁面需要進行數據刷新。因此需要監聽路由變化 解決 使用RouteObserver進行錄音監聽 創建全局變量&#xff0c;不在任何類中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

flask-apscheduler 定時任務被執行兩次

定時任務沒有被多次調用&#xff0c;事實上如果多次調用的話&#xff0c;flask-apscheduler會拋出異常。 但一開始任務還是按時執行一次&#xff0c;重啟flask或者修改部分代碼后&#xff0c;就發送定時任務一次執行兩次了。 之所以會發生這種情況&#xff0c;是因為在debug模…

面試-微服務篇

springcloud組件有哪些&#xff1f; eureka、ribbon負載均衡、feign、hystrix、zuul/gateway網關 nacos、ribbon、feign、sentinel、gateway 服務注冊和發現是什么意思&#xff1f;springcloud如何實現服務注冊發現&#xff1f; 微服務中必須要使用的組件&#xff0c;考察我們使…

LeetCode刷題記錄:(15)三角形最小路徑和

知識點&#xff1a;倒敘的動態規劃 題目傳送 解法一&#xff1a;二維動態規劃【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i層第…

[240705] 美光或將助力英偉達 RTX 50系列領先 AMD | 中國領跑生成式人工智能專利競賽

目錄 美光或將助力英偉達 RTX 50系列領先 AMD中國領跑生成式人工智能專利競賽 美光或將助力英偉達 RTX 50系列領先 AMD &#x1f4e2; 美光近日公布了其下一代顯存 GDDR7 的性能數據&#xff0c;顯示出在游戲性能方面高達30%的提升&#xff0c;這對于即將推出的顯卡來說無疑是…

白騎士的C語言教學基礎篇 1.2 C語言基礎語法

系列目錄 上一篇&#xff1a;白騎士的C語言教學基礎篇 1.1 C語言介紹 在這一篇內容中&#xff0c;我們將介紹C語言的基礎語法&#xff0c;包括C語言的程序結構、數據類型與變量、常量與運算符。 C語言程序結構 C語言程序的基本結構包括頭文件、主函數和語句。一個簡單的C語言…

Java+前后端分離架構+ MySQL8.0.36產科信息管理系統 產科電子病歷系統源碼

Java前后端分離架構 MySQL8.0.36產科信息管理系統 產科電子病歷系統源碼 產科信息管理系統—住院管理 數字化產科住院管理是現代醫院管理中的重要組成部分&#xff0c;它利用數字化技術優化住院流程&#xff0c;提升醫療服務質量和效率。以下是對數字化產科住院管理的詳細闡述…

【Spring Boot】統一異常處理

目錄 統一異常處理一. 概念二. 全局異常處理三. 處理特定異常 統一異常處理 一. 概念 其實統一異常是運用了AOP&#xff08;對某一類事情的集中處理&#xff09;的思維&#xff0c;簡單概括就是在我們進行前后端數據交互的時候&#xff0c;拋出的任何的異常都能夠自動捕獲然后…

uniapp微信接口回調 response.sendRedirect nginx 報404錯誤

如題 參考 uniapp打包H5時,訪問index.html頁面白屏報錯net::ERR_ABORTED 404 - 簡書 nginx中修改 配置文件 location / { try_files $uri $uri/ /index.html; root html; index index.html index.htm; } uniapp里配置 重新載入

JavaScript常用包管理工具

NPM、Yarn、CNPM 和 PNPM 是 JavaScript 生態系統中常用的包管理工具。它們各自有不同的特點和優勢。以下是對它們的詳細解釋&#xff1a; 1. NPM (Node Package Manager) 簡介&#xff1a; NPM 是 Node.js 的默認包管理工具&#xff0c;也是最早出現的 JavaScript 包管理工具…

ingress-nginx控制器證書不會自動更新問題

好久沒更新了&#xff0c;正好今天遇到了一個很有意思的問題&#xff0c;在這里給大家分享下&#xff0c;同時也做下記錄。 背景 最近想做個實驗&#xff0c;當k8s集群中secret更新后&#xff0c;ingress-nginx控制器會不會自動加載新的證書。我用通義千問搜了下&#xff0c;…

什么是FPGA的基本組成單元?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;的基本組成單元是其內部結構的關鍵組件&#xff0c;這些單元可以被編程來執行各種數字邏輯功能。FPGA的基本組成單元主要包括以下幾個部分&#xff1a; 可編程邏輯塊 (CLB, Configurable Logic Block) CLB是FPGA中最…

Airflow: 大數據調度工具詳解

歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;歡迎訂閱相關專欄&#xff1a; 歡迎關注微信公眾號&#xff1a;野老雜談 ?? 全網最全IT互聯網公司面試寶典&#xff1a;收集整理全網各大IT互聯網公司技術、項目、HR面試真題. ?? AIGC時代的創新與未來&a…

【CH32V305FBP6】移植 RT-Thread

文章目錄 前言實現修改鏈接文件移植 RTT 代碼修改啟動文件修改中斷文件修改主文件 前言 移植 RT-Thread 到 CH32V305FBP6。 實現 修改鏈接文件 .text :{. ALIGN(4);*(.text)*(.text.*)*(.rodata)*(.rodata*)*(.gnu.linkonce.t.*)/* section information for finsh shell */…