iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 如何识别触摸的图像大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个应用程序,用户可以在画布上拖放项目,当他释放图像时,它将在画布上绘制.

这是我的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
    }

}

在我的ViewController类中,我添加了这段代码来处理触摸等:

ornament1.dropTarget = xmasTree
    ornament2.dropTarget = xmasTree
    ornament3.dropTarget = xmasTree
    ornament4.dropTarget = xmasTree

NotificationCenter.default.addObserver(self,selector: #selector(ViewController.itemDroppedOnTree(_:)),name: NSNotification.Name(rawValue: "onTargetDropped"),object: nil)

}


func itemDroppedOnTree(_ notif : AnyObject){



}

当图像在画布上拖动时,我设法得到X和Y位置,但是我无法找到一种方法来识别4个图像中的哪一个被丢弃,以便我绘制特定的图像!

解决方法

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

NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "onTargetDropped"),object: self,userInfo: ["position":position]))

稍后在itemDroppedOnTree中获取它:

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

我建议反对它,并恳求使用委托来通知ViewController. (基于意见:通常,仅对多人广播使用通知.)

委托函数应将sender作为第一个参数.根据func tableView:tableView:UITableView,cellForRowAt indexPath:IndexPath).

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

if dragImage === dragImage1 {...

您的代码加上工作委托粘贴到Playground:

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?) {
        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,height: 30.0))

    override func viewDidLoad() {
        let target = UIView(frame: CGRect(x: 200.0,y: 400.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,width: 300.0,height: 600.0))
let myVc = MyVC()
myVc.view.frame = CGRect(x: 0.0,height: 600.0)
myVc.view.backgroundColor = .green
container.addSubview(myVc.view)

PlaygroundPage.current.liveView = container

结果:

ios – 如何识别触摸的图像

大佬总结

以上是大佬教程为你收集整理的ios – 如何识别触摸的图像全部内容,希望文章能够帮你解决ios – 如何识别触摸的图像所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: