添加此if语句时:
if sender.state == UIGestureRecognizerState.Ended {
stateLabel.text = "Coordniates: \(sender.view!.center.x), \(sender.view!.center.y)"
}
我的&#34; panView&#34;的位置重置它的原始位置(启动应用程序时它开始的位置)。如果我删除if语句,一切都按预期工作(&#34; panView&#34;框保留在我删除它的位置。坐标在&#34; stateLabel&#34中正确更新;始终...... < / p>
像我这样的接缝通过包含if语句来重置位置:-o
有什么想法吗?
这是我的完整代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var panView: UIView!
@IBOutlet weak var stateLabel: UILabel!
let panRec = UIPanGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
panRec.addTarget(self, action: "draggedView:")
panView.addGestureRecognizer(panRec)
// Do any additional setup after loading the view, typically from a nib.
}
func draggedView(sender:UIPanGestureRecognizer){
self.view.bringSubviewToFront(sender.view!)
var translation = sender.translationInView(self.view)
sender.view!.center = CGPointMake(sender.view!.center.x + translation.x, sender.view!.center.y + translation.y)
sender.setTranslation(CGPointZero, inView: self.view)
if sender.state == UIGestureRecognizerState.Ended {
stateLabel.text = "Coordniates: \(sender.view!.center.x), \(sender.view!.center.y)"
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
答案 0 :(得分:1)
自动布局正在移动您的视图。你有2个选择如何解决这个问题:
在Xcode右侧的文件检查器中关闭自动布局。
通过为视图的水平位置和垂直位置创建约束,在Auto Layout系统中工作。如果在Interface Builder中创建约束,请将IBOutlet
添加到代码中的约束中,然后更新约束&#39; constant
属性,而不是引用框架。
以下是您更新的代码以使用约束。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var panView: UIView!
@IBOutlet weak var stateLabel: UILabel!
@IBOutlet weak var panViewCenterX: NSLayoutConstraint!
@IBOutlet weak var panViewCenterY: NSLayoutConstraint!
let panRec = UIPanGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
panRec.addTarget(self, action: "draggedView:")
panView.addGestureRecognizer(panRec)
// Do any additional setup after loading the view, typically from a nib.
}
func draggedView(sender:UIPanGestureRecognizer){
self.view.bringSubviewToFront(sender.view!)
var translation = sender.translationInView(self.view)
panViewCenterY.constant += translation.y
panViewCenterX.constant += translation.x
sender.setTranslation(CGPointZero, inView: self.view)
if sender.state == UIGestureRecognizerState.Ended {
stateLabel.text = "Coordniates: \(panViewCenterX.constant), \(panViewCenterY.constant)"
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
现在,我将逐步指导您在Interface Builder中创建约束。不要让细节吓到你,这并不难。
单击 Interface Builder 中的Pan View项目,然后单击屏幕底部的 Resolve Autolayout Issues 图标 | - ^ - | 。在所选视图下的弹出窗口中,单击 Clear Constraints 。这样可以确保我们从平移视图的约束开始就是一个干净的平板。
控制在平移视图中对角拖动。
按住 Shift ,在我告诉你之前不要放手。在弹出窗口中,单击前导空格到容器边距,然后单击顶部空间到布局指南。放开 Shift 。点击返回。这为Pan View设置了水平和垂直位置约束。现在让我们更改这些约束,使它们基于平移视图的中心X和中心Y.
打开文档大纲视图。您可能需要转动一些三角形才能看到新约束。
单击垂直空间约束。
在最右侧的尺寸检查器中,将第一个项目字段更改为中心Y 。将常量更改为100。
再次在文档大纲视图中,单击水平空间约束。
在最右侧的尺寸检查器中,将第一个项目字段更改为中心X 。将常量更改为100。
将约束连接到您的代码,如下所示: