iOS 小组件开发第十篇:小组件动画

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

小组件系列传送门:

iOS 小组件开发第一篇:基础介绍
iOS 小组件开发第二篇:时间线
iOS 小组件开发第三篇:实战
iOS 小组件开发第四篇:小组件的尺寸
iOS 小组件开发第五篇:开发可配置的小组件
iOS 小组件开发第六篇:点击事件和交互
iOS 小组件开发第七篇:锁屏小组件
iOS 小组件开发第八篇:灵动岛开发
iOS 小组件开发第九篇:在 iOS 17 上创建可交互的小组件

昨天讲了 iOS 17 中可直接交互的小组件,如果你有完整运行起来 Demo,可能就会发现,当点击下边的计算按钮时,上边的数字变化是有一个动画的,这其实是 iOS 17 中新增的默认过度动画,今天来讲讲 iOS 17 中新增的这些动画部分。

添加动画

要给动态内容添加动画的方式非常简单,只需要在控件上使用 .contentTransition 属性,当内容改变时,就会自动根据设置的动画属性执行对应动画了:

scss 复制代码
Text("结果: \(NumberManager.number)")
                .contentTransition(.symbolEffect)

动画类型

contentTransition 支持传入一个 ContentTransition 类型,总共有这几种:

1、 identity

严格来说,这个类型是禁用动画的,当使用这个属性时,内容改变将不使用动画:

scss 复制代码
Text("结果: \(NumberManager.number)")
                .contentTransition(.identity)

2、 opacity

按照透明度方式过度动画。

scss 复制代码
Text("结果: \(NumberManager.number)")
                .contentTransition(.opacity)

3、 interpolate

当文本视图具有相同的字符串时,文本视图可以插入过渡。匹配字形对可以对其颜色、位置、大小和任何变量属性进行动画更改。

scss 复制代码
Text("结果: \(NumberManager.number)")
                .contentTransition(.interpolate)

4、 numericText(countsDown: Bool = false)

这个属性主要针对数字类型变化时的过渡动画,当数字切换时,会有数字滚动效果,数字默认向上滚动,countsDown 参数用来控制是否向下滚动。

less 复制代码
Text("结果: \(NumberManager.number)")
                .contentTransition(.numericText(countsDown: false))

上边几个都是 iOS 16 可用的,接下来几个是 iOS 17 新增的动画效果。

5、 numericText(value: Double)

这个属性同样是针对数字切换的,只不过数字动画切换的方向是由参数 value 值和当前值对比决定的,如果更新的值大于当前值,则动画向上滚动,否则向下滚动。

less 复制代码
Text("结果: \(NumberManager.number)")
                .contentTransition(.numericText(value: Double(NumberManager.number)))

6、 symbolEffect

按照苹果文档的说法,这个属性是将默认符号效果过渡应用于插入或删除视图层次结构中的符号图像的内容过渡。不过我测试下来只是增加了一个缩放的动画效果

scss 复制代码
HStack {
    if NumberManager.number > 10 {
        Image(systemName: "\(NumberManager.number).circle")
    }
    Text("结果: \(NumberManager.number)")
}
.contentTransition(.symbolEffect)

7、 symbolEffect(_ effect: T, options: SymbolEffectOptions = .default) -> ContentTransition where T : ContentTransitionSymbolEffect, T : SymbolEffect

同样也是针对符号的动画效果,只是多了可自定义 effectoptions 参数:

less 复制代码
Image(systemName: "\(NumberManager.number).circle")
                .contentTransition(.symbolEffect(.automatic, options: .speed(1)))

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
Magnetic_h16 小时前
【iOS】单例模式
笔记·学习·ui·ios·单例模式·objective-c
归辞...18 小时前
「iOS」——单例模式
ios·单例模式·cocoa
yanling202320 小时前
黑神话悟空mac可以玩吗
macos·ios·crossove·crossove24
归辞...1 天前
「iOS」viewController的生命周期
ios·cocoa·xcode
crasowas1 天前
Flutter问题记录 - 适配Xcode 16和iOS 18
flutter·ios·xcode
2401_852403551 天前
Mac导入iPhone的照片怎么删除?快速方法讲解
macos·ios·iphone
SchneeDuan1 天前
iOS六大设计原则&&设计模式
ios·设计模式·cocoa·设计原则
JohnsonXin2 天前
【兼容性记录】video标签在 IOS 和 安卓中的问题
android·前端·css·ios·h5·兼容性
蒙娜丽宁2 天前
Go语言错误处理详解
ios·golang·go·xcode·go1.19
名字不要太长 像我这样就好2 天前
【iOS】push和pop、present和dismiss
学习·macos·ios·objective-c·cocoa