【发布时间】:2016-06-19 07:58:11
【问题描述】:
我遇到了一个问题 我有一个视图控制器,它包含一个平移手势和一个 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()
}
}
}
更新: 我已经更新了代码。 添加标签以编程方式解决了这个问题,但我遇到了另一个问题 这是代码。
class 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 标签 = UILabel
numbersLabels 是使用情节提要添加的空标签,仅用于在以编程方式创建标签时进行定位。
问题在于以编程方式创建并添加到标签数组的标签没有响应。
【问题讨论】:
-
你在使用自动布局吗?
-
不,我目前没有使用自动布局
-
还是一样的效果,没有任何改变。