核心動畫——CAAnimation

来源:http://www.cnblogs.com/chengy134/archive/2016/04/15/5396181.html
-Advertisement-
Play Games

核心動畫——CAAnimation 需要的框架:CoreAnimation -> 基礎框架 CAAnimation 分為三大類: 處理動畫的類 (基類 不能使用) ①CAPropertyAnimation 屬性動畫 -> 通過改變屬性值產生動畫效果 <1>CABasicAnimation 基礎動畫 ...


 核心動畫——CAAnimation

 需要的框架:CoreAnimation   ->  基礎框架

 CAAnimation 分為三大類:     處理動畫的類 (基類 不能使用)

 ①CAPropertyAnimation         屬性動畫 -> 通過改變屬性值產生動畫效果

   <1>CABasicAnimation        基礎動畫 -> 只能是兩個點之間的變化

       CASpringAnimation      彈簧動畫 (彈動效果)

   <2>CAKeyframeAnimation     關鍵幀動畫 -> 可以添加多個點的變化或者添加路徑

 ②CAAnimationGroup            動畫組 -> 可以同時添加多種動畫  達到預期效果

 ③CATransition                轉場動畫 -> 給視圖切換的時候添加動畫效

下麵給大家畫一個結構圖,可以讓大家更容易的瞭解

 CALayer 圖層

 UIView 視圖 -> 可以跟用戶交互 -> rootLayer 發生改變子圖層也會發生改變 rootLayer沒有動畫效果

 button 不止有一個視圖 改變的只是其中一個視圖的rootLayer -> 顯示 未被裁切的邊框

 CALayer -> 不可以跟用戶交互 只能顯示內容 發生改變子圖層不會跟隨發生改變 本身自帶動畫效果(改變屬性效果的時候) -> 隱式動畫 

 CALayer可以設置的屬性

                 bounds 邊境範圍

                 position 中心點

                 zPosition z軸中心點

                 anchorPoint 錨點   

                 anchorPointZ Z軸錨點

                 transform 轉換形態

                 frame NO. Animatable 坐標

                 hidden 隱藏

                 doubleSided 圖層背面是否顯示

                 geometryFlipped 翻轉 顛倒

                 masksToBounds 裁切邊境

                 contents 內容

                 opaque 不透明度

                 allowsEdgeAntialiasing 是否使用 變形後的抗鋸齒

                 backgroundColor 背景顏色

                 borderWidth 邊框寬

                 borderColor 邊框顏色

                 opacity 不透明度

                 shadowColor 陰影顏色

                 shadowOpacity 陰影不透明度

                 rasterizationScale 防止Retina屏幕像素化

                 shadowOffset 陰影偏移量

                 shadowRadius 陰影的半徑

✮✮✮✮✮錨點的最大值是1,1 最小值是0,0 預設值是0.5,0.5當視圖改變的時候是以錨點為基點去改變的

     錨點的值與位置 

     0,0 = 在圖層的左上角  

     0,1 = 圖層的左下角  

     1,0 = 圖層的右上角

     1,1 = 在圖層的右下角 

 錨點的計算公式:錨點值 = 錨點在視圖上的位置.x.y/視圖的寬高

下麵就鐘錶為例介紹一下核心動畫:

#import "ViewController.h"

#define Angle(a) (a)*M_PI/180
#define SAngle 6 //每秒旋轉多少度

@interface ViewController ()
{
    CALayer *layer;
    float s;
}

@property(nonatomic,strong)CALayer *pointLayer;
@property(nonatomic,strong)CALayer *minuteLayer;
@property(nonatomic,strong)CALayer *SecondtLayer;

@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //**圖層不能跟用戶交互,不能添加響應事件
    //初始化CALayer  addSubLayer:添加到父圖層的方法
    /*
    layer = [CALayer layer];
    layer.frame = CGRectMake(0, 0, 100, 100);
    layer.cornerRadius = 50;
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    [self.view.layer addSublayer:layer];
    */
    
    
    UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.width)];
    image.image = [UIImage imageNamed:@"biaopan"];
    image.contentMode = UIViewContentModeScaleAspectFit;
    image.center = self.view.center;
    [self.view addSubview:image];
    
    
    self.SecondtLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.SecondtLayer.contents = (id)[UIImage imageNamed:@"miaozhen"].CGImage;
    
    self.minuteLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.minuteLayer.contents = (id)[UIImage imageNamed:@"fenzhen"].CGImage;
    
    self.pointLayer.anchorPoint = CGPointMake(0.5, 0.9);
    //圖層上要的是顏色CGColorRef 圖片CGImageRef
    self.pointLayer.contents = (id)[UIImage imageNamed:@"shizhen"].CGImage;
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(start) userInfo:nil repeats:YES];
}

