创建带有多个可点击区域的图像的SwiftUI视图

oxiaedzo  于 2023-11-16  发布在  Swift
关注(0)|答案(2)|浏览(153)

我想创建一个缩放ZStack图像的视图。当我给予它们一个onTapGesture时,只有顶层可用,即使是在其透明区域,而背景应该是可粘贴的。
我确实尝试将renderingMode改为template来将透明区域标记为未渲染。我甚至尝试创建UIButton作为替换,因为在旧版本的UIKit中,透明区域是不可点击的。

ZStack{
    Image("backgound"))
        .resizable()
        .scaledToFit()
    Image("foreground")
        .resizable()
        .scaledToFit()
    Image("clickableHighlight1")
        .resizable()
        .scaledToFit()
        .onTapGesture {
            //do stuff specific to highlite1 area
        }
    Image("clickableHighlight2")
        .resizable()
        .scaledToFit()
        .onTapGesture {
            //do stuff specific to highlite2 area
        }
}

字符串

bejyjqdl

bejyjqdl1#

我不知道这有多重要,但我想出了一个解决方案,也许其他人会从中受益。
我确实使用转换器将我的可点击区域转换为SwiftUI形状(https://svg-to-swiftui.quassum.com/)这可能是困难的,这取决于你试图转换的svg。对我来说,它工作得很好,因为svg包含简单的路径。我给了结果形状语义名称,并将它们粘贴在我的视图上方。可悲的是,不能使用缩放到适合修改器来缩放形状,因为onTapGesture识别出了孔区域而不仅仅是突出显示的区域。所以我最终使用了overlay

import SwiftUI

struct ContentView: View {
var body: some View {
    ZStack {
        Image("background")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .overlay{
                ZStack{
                  Circle() //use the Shape you get from the converter
                      .onTapGesture {
                          print("Circle is pressed")
                      }
                  Rectangle() //use the Shape you get from the converter
                      .onTapGesture {
                          print("Rectangle is pressed")
                      }
                }
            }
     }
}

字符串

5cg8jx4n

5cg8jx4n2#

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Image("background")
                .resizable()
                .scaledToFit()

            ClickableArea(imageName: "clickableHighlight1") {
                // Do stuff specific to highlight 1 area
                print("Clicked on Highlight 1")
            }

            ClickableArea(imageName: "clickableHighlight2") {
                // Do stuff specific to highlight 2 area
                print("Clicked on Highlight 2")
            }
        }
    }
}

struct ClickableArea: View {
    let imageName: String
    let action: () -> Void

    var body: some View {
        Image(imageName)
            .resizable()
            .scaledToFit()
            .onTapGesture {
                action()
            }
    }
}

@main
struct YourApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

字符串
这段代码可以帮助你制作可点击的图片

相关问题