我正面临问题 我有一个视图控制器,它包含一个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添加的空标签,仅用于在以编程方式创建标签时进行定位。
问题是以编程方式创建并添加到标签数组的标签没有响应。
您是否使用自动布局? – beyowulf
没有即时通讯不使用自动布局 –
仍然同样的影响,没有任何改变。 –