Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 查找发件人';带手势识别器和swift的s标签_Ios_Swift_Tags_Uigesturerecognizer - Fatal编程技术网

Ios 查找发件人';带手势识别器和swift的s标签

Ios 查找发件人';带手势识别器和swift的s标签,ios,swift,tags,uigesturerecognizer,Ios,Swift,Tags,Uigesturerecognizer,tl;dr:我应该如何设置标签,以便可以使用手势识别器检索标签? 我正在设置一个视图,用户按下按钮时可以在其中生成多个UIImageView。 图像创建过程是: var siegeView: UIView! var round1: UIImageView! var setTag : Int! var tagCounter = 0 @IBAction func showContent(sender: AnyObject) { round1 = UIImageView(frame:

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

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

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)
然后,用户可以使用手势识别器的功能“handlePan”移动创建的图像,如下所示:

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


我仍然陷在困境中,因为我找不到哪里出了问题。我不清楚识别器是如何工作的。如果你有一些线索,我们仍然非常感谢。谢谢

我认为这段代码符合您的要求。我注释了一些东西,因为我不知道它是什么,我硬编码标签中的图像和文本。正如我在评论中所说,您不需要使用标记,因为每个识别器都知道自己的视图。我注释掉了按钮的内容,但当我在屏幕上上下移动视图时,我确实看到了“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")
        }

    }
}
类ViewController:UIViewController{
@iAction func showContent(发件人:AnyObject){
var rond1=UIImageView(帧:CGRectMake(0,01000100))
rond1.image=UIImage(名为:“Lofoten.jpg”)
var label=UILabel(帧:CGRectMake(0,0,200,21))
label.center=CGPointMake(rond1.frame.origin.x+50,rond1.frame.origin.y+100)
label.textAlignment=NSTextAlignment.Center
label.text=“图片”
label.textColor=UIColor.whiteColor()
label.frame=CGRectMake(0,rond1.frame.size.height-2510025)
rond1.addSubview(标签)
rond1.userInteractionEnabled=true
视图。添加子视图(rond1)
let recognizer=UIPanGestureRecognizer(目标:self,操作:选择器(“handlePan:”)
rond1.AddGestureRecognitor(识别器)
}
func handlePan(识别器:UIPangestureRecognitor){
let iv=识别器视图
let translation=recognizer.translationView(self.view)
iv.center.x+=translation.x
iv.center.y+=translation.y
识别器.setTranslation(CGPointZero,inView:self.view)
//var SwitchRange=PremierRange
var centerBoardY=self.view.center.y
var centerRondY=iv.center.y
//DistanceCenterY.text=“\(centerRondY-centerBoardY)”
如果centerRondY-centerBoardY<100{
//switchRang.setOn(真,动画:真)
println(“dans开关如果”)
}否则{
//switchRang.setOn(假,动画:真)
println(“dans开关其他”)
}
}
}

识别器有一个视图属性,因此您只需查询recognizer.view.tag是的,我尝试过,但即使图像的标记不同,我也只能得到0。您认为recognizer.view.tag应该引用图像的标记,还是我应该使用其他方式标记我的视图它可以从recognizer.view.tag访问?您应该将标记添加到siegeView而不是图像视图,因为这是recognizer.view返回的视图(或者将标签添加到图像视图中,并且根本不使用siegeView——不清楚创建siegeView的原因)。好的,谢谢,因为它有点有效。我删除了uiview,标记工作得很好…只要我只有一个图像。当第二个图像弹出时,当我尝试移动第一个图像时,应用程序就会恐慌。它抛出一个致命错误,因为返回了一个nil。我会在此处添加代码更新。实际上,你甚至不需要使用标记,因为每个图像视图都有自己的手势识别器(或者无论如何都应该有),并且它的view属性将指向它所附着的视图。rond1.viewWithTag(tagInfo)完全不清楚您要用它做什么.round1没有任何子视图,是吗?您应该编辑您的问题,以显示整个showContent函数的当前状态。谢谢!看起来很棒。此时
iv.center.x+=translation.x
编译器抱怨“UIView”没有名为center的成员。我不知道为什么…你有这个警告吗?你做到了!它起作用了!我刚刚添加了
let iv:UIView!=识别器。view
非常感谢!所以为了确保我得到了它,我试图从识别器函数中获取一个标记,但这不是必需的,因为我可以像你一样调用识别器自己的参数?对吗?@NicolasKalogeropoulos,是的,这是正确的。每个识别器只知道自己的视图,因此您所做的任何翻译都只会影响该视图。在一个相关主题上,我正在寻找一种方法,将自定义属性添加到使用上述代码生成的图像中。假设我正在传递一个“positionUnder100”作为一个bool,当我生成图像和移动图像时,关于它在屏幕上的位置,bool会从真变假……我甚至不确定是否可能这样做,但也许你知道:)@NicolasKalogeropoulos,当然可能。将UIImage(或UIImageView)子类化,并将单个BOOL属性添加到其.h文件中。
  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")
    }

}
@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)
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")
        }

    }
}