Ios 如何识别被触摸的图像

Ios 如何识别被触摸的图像,ios,swift,swift3,uigesturerecognizer,Ios,Swift,Swift3,Uigesturerecognizer,我正在开发一个应用程序,用户将能够在画布上拖放项目,当他释放图像时,它将绘制在画布上 这是我的DragImage类,处理触摸: class DragImages: UIImageView { var originalPos : CGPoint! var dropTarget: UIView? override init (frame : CGRect){ super.init(frame: frame) } required init

我正在开发一个应用程序,用户将能够在画布上拖放项目,当他释放图像时,它将绘制在画布上

这是我的DragImage类,处理触摸:

class DragImages: UIImageView {

    var originalPos : CGPoint!
    var dropTarget: UIView?

    override init (frame : CGRect){
        super.init(frame: frame)
    }

    required init?(coder aDecoder : NSCoder){
        super.init(coder : aDecoder)
    }

    override func touchesBegan(_ touches : Set<UITouch>,with event: UIEvent?){
        originalPos = self.center
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first{
            let position = touch.location(in: self.superview)
            self.center = CGPoint(x : position.x, y : position.y)
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

        if let touch = touches.first, let target = dropTarget{
            let position = touch.location(in: self.superview)
            if target.frame.contains(position){

               NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "onTargetDropped"), object: nil))
            }else {
                self.center = originalPos
            }
        }

        print(self.center.x, self.center.y)
        self.center = originalPos
    }

    func getEndPosX() -> CGFloat{
        return self.center.x
    }

    func getEndPosY() -> CGFloat {
        return self.center.y
    }

}

在画布上拖动图像时,我成功地获得了X和Y位置,但我找不到一种方法来识别4个图像中的哪一个正在被删除,以便我绘制特定的图像

您可以将发件人添加到通知中(以及职位):

然后在
itemDroppedOnTree
中获取它:

func itemDroppedOnTree(_ notif : NSNotification){
    let position = notif.userInfo["position"]
    let sender = notif.object as! DragImage
    if sender === dragImage1 {
         //... 
    } else if sender === dragImage2 {
         //...
    }
 }

但我建议不要这样做,并请求使用
委托
通知
视图控制器
。(基于意见:一般情况下,仅对多个广播使用通知。)

委托函数应将发送方作为第一个参数。根据
func tableView:tableView:UITableView,cellForRowAt indexath:indexPath)

通过这种方式,您可以知道哪个图像正在发送其新位置,并可以将其与您的财产进行比较,如上例所示:

 if dragImage === dragImage1 {...

要粘贴到游乐场的代码和工作代理:

import UIKit
import PlaygroundSupport

protocol DragImageDelegate: class {
    func dragimage(_ dragImage:DragImage, didDropAt position:CGPoint)
}

class DragImage: UIImageView {
    weak var delegate: DragImageDelegate?

    var originalPos : CGPoint!
    var dropTarget: UIView?

    override init (frame : CGRect) {
       super.init(frame: frame)
        isUserInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func touchesBegan(_ touches : Set<UITouch>,with event: UIEvent?){
        originalPos = self.center
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first{
            let position = touch.location(in: self.superview)
            self.center = CGPoint(x : position.x, y : position.y)
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first, let target = dropTarget {
            let position = touch.location(in: self.superview)
            if target.frame.contains(position){
                print(self.center.x, self.center.y)
                guard let delegate = self.delegate else {
                    print("delegate not set")
                    return
                }
                print(self.center.x, self.center.y)

                delegate.dragimage(self, didDropAt: position)

                return
            }
        }

        self.center = originalPos
    }
}

class MyVC: UIViewController, DragImageDelegate {
    let dragImage1 = DragImage(frame: CGRect(x: 0.0, y: 0.0, width: 30.0, height: 30.0))
    let dragImage2 = DragImage(frame: CGRect(x: 0.0, y: 100.0, width: 30.0, height: 30.0))

    override func viewDidLoad() {
        let target = UIView(frame: CGRect(x: 200.0, y: 400.0, width: 30.0, height: 30.0))
        target.backgroundColor = .black
        view.addSubview(target)

        dragImage1.backgroundColor = .white
        dragImage2.backgroundColor = .white
        dragImage1.dropTarget = target
        dragImage2.dropTarget = target
        view.addSubview(dragImage1)
        view.addSubview(dragImage2)

        dragImage1.delegate = self
        dragImage2.delegate  = self
    }

    private func move(_ view:UIView, to position:CGPoint) {
        view.frame = CGRect(x: position.x, y: position.y, width: view.frame.size.width, height: view.frame.size.height)
    }

    // MARK: - DragImageDelegate

    func dragimage(_ dragImage: DragImage, didDropAt position: CGPoint) {
        if dragImage === dragImage1 {
            move(dragImage1, to: position)
        } else if dragImage === dragImage2 {
            move(dragImage2, to: position)
        }
    }
}

var container = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0))
let myVc = MyVC()
myVc.view.frame = CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0)
myVc.view.backgroundColor = .green
container.addSubview(myVc.view)

