手势识别器 手势是用户在屏幕上执行的动作,如点击、滑动或捏合。这些手势很难识别,因为屏幕上只能返回手指的位置。为此,Apple提供了手势识别器。手势识别器完成所有识别手势所需的计算。所以我们不用处理众多的事件和值,只需在等待系统监测到复杂手势时发送通知并进行相应处理即可。 手势修饰符 手机设备上最常用的手势是点击,在用户手指触碰屏幕时得到识别。因这种手势使用频繁,SwiftUI定义了两个非常方便的修饰符来完成处理。 onTapGesture(count:Int,perform:Closure):此修饰符识别一次或多次点击。count参数指定要多少次点击才能做手势识别(默认值为1),perfo...

本文来自正在规划的Go语言&云原生自我提升系列,欢迎关注后续文章。 2000年以来,自动化测试的广泛应用可能比任何其他软件工程技术都更能提高代码质量。Go是一种专注于提高软件质量的语言和生态系统,很自然的在其标准库中包含了测试支持。Go中测试代码非常容易,没有理由不添加测试。本章中,读者将了解如何测试Go代码,将测试分组为单元测试和集成测试,检查测试代码覆盖率,编写基准测试,并学习如何使用Go竞态检查器检测代码的并发问题。同时,还会讨论如何编写可测试的代码,以及为什么它会提高我们的代码质量。 测试的基础知识 Go的测试支持由两部分组成:库和工具。标准库中的testing包提供了编写测试...

使用模块 我们已经学习了如何在单个模块中使用包,接下来该学习如何集成第三方模块及其中的包。然后,我们会学习如何发布自己模块并添加版本,以及Go的中央服务:pkg.go.dev、模块代理和校验和(checksum)数据库。 导入第三方代码 我们已导入过标准库中的包,如fmt、errors、os和math。Go使用同样的导入系统来集成第三方包。和很多其它编译语言不同,Go总是通过源代码将应用构建为单个二进制文件。它包含模块的源代码及其所依赖的所有模块的源代码。和我们学过的模块内导包一样,在导入第三方包时,指定包所处的源代码的位置。 我们来看一个例子。前面提到过在需要十进制的精确表示时应避免使用浮点...

  NOiy3I4oXUBU   2023年12月15日   100   0   0 Go云原生模块Go模块云原生

从其它语言转Go最大的挑战之一就是错误处理。对那些习惯了使用异常的开发者,Go采取的方法有些离经叛道。但Go语言使用的方法蕴含着牢不可破的软件工程原理。本章中,我们学习如何在Go中处理错误。我们会学习Go系统中会停止执行的错误处理panic和recover。 错误处理基础 在函数一章我们简单地讲到,Go以error类型值作为函数最后一个返回值来进行错误处理。这只是一种惯例,但这一惯例已深入人心不应打破它。在函数执行正常时,使用nil来返回错误参数。如果出错则返回一个错误值。然后调用函数会检查错误返回值是否为nil,处理返回的错误或是返回自己的错误。带错误处理的简单函数如下所示: funcc...

通过前面章节的学习,我们知道Go是一种静态类型语言,包含有内置类型和用户定义类型。和大部分现代编程语言一样,Go允许我们对类型关联方法。它也具备类型抽象,可以编写没有显式实现的方法。 然而,Go处理方法、接口和类型的方式与现行大部分其它语言大相径庭。Go的设计者鼓励软件开发者所提倡的最佳实践,避免继承、鼓励组合。本章中我们会学习类型、方法和接口,了解如何使用它们来构建可测试、易维护的程序。 Go的类型 在复合类型一章中我们学习过如何定义结构体类型: typePersonstruct{ FirstNamestring LastNamestring Ageint } 读作声明名为Person的...

