动画内容更新
当你定义Live Activity的用户界面时,系统会忽略任何动画修饰符——例如,withAnimation(_:_:)和animation(_:value:)——而使用系统的动画计时。但是,当Live Activity的动态内容发生变化时,系统会执行一些动画。文本视图动画内容变化与模糊的内容过渡,和系统动画内容过渡的图像和SF符号。如果您根据内容或状态更改在用户界面中添加或删除视图,则视图将淡入或淡出。使用以下视图转场来配置这些内置转场:不透明度、移动(edge:)、滑动、推送(from:)或它们的组合。此外,请求定时器文本的动画与numericText(countsDown:)。
Live Activity更新数据时,画面会淡入淡出,如何关闭此动画效果?
我尝试了所有可能的方法来关闭动画,但是当刷新Live Activity时,图片仍然有一个半透明的动画
这是一个棘手的问题,从我的经验来看,不同的视图类型需要不同的解决方案。
-
我在我的Live Activity
DynamicIsland
视图上有一个ProgressView
,为此我必须使用.transition(.identity)
修改器来停止闪烁动画的进度条。注意:.contentTransition(.identity)
不能在此视图下工作。 -
我在Live Activity的
DynamicIsland
视图上也有几个Image
视图,为此我不得不使用不同的解决方案。
这是我的图像代码简化:
let url: URL? = <some URL>
if let url,
let uiImage = UIImage(contentsOfFile: url)
{
Image(uiImage: uiImage)
.contentTransition(.identity)
}
我尝试了几种其他方法来阻止Image
闪烁,结果不同:
.transition(.identity)
: no effect.- 将图像包装在符合
Equatable
的视图结构中,并用.equatable()
修饰符标记该包装视图:闪烁大大减少,但仍然偶尔发生。 .contentTransition(.identity)
:工作,Image
完全停止闪烁。
根据苹果ActivityKit的开发者文档,你不能改变Live Activities的默认动画。系统忽略你指定的任何动画修饰符,而使用自己的动画计时。然而,你可以为添加和删除视图以及定时器文本配置内置转换。
要达到无效果,您可以使用多个视图,根据内容状态弹出和退出。
if !context.state.imageName.isEmpty {
Image(systemName: context.state.imageName)
.resizable()
.frame(width: 30, height: 30)
.padding(.trailing, 10)
} else {
Image("live-activity-logo")
.resizable()
.frame(width: 30, height: 30)
.padding(.trailing, 10)
}
您可以使用transition
修饰符使这些视图以文档中描述的动画方式显示。