2017-02-03 10 views
0

Я нобе, когда дело доходит до Core Animation. Я пытаюсь реализовать простую анимацию, где UILabel перемещается из точки A в точку B. У меня есть следующий код, который я получил из примера кода анимации, но я не могу заставить его работать. Метка просто не перемещается. Что я делаю не так?Swift: Core Анимация не анимация

let frame = self.view.frame 
let blueBox = UIView(frame: frame) 
blueBox.backgroundColor = UIColor(red: 46/255, green: 83/255, blue: 160/255, alpha: 1.0) 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 400)) 
label.center = CGPoint(x: frame.size.width/2, y: frame.size.height/2) 
label.textAlignment = .center 
label.lineBreakMode = .byWordWrapping 
label.numberOfLines = 0 

label.layer.position = label.center 

var attrsA = [NSFontAttributeName: UIFont(name: "LemonMilk", size: 92), NSForegroundColorAttributeName: UIColor.white] 
var a = NSMutableAttributedString(string:"Hello\n", attributes:attrsA) 
var attrsB = [NSFontAttributeName: UIFont(name: "LemonMilk", size: 38), NSForegroundColorAttributeName: UIColor.white] 
var b = NSAttributedString(string:"World", attributes:attrsB) 
a.append(b) 


label.attributedText = a 

let theAnimation = CABasicAnimation(keyPath: "position"); 
theAnimation.fromValue = [NSValue(cgPoint: CGPoint(x: screenWidth/2, y: screenHeight/2))] 
theAnimation.toValue = [NSValue(cgPoint: CGPoint(x: 100.0, y: 100.0))] 
theAnimation.duration = 3.0; 
theAnimation.autoreverses = false //true - reverses into the initial value either smoothly or not 
theAnimation.repeatCount = 2 

blueBox.addSubview(label) 

view.addSubview(blueBox) 
label.layer.add(theAnimation, forKey: "animatePosition"); 
+2

Это может быть намного проще для вас, чтобы просто использовать 'UIView.animate (withDuration:)' – Pierce

+0

@Pierce но что не отвечает на вопрос – matt

+0

@matt - Я знаю, поэтому я не ответил на это. Я только что сделал рекомендацию в комментариях – Pierce

ответ

1

Первый: Вы не можете позвонить addSubview на label и add(animation:) на label.layer на одном дыхании. Вы можете только анимировать представление, которое уже в иерархии представлений. Другими словами, даже если все о вашем коде было в порядке, вы звоните add(animation:)слишком рано. Попробуйте ввести delay.

Второй: Эти линии являются поддельными:

theAnimation.fromValue = [NSValue(cgPoint: CGPoint(x: screenWidth/2, y: screenHeight/2))] 
theAnimation.toValue = [NSValue(cgPoint: CGPoint(x: 100.0, y: 100.0))] 

Ни fromValue, ни toValue может быть массив. Избавьтесь от этих брекетов. И в Swift 3.0.1 и более поздних версиях, вам также не нужно принуждать NSValue. Итак:

theAnimation.fromValue = CGPoint(x: screenWidth/2, y: screenHeight/2) 
theAnimation.toValue = CGPoint(x: 100.0, y: 100.0) 

Третий: Что такое fromValue даже? Если вы хотите анимировать, где метка уже есть, просто опустите fromValue.

Таким образом, я изменил свой код до конца, как это, и я увидел анимацию:

label.attributedText = a 
blueBox.addSubview(label) 
view.addSubview(blueBox) 
delay(1) { 
    let theAnimation = CABasicAnimation(keyPath: "position"); 
    theAnimation.toValue = CGPoint(x: 100.0, y: 100.0) 
    theAnimation.duration = 3.0; 
    theAnimation.autoreverses = false //true - reverses into the initial value either smoothly or not 
    theAnimation.repeatCount = 2 
    label.layer.add(theAnimation, forKey: "animatePosition"); 
} 
+0

Анимация по-прежнему не будет делать то, что вы хотите, но, по крайней мере, с этими предложениями вы должны что-то переживать. Если нет, сообщите мне. – matt