李洪強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:能夠設置一個CGPathRef\CGMutablePathRef,讓層跟着路徑移動。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:動畫終點(在總體動畫的百分比)ui

  • UIView動畫spa

  • 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 值等。文章若有問題,請留言,我將及時更正。

相關文章
相關標籤/搜索