IOS动画和各种监听总结UIGestureRecognizer

本文详细介绍iOS平台上的动画实现方式,包括首尾动画、Block动画及帧动画,并讲解了CGAffineTransform的应用。此外,还介绍了多种UIGestureRecognizer的使用方法,帮助开发者更好地处理触摸事件。

一,动画

       相对于Android动画的间动画和帧动画,IOS也有三种实现动画的方式。

  1,首尾动画(事物动画)---这种动画模式主要用到只有属性改变引起的动画,而且执行完动画后不再执行其它的操作

[UIView begainAnimations:@"" context:nil];//开启动画事务

[UIView setAnimationDuration:1.5];

(需要执行动画的View执行动画)

比如:UIImage *img=[UIImage imageName:@"img.png"];

            UIImageView *imgView=[[UIImageView alloc] initWithImage:img];

            imgView.tansform=CGAffineTransformScale(imgView.transform,2,2);

     [UIView  commitAnimations];//动画事务结束 执行完毕


2,Block动画  由于其使用方便 结构简单  大部分情况下都是用这个动画

[UIView animationWithDuration:1.0 animations:^{

//在这里执行具体的动画操作

比如:UIImage *img=[UIImage imageName:@"img.png"];

            UIImageView *imgView=[[UIImageView alloc] initWithImage:img];

            imgView.tansform=CGAffineTransformScale(imgView.transform,2,2);



completion:^(BOOL isFinished){

 NSLog(@"动画执行完毕");

}];

注:

     我们经常使用的函数是 [UIView animateWithDuration: animations:^{} completion:^(BOOL finished) {}];和[UIView animateWithDuration: animations:^{}];

但是有时候我们会用到[UIView animateWithDuration: delay: options: animations: completion:^(BOOL finished) {}];
  方法中的options一项需要传入一个枚举UIViewAnimation,这个枚举大概控制的是这几个要素:当前动画嵌套中的动画执行随时间的快慢种类(先快后慢等..)。动画要一直重复吗。如果我使用转场动画那么我用哪种转场效果。还有子动画嵌套在父动画中时我们如何对待父动画中的相同选项等等..
       很像Android动画中的各种插值器。

    UIViewAnimationOptionLayoutSubviews            //提交动画的时候布局子控件,表示子控件将和父控件一同动画。

    UIViewAnimationOptionAllowUserInteraction      //动画时允许用户交流,比如触摸

    UIViewAnimationOptionBeginFromCurrentState     //从当前状态开始动画

    UIViewAnimationOptionRepeat                    //动画无限重复

    UIViewAnimationOptionAutoreverse               //执行动画回路,前提是设置动画无限重复

    UIViewAnimationOptionOverrideInheritedDuration //忽略外层动画嵌套的执行时间

    UIViewAnimationOptionOverrideInheritedCurve    //忽略外层动画嵌套的时间变化曲线

    UIViewAnimationOptionAllowAnimatedContent      //通过改变属性和重绘实现动画效果,如果key没有提交动画将使用快照

    UIViewAnimationOptionShowHideTransitionViews   //用显隐的方式替代添加移除图层的动画效果

    UIViewAnimationOptionOverrideInheritedOptions  //忽略嵌套继承的选项

   //时间函数曲线相关

    UIViewAnimationOptionCurveEaseInOut            //时间曲线函数,由慢到快

    UIViewAnimationOptionCurveEaseIn               //时间曲线函数,由慢到特别快

    UIViewAnimationOptionCurveEaseOut              //时间曲线函数,由快到慢

    UIViewAnimationOptionCurveLinear               //时间曲线函数,匀速

   //转场动画相关的

    UIViewAnimationOptionTransitionNone            //无转场动画

    UIViewAnimationOptionTransitionFlipFromLeft    //转场从左翻转

    UIViewAnimationOptionTransitionFlipFromRight   //转场从右翻转

    UIViewAnimationOptionTransitionCurlUp          //上卷转场

    UIViewAnimationOptionTransitionCurlDown        //下卷转场

    UIViewAnimationOptionTransitionCrossDissolve   //转场交叉消失

    UIViewAnimationOptionTransitionFlipFromTop     //转场从上翻转

    UIViewAnimationOptionTransitionFlipFromBottom  //转场从下翻转

3.UIImageView执行帧动画

NSMutableArray *array=[NSMutableArray array];

for(int i=0;i<12;i++){

[array addObject:[UIImage imageName:[NSString stringFormat:@"img_%d.png",i]]];

[imageView setAnimationImages:array];

[imageView setAnimationRepeatCount:2];

[imageView setAnimationDuration:array.count*0.05];

[iamgeView startAnimation];//开启动画

[imageView performSelector:@select(clearArray:) withObject:array afterDelay:imageView.animationDuration];//执行完动画清楚Array中的图片资源节省资源

}


注:使用的动画真正执行类CGAffineTransform


CGAffineTransform类是出自CoreGraphics框架,可用于设定UIView的transform属性,控制视图的缩放、旋转和平移操作:

另称放射变换矩阵,可参照线性代数的矩阵实现方式0.0

这里附上的CGAffineTransform官方文档:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/index.html

transform 是一种状态,并且只有一种状态

(1)CGAffineTransformMakeTranslation(<#CGFloat tx#>, <#CGFloat ty#>):只能变化一次,因为这种方式的变化始终是以最原始的状态值进行变化的,所以只能变化一次

例如:

UIButton *head = (UIButton *) [self.view viewWithTag:10];
  head.transform = CGAffineTransformMakeTranslation(0,-10);

(2)CGAffineTransformTranslate(CGAffineTransform t, <#CGFloat tx#>, <#CGFloat ty#>):能够多次变化,每次变化都是以上一次的状态(CGAffineTransform t)进行的变化,所以可以多次变化

head.transform = CGAffineTransformTranslate(head.transform, 0, -10);

(也就是说一般带make的方法是以最原始初始化的状态为基础进行改变的,所以只能变化一次;而不带make的方法每次变化都是以上次变化的后的状态值为基础进行的变化,所以可以多次变化)
(3) CGAffineTransformIdentity:清空所有的设置的transform(一般和动画配合使用,只能使用于transfofrm设置的画面)

UIButton *head = (UIButton *) [self.view viewWithTag:10];
    head.transform = CGAffineTransformIdentity;

(4)CGAffineTransformMakeScale(  CGFloat   sx,   CGFloat   sy)  (缩放:设置缩放比例)仅通过设置缩放比例就可实现视图扑面而来和缩进频幕的效果。

UIButton *head = [self.view viewWithTag:10];
    head.transform = CGAffineTransformScale(head.transform,1.5,1.5);

(5)  CGAffineTransformMakeRotation(  CGFloat   angle)  (旋转:设置旋转角度)

UIButton *head =  [self.view viewWithTag:10];
    head.transform = CGAffineTransformMakeRotation(M_PI_2);

另外CATransaction有空研究一下,比较类似于Android的属性动画。


二,UIGestureRecognizer 各种Touch事件的监听

UIGestureRecognizer有几个对应的子类,分别处理相应的Touch事件。

1.UITapGestureRecognizer  负责处理简单点击事件监听,比较类似Android的OnclickListner

2.UISwipeGestureRecognizer 负责处理向上 下 左 右滑动的监听,但是使用的时候需要使用哪个方向的给哪个方向的属性,一次只能用一个derection

3,UIPanGestureRecognizer 负责处理拖拽事件的处理

4,UIPinchGestureRecognizer 负责处理捏合事件的处理

5,UIRatotionGestureRecognizer 负责旋转事件的处理

给每个UIView及其子类添加手势监听事件也很容易

[view addGestureRecognizer: gestureRecoginizer];

UIButton除了这个还有一个属于自己的监听方法

[UIButton addTarget:self  action:@select()  forControllEvents:(UIControllEvents)];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值