Live Activity更新数据时,画面会淡入淡出,如何关闭此动画效果?



动画内容更新

当你定义Live Activity的用户界面时,系统会忽略任何动画修饰符——例如,withAnimation(_:_:)和animation(_:value:)——而使用系统的动画计时。但是,当Live Activity的动态内容发生变化时,系统会执行一些动画。文本视图动画内容变化与模糊的内容过渡,和系统动画内容过渡的图像和SF符号。如果您根据内容或状态更改在用户界面中添加或删除视图,则视图将淡入或淡出。使用以下视图转场来配置这些内置转场:不透明度、移动(edge:)、滑动、推送(from:)或它们的组合。此外,请求定时器文本的动画与numericText(countsDown:)。

Live Activity更新数据时,画面会淡入淡出,如何关闭此动画效果?

我尝试了所有可能的方法来关闭动画,但是当刷新Live Activity时,图片仍然有一个半透明的动画

这是一个棘手的问题,从我的经验来看,不同的视图类型需要不同的解决方案。

  • 我在我的Live ActivityDynamicIsland视图上有一个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修饰符使这些视图以文档中描述的动画方式显示。

最新更新