例如,在下面Gif图中,当点击空白区域时,会触发对话效果。
但实际上,我只在Lottie动画上添加了显示对话的功能,因为Lottie内容的小猪比较小,就导致存在很多属于Lottie动画空白区域。
因此,需要控制实际的点击区域,以便只有点击手势在小猪身上时,才显示对话。
LottieView(filename: "HomePiggyBank",isPlaying: isPlaying, playCount: 1, isReversed: isReversed)
.scaleEffect(1.5)
.frame(width: 300,height: 300)
.offset(x:60,y:40)
// 覆盖的点击手势
.overlay {
GeometryReader { geometry in
let pigXOffset: CGFloat = geometry.size.width * 0.7 // 小猪在动画中的X位置偏移
let pigYOffset: CGFloat = geometry.size.height * 0.75 // 小猪在动画中的Y位置偏移
let pigWidth: CGFloat = geometry.size.width * 0.7 // 小猪的宽度
let pigHeight: CGFloat = geometry.size.height * 0.5 // 小猪的高度
ZStack {
Button(action: {
// 点击动画时刷新谚语
currentProverb = generateUniqueRandomProverb()
withAnimation(.easeInOut(duration: 0.5)) {
isDisplayedProverb = true
isProverb = false
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
isDisplayedProverb = false
isProverb = true
}
}
}) {
Color.red // 点击区域是透明的
.opacity(0.3)
}
.allowsHitTesting(isProverb)
.frame(width: pigWidth, height: pigHeight) // 小猪的点击区域
.position(x: pigXOffset, y: pigYOffset) // 小猪区域的位置
}
}
}
为了显示点击区域,我在按钮的部分添加了红色透明度为0.3的方块。
通过给Lottie动画添加overlay层,使用GeometryReader设置小猪在Lottie动画中的偏移尺寸和点击区域。frame设置的是上图中红色的点击区域,position设置的是红色的点击区域的左上角位置。
最后,在GeometryReader设置一个ZStack的Button点击按钮,当点击按钮时,输出相关的谚语。
红色区域改为:
Color.clear // 点击区域是透明的
相关文章
SwiftUI容器视图GeometryReader:https://fangjunyu.com/2024/12/15/swiftui%e5%ae%b9%e5%99%a8%e8%a7%86%e5%9b%begeometryreader/