- (void)start{
    
    //日曆的一個類NSCalendar 獲得年月日時分秒
    //NSDateComponents 組件
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    ///(NSCalendarUnit)需要的組件  獲得哪個日期的組件
    NSDateComponents *component = [calendar components:NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:[NSDate date]];
    
    s = component.second*SAngle;
    self.SecondtLayer.transform = CATransform3DMakeRotation(Angle(s),0, 0, 1);
    self.SecondtLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.SecondtLayer.contents = (id)[UIImage imageNamed:@"miaozhen"].CGImage;
    
    float m = component.minute*SAngle;
    self.minuteLayer.transform = CATransform3DMakeRotation(Angle(m),0, 0, 1);
    self.minuteLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.minuteLayer.contents = (id)[UIImage imageNamed:@"fenzhen"].CGImage;
    
    float h = component.hour*SAngle;
    self.pointLayer.transform = CATransform3DMakeRotation(Angle(h), 0, 0, 1);
    self.pointLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.pointLayer.contents = (id)[UIImage imageNamed:@"shizhen"].CGImage;
}

- (CALayer *)pointLayer{
    if (_pointLayer) {
        return _pointLayer;
    }
    _pointLayer = [CALayer layer];
    _pointLayer.bounds = CGRectMake(0, 0, 29, 200);
    _pointLayer.position = self.view.center;
    [self.view.layer addSublayer:_pointLayer];
    return _pointLayer;
}

- (CALayer *)minuteLayer{
    if (_minuteLayer) {
        return _minuteLayer;
    }
    _minuteLayer = [CALayer layer];
    _minuteLayer.bounds = CGRectMake(0, 0, 21, 210);
    _minuteLayer.position = self.view.center;
    [self.view.layer addSublayer:_minuteLayer];
    return _minuteLayer;
}

- (CALayer *)SecondtLayer{
    if (_SecondtLayer) {
        return _SecondtLayer;
    }
    _SecondtLayer = [CALayer layer];
    _SecondtLayer.bounds = CGRectMake(0, 0, 21, 230);
    _SecondtLayer.position = self.view.center;
    [self.view.layer addSublayer:_SecondtLayer];
    return _SecondtLayer;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    /*
    UITouch *touch = [touches anyObject];
    layer.position = [touch locationInView:self.view];
    CGFloat width = CGRectGetWidth(layer.bounds)!= 100?100:25;
    layer.bounds = CGRectMake(0, 0, width, width);
    
    CGColorRef color = [UIColor lightGrayColor].CGColor != layer.backgroundColor?[UIColor lightGrayColor].CGColor:[UIColor yellowColor].CGColor;
    layer.backgroundColor = color;
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.geometryFlipped = YES;
    layer.cornerRadius = layer.cornerRadius != 50?50:0;
    //圖層的透明度
    layer.opacity = 0;
    */
    
    //緢點
    self.SecondtLayer.transform = CATransform3DMakeRotation(Angle(Angle(60)), 0, 0, 1);
    self.minuteLayer.transform = CATransform3DMakeRotation(Angle(s/60), 0, 0, 1);
    self.pointLayer.transform = CATransform3DMakeRotation(Angle(s/360), 0, 0, 1);
    
    
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //layer.opacity = 1;
    self.pointLayer.transform = CATransform3DIdentity;
    
}


@end

效果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系統是cenos6.7 64位的,預設mysql5.7.11下載到/usr/local/src,安裝目錄在/app/local/mysql目錄下,mysql數據放置目錄/app/local/data。mysql從5.1後採用cmake方式編譯安裝,所以要先編譯安裝cmake工具,也可以採用yum方式 ...
  • Question: 初步理解多維資料庫和關係型資料庫都是表存儲,只不過是在多維數據集里叫做事實表、維表,做分析的話關係型資料庫也可以做到的呀?(書上說多維資料庫的查詢速度更快一點,可是為什麼會更快呢?)多維資料庫和關係型資料庫單單是查詢速度上更優嗎?還有會出於什麼考慮來建多維資料庫呢? Answer ...
  • 環境配置 在 Java 程式中如果要使用 MongoDB,你需要確保已經安裝了 Java 環境及 MongoDB JDBC 驅動。 本章節實例時候 Mongo 3.x 以上版本。 你可以參考本站的Java教程來安裝Java程式。現在讓我們來檢測你是否安裝了 MongoDB JDBC 驅動。 首先你必 ...
  • 分片 在Mongodb裡面存在另一種集群,就是分片技術,可以滿足MongoDB數據量大量增長的需求。 當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據也足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多台機器上分割數據,使得資料庫系統能存儲和處理更多的數據。 為什麼使用分片 複製所有的 ...
  • 今天無意中在網上看到了關於oracle誤刪除數據恢復的一條信息,發現的確很好使,下麵就我的測試向大家彙報下。 1. select * from t_viradsl2 t //查詢t_viradsl2中所有的數據,可以看到三條數據 2. delete t_viradsl2 //刪除t_viradsl2 ...
  • 源文件在這裡:http://pan.baidu.com/s/1kVKrbkb ...
  • 前言 公司的產品同時適配 iPhone 和 iPad ,並堅持用 Storyboard 來做適配,今天又踩一個坑(以前遇到過)還以為是 XCode 的鬼毛病。 聲明 歡迎轉載,但請保留文章原始出處:) 博客園:http://www.cnblogs.com 農民伯伯: http://over140.c ...
  • a.我們先來體驗一下在Linux下用彙編編程的感覺,見代碼 編譯方法: nasm -f elf hello.asm -o hello.o ld -m elf_i386 -s -o hello hello.o ./hello 運行結果是列印出Hello, world! 入口點預設的是_start,我們 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...