SwiftUI通过GeometryReader设置点击区域
SwiftUI通过GeometryReader设置点击区域

SwiftUI通过GeometryReader设置点击区域

例如,在下面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/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注