iOS中关于动画效果的要点

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之前的调用方式:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>[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];

</code>

现在都用block的方式进行调用:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>[UIViewanimateWithDuration:0.3animations:^{

 

UIEdgeInsetsinsets =

 

scrollView.scrollIndicatorInsets;

 

//insets.top = kStatusBarHeight;

 

insets.bottom=52;

 

scrollView.scrollIndicatorInsets= insets;

 

[self.viewlayoutIfNeeded];

 

}];

</code>

所有的动画实现,归根结底都是基于CALayer,调用方式如下,更多请见动画解释 :

?

1

2

3

4

5

6

<code>CAKeyframeAnimation*anim = [CAKeyframeAnimationanimationWithKeyPath:@transform.rotation];

 

anim.values= forward ?@[@0,@(M_PI)]:@[@(M_PI),@0];

 

[indicatoraddAnimation:animforKey:anim.keyPath];

</code>

CALayer是基于了Core Animation之上;而从iOS7开始,提供了更加有趣的模拟物理世界动态的框架,UIKit Dynamics。
隐式动画vs显式动画

当改变CALayer的某个属性如x坐标,默认就会产生动画效果,这就是隐式动画;你可以使用矩阵变化CGAffineTransform*实现更复杂的外形变化的效果。显式动画就是类似如下代码:

?

1

2

<code>[indicatoraddAnimation:animforKey:anim.keyPath];

</code>

关于它们的更详细解释请见,Layer中自定义属性的动画
UIView是如何和CALayer进行协作的:

UIView其实是CALayer的一个的代理,也就说我们看到界面上的东西,其实还是由CALayer来负责展示。CALayer是有隐形动画,可是为什么我们修改一个UIView的外形时,没有看到动态效果。详细的解释请看,View-Layer协作
交互式动画技术的实现

交互式动画的特点是随时响应外部的触控时间;这包含两方面:

1,随手势而动:当我们向右侧滑动时,可以看到上层页面逐步向右推,下层页面逐步显示出来;如果继续往右边滑动时,到一定程度上层页面完全消失,而下层页面完全显示出来。但也有可能性,用户往回滑动,下层页面又回到了之前的位置。

2,随时撤销动画:这是就比较复杂了。比方我们一个方块从左到右滑动,滑动到一半,我们想撤回让方块回到原来位置;虽然我们可以撤销动画,但是看到的效果是;突然方块出现在了原来位置,而不是从现在的位置被拖回来。要完美实现动画撤销的效果就得理解,Present layer/Model Layer,Present Layer用于保存图层的实时属性,与当前动画进行有关,而Model Layer只是保持了最终属性值。所以解决方案是,在撤回时获取其实时属性,在添加其返回的动画。详见:交互式动画 。当然我们也可以使用Pop框架,它是完全的交互动画框架。
总结:

照例总结一下,学习就是先把书读厚,然后再把书读薄的过程:

?

1

2

3

4

5

6

<code>1,Core Animation是iOS上动画的关键人物;所有看到CA*的类,一定和动画有关,比方CALayer。

 

2,只要改变CALayer的动画相关属性,比方位置,大小就会触发隐性动画。UIView是CALayer的代理而已,所有也天然有隐形动画,触发的方式就是动画属性的变化代码放到类似animateWithDuration的block中。

 

3,位置,大小,外形,颜色,透明度都是动画属性。

</code>

学的越多,做的越快;学的越多,做的越好。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值