Swift:核心动画没有动画

时间:2017-02-03 17:05:03

标签: ios swift uiview core-graphics core-animation

对于Core Animation来说,我是一个noobie。我试图实现简单动画,其中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"); 从A点移动到B点。我有以下代码,我从动画代码示例中获得但我无法使其工作。标签根本不动。我做错了什么?

curve_fit

1 个答案:

答案 0 :(得分:1)

首先:您无法同时呼叫addSubview上的labeladd(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))]

fromValuetoValue都不能是数组。摆脱那些牙箍。在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");
}