坚持写iOS DeveloperiOS 开发

iOS核心动画高级技巧(笔记)——(七)显式动画

2016-08-21  本文已影响132人  gamper

属性动画

找到一篇很详细的CABasicAnimation使用总结

CAKeyframeAnimation用values数组代替fromValuetoValue,里面的元素称为”关键帧“,动画对象会在指定的时间内,依次显示values数组中的每一个关键帧。
path属性:可以设置一个CGPathRef、CGMutabelPathRef,让图层按照路径轨迹移动,path只对CALayeranchorPointposition起作用,如果设置了path,那么values将被忽略。
keyTimes:可以为对应的关键帧指定对一个你的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的。
rotationMode属性,设置它为常量kCAAnimationRotateAuto,图层将会根据曲线的切线自动旋转。

动画组

过渡

在自己创建的图层中对图层contents图片做的改动都会自动附上淡入淡出的动画,但是对于视图关联的图层,或者是其他隐式动画的行为,这个特性依然是被禁用的。

CATransition并不作用于指定的图层属性,可以在即使不能准确得知改变了什么的情况下对图层做动画,例如,在不知道UITableView哪一行被添加或者删除的情况下,直接就可以平滑地刷新它,或者在不知道UIViewController内部的视图层级的情况下对两个不同的实例做过渡动画。
为了确保CATransition添加到的图层在过渡动画发生时不会在树状结构中被移除,一般来说,只需要将动画添加到被影响图层的superlayer

苹果通过UIView+transitionFromView:toView:duration:options:completion:+transitionWithView:duration:options:animations:方法提供了Core Animation的过渡特性。但是这里的可用的过渡选项和CATransitiontype属性提供的常量完全不同。UIView过渡方法中options参数可以由如下常量指定:
UIViewAnimationOptionTransitionFlipFromLeft
UIViewAnimationOptionTransitionFlipFromRight
UIViewAnimationOptionTransitionCurlUp
UIViewAnimationOptionTransitionCurlDown
UIViewAnimationOptionTransitionCrossDissolve
UIViewAnimationOptionTransitionFlipFromTop
UIViewAnimationOptionTransitionFlipFromBottom
CALayer有一个-renderInContext:方法,可以通过把它绘制到Core Graphics的上下文中捕获当前内容的图片,然后在另外的视图中显示出来。如果我们把这个截屏视图置于原始视图之上,就可以遮住真实视图的所有变化,于是重新创建了一个简单的过渡效果。
renderInContext:创建自定义过渡效果
@IBAction func start(sender: UIButton) {
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, 0.0)
self.view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let coverImage = UIGraphicsGetImageFromCurrentImageContext()
//insert snapshot view in front of this one
let coverView = UIImageView(image: coverImage)
coverView.frame = self.view.bounds
self.view.addSubview(coverView)
//update the view (we'll simply randomize the layer background color)
let red = CGFloat(arc4random()) / CGFloat(INT_MAX)
let green = CGFloat(arc4random()) / CGFloat(INT_MAX)
let blue = CGFloat(arc4random()) / CGFloat(INT_MAX)
self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
//perform animation (anything you like)”
UIView.animateWithDuration(1.0, animations: ({
var transform = CGAffineTransformIdentity
transform = CGAffineTransformMakeScale(0.01, 0.01)
transform = CGAffineTransformRotate(transform,CGFloat(M_PI_2))
coverView.transform = transform
coverView.alpha = 0.0
}), completion: { (finished:Bool) -> Void in coverView.removeFromSuperview()}
)
}

使用renderInContext:创建自定义过渡效果
这里有个警告:-renderInContext:捕获了图层的图片和子图层,但是不能对子图层正确地处理变换效果,而且对视频和OpenGL内容也不起作用。但是用CATransition,或者用私有的截屏方式就没有这个限制了。

在动画过程中取消动画

上一篇下一篇

猜你喜欢

热点阅读