#CALayer 上一期中咱們簡單的瞭解了CALayer的簡單建立和簡單的設置,那麼今天咱們就一塊兒來看看CALayer視圖的一些實際性的應用吧 ##1、CALayer3D轉換 ###一、3D轉換的基本設置 想要實現CALayer的3D轉換咱們須要先建立好CALayer視圖,至於怎麼建立CALayer視圖在上一個篇章中咱們已經給你們詳細介紹過了,這裏我就再也不囉嗦。下面咱們來看看怎麼實現CALayer視圖的3D轉換。 實現CALayer視圖的3D轉換有多種方法,可是其實質仍是設置好CALayer視圖的transform屬性和方法,下面咱們就先來看看怎麼設置。 eg:
git
- (void)transform { layer.transform = CATransform3DTranslate(layer.transform, 0, 0, 100); layer.transform = CATransform3DScale(layer.transform, 1, 1, 1.5); layer.transform = CATransform3DRotate(layer.transform, M_PI_4, 0, 0, 1); }
上面就是CALayer的transform屬性的三個基本設置,只須要設置好着三個屬性就能夠實現CALayer視圖的3D轉換了。github
###二、3D轉換的transform方法 在上面的示例代碼中咱們能夠看出來CALayer視圖的3D轉換視圖transform是一個方法,在這個方法中設置視圖的屬性,當咱們須要使用方法來實現3D轉化時,調用不是直接在主方法viewDidLoad
中調用的,而是在一個實現CALayer視圖的專屬方法中調用的。 eg:
算法
//實現CALayer視圖3D轉換的調用方法 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self transform]; }
###三、3D轉換的多種方法: 上面咱們看見了3D轉換的一種最簡單的實現方法,那麼下面咱們一塊兒來看看實現3D轉換的其餘的方法還有那些呢! ####3.1使用KVC模式實現3D 有時候咱們在實現3D轉換時會用到KVC模式來實現3D轉換,使用KVC模式來實現3D轉換的好處在於咱們設置的3D轉換的值的範圍是能夠經過鍵值傳輸來更改的,這樣就實現了3D轉換中爲所欲爲的轉換幅度! eg:
學習
[layer setValue:@2 forKeyPath:@"transform.scale.x"]; [layer setValue:@2 forKeyPath:@"transform.scale"]; [layer setValue:@100 forKeyPath:@"transform.translation"]; [layer setValue:@100 forKeyPath:@"transform.translation.x"]; [layer setValue:@M_PI_4 forKeyPath:@"transform.rotation"]; [layer setValue:@M_PI_4 forKeyPath:@"transform.rotation.x"];
####3.2使用組合動畫來實現3D 其實咱們想要實現CALayer視圖的3D還有一個更簡單的方法,那就是經過組合動畫來實現,可是若是須要組合動畫那咱們就須要先設置一個隱式動畫,使CALayer視圖的屬性發生變換時會默認產生動畫效果。 隱式動畫:
動畫
// 隱式動畫: 當layer的屬性發生變換時會默認產生動畫效果,動畫時間0.25s layer.opacity = 0.2; layer.cornerRadius = 50;
當咱們設置好隱式動畫以後咱們就能夠來組合3D視圖了, eg:
spa
// 組合 CATransform3D CATransform3D transform_01 = CATransform3DScale(layer.transform, 2, 2, 1); CATransform3D transform_02 = CATransform3DRotate(layer.transform, M_PI_4, 0, 0, 1); layer.transform = CATransform3DConcat(transform_01, transform_02);
上面使咱們設置的3D組合,可是若是咱們直接這樣設置使用的話會發現一個問題,就是咱們的3D轉換動畫是直接啓動的,在咱們啓動程序時就直接啓動了,沒有造成一個動畫效果,這時若是咱們想要改變這個狀況,那就須要去設置一個延遲調用的方法了。 eg:
code
//延遲一秒調用 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ layer.opacity = 1; layer.cornerRadius = 0; layer.transform = CATransform3DIdentity; });
#2、示例Demo 上面學習和咱們以前學習的相結合,咱們已經將CALayer視圖的一些基礎學完了,那咱們一塊兒來作一個簡單的示例Demo把。 這個Demo的內容是這樣的:利用咱們全部的CALayer來實現一個3D的時鐘,這個時鐘的時間須要與現實時間進行同步,切秒針每秒走一下,分針每分鐘走一下,時針每小時走一下。 這個Demo中有兩個難點,接下來我將這兩個難點分別在下面解釋出來,但願能對你們有所幫助。component
// 指定日曆的算法 NSCalendarIdentifierGregorian,NSGregorianCalendar NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // NSDateComponent 能夠得到日期的詳細信息,即日期的組成 self.comps = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]];
layer_1.transform = CATransform3DRotate(layer_1.transform, (M_PI/30), 0, 0, 1); layer_3.transform = CATransform3DRotate(layer_3.transform, (M_PI/360), 0, 0, 1); layer_2.transform = CATransform3DRotate(layer_2.transform, (M_PI/30), 0, 0, 1);
除去這個兩個難點之外,這個Demo就沒有什麼別的難點了,你們均可以根據CALayer視圖的兩個文檔本身寫出來,這個是我本身寫的3D時鐘Demo,你們均可以點去看看,但願能對各位有所幫助!orm