如何为子层和子视图设置动画?
How do I animate sublayers and subviews?
我有一个 loginViewController,当用户未登录时它会持续弹出。我想为这个 window 的背景设置动画。我尝试了两种方法,UIViewAnimateWithDuration
添加子视图,CABasicAnimation
添加子层。这两个动画都不是 运行。正在绘制子层和子视图,但它们不是动画。
第一个动画是animateWithDuration
。它试图将绘制的矩形移动到它的 y 轴上的随机点。第二个动画是 CABasicAnimation
不透明度,将绘制矩形的 alpha 从 1 更改为 0。我使用视图动画或图层动画都足够但都没有点击对我来说无关紧要。
func makeBackground() -> UIView {
let backRect = UIView()
backRect.frame = self.view.bounds
backRect.backgroundColor = backgroundColor
let floater2 = UIView(frame: CGRectMake(25.0, 0.0, 25, 25))
floater2.backgroundColor = backgroundColor
floater2.layer.borderWidth = 1.0
floater2.layer.borderColor = lowColor.CGColor
floater2.alpha = 0.0
backRect.addSubview(floater2)
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: { () -> Void in
let randomY = CGFloat(arc4random_uniform(568))
floater2.frame.origin.y = randomY
}, completion: nil)
let floater1 = CALayer()
floater1.frame = CGRectMake(0.0, 0.0, 25, 25)
floater1.backgroundColor = UIColor.redColor().CGColor
let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 1.0
animation.toValue = 0.0
animation.repeatCount = 100
animation.duration = 2.0
floater1.addAnimation(animation, forKey: "opacity")
backRect.layer.addSublayer(floater1)
return backRect
}
然后我在呈现登录视图控制器时将函数的结果分配给一个变量:
var loginViewController = PFLogInViewController()
loginViewController.delegate = self
loginViewController.fields = PFLogInFields.Default
| PFLogInFields.Facebook
| PFLogInFields.Twitter
loginViewController.logInView?.backgroundColor = backgroundColor
var bg = self.makeBackground()
loginViewController.logInView?.addSubview(bg)
loginViewController.logInView?.sendSubviewToBack(bg)
这段代码的问题:
backRect.addSubview(floater2)
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: { () -> Void in
floater2.frame.origin.y = randomY
...是您正在尝试为尚不属于渲染树的部分制作动画。您需要在 addSubview
之后提供一个 "heartbeat" 以便 floater2
是渲染树的 部分 - 也就是说,它实际上是 in 界面 - 在你开始动画之前。短暂延迟即可:
backRect.addSubview(floater2)
delay(0.1) {
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: { () -> Void in
floater2.frame.origin.y = randomY
(其中 delay
是或类似于我的效用函数:)。
你的图层动画问题是并行的。在渲染树中之前,您无法为图层设置动画。事实上,由于视图 是 层,并且由于视图动画实际上 是 层动画,所以它是相同的问题。
我有一个 loginViewController,当用户未登录时它会持续弹出。我想为这个 window 的背景设置动画。我尝试了两种方法,UIViewAnimateWithDuration
添加子视图,CABasicAnimation
添加子层。这两个动画都不是 运行。正在绘制子层和子视图,但它们不是动画。
第一个动画是animateWithDuration
。它试图将绘制的矩形移动到它的 y 轴上的随机点。第二个动画是 CABasicAnimation
不透明度,将绘制矩形的 alpha 从 1 更改为 0。我使用视图动画或图层动画都足够但都没有点击对我来说无关紧要。
func makeBackground() -> UIView {
let backRect = UIView()
backRect.frame = self.view.bounds
backRect.backgroundColor = backgroundColor
let floater2 = UIView(frame: CGRectMake(25.0, 0.0, 25, 25))
floater2.backgroundColor = backgroundColor
floater2.layer.borderWidth = 1.0
floater2.layer.borderColor = lowColor.CGColor
floater2.alpha = 0.0
backRect.addSubview(floater2)
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: { () -> Void in
let randomY = CGFloat(arc4random_uniform(568))
floater2.frame.origin.y = randomY
}, completion: nil)
let floater1 = CALayer()
floater1.frame = CGRectMake(0.0, 0.0, 25, 25)
floater1.backgroundColor = UIColor.redColor().CGColor
let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 1.0
animation.toValue = 0.0
animation.repeatCount = 100
animation.duration = 2.0
floater1.addAnimation(animation, forKey: "opacity")
backRect.layer.addSublayer(floater1)
return backRect
}
然后我在呈现登录视图控制器时将函数的结果分配给一个变量:
var loginViewController = PFLogInViewController()
loginViewController.delegate = self
loginViewController.fields = PFLogInFields.Default
| PFLogInFields.Facebook
| PFLogInFields.Twitter
loginViewController.logInView?.backgroundColor = backgroundColor
var bg = self.makeBackground()
loginViewController.logInView?.addSubview(bg)
loginViewController.logInView?.sendSubviewToBack(bg)
这段代码的问题:
backRect.addSubview(floater2)
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: { () -> Void in
floater2.frame.origin.y = randomY
...是您正在尝试为尚不属于渲染树的部分制作动画。您需要在 addSubview
之后提供一个 "heartbeat" 以便 floater2
是渲染树的 部分 - 也就是说,它实际上是 in 界面 - 在你开始动画之前。短暂延迟即可:
backRect.addSubview(floater2)
delay(0.1) {
UIView.animateWithDuration(2.0, delay: 0.0, options: .Repeat, animations: { () -> Void in
floater2.frame.origin.y = randomY
(其中 delay
是或类似于我的效用函数:)。
你的图层动画问题是并行的。在渲染树中之前,您无法为图层设置动画。事实上,由于视图 是 层,并且由于视图动画实际上 是 层动画,所以它是相同的问题。