2016-03-05 88 views
0

我正面临问题 我有一个视图控制器,它包含一个Pan手势和一个NSTimer,它有一个每秒钟都会被调用的选择器 问题在于每当定时器被激活时标签i尝试使用平移手势移动会自动返回其原点位置。 原因是什么?UIPanGesture With NSTimer问题

这里是代码

import UIKit 

class gameViewController: UIViewController { 


    @IBOutlet weak var img1: UIImageView! 
    @IBOutlet weak var lbl1: UILabel! 


    @IBOutlet weak var timerLabel: UILabel! 
    @IBOutlet weak var gameDifficultyLabel: UILabel! 

    var timer = NSTimer() 
    var timeManager = TimerManager() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     timerLabel.text = "\(timeManager.displayedTime(timeManager.time!))" 
     // Do any additional setup after loading the view. 
     timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTime", userInfo: nil, repeats: true) 
    } 
    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     if let difficulty = timeManager.difficulties { 
      switch difficulty { 
      case .Easy: 
       gameDifficultyLabel.text = "Easy" 
      case .Medium: 
       gameDifficultyLabel.text = "Medium" 
      case .Hard: 
       gameDifficultyLabel.text = "Hard" 
      } 
     } 
    } 

    @IBAction func panGesture(sender: UIPanGestureRecognizer) { 
     let translation = sender.translationInView(self.view) 
     if let view = sender.view { 
      view.center = CGPoint(x:view.center.x + translation.x, 
       y:view.center.y + translation.y) 
     } 
     sender.setTranslation(CGPointZero, inView: self.view) 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
    func updateTime() { 
     let shouldStop = timeManager.updateTime() 
     timerLabel.text = timeManager.displayedTime(timeManager.time) 
     if shouldStop { 
      timer.invalidate() 
     } 
    } 
} 

UPDATE: 我已经更新了代码。 以编程方式添加标签解决了问题,但我有另一个问题 这里是代码。

类gameViewController:UIViewController的{

@IBOutlet var numbersContainers: [UIImageView]! 
@IBOutlet var numbersLabel: [UILabel]! 

@IBOutlet weak var timerLabel: UILabel! 
@IBOutlet weak var gameDifficultyLabel: UILabel! 

var LabelsBackground = [UIImageView]() 
var Labels = [UILabel]() 

var timer = NSTimer() 
var timeManager = TimerManager() 

var panGesture : UIPanGestureRecognizer! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    timerLabel.text = "\(timeManager.displayedTime(timeManager.time!))" 
    self.createLabelsBackground() 
    self.setUpLabelsBackground() 
    self.addLabelsBackground() 

    self.createLabels() 
    self.setUpLabels() 
    self.addLabels() 

    panGesture = UIPanGestureRecognizer(target: self, action: "panAction:") 
    panGesture.minimumNumberOfTouches = 1 
    panGesture.maximumNumberOfTouches = 1 

} 
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTime", userInfo: nil, repeats: true) 
    self.addPanGesture() 
} 
override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    if let difficulty = timeManager.difficulties { 
     switch difficulty { 
     case .Easy: 
      gameDifficultyLabel.text = "Easy" 
     case .Medium: 
      gameDifficultyLabel.text = "Medium" 
     case .Hard: 
      gameDifficultyLabel.text = "Hard" 
     } 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
func updateTime() { 
    let shouldStop = timeManager.updateTime() 
    timerLabel.text = timeManager.displayedTime(timeManager.time) 
    if shouldStop { 
     timer.invalidate() 
    } 
} 
func createLabelsBackground() { 
    for _ in 0..<10 { 
     if let img = UIImage(named: "noContainer") { 
      LabelsBackground.append(UIImageView(image: img)) 
     } 

    } 
} 
func setUpLabelsBackground() { 
    for i in 0..<10 { 
     LabelsBackground[i].frame = numbersContainers[i].frame 
     LabelsBackground[i].center = numbersContainers[i].center 
    } 
} 
func addLabelsBackground() { 
    for background in LabelsBackground { 
     self.view.addSubview(background) 
    } 
} 

func createLabels() { 
    for _ in 0..<10 { 
     Labels.append(UILabel()) 
    } 
} 
func setUpLabels() { 
    for i in 0..<10 { 
     Labels[i].frame = numbersLabel[i].frame 
     Labels[i].center = numbersLabel[i].center 
     Labels[i].backgroundColor = UIColor.whiteColor() 
     Labels[i].userInteractionEnabled = true 
    } 
} 
func addLabels() { 
    for label in Labels { 
     self.view.addSubview(label) 
    } 
} 

func addPanGesture(){ 
    for label in Labels { 
     label.text = "10" 
     label.addGestureRecognizer(panGesture) 
    } 
} 

func panAction(recognizer: UIPanGestureRecognizer) { 
    print("panAction") 
    let translation = recognizer.translationInView(self.view) 
    if let myView = recognizer.view { 
     myView.center = CGPoint(x: myView.center.x + translation.x, y: myView.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPointZero, inView: self.view) 
} 

}

只是为了澄清 @IBOutlet VAR numbersLabel:[的UILabel]! var Labels = UILabel

numbersLabels是使用storyboard添加的空标签,仅用于在以编程方式创建标签时进行定位。

问题是以编程方式创建并添加到标签数组的标签没有响应。

+0

您是否使用自动布局? – beyowulf

+0

没有即时通讯不使用自动布局 –

+0

仍然同样的影响,没有任何改变。 –

回答

2

我认为你确实启用了自动布局(默认情况下它是启用的)。如果您没有为视图指定任何约束(例如您的标签),故事板将在构建时为您创建它们。您可以通过查看标签的Size Inspector设置来验证此情况。

当调用updateTime()时,自动布局会根据故事板自动创建的约束将标签放回原始位置。

为了解决这个问题,您可以:

1)创建标签编程而不是在故事板创建它的。

OR

2)添加明确的约束在故事板的标签位置,然后创建@IBOutlet s到这些约束条件,并通过改变这些约束的constant属性,而不是改变其框移动代码的标签(中心)。

+0

但我还没有使用任何自动布局。它是如何得到启用的? –

+0

默认情况下,自动布局处于打开状态。 – vacawama

+0

好的,谢谢,我会尝试以编程的方式来做,并检查会发生什么。 –