if语句重置对象的位置......为什么?

时间:2014-11-24 17:00:15

标签: if-statement swift xcode6

添加此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.
}   
}

1 个答案:

答案 0 :(得分:1)

自动布局正在移动您的视图。你有2个选择如何解决这个问题:

  1. 在Xcode右侧的文件检查器中关闭自动布局。

  2. 通过为视图的水平位置和垂直位置创建约束,在Auto Layout系统中工作。如果在Interface Builder中创建约束,请将IBOutlet添加到代码中的约束中,然后更新约束&#39; constant属性,而不是引用框架。


  3. 以下是您更新的代码以使用约束。

    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中创建约束。不要让细节吓到你,这并不难。

    1. 单击 Interface Builder 中的Pan View项目,然后单击屏幕底部的 Resolve Autolayout Issues 图标 | - ^ - | 。在所选视图下的弹出窗口中,单击 Clear Constraints 。这样可以确保我们从平移视图的约束开始就是一个干净的平板。

    2. 控制在平移视图中对角拖动。

    3. first control drag

      1. 按住 Shift ,在我告诉你之前不要放手。在弹出窗口中,单击“宽度”,然后单击“高度”。放开 Shift 。点击返回。这为Pan View设置了宽度和高度限制。
      2. set width and height

        1. 控制从平移视图的中心拖动到包含的视图。
        2. second control drag

          1. 按住 Shift ,在我告诉你之前不要放手。在弹出窗口中,单击前导空格到容器边距,然后单击顶部空间到布局指南。放开 Shift 。点击返回。这为Pan View设置了水平和垂直位置约束。现在让我们更改这些约束,使它们基于平移视图的中心X和中心Y.

          2. 打开文档大纲视图。您可能需要转动一些三角形才能看到新约束。

          3. document outline

            1. 单击垂直空间约束。

            2. 在最右侧的尺寸检查器中,将第一个项目字段更改为中心Y 。将常量更改为100。

            3. constraint inspector

              1. 再次在文档大纲视图中,单击水平空间约束。

              2. 在最右侧的尺寸检查器中,将第一个项目字段更改为中心X 。将常量更改为100。

              3. 将约束连接到您的代码,如下所示:

              4. wire up constraint

                1. 编译并运行。您的平移视图应该是可拖动的,并且您的标签应该在您放手时更新。