一個java程序員自學IOS開發之路(十二)

2015/12/05數組

Day 44緩存

今天開始學習圖層併發

CALayer框架

  • iOS中,你能看得見摸得着的東西基本上都是UIView,好比一個按鈕、一個文本標籤、一個文本輸入框、一個圖標等等,這些都是UIView
  • 其實UIView之因此能顯示在屏幕上,徹底是由於它內部的一個圖層
  • 在建立UIView對象時,UIView內部會自動建立一個圖層(即CALayer對象),經過UIView的layer屬性能夠訪問這個層

@property(nonatomic,readonly,retain) CALayer *layer; 函數

  • UIView須要顯示到屏幕上時,會調用drawRect:方法進行繪圖,而且會將全部內容繪製在本身的圖層上,繪圖完畢後,系統會將圖層拷貝到屏幕上,因而就完成了UIView的顯示
  • 換句話說,UIView自己不具有顯示的功能,是它內部的層纔有顯示功能

 

經過操做CALayer對象,能夠很方便地調整UIView的一些外觀屬性,好比:性能

陰影學習

圓角大小動畫

邊框寬度和顏色atom

… …url

 

還能夠給圖層添加動畫,來實現一些比較炫酷的效果

 

CALayer的屬性

  • 寬度和高度

@property CGRect bounds;

  • 位置(默認指中點,具體由anchorPoint決定)

@property CGPoint position;

  • 錨點(x,y的範圍通常是是0-1,0表示起點,1表示終點),決定了position的含義

@property CGPoint anchorPoint;

  • 背景顏色(CGColorRef類型)

@property CGColorRef backgroundColor;

  • 形變屬性

@property CATransform3D transform;

  • 邊框顏色(CGColorRef類型)

@property CGColorRef borderColor;

  • 邊框寬度

@property CGFloat borderWidth;

  • 圓角半徑

@property CGColorRef borderColor;

  • 內容(好比設置爲圖片CGImageRef)

@property(retain) id contents;

 

首先

CALayer是定義在QuartzCore框架中的

CGImageRef、CGColorRef兩種數據類型是定義在CoreGraphics框架中的

UIColor、UIImage是定義在UIKit框架中的

 

其次

QuartzCore框架和CoreGraphics框架是能夠跨平臺使用的,在iOS和Mac OS X上都能使用

可是UIKit只能在iOS中使用

 

爲了保證可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

 

UIViewCALayer的選擇

經過CALayer,就能作出跟UIImageView同樣的界面效果

 

既然CALayer和UIView都能實現相同的顯示效果,那究竟該選擇誰好呢?

其實,對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView能夠

因此,若是顯示出來的東西須要跟用戶進行交互的話,用UIView;若是不須要跟用戶進行交互,用UIView或者CALayer均可以

固然,CALayer的性能會高一些,由於它少了事件處理的功能,更加輕量級

 

positionanchorPoint

  • CALayer有2個很是重要的屬性:position和anchorPoint

@property CGPoint position;

  • 用來設置CALayer在父層中的位置
  • 以父層的左上角爲原點(0, 0)

 

@property CGPoint anchorPoint;

  • 稱爲「定位點」、「錨點
  • 決定着CALayer身上的哪一個點會在position屬性所指的位置
  • 以本身的左上角爲原點(0, 0)
  • 它的x、y取值範圍通常是0~1(0表示起點,1表示終點)),默認值爲(0.5, 0.5)是layer的中點

 

隱式動畫

每個UIView內部都默認關聯着一個CALayer,咱們可用稱這個Layer爲Root Layer(根層)

 

全部的非Root Layer,也就是手動建立的CALayer對象,都存在着隱式動畫

 

什麼是隱式動畫?

當對非Root Layer的部分屬性進行修改時,默認會自動產生一些動畫效果

而這些屬性稱爲Animatable Properties(可動畫屬性)

 

列舉幾個常見的Animatable Properties

bounds:用於設置CALayer的寬度和高度。修改這個屬性會產生縮放動畫

backgroundColor:用於設置CALayer的背景色。修改這個屬性會產生背景色的漸變更畫

position:用於設置CALayer的位置。修改這個屬性會產平生移動畫

  • 能夠經過動畫事務(CATransaction)關閉默認的隱式動畫效果

[CATransaction begin];

[CATransaction setDisableActions:YES];

self.myview.layer.position = CGPointMake(10, 10);

[CATransaction commit];

 

用了一下CATransform3D,感受3D的效果很是酷炫~

 

2015/12/06

Day 45

核心動畫(Core Animation)

  • Core Animation是一組很是強大的動畫處理API,使用它能作出很是炫麗的動畫效果,並且每每是事半功倍,使用它須要先添加QuartzCore.framework和引入對應的框架<QuartzCore/QuartzCore.h>
  • 開發步驟:
  1. 初始化一個動畫對象(CAAnimation)並設置一些動畫相關屬性
  2. 添加動畫對象到層(CALayer)中,開始執行動畫
  • CALayer中不少屬性均可以經過CAAnimation實現動畫效果,包括:opacitypositiontransformboundscontents等(能夠在API文檔中搜索:CALayer Animatable Properties)
  • 經過調用CALayeraddAnimation:forKey增長動畫到層(CALayer)中,這樣就能觸發動畫了。經過調用removeAnimationForKey能夠中止層中的動畫
  • Core Animation的動畫執行過程都是在後臺操做的,不會阻塞主線程

CAAnimation繼承結構

 

CAAnimation

全部動畫對象的父類,負責控制動畫的持續時間和速度,是個抽象類,不能直接使用,應該使用它具體的子類

屬性解析:(紅色表明來自CAMediaTiming協議的屬性)

duration:動畫的持續時間

repeatCount:動畫的重複次數

repeatDuration:動畫的重複時間

