2016-03-05 84 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

好的,謝謝,我會嘗試以編程的方式來做,並檢查會發生什麼。 –