CALayer

#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

相關文章
相關標籤/搜索