removedOnCompletion:默認爲YES,表明動畫執行完畢後就從圖層上移除,圖形會恢復到動畫執行前的狀態。若是想讓圖層保持顯示動畫執行後的狀態,那就設置爲NO,不過還要設置fillMode爲kCAFillModeForwards

fillMode:決定當前對象在非active時間段的行爲.好比動畫開始以前,動畫結束以後

beginTime:能夠用來設置動畫延遲執行時間,若想延遲2s,就設置爲CACurrentMediaTime()+2,CACurrentMediaTime()爲圖層的當前時間

timingFunction:速度控制函數,控制動畫運行的節奏

delegate:動畫代理

 

CAPropertyAnimation

是CAAnimation的子類,也是個抽象類,要想建立動畫對象,應該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation

屬性解析:

keyPath:經過指定CALayer的一個屬性名稱爲keyPath(NSString類型),而且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。好比,指定@」position」爲keyPath,就修改CALayer的position屬性的值,以達到平移的動畫效果

 

CABasicAnimation

CAPropertyAnimation的子類

屬性解析:

fromValue:keyPath相應屬性的初始值

toValue:keyPath相應屬性的結束值

隨着動畫的進行,在長度爲duration的持續時間內,keyPath相應屬性的值從fromValue漸漸地變爲toValue

若是fillMode=kCAFillModeForwardsremovedOnComletion=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:動畫過渡類型

            字符串

            pageCurl            向上翻一頁

            pageUnCurl          向下蓋一頁

            rippleEffect        滴水效果

            suckEffect          收縮效果,如一塊布被抽走

            cube                立方體效果

            oglFlip             上下翻轉效果

            常量

            kCATransitionFade淡出

            kCATransitionMoveIn覆蓋原圖

            kCATransitionPush推出

            kCATransitionReveal底部顯出來

subtype:動畫過渡方向(上下左右)

startProgress:動畫起點(在總體動畫的百分比)

endProgress:動畫終點(在總體動畫的百分比)

實感轉場效果很是酷炫

 

UIView動畫

  • UIKit直接將動畫集成到UIView類中,當內部的一些屬性發生改變時,UIView將爲這些改變提供動畫支持
  • 執行動畫所須要的工做由UIView類自動完成,但仍要在但願執行動畫時通知視圖,爲此須要將改變屬性的代碼放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之間
  • 常見方法解析:
  • + (void)setAnimationDelegate:(id)delegate

設置動畫代理對象,當動畫開始或者結束時會發消息給代理對象

  • + (void)setAnimationWillStartSelector:(SEL)selector

當動畫即將開始時,執行delegate對象的selector,而且把beginAnimations:context:中傳入的參數傳進selector

  • + (void)setAnimationDidStopSelector:(SEL)selector

當動畫結束時,執行delegate對象的selector,而且把beginAnimations:context:中傳入的參數傳進selector

  • + (void)setAnimationDuration:(NSTimeInterval)duration

動畫的持續時間,秒爲單位

  • + (void)setAnimationDelay:(NSTimeInterval)delay

動畫延遲delay秒後再開始

  • + (void)setAnimationStartDate:(NSDate *)startDate

動畫的開始時間,默認爲now

  • + (void)setAnimationCurve:(UIViewAnimationCurve)curve

動畫的節奏控制,具體看下面的」備註

  • + (void)setAnimationRepeatCount:(float)repeatCount

動畫的重複次數

  • + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses

若是設置爲YES,表明動畫每次重複執行的效果會跟上一次相反

  • + (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache

設置視圖view的過渡效果, transition指定過渡類型, cache設置YES表明使用視圖緩存,性能較好

 

Block動畫

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

參數解析:

  • duration:動畫的持續時間
  • delay:動畫延遲delay秒後開始
  • options:動畫的節奏控制
  • animations:將改變視圖屬性的代碼放在這個block
  • completion:動畫結束後,會自動調用這個block

 

+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

參數解析:

  • duration:動畫的持續時間
  • view:須要進行轉場動畫的視圖
  • options:轉場動畫的類型
  • animations:將改變視圖屬性的代碼放在這個block
  • completion:動畫結束後,會自動調用這個block

 

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

方法調用完畢後,至關於執行了下面兩句代碼:

// 添加toView到父視圖

[fromView.superview addSubview:toView]; 

// 把fromView從父視圖中移除

[fromView.superview removeFromSuperview];

參數解析:

  • duration:動畫的持續時間
  • options:轉場動畫的類型
  • animations:將改變視圖屬性的代碼放在這個block
  • completion:動畫結束後,會自動調用這個block

 

UIImageView的幀動畫

UIImageView可讓一系列的圖片在特定的時間內按順序顯示

相關屬性解析:

animationImages:要顯示的圖片(一個裝着UIImage的NSArray)

animationDuration:完整地顯示一次animationImages中的全部圖片所需的時間

animationRepeatCount:動畫的執行次數(默認爲0,表明無限循環)

相關方法解析:

- (void)startAnimating; 開始動畫

- (void)stopAnimating中止動畫

- (BOOL)isAnimating是否正在運行動畫

 

UIActivityIndicatorView

是一個旋轉進度輪,能夠用來告知用戶有一個操做正在進行中,通常用initWithActivityIndicatorStyle初始化

方法解析:

- (void)startAnimating; 開始動畫

- (void)stopAnimating中止動畫

- (BOOL)isAnimating是否正在運行動畫

UIActivityIndicatorViewStyle有3個值可供選擇:

UIActivityIndicatorViewStyleWhiteLarge   //大型白色指示器    

UIActivityIndicatorViewStyleWhite      //標準尺寸白色指示器    

UIActivityIndicatorViewStyleGray    //灰色指示器,用於白色背景

相關文章
相關標籤/搜索