zoukankan      html  css  js  c++  java
  • 李洪强iOS经典面试题143-绘图与动画

    李洪强iOS经典面试题143-绘图与动画

     

    绘图与动画

    CAAnimation的层级结构

    • CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation
    • 属性解析:keyPath:通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@”position”为keyPath,就修改CALayer的position属性的值,以达到平移的动画效果

    • CABasicAnimation,CAPropertyAnimation的子类

    • 属性解析:
    • fromValue:keyPath相应属性的初始值
    • toValue:keyPath相应属性的结束值
    • 随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue。如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。比如,CALayer的position初始值为(0,0),CABasicAnimation的fromValue为(10,10),toValue为(100,100),虽然动画执行完毕后图层保持在(100,100)这个位置,实质上图层的position还是为(0,0)

    • CAKeyframeAnimation,CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值

    • 属性解析:
    • values:就是上述的NSArray对象。里面的元素称为”关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧
    • path:可以设置一个CGPathRefCGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略
    • keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的
    • CABasicAnimation可看做是最多只有2个关键帧的CAKeyframeAnimation

    • CAAnimationGroup,CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

    • 属性解析:
    • animations:用来保存一组动画对象的NSArray
      默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间

    • CATransition,CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点

    • UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果
    • 属性解析:
    • type:动画过渡类型
    • subtype:动画过渡方向
    • startProgress:动画起点(在整体动画的百分比)
    • endProgress:动画终点(在整体动画的百分比)

    • UIView动画

    • UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持
      执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之间

    • Block动画

    • 帧动画


    PNG

    谈谈你对Core Graphic 绘图的了解?

    • Core Graphics是基于C的API,可以用于一切绘图操作

    • Core Graphics 和Quartz 2D的区别

      • quartz是一个通用的术语,用于描述在IOS和MAC OS X ZHONG 整个媒体层用到的多种技术 包括图形、动画、音频、适配。
      • Quart 2D 是一组二位绘图和渲染API,Core Graphic会使用到这组API
      • Quartz Core 专指Core Animation用到的动画相关的库、API和类
    • Core Graphics是高度集成于UIView和其他UIKit部分的。

    • Core Graphics数据结构和函数可以通过前缀CG来识别。

    • 系统拥有坐标系,如320 480 硬件有retain屏幕和非retain屏:如320 480、640 960
      Core Graphics 使用的是系统的坐标系来绘制图片。在分辨率为640
       960手机上绘制图片时,实际上Core Graphics 的坐标是320*480。这个时候每个坐标系上的点,实际上拥有两个像素。

    • 视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层和子视图。自定义绘图大部分是由UIKit或者Core Graphics来实现的。

    • Core Graphics的优点:快速、高效,减小应用的文件大小。同时可以自由地使用动态的、高质量的图形图像。 使用Core Graphics,可以创建直线、路径、渐变、文字与图像等内容,并可以做变形处理

    • 2D绘图一般可以拆分成以下几个操作: 线条 , 路径 , 文本 , 图片 , 渐变

    • 由于像素是依赖于目标的,所以2D绘图并不能操作单独的像素,我们可以从上下文(Context)读取它。
      绘图就好比在画布上拿着画笔机械的进行画画,通过制定不同的参数来进行不同的绘制。
      http://www.tuicool.com/articles/jIJzMf
      http://blog.csdn.net/mangosnow/article/details/37054765

    Core Animation(核心动画)?

    • CoreAnimation也就是核心动画, 是一组非常强大的动画处理API, 可以使用少量的代码做出绚丽的效果, 是直接作用在CALayer上的, 并非UIView, 并且Core Animation的动画执行过程都是在后台操作, 不会阻塞主线程.

    • 所有动画都是作用在CALayer上的, 当把动画添加到Layer上, 是不直接修改它的属性, Core Animation维护了两个平行layer的层次结构, 模型层树可以看到Layer的状态, 表示层树则是动画正在表现的值的近似。

    • Core Animation的使用步骤:

      • 使用它需要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h>(iOS7.0+ 不需要)

      • 初始化一个CAAnimation对象,并设置一些动画相关属性

      • 通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了

      • 通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画

    转场动画?

    • CATransition-转场动画, 作为CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点. UINavigationController就是通CATransition实现了将控制器的视图推入屏幕的动画效果.

    Cocoa Touch提供了哪几种Core Animation过渡类型?

    • Cocoa Touch 提供了 4 种 Core Animation 过渡类型,分别为:交叉淡化、推挤、显示和覆盖。

    使用UIView的动画函数, 实现转场动画

    • 单视图:
      +(void)transitionWithView:(UIView* )view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
    • 双视图:
      +(void)transitionFromView:(UIView )fromView toView:(UIView)toView
      duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;

    一个动画怎么实现?

    • 以转场动画为例:

      • 创建CATransition对象
        CATransition *animation = [CATransition animation];

      • 设置运动时间(即动画时间)
        animation.duration = DURATION;

      • 设置运动type(类型)
        animation.type = type;
        if (subtype != nil) { //设置子类 (和type配合使用, 指定运动的方向)
        animation.subtype = subtype;}

      • 设置运动速度(动画的运动轨迹,用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是先快后慢,先慢后快还是先慢再快再慢)
        animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;

      • 将动画添加到view的Layer层
        [view.layer addAnimation:animation forKey:@"animation"];

      • 动画类型如下:
        typedef enum : NSUInteger {
        Push, //推挤
        Cube, //立方体
        } AnimationType;

    说说Core Animation是如何开始和结束动画的

    不是很清楚题目的真正要求,是想知道核心动画的哪些知识点。如何开始和结束动画,这核心动画有很多种,每种动画还有很大的区别。
    参考答案:
    动画的开始和结束都可以通过CAMediaTiming协议来处理,核心动画的基类是遵守了CAMediaTiming协议的,可以指定动画开始时间、动画时长、动画播放速度、动画在完成时的行为(停留在结束处、动画回到开始处、动画完成时移除动画)。

    动画有基本类型有哪几种;表视图有哪几种基本样式。

    • 动画有两种基本类型:一种为UIView动画,又称隐式动画,动画后frame的数值发生了变化.另一种是CALayer动画,又称显示动画,动画后模型层的数据不会发生变化,图形回到原来的位置。

    • UITableViewStylePlain:普通样式

    • UITableViewStyleGrouped:分组样式
    • UITableViewCellStyleDefault:Default样式:左边一个显示图片的imageView,一个标题textLabel,没有detailTextLabel。

    • UITableViewCellStyleSubtitle:Subtitle样式:左边一个显示图片的imageView,上边一个主标题textLabel,一个副标题detailTextLabel。主标题字体大且加黑,副标题字体小在主标题下边。

    • UITableViewCellStyleValue1:Value1样式:左边一个显示图片的imageView,左边一个主标题textLabel,右边一个副标题detailTextLabel,主标题字体比较黑。

    • UITableViewCellStyleValue2:Value2样式:左边一个主标题textLabel字体偏小,挨着右边一个副标题detailTextLabel,字体大且加黑。

    CADisplayLink

    • CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右
    • CADisplayLink是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间
    • 使用方法:
      定义CADisplayLink并制定触发调用方法
      将显示链接添加到主运行循环队列

    Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用。

    上下文:主要用于描述图形写入哪里;

    路径:是在图层上绘制的内容;

    状态:用于保存配置变换的值、填充和轮廓, alpha 值等。
    文章如有问题,请留言,我将及时更正。

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/6027833.html
Copyright © 2011-2022 走看看