@Status
通过使用 @State 修饰器我们可以关联出 View 的状态 SwiftUI 将会把使用过 @State 修饰器的属性存储到一个特殊的内存区域,并且这个区域和 View struct 是隔离的 当 @State 装饰过的属性发生了变化,SwiftUI 会根据新的属性值重新创建视图
@Binding
有时候我们会把一个视图的属性传至子节点中,但是又不能直接的传递给子节点,因为在 Swift 中值的传递形式是值类型传递方式,也就是传递给子节点的是一个拷贝过的值。但是通过 @Binding 修饰器修饰后,属性变成了一个引用类型,传递变成了引用传递,这样父子视图的状态就能关联起来了。
@ObservedObject
@ObservedObject 的用处和 @State 非常相似,从名字看来它是来修饰一个对象的,这个对象可以给多个独立的 View 使用。如果你用 @ObservedObject 来修饰一个对象,那么那个对象必须要实现 ObservableObject 协议,然后用 @Published 修饰对象里属性,表示这个属性是需要被 SwiftUI 监听的
@EnvironmentObject
从名字上可以看出,这个修饰器是针对全局环境的。通过它,我们可以避免在初始 View 时创建 ObservableObject, 而是从环境中获取 ObservableObject
ContentViewswift
swiftui 请求 渲染数据流程 *** 作如下
在使用 SwiftUI 之前,需要如下的环境:Xcode 11 beta(必选)通过官网下载最新的 Xcode 11 beta 并安装。
macOS 1015 beta (可选)macOS 的系统最好升级到 1015 beta,不升也没关系。因为 1015 beta 目前还没有公测,想要体验到 1015 beta 目前还比较麻烦,首先需要有开发者账号,然后注册 Apple Developer Program 来获取最新的版本。但是不更新系统也是可以体验到 SwiftUI 的,只是不能使用 Xcode 里的预览界面的功能而已,所以我是没有更新 macOS 的系统,我的 macOS 的系统版本号是 10145。
使用SwiftUI的TextField进一步封装的自定义组件
基于Xcode113,iOS13的项目
收起键盘时调用 onCommit 方法
实时获取输入内容 onChange 方法
遗留问题:
1、TextField不能设置returnKeyType属性(也许是没找到)。如果要使用这个属性的话,可以封装UITextField给swiftUI用。
2、SearchBar设置初始值时,在init方法给@State 修饰的searchText赋值时无效,已解决。
解决方法: 重新初始化State
3、上面实时获取输入内容依然采用的命令式的写法,如果使用相应式需配合 Combine ,可以参考这个 项目>
实际上 iOS 上的桌面小组件更保守,但仍然有开发者啃下了这块硬骨头,围绕桌面小组件构建出了一款又一款热门应用。
Healthview 将桌面小组件做成了健康数据看板,豆瓣的**日历让人每天都能遇见新作品,livein 和《贴贴》将桌面小组件变成了亲密好友之间的看板,前者甚至还连续 5 天登上 App Store 免费榜首。
桌面小组件表现亮眼
今年年初开始,围绕桌面小组件构建的应用层出不穷,它们大多参考了应用 Locket Widget 的设计,朋友或者亲人之间通过桌面小组件分享自己的。
▲ Locket Widget
之后的 livein 、realmoji 、《贴贴》核心设计类似,差异体现在拍摄玩法、好友限制方面,比如 realmoji 主打 emoji 表情,可以让用户参考 emoji 表情拍摄,传递到朋友的桌面上,分享心情。
livein 则不像《贴贴》严格限制好友数量,人们既可以分享照片给朋友也可以分享给粉丝。
▲ 用《贴贴》给朋友桌面发个表情包
基于桌面小组件 Locket Widget 、livein 都曾登顶 App Store 免费下载总榜,前者更是创下过 12 天突破 300 万下载量的纪录,国内应用《贴贴》在小红书等社交媒体上也有不错的讨论度,仿佛桌面小组件成为了一条新赛道。
「桌面是更高效的入口」是这类桌面小组件应用火爆过程中被反复提及的词。
相比桌面浩如烟海的 App,桌面小组件更大更瞩目,一解锁手机就能看见亲密好友的最新,自然能吸引到更多人下载尝鲜。
▲几乎在每一页桌面,我都会添加一个桌面小组件
优秀小部件一定程度上能提升应用活跃度、吸引新用户下载,而且并不仅限于社交或工具领域,运动健康应用 YaoYao 的开发者汪家浩告诉我自从上线桌面小组件功能后,用户的活跃度有了一定程度上升。
苹果在桌面美化方面一直限制颇多,桌面小组件是一个例外,优秀应用可以通过一个好看、好用的小组件吸引用户下载和使用。
相比 iOS,Android 在桌面小小组件方面起步更早也更开放,很早就支持了交互式小组件,各路定制 Android 系统基本都将其作为功能亮点之一推广,实用且高效。
▲ OriginOS 的天气小组件可以直接早桌面上 *** 控
比如 vivo 的 OriginOS 系统,在桌面你就能滑动天气应用小组件,查看不同时间段的天气情况,速记、计时器、健康等应用的桌面小组件都可以直接点击其中的按钮,一步就可以定时、语音记录,效率优先。
小米在这方面做得就更极致了,甚至可以让你在桌面上玩各种各样的小游戏,像这个捉鱼小游戏,玩法和《黄金矿工》类似,只是这次你可以直接在桌面上玩。
▲ MIUI 桌面小组件,在手机桌面上「钓鱼」
它们就像是一个又一个迷你应用,解锁桌面就可以使用,在可玩性和效率方面表现不错。
这并非是苹果选择的方向,自从 iOS 14 推出桌面小组件功能后一直没有支持交互式小组件,甚至因为种种限制影响到了《贴贴》等应用的体验。
iPhone 桌面小组件的限制
在《贴贴》的 App Store 评论区,「桌面小组件上的不能实时更新」是最常见的吐槽之一,当朋友之间分享新照片却不能及时在桌面更新,应用也就几乎没了存在价值。
《贴贴》官方曾在抖音给出解决方案,即保持应用一直在运行,不能通过多任务功能将其关闭。
▲《贴贴》在抖音的回复
正是苹果限制 iOS 桌面小组件的刷新能力。
早在 iOS 14 推出时,苹果就提供了桌面小组件的开发文档,针对小组件的刷新提出多种运行方式,其中比较常见的有 2 种:
当应用在运行时,可以通过应用对小组件进行刷新。
当应用关闭时,开发者可以提交相应的刷新频率设置,比如天气应用按照时间段,一天刷新 5 次,系统会根据运行情况决定是否刷新。
开发文档中,苹果给出了限制桌面小组件刷新的理由——节省资源,保证手机续航,在《贴贴》的 App Store 评论区就有用户表示长期将应用挂在后台运行,耗电量颇高。
在《50 音起源》的开发者周楷雯看来,苹果要求开发者统一使用 SwiftUI 构建桌面小组件,除了降低开发成本、推动小组件在苹果生态内跨平台运行,也以数据处理优化的方式,节省资源和增加手机续航。
《足迹》作为一款需要长期运行的运动健康监测应用,提供了专门的「省电模式」,据我一位使用 iPhone 12 mini 朋友的亲身经历,大概一晚上耗电增加 1%-2% 左右。
此外,苹果在桌面小组件讲解视频中提到了一个概念「小组件不是迷你 App」,桌面应该是手机 *** 作的起点而不是终点,这和当初 iPhone Home 键的「一键回家」理念一脉相承,按下 Home 键就能回到桌面,回到最初的地方。
当然,这可能也有美学上的考量,人们每天打开手机数十次,一旦交互小组件泛滥,桌面上的按钮也会泛滥,一堆按钮看起来并不美观。
另一方面,小组件本身要占据更多桌面空间,在应用越多的情况,寻找应用就成了难题,并不是每个人都愿意花费时间整理桌面的,我自己也靠 App 资源库和搜索寻找应用,繁杂的交互小组件只能加重这一问题。
现阶段的 iPhone 桌面小组件,并不能让你直接在桌面上 *** 作,即便是勾选 to do 应用上的一个任务,都需要点击小组件,然后进入应用,再完成勾选,仅有像快捷指令这样的官方应用例外。
▲桌面小组件无法在桌面勾选 to do 事项
交互式小组件十分考验设计能力,需要人们熟悉相应的 *** 作,比如小米 MIUI 上的桌面小组件游戏,我经常在玩的时候不小心长按,导致 *** 作手机以为我要移动小部件,最终游戏失败。
左右滑动天气小组件查看不同时间段的天气情况,其实也是有好处也有遗憾,一方面 *** 作效率变高了,另一方面滑动 *** 作有可能会桌面左右滑动切换产生冲突,引发误触。
Google 发布 Android 12 时,带来新的桌面小组件,它们形态更丰富、随性,同时 Google 要表示要推出新技术和新工具给开发者们,这不仅是为了降低成本,也可能是通过开发标准保证新桌面小组件体验流畅和省电。
更进一步,需要新的方法
启发一批桌面小组件应用的 Locket Widget 开发者 Matt Moss,曾表示设计应用的初衷是能和异地恋的女朋友保持联系,通过分享保持新鲜感,这也是《贴贴》等应用在宣传时常见的说法。
这股风潮的兴起,证明了桌面小组件大有可为,但苹果的限制让它们不能在小组件本身挖掘更多玩法,甚至显示刷新都有限制。
对于用户而言,这类小组件到底是社交应用还是工具应用,并非一目了然,像微信这样的社交应用,一直保持运行基本已经是常识了,但其他应用要获得类似的待遇并不容易,这需要足够多的社交关系加持。
要么 livein、Locket Widget 的开发者们按照要求,进一步往应用内部挖掘功能,将用户留下来,不然依靠 Tik Tok 等短视频平台导流爆火的它们,仅仅针对恋爱群体、核心设计高度趋同,用户很快就会失去新鲜感,除非是苹果转变方向。
WWDC 2022 前夕有不少关于 iOS 16 系统的爆料,其中就有一条是 iPhone 支持交互式小组件,按照 leaksApplePro 发布的来看,大多是音乐、计时器这种常见的效率应用,一两个按钮就能提供核心功能。
如苹果真的上线交互式桌面小组件,要么是用户的行为让它改变想法,或是找到了同时保证续航和桌面小组件体验的方法
收集传输。选择csdn来源并传输到swiftuitextfield来获取最新时间的数据。步骤如下:
1、首先使用string来获取用户在csdn中输入的内容。
2、其次使用收集到的数据在swiftuitextfield中进行编写即可。
文字
按钮 手势
占位的view
分割线,VStack 里面分割线是水平方向的线
HStack 里面分割线是竖直方向的线
矩形View
圆角矩形View 圆角等于高度的一半时,矩形两边正好是两个半圆
----------------------------->1<-----------------------------
让View纵向排列
让View水平排列
垂直于屏幕方向排列
分组,显示多个自动预览页的时候,可以把自动预览页放进Group,
一个View,会尽量的扩张自己,尽可能多占空间,可以放View,可以获取自己的宽高
可滑动的View
----------------------------->2<-----------------------------
可以展示多个不同的View,可以用for Each语句铺view
for循环 遍历数组或者view数组,这些view可以放到List里面
导航栏可以进行跳转
导航栏的跳转
空View
模态推出一个页面
----------------------------->3<-----------------------------
修改View宽高
修改View上下左右的间距
修改View水平方向或竖直方向偏移量
把View裁成某个形状 (圆形)
把超出View得部分裁剪掉
实现缩放效果
----------------------------->4<-----------------------------
修改颜色
修改透明度
隐藏View
在View前面添加东西
在View后面添加东西
----------------------------->5<-----------------------------
修改一个View在List里面的上下左右间距
当一个View的一部分处在安全区域的时候,要在安全区域里显示内容可以用~~忽略安全区域
设置导航栏的标题
设置了标题之后,~~导航栏隐藏才会起作用,
可以在导航栏里 添加其他的View
我们在适配ipad的时候用到,可以使ipad显示的效果和iphone一样
----------------------------->6<-----------------------------
修改字体、大小
字体加粗
限制行数
----------------------------->7<-----------------------------
声明是可以缩放的
保持原图宽高比填充整个空间
保持原图宽高比适应整个空间
----------------------------->8<-----------------------------
当list里面的一个View有多个button的时候,点击这个View所有的button都会响应,要解决这个问题,我们设置了buttonStyle,设置为BorderlessButtonStyle,其实设置成其他的buttonStyle也可以,我们也可以自定义buttonStyle
----------------------------->9<-----------------------------
把swiftUI的View封装成UIViewController
----------------------------->10<---------------------------
协议,至少实现两个函数,创建函数makeUIView和更新函数updateUIView,如果需要可以自定义Coordinator
协议,至少实现两个函数,创建函数makeUIViewController和更新函数updateUIViewController,如果需要可以自定义Coordinator
----------------------------->11<---------------------------
我们在用到环境对象的时候,环境对象的类型必须遵循这个协议,这个协议规定了类型必须是class类,这个类里面的属性加上@Published修饰词,属性改变用到这个属性的View就会更新
----------------------------->12<---------------------------
通常是View自己使用,可以起到更新属性的时候就更新View
子View使用父View的属性时,需要使用这个修饰词可以起到更新属性的时候就更新View,父View和子View的属性绑定在一块,一个改变另一个也会改变,同时更新View
必须遵循ObservableObject协议,协议详情请看12页,需要在多个页面共享的话 用这个修饰,声明之后不需要赋值,因为它会从父View里面找相应的值,如果找不到app会闪退
必须遵循ObservableObject协议,协议详情请看12页,复杂类型属性可以使用这个
----------------------------->13<---------------------------
使用:
使用:
以上就是关于SwiftUi的属性装饰器全部的内容,包括:SwiftUi的属性装饰器、swiftui 请求 渲染数据、SwiftUI:自定义SearchBar等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)