在系统并深入学习iOS动画的过程中,不得不说是个痛苦的过程。没有任何书系统的讲解这方面的知识,网上的文章都讲的支离破碎;很幸运的看到了http://objccn.io这个网站;即使如此,还是花了三天时间;这个是对整体概念模糊到不断清晰,再逐步理顺,最后总结归纳为几个关键点。我想这辈子应该都忘记不了了。
iOS上的动画效果绝对赞;最常见的uitable动态效果,当手指在屏幕上下滑动时,列表会跟随其一起上下活动;如果猛的往上一推,还可以看到列表的惯性作用下,还会不断滚动,同时慢慢减速。这个过程根本不需要我们写一行代码。我们用“animat”作为关键在工程中搜索一下,就会明白我们是多么频繁的,直接或间接的在使用动画效果。
在UIViewController,UICollectionView,UIView,CALayer中使用动画
在push和pop视图控制器的时候,就有一个animated的选项。甚至从iOS7开始允许开发者自定义视图转场效果,具体来说,你可以定义pop和push时的动画效果,还可以定义子视图控制之间切换时的动画效果。对于子视图之间切换效果也可以用之前的transitionFromViewController:toViewController:duration:options:animations:completion:。具体看自定义ViewController容器转场 ,以及View Controller转场 。
UICollectionView是个比UITableView更灵活的组件,当然使用起来也更复杂;iOS7开始,为其定制了更炫的动画效果。更具体的内容见:Collection View动画 。
UIView的动画是最常见的了,iOS4之前的调用方式:
[UIViewbeginAnimations:nilcontext:NULL];
[UIViewsetAnimationDuration:0.3];
// Set the new transform
self.view.layer.affineTransform=newTransform;
// Fix the view origin
self.view.frame= (CGRect){ { f.origin.x, f.origin.y},self.view.frame.size};
[UIViewcommitAnimations];
现在都用block的方式进行调用:
[UIViewanimateWithDuration:0.3animations:^{
UIEdgeInsetsinsets =
scrollView.scrollIndicatorInsets;
//insets.top = kStatusBarHeight;
insets.bottom=52;
scrollView.scrollIndicatorInsets= insets;
[self.viewlayoutIfNeeded];
}];
所有的动画实现,归根结底都是基于CALayer,调用方式如下,更多请见动画解释 :
CAKeyframeAnimation*anim = [CAKeyframeAnimationanimationWithKeyPath:@"transform.rotation"];
anim.values= forward [email protected][@0,@(M_PI)]:@[@(M_PI),@0];
[indicatoraddAnimation:animforKey:anim.keyPath];
CALayer是基于了Core Animation之上;而从iOS7开始,提供了更加有趣的模拟物理世界动态的框架,UIKit Dynamics。
隐式动画vs显式动画
当改变CALayer的某个属性如x坐标,默认就会产生动画效果,这就是隐式动画;你可以使用矩阵变化CGAffineTransform*实现更复杂的外形变化的效果。显式动画就是类似如下代码:
[indicatoraddAnimation:animforKey:anim.keyPath];
关于它们的更详细解释请见,Layer中自定义属性的动画
UIView是如何和CALayer进行协作的:
UIView其实是CALayer的一个的代理,也就说我们看到界面上的东西,其实还是由CALayer来负责展示。CALayer是有隐形动画,可是为什么我们修改一个UIView的外形时,没有看到动态效果。详细的解释请看,View-Layer协作
交互式动画技术的实现
交互式动画的特点是随时响应外部的触控时间;这包含两方面:
1,随手势而动:当我们向右侧滑动时,可以看到上层页面逐步向右推,下层页面逐步显示出来;如果继续往右边滑动时,到一定程度上层页面完全消失,而下层页面完全显示出来。但也有可能性,用户往回滑动,下层页面又回到了之前的位置。
2,随时撤销动画:这是就比较复杂了。比方我们一个方块从左到右滑动,滑动到一半,我们想撤回让方块回到原来位置;虽然我们可以撤销动画,但是看到的效果是;突然方块出现在了原来位置,而不是从现在的位置被拖回来。要完美实现动画撤销的效果就得理解,Present layer/Model Layer,Present Layer用于保存图层的实时属性,与当前动画进行有关,而Model Layer只是保持了最终属性值。所以解决方案是,在撤回时获取其实时属性,在添加其返回的动画。详见:交互式动画 。当然我们也可以使用Pop框架,它是完全的交互动画框架。
总结:
照例总结一下,学习就是先把书读厚,然后再把书读薄的过程:
1,Core Animation是iOS上动画的关键人物;所有看到CA*的类,一定和动画有关,比方CALayer。
2,只要改变CALayer的动画相关属性,比方位置,大小就会触发隐性动画。UIView是CALayer的代理而已,所有也天然有隐形动画,触发的方式就是动画属性的变化代码放到类似animateWithDuration的block中。
3,位置,大小,外形,颜色,透明度都是动画属性。
学的越多,做的越快;学的越多,做的越好。
版权声明:本文为博主原创文章,未经博主允许不得转载。