在SwiftUI中,使用Lottie动画时,存在每个动画的显示大小不一致问题。就需要对每一个动画设置相同的尺寸。
我尝试通过修改Lottie动画的显示代码,但没有实现大小相等的情况,此外还有比较小的动画也不应该显示的很大。因此需要个性化修改。
解决方案
方案1、设置scaleEffect
定义一个字典 animationScaleMap,其中 键为动画名称,值为对应的缩放比例。
根据 LoopAnimation 取出对应的缩放值,然后在 .scaleEffect() 里应用这个缩放比例。
struct ContentView: View {
/// **存储动画的缩放比例**
let animationScaleMap: [String: CGFloat] = [
"Home0": 1.0,
"Home1": 0.8,
...
]
var body: some View {
ForEach(backgroundRange, id: \.self) { index in
Button(action: {}, label: {
let animationName = "Home\(index)"
let scale = animationScaleMap[animationName] ?? 1.0 // 获取缩放比例,默认 1.0
LottieView(filename: animationName)
.scaleEffect(scale) // **应用缩放比例**
})
}
}
}
通过字典可以调整每个动画的缩放比例,做到尺寸相等。
如果需要设置的缩放比例字典代码过长,比如有60个动画,那么可以考虑将缩放比例字典代码放在单独的一个Swift文件中。
新建一个 Swift 文件,命名为 AnimationScaleConfig.swift。
import SwiftUI
struct AnimationScaleConfig {
static let animationScaleMap: [String: CGFloat] = [
"Home0": 1.0,
"Home1": 0.8,
...
// 继续添加你的动画缩放值
]
// 获取动画对应的缩放值,默认返回 1.0
static func scale(for animationName: String) -> CGFloat {
return animationScaleMap[animationName] ?? 1.0
}
}
ContentView.swift 中使用
LottieView(filename: "Home\(index)")
.scaleEffect(AnimationScaleConfig.scale(for: "Home\(index)")) // 直接调用获取缩放值
方案二、在AE(After Effects)+ Bodymovin 重新导出
如果有 AE(Adobe After Effects) 和 Bodymovin 插件,可以:
1、重新调整动画画布尺寸(调整 Composition Settings)。
2、导出新的 Lottie JSON 文件。
3、替换原来的 Lottie 文件。
注意:未实际测试过AE导出,如果未下载AE,则慎重使用该方案。