PlaygroundPage.current.liveView = container
导入UIKit
导入PlaygroundSupport
协议DragImageDelegate:类{
func dragimage(gimage:dragimage,didDropAt位置:CGPoint)
}
类DragImage:UIImageView{
弱变量委托:DragImageDelegate?
var originalPos:CGPoint!
var dropTarget:UIView?
重写初始化(帧:CGRect){
super.init(frame:frame)
isUserInteractionEnabled=true
}
必需的初始化?(编码器aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
原点=自中心
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
如果让触摸=先触摸{
让位置=触摸位置(在:self.superview中)
self.center=CGPoint(x:position.x,y:position.y)
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果让touch=touch.first,则让target=dropTarget{
让位置=触摸位置(在:self.superview中)
如果target.frame.contains(位置){
打印(self.center.x、self.center.y)
guard let delegate=self.delegate else{
打印(“未设置委托”)
返回
}
打印(self.center.x、self.center.y)
代理绘图(自身,didDropAt:位置)
返回
}
}
self.center=originalPos
}
}
类MyVC:UIViewController,DragImageDelegate{
设dragImage1=DragImage(帧:CGRect(x:0.0,y:0.0,宽度:30.0,高度:30.0))
设dragImage2=DragImage(帧:CGRect(x:0.0,y:100.0,宽度:30.0,高度:30.0))
重写func viewDidLoad(){
让target=UIView(帧:CGRect(x:200.0,y:400.0,宽度:30.0,高度:30.0))
target.backgroundColor=.black
view.addSubview(目标)
dragImage1.backgroundColor=.white
dragImage2.backgroundColor=.white
dragImage1.dropTarget=目标
dragImage2.dropTarget=目标
view.addSubview(绘图页1)
view.addSubview(绘图2)
dragImage1.delegate=self
dragImage2.delegate=self
}
私有函数移动(view:ui视图,到位置:CGPoint){
view.frame=CGRect(x:position.x,y:position.y,width:view.frame.size.width,height:view.frame.size.height)
}
//马克:-德拉金马代表
func dragimage(gimage:dragimage,didDropAt位置:CGPoint){
如果dragImage==dragImage1{
移动(dragImage1,到:位置)
}否则,如果dragImage==dragImage2{
移动(dragImage2,到:位置)
}
}
}
var container=UIView(帧:CGRect(x:0.0,y:0.0,宽度:300.0,高度:600.0))
设myVc=myVc()
myVc.view.frame=CGRect(x:0.0,y:0.0,宽度:300.0,高度:600.0)
myVc.view.backgroundColor=.green
container.addSubview(myVc.view)
PlaygroundPage.current.liveView=容器
结果:


首先,不要忘记将UIImageView.isUserInteractionEnabled()设置为true(很容易出错,我们都这么做)。第二,设置标签属性-它们将帮助您知道哪个被触摸。第三事情看起来不错,但如果您有其他问题,请尝试使用UIgestureRecognitor或调试当前的设置。我尝试过使用UIgestureRecognitor,但没有成功。当你说标签属性时,我能在我的案例中使用它吗?你能给我一段示例代码来指导我吗?使用代理通知viewController而不是通知。委托函数将seder作为第一个参数。例如
tableView:tableView cellForRowAt:…
。这样你就知道它是哪一幅了。一般来说,只对许多广播使用通知。@shallowthough-我每天从你那里学到越来越多。谢谢(编辑-你说的“seder”是指“sender”。)pavlos,既然你有了sender,你就可以很容易地使用tag属性了。是的,“sender”,对不起。你不需要标签。您可以比较视图:
如果发送者===1{…}如果…
我很乐意。欢迎
 if dragImage === dragImage1 {...
import UIKit
import PlaygroundSupport

protocol DragImageDelegate: class {
    func dragimage(_ dragImage:DragImage, didDropAt position:CGPoint)
}

class DragImage: UIImageView {
    weak var delegate: DragImageDelegate?

    var originalPos : CGPoint!
    var dropTarget: UIView?

    override init (frame : CGRect) {
       super.init(frame: frame)
        isUserInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func touchesBegan(_ touches : Set<UITouch>,with event: UIEvent?){
        originalPos = self.center
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first{
            let position = touch.location(in: self.superview)
            self.center = CGPoint(x : position.x, y : position.y)
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first, let target = dropTarget {
            let position = touch.location(in: self.superview)
            if target.frame.contains(position){
                print(self.center.x, self.center.y)
                guard let delegate = self.delegate else {
                    print("delegate not set")
                    return
                }
                print(self.center.x, self.center.y)

                delegate.dragimage(self, didDropAt: position)

                return
            }
        }

        self.center = originalPos
    }
}

class MyVC: UIViewController, DragImageDelegate {
    let dragImage1 = DragImage(frame: CGRect(x: 0.0, y: 0.0, width: 30.0, height: 30.0))
    let dragImage2 = DragImage(frame: CGRect(x: 0.0, y: 100.0, width: 30.0, height: 30.0))

    override func viewDidLoad() {
        let target = UIView(frame: CGRect(x: 200.0, y: 400.0, width: 30.0, height: 30.0))
        target.backgroundColor = .black
        view.addSubview(target)

        dragImage1.backgroundColor = .white
        dragImage2.backgroundColor = .white
        dragImage1.dropTarget = target
        dragImage2.dropTarget = target
        view.addSubview(dragImage1)
        view.addSubview(dragImage2)

        dragImage1.delegate = self
        dragImage2.delegate  = self
    }

    private func move(_ view:UIView, to position:CGPoint) {
        view.frame = CGRect(x: position.x, y: position.y, width: view.frame.size.width, height: view.frame.size.height)
    }

    // MARK: - DragImageDelegate

    func dragimage(_ dragImage: DragImage, didDropAt position: CGPoint) {
        if dragImage === dragImage1 {
            move(dragImage1, to: position)
        } else if dragImage === dragImage2 {
            move(dragImage2, to: position)
        }
    }
}

var container = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0))
let myVc = MyVC()
myVc.view.frame = CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0)
myVc.view.backgroundColor = .green
container.addSubview(myVc.view)

PlaygroundPage.current.liveView = container