If statement 如果语句重置对象的位置。。。为什么?

If statement 如果语句重置对象的位置。。。为什么?,if-statement,swift,xcode6,If Statement,Swift,Xcode6,添加此if语句时: if sender.state == UIGestureRecognizerState.Ended { stateLabel.text = "Coordniates: \(sender.view!.center.x), \(sender.view!.center.y)" } 我的“panView”的位置重置为其原始位置(当应用程序启动时开始)。如果我删除If语句,一切都会正常工作(“panView”框停留在我放置它的位置。坐标在“stateL

添加此if语句时:

    if sender.state == UIGestureRecognizerState.Ended {
        stateLabel.text = "Coordniates: \(sender.view!.center.x), \(sender.view!.center.y)"
    }
我的“panView”的位置重置为其原始位置(当应用程序启动时开始)。如果我删除If语句,一切都会正常工作(“panView”框停留在我放置它的位置。坐标在“stateLabel”中始终正确更新

我通过包含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.
}   
}

自动布局正在移动您的视图。您有两种选择来处理此问题:

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

  • 通过为视图的水平位置和垂直位置创建约束,在自动布局系统中工作。如果在Interface Builder中创建约束,请将
    IBOutlet
    s添加到代码中的约束中,然后更新约束的
    常量
    属性,而不是引用框架。


  • 下面是更新后的代码以使用约束

    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中的“平移视图”项目,然后单击屏幕底部的“解决自动布局问题”图标|-^-|。在“选定视图”下的弹出窗口中,单击“清除约束”。这可确保我们在平移视图的约束方面从头开始

  • 控件在平移视图中沿对角线拖动

  • 按住Shift键,在我告诉您之前不要松开。在弹出窗口中,单击“宽度”并单击“高度”。松开Shift键。单击“返回”。这将设置平移视图的宽度和高度约束
  • 控件从平移视图的中心拖动到包含视图
  • 按住Shift键,在我告诉您之前不要松开。在弹出窗口中,单击“前导空间到容器边距”,然后单击“顶部空间到布局指南”。松开Shift键。单击“返回”。这将设置平移视图的水平和垂直位置约束。现在,让我们更改这些约束,使其基于视图的中心X和中心Y全景图

  • 打开“文档大纲”视图。可能需要旋转一些三角形才能看到新的约束

  • 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.
        }   
    
    }
    

  • 单击垂直空间约束

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

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

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

  • 将约束关联到代码,如下所示:

  • 编译并运行。你的平移视图应该是可拖动的,当你放手时,你的标签应该更新

  • 1.这很有效,但我真的希望自动布局,因为我希望它能在多台设备上运行。2.我不知道这是怎么做到的。如果我更改了除文本道具以外的任何内容,如
    statelab.backgroundColor
    ,则一切正常(启用自动布局时)完全按照您显示和复制的代码执行,但在panView.AddgestureRecognitizer(panRec)中不断出现此错误:“Thread1:EXC_BAD_指令(code=EXCI386_INVOP,subcode=0x0)。在调试区域中,它会显示:“致命错误:在展开可选值(lldb)时意外发现零。”“…我在这里遗漏了什么?发现了错误;我忘了连接panView:-o现在一切都正常了!!!Thanx还有一件事:如果我想让多个
    panView
    独立移动,那怎么容易呢?看起来stackoverflow想让我对此进行新的讨论,所以我会这样做;-)