使用手势识别器和 swift 查找发件人的标签

Nic*_*los 3 tags uigesturerecognizer ios swift

tl;dr: 我应该如何设置我的标签,以便可以使用手势识别器检索它们?

我正在设置一个视图,用户可以在其中按下按钮时生成多个 UIImageViews。图像创建过程是:

var siegeView: UIView!
var round1: UIImageView!
var setTag : Int!
var tagCounter = 0

 @IBAction func showContent(sender: AnyObject) {


    round1 = UIImageView(frame: CGRectMake(0, 0, 100, 100))

    round1.image = UIImage(named: nomDuRond.text)

    setTag = tagCounter
    tagCounter++
    self.rond1.tag = setTag

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(round1.frame.origin.x+50, round1.frame.origin.y+100)
    label.textAlignment = NSTextAlignment.Center
    label.text = nomDuRond.text

    siegeView = UIView(frame: CGRectMake(round1.frame.origin.x, round1.frame.origin.y, round1.frame.size.width, round1.frame.size.height))

    round1.userInteractionEnabled = true
    siegeView.addSubview(rond1)
    siegeView.addSubview(label)

    view.addSubview(siegeView)

    let recognizer = UIPanGestureRecognizer(target: self, action:Selector("handlePan:"))
    recognizer.delegate = ClassSiege()
    siegeView.addGestureRecognizer(recognizer)
Run Code Online (Sandbox Code Playgroud)

然后用户可以使用下面的手势识别器的函数“handlePan”移动创建的图像:

 func handlePan(recognizer:UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(self.view)
    self.view.bringSubviewToFront(recognizer.view!)
    recognizer.view!.center = CGPoint(x:recognizer.view!.center.x + translation.x,
        y:recognizer.view!.center.y + translation.y)
    recognizer.setTranslation(CGPointZero, inView: self.view)

    var centerBoardX = BlackBoard.center.x
    var centerBoardY = BlackBoard.center.y
    var centerRondX = round1.superview?.center.x
    var centerRondY = round1.superview?.center.y
    var switchRang = premierRang

    DistanceCenterY.text = " \(centerRondY! - centerBoardY)"


    if centerRondY! - centerBoardY < 100 {
        switchRang.setOn(true, animated: true)

        println("dans switch if")
    } else {

        switchRang.setOn(false, animated: true)
        println("dans switch else")
    }

}
Run Code Online (Sandbox Code Playgroud)

目前,我的目标是能够获取 DistanceCenterY 信息,以及对用户移动的每个视图激活 if 操作。但它仅适用于创建的最后一个视图。我的猜测是,如果我指定图像的标签,它就可以工作。但是我不知道如何检索用户当前正在移动的图像的标签

在这里尝试了这个解决方案,但它不是图像的标签,因为即使标签不同,它也总是返回 0。

所以,我的问题是:我应该如何设置我的标签,以便可以使用手势识别器检索它们?

我深深地被困在这里,所以任何帮助将不胜感激!谢谢

更新 1 : 多亏了 Rdelmar,我才得以前进……但不会太远!

我更新了创建图像的方式,并修改了 Gesture Recognizer 函数以使用标签信息来获取所选图像的信息。

代码是:

var siegeView: UIView! var rond1:UIImageView!var rond2:UIImageView!var setTag : 整数!var tagCounter = 1 var tagInfo = 0

  func handlePan(recognizer:UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(self.view)
    recognizer.view!.center = CGPoint(x:recognizer.view!.center.x + translation.x,
        y:recognizer.view!.center.y + translation.y)
    recognizer.setTranslation(CGPointZero, inView: self.view)


    var switchRang = premierRang
    //Here I'm getting the tag from the recognizer. 
    var tag = recognizer.view?.tag
    tagInfo = tag!


    var centerBoardX = BlackBoard.center.x
    var centerBoardY = BlackBoard.center.y
    //to get the coordinates of the image, i'm getting the info using the tag I got earlier. 
    var centerRondX = rond1.viewWithTag(tagInfo)!.center.x
    var centerRondY = rond1.viewWithTag(tagInfo)!.center.y

    DistanceCenterY.text = " \(centerRondY - centerBoardY)"


    if centerRondY - centerBoardY < 100 {
        switchRang.setOn(true, animated: true)

        println("dans switch if")
    } else {

        switchRang.setOn(false, animated: true)
        println("dans switch else")
    }

}
Run Code Online (Sandbox Code Playgroud)

和 showcontent 功能更新:

@IBAction func showContent(sender: AnyObject) {


    rond1 = UIImageView(frame: CGRectMake(0, 0, 100, 100))

    rond1.image = UIImage(named: nomDuRond.text)

    setTag = tagCounter
    tagCounter++
    rond1.tag = setTag

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(rond1.frame.origin.x+50, rond1.frame.origin.y+100)
    label.textAlignment = NSTextAlignment.Center
    label.text = nomDuRond.text

    rond1.userInteractionEnabled = true
    view.addSubview(rond1)
    //the label subview was getting me some bugs, so for now I removed it. 
    //view.addSubview(label)

    let recognizer = UIPanGestureRecognizer(target: self, action:Selector("handlePan:"))
    recognizer.delegate = ClassSiege()
    rond1.addGestureRecognizer(recognizer)
Run Code Online (Sandbox Code Playgroud)

移动图像时返回的标签是正确的,但是当我添加第二个图像并移动第一个图像时,我收到一个致命错误,因为该行返回了 nil var centerRondY = rond1.viewWithTag(tagInfo)!.center.y

我仍然被卡住,因为我找不到问题所在。我不清楚识别器是如何工作的。如果你有一些线索,它仍然非常非常感激。谢谢 !

rde*_*mar 5

我认为这段代码可以满足您的需求。我注释掉了一些东西,因为我不知道它是什么,我硬编码了标签中的图像和文本。正如我在评论中所说,您不需要使用标签,因为每个识别器都知道自己的视图。我注释掉了按钮的东西,但是当我在屏幕上上下移动视图时,我确实看到“if”和“else”日志语句被触发,

class ViewController: UIViewController {

    @IBAction func showContent(sender: AnyObject) {

        var rond1 = UIImageView(frame: CGRectMake(0, 0, 100, 100))
        rond1.image = UIImage(named:"Lofoten.jpg")

        var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
        label.center = CGPointMake(rond1.frame.origin.x+50, rond1.frame.origin.y+100)
        label.textAlignment = NSTextAlignment.Center
        label.text = "Picture"
        label.textColor = UIColor.whiteColor()
        label.frame = CGRectMake(0, rond1.frame.size.height - 25, 100, 25)

        rond1.addSubview(label)
        rond1.userInteractionEnabled = true

        view.addSubview(rond1)
        let recognizer = UIPanGestureRecognizer(target: self, action:Selector("handlePan:"))
        rond1.addGestureRecognizer(recognizer)

    }

    func handlePan(recognizer:UIPanGestureRecognizer) {
        let iv = recognizer.view
        let translation = recognizer.translationInView(self.view)
        iv.center.x += translation.x
        iv.center.y += translation.y
        recognizer.setTranslation(CGPointZero, inView: self.view)
       // var switchRang = premierRang

        var centerBoardY = self.view.center.y
        var centerRondY = iv.center.y

        //DistanceCenterY.text = " \(centerRondY - centerBoardY)"

        if centerRondY - centerBoardY < 100 {
            //switchRang.setOn(true, animated: true)

            println("dans switch if")
        } else {

            //switchRang.setOn(false, animated: true)
            println("dans switch else")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)