如何在用户点击的地方显示图像? SwiftUI

Posted

技术标签:

【中文标题】如何在用户点击的地方显示图像? SwiftUI【英文标题】:How to display an image where the user taps? SwiftUI 【发布时间】:2020-04-20 23:36:35 【问题描述】:

我正在制作一个采矿攻丝游戏,我想在用户点击的任何地方显示一个锤子。

我的意思是,无论用户点击哪里,锤子图像都会停留一秒钟。

有办法吗?

我的示例代码如下:

struct Level1: View 

@State var tapScore = 0
@State var showingMinedHammer = false

func showMinedHammer() 
    self.showingMinedHammer = true
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) 
    self.showingMinedHammer = false
    


func mine() 
    tapScore += 1
    showMinedHammer()


var body: some View 
     GeometryReader  geometryProxy in
        ZStack 
Image("mine1").resizable().frame(width: UIScreen.main.bounds.height * 1.4, height: UIScreen.main.bounds.height)
              .onTapGesture 
            self.mine()
            

if self.showingMinedHammer 
                Image(systemName: "hammer.fill")
                .resizable()
                .frame(width: 30, height: 30)
            


.edgesIgnoringSafeArea(.all)


【问题讨论】:

这能回答你的问题吗? How to detect a tap gesture location in SwiftUI? 我觉得应该是这样,但是我是新手,所以我很难阅读别人的代码并将其实现到我的身上。不过谢谢! 【参考方案1】:

它只需要读取点击位置并将其用作锤子图像的位置,如下所示 - 全部由 SwiftUI 完成

使用 Xcode 11.4 / ios 13.4 测试

这里只修改了一部分

@State private var location = CGPoint.zero      // < here !!
var body: some View 
    GeometryReader  geometryProxy in
        ZStack 
            Image("mine1").resizable().frame(width: UIScreen.main.bounds.height * 1.4, height: UIScreen.main.bounds.height)
                .gesture(DragGesture(minimumDistance: 0).onEnded  value in
                    self.location = value.location // < here !!
                    self.mine()
                )
            if self.showingMinedHammer 
                Image(systemName: "hammer.fill")
                    .resizable()
                    .frame(width: 30, height: 30)
                    .position(self.location)    // < here !!
            
        
    .edgesIgnoringSafeArea(.all)

【讨论】:

@Asperi 也许你可以帮助回答我的related question【参考方案2】:

要获取您点击的位置,您可以执行以下操作:

import SwiftUI

struct ContentView: View 

@State var points:[CGPoint] = [CGPoint(x:0,y:0), CGPoint(x:50,y:50)]

var body: some View 

    ZStack
        GetTapLocation 
           // tappedCallback
           location in
            self.points.append(location)
            print(self.points)
        
    




struct GetTapLocation:UIViewRepresentable 
var tappedCallback: ((CGPoint) -> Void)

func makeUIView(context: UIViewRepresentableContext<GetTapLocation>) -> UIView 
    let v = UIView(frame: .zero)
    let gesture = UITapGestureRecognizer(target: context.coordinator,
                                         action: #selector(Coordinator.tapped))
    v.addGestureRecognizer(gesture)
    return v


class Coordinator: NSObject 
    var tappedCallback: ((CGPoint) -> Void)
    init(tappedCallback: @escaping ((CGPoint) -> Void)) 
        self.tappedCallback = tappedCallback
    
    @objc func tapped(gesture:UITapGestureRecognizer) 
        let point = gesture.location(in: gesture.view)
        self.tappedCallback(point)
    


func makeCoordinator() -> GetTapLocation.Coordinator 
    return Coordinator(tappedCallback:self.tappedCallback)


func updateUIView(_ uiView: UIView,
                   context: UIViewRepresentableContext<GetTapLocation>) 



必须有一个更简单的实现,但在此之前你可以得到你点击的位置。我希望这会有所帮助:)

【讨论】:

谢谢,但图像保持稳定,我希望它显示在用户点击的位置。 然后你可以使用我的最后一个例子,当你点击图像时,图像会在同一个地方保持稳定,将它替换为你定义的那个。或者你是什么意思用户点击的地方? 但我不想敲击锤子。起初锤子是不可见的,当在屏幕上点击时,锤子应该出现在被点击的地方。 我更新了我的答案,使用第一个代码,您可以单击屏幕上的任意位置,点击的位置将存储在变量点中。希望对你有帮助

以上是关于如何在用户点击的地方显示图像? SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

无法点击 SwiftUI 网格图像以显示 DetailView

只显示图片的百分比,swiftUI

在SwiftUI中点击watchOS应用程序时如何更改图像

如何在 SwiftUI 的新地图视图中制作可点击的图钉?

当用户输入的时间低于预期时间时,如何在 swiftUI 中显示警报消息?

如何在 SwiftUI 中显示来自 url 的图像