Ios 查找发件人';带手势识别器和swift的s标签
tl;dr:我应该如何设置标签,以便可以使用手势识别器检索标签? 我正在设置一个视图,用户按下按钮时可以在其中生成多个UIImageView。 图像创建过程是: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:
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”移动创建的图像,如下所示:
当我移动图像时,返回的标记是正确的,但是当我添加第二个图像并移动第一个图像时,我得到了一个致命错误,因为该行返回了一个nilvar 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")
}
}
}