我们在Day8中演示了attachment的实现,本节的知识点是portal。portal相当于哆啦A梦里的任意门,它让我们可以打开另一个世界,这个世界独立于当前的世界,具有单独的光照系统并且由portal几何图形进行遮罩。 要创建portal,首先就需要创建一个世界(makeWorld),在其中可以添加自己的实体。接着创建portal并将其关联至刚刚创建的世界。 主要的代码如下: importSwiftUI importRealityKit structContentView:View{ varbody:someView{ RealityView{contentin letworld=m...

本文我们要在visionOS内实现一个标题输出的动画效果。主要讲ViewModifier协议,修饰符(modifier)应用于视图或另一个视图修饰符,生成原值的另一个版本。在希望创建一个可应用于不同视图的修饰符时可实现ViewModifier协议。 首先定义ViewModel,本例中的模型比较简单,仅定了三个变量,分别表示当前文本、标题输出是否完成以及最终的标题文本。 importSwiftUI @Observable classViewModel{ vartitleText:String="" varisTitleFinished:Bool=false varfinalTitle:Str...

学到现在,我们的程序都局限于main函数中的寥寥数行。是时候搞点更大的动作了。本章中我们会学习如何在Go语言中编写函数以及函数那些有趣的功能。 声明及调用函数 读者只要使用过C、Python、Ruby或JavaScript等编程语言,那么对Go函数的基础也不会陌生。(Go中还有方法,在类型、方法和接口一章中进行讲解。)和控制结构一样,Go也为函数添加了一些特性。其中一些是改进,另一些是我们应当避免的试验。在本章中均会进行讨论。 我们已经见过如何声明和使用函数。我们编写的每个程序都有一个main函数,它是Go程序的入口,我们也调用过fmt.Println函数来在屏幕上显示输出。因main函数不接...

视频 录制和播放视频对用户来说和拍照、显示图片一样重要。和图片一样,Apple框架中内置了播放视频和创建自定义播放器的工具。 视频播放器 SwiftUI定义了VideoPlayer视图用于播放视频。该视图提供了所有用于播放、停止、前进和后退的控件。视图包含如下初始化方法。 VideoPlayer(player:AVPlayer?,videoOverlay:Closure):该初始化方法创建视频播放器来播放通过参数提供的视频。player参数是负责播放的对象,videoOverlay参数提供希望展示在视频上方的视图。 VideoPlayer视图展示用户控制视频的界面,但视频由AVPlayer...

在上一篇文章中,我们学习了一些字面量和预声明变量类型:数值、布尔值和字符串。本文中我们会学习Go中的复合类型、内置的支持函数以及使用的最佳实践。 数组-古板不宜直接使用 和大部分编程语言一样,Go语言也有数组。但在Go中很少直接使用数组。一会我们就知道个中缘由了,但我们首先快速讲解数组的声明语法及使用。 数组中的所有元素都必须是指定的类型。有多种声明方式。第一种是指定数组大小及数组中元素的类型: varx[3]int 这会创建包含3个int类型元素的数组。因为我们并未指定值,所有位置(x[0]、x[1]和x[2])都使用int的零值初始化,当然也就是0了。如果数组有初始化值,可以通过数组字...

在更深入学习Odoo开发之前,我们需要配置好开发环境并学习相关的基础管理任务。 本章中,我们将学习如何配置构建Odoo应用所需的环境。我们会配置一个Ubuntu系统来托管开发服务端实例。可以使用云服务器、本地服务器或者Windows10上的子系统。 学习完本章后,读者可以掌握如何准备开发环境、通过源码运行Odoo以及在同一台机器上拥有多个Odoo项目和多个Odoo版本。读者还会学习Odoo的服务端是如何运行的,以及在开发过程中如何使用它们。 本文章主要讲解如下内容: 为Odoo服务端配置主机 使用源码安装Odoo 管理Odoo数据库 配置Odoo服务端参数 查找、安装社区插件 使用服务端开发...

存储图片 在前面的示例中,我们在屏幕上展示了图片,但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用,这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPhotosAlbum(UIImage,Any?,Selector?,UnsafeMutableRawPointer?):该函数将第一个参数所指定的图像添加到相册。第二个参数是在处理结束后包含所要执行方法的对象的指针,第三个参数是表示该方法的选择器,最后一个参数是传递给该方法数据的指针。 UISaveVideoAtPathToSavedPhotos...

本例选择了《天空之城》的25张照片,组成5x5的照片墙)。首先我们在setupContentEntity方法中构建了一个纹理数组,将这25张照片添加到数组images中。其中封装了setup方法,借助于visionOS对沉浸式空间的支持,我们创建了三个平面,组成具有立体感的照片墙。 在setup方法中调用了addChildEntities,对images随机打散,通过quotientAndRemainder方法对5求商取余来设置x和y的值,从而生成5x5的照片,z轴上仅以平面为基准做了小小的调整。将准备好的位置和纹理,传入makePlane方法进行配置返回实体再分别添加到3个平面中。 为增加趣...

Foveatedrendering听起来好像是非常复杂的技术。但实际上注视点(foveation)的底层概念非常直接。使用人注视屏幕的信息,可以减少生成场景的运算资源,方式是使用高分辨率渲染人眼观看的小区哉,而场景外的其它区域(人的四周)采用更小的分辨率和更少的细节。注视点渲染主要用于显示技术,如VR头显和AR眼镜,对些场景资源优化至关重要。 本文中作者会回答一个问题:什么是注视点渲染?我们会讨论动态注视点渲染、静态(或固定)注视点渲染,以及这些技术如何降低GPU的计算负载。还会讲到其姐妹概念-动态注视点传输如何了减少所需的网络带宽。 注视点渲染是一种设备性能优化技术,将资源集中于渲染人眼所注...

每种编程语言都需要有开发环境,Go自然也不例外。如果读者之前已经写过Go程序,那么一定已经有环境了,但可能会漏掉一些最新技术和工具。如果是第一次在电脑上配置Go,也不必担心,Go及其支持工具的安装非常简单。在配置好环境并验证后,我们会构建一个简单程序,学习几种构建和运行Go代码的方式,然后涉足一些简化Go开发的工具和技巧。  安装Go工具 要编写Go代码,首先要下载、安装Go开发工具。工具的最新版请见Go官方网站的下载页面。选择所用平台的下载文件并执行安装。Mac的安装包.pkg及Windows的安装包.msi可自动在相应的位置安装Go、移除旧的安装版本,并将Go二进制文件放到默认的...

技术要求 在学习本书前,你应该了解一些Python编程的基础知识,比如基础语法、变量类型、元组数据类型、列表字典、函数、字符串和方法。在python.org/downloads/上有3.7.2和2.7.15两个版本可供下载。本书中我们将使用3.7这一版本来作为代表示例和包的安装。 译者注:预计Python3.7还会发展较长时间,而Python2则长期止步于Python2.7了,但小版本号都在不断变化 本章的示例和源代码可通过GitHub仓库进行获取。 为什么选择Python? Python有非常丰富的开源库用于数据分析工具、网站框架、测试等等。Python是一种可在不同平台上使用的编程语言(W...

在之前的学习中我们在空间中添加了3D模型,但在初始摆放后就无法再对其进行移动或做出修改。本节我们在Day5显示和隐藏的基础上让我们模型可以实现拖拽效果,同时对纯色的立方体实现点击随机换色的功能。 首先是入口文件,无需做出改变, importSwiftUI @main structvisionOSDemoApp:App{ varbody:someScene{ WindowGroup(){ ContentView() } ImmersiveSpace(id:"ImmersiveSpace"){ ImmersiveView() } } } 接着是ViewModel.swift文件,这里是核心逻...

本节我们开始初探在visionOS中添加动画效果,我们的入口文件和ContentView和Day6中并没有什么区别,所以重点来看ViewModel和ImmersiveView。 首先是ViewModel.swift文件: importSwiftUI importRealityKit classViewModel:ObservableObject{ privatevarcontentEntity=Entity() funcsetupContentEntity()->Entity{ returncontentEntity } funcgetTargetEntity(name:Stri...

我们在Day1中学习了如何创建一个visionOS应用,但在第一个Demo应用中我们的界面内容还是2D的,看起来和其它应用并没有什么区别。接下来我们先学习如何展示3D素材,苹果为方便开发人员,推出了RealityKit,接下来看如何使用。 首先我们需要一个3D素材,Apple在QuickLook页面提供了一些素材,读者也可以到Sketchfab等网站获取其它的免费或付费素材,推荐的格式是usdz,这是Pixar研发开源的一种文件格式,目前根据AOUSD官网其主要成员有苹果、英伟达、AutoDesk、Adobe和Unity等业界大佬。并且主流的设备软件基本都内置或由社区提供了对usdz的格式转换...

细心的读者会发现在在Day1和Day2的示例中我们使用的都是WindowGroup。 @main structvisionOSDemoApp:App{ varbody:someScene{ WindowGroup{ ContentView() } } } 本节我们来认识在visionOS开发中会经常用到的另一个概念ImmersiveSpace。 沉浸式空间为内容提供了一个无界的区域,可在空间内控制内容的大小和摆放位置。在获取用户的授权后,我们还可以使用开启了沉浸空间的ARKit来将内容集成到周遭环境中。例如,可以使用ARKit场景重建来获取家具的网格(mesh)及其附近的对象,让内容可以...

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~