核心動(dòng)畫(1)

[toc]

前言

Core Animation提供了一種通用系統(tǒng)享潜,可對(duì)應(yīng)用程序的視圖和其他視覺元素進(jìn)行動(dòng)畫處理潘懊。Core Animation不能替代您的應(yīng)用程序視圖狼电。相反,它是一種與視圖集成以提供更好的性能和動(dòng)畫效果的技術(shù)盆均。它通過將視圖的內(nèi)容緩存到可以由圖形硬件直接操縱的位圖中來實(shí)現(xiàn)此行為塞弊。在某些情況下,這種緩存行為可能需要您重新考慮如何呈現(xiàn)和管理應(yīng)用程序的內(nèi)容泪姨,但是大多數(shù)情況下游沿,您在不知道它存在的情況下使用Core Animation。除了緩存視圖內(nèi)容之外肮砾,Core Animation還定義了一種方法诀黍,該方法可以指定任意視覺內(nèi)容,將該內(nèi)容與視圖集成以及將其與其他所有內(nèi)容一起設(shè)置為動(dòng)畫

核心動(dòng)畫知識(shí)

image.png

從圖中可以看出仗处,最底層是圖形硬件(GPU)眯勾;上層是OpenGLCoreGraphics,提供一些接口來訪問GPU婆誓;再上層的CoreAnimation在此基礎(chǔ)上封裝了一套動(dòng)畫的API吃环。最上面的UIKit屬于應(yīng)用層,處理與用戶的交互洋幻。所以郁轻,學(xué)習(xí)這CoreAnimation`也會(huì)涉及一些圖形學(xué)的知識(shí),了解這些有助于我們更順手的使用以及更高效的解決問題文留。

  • Core Animation 結(jié)構(gòu)圖
image.png
  • Core Animation Introduction
  1. 簡單易易?用的?高性能混合編程模型
  2. ?用類似于視圖?一樣,使?用圖層來創(chuàng)建復(fù)雜的編程接?口
  3. 輕量量化的數(shù)據(jù)結(jié)構(gòu),它可以同時(shí)顯示讓上百個(gè)圖層產(chǎn)?生動(dòng)畫效果
  4. 一套?非常較簡單的動(dòng)畫接?口,能讓動(dòng)畫運(yùn)?行行在獨(dú)?立的線程中,并可以獨(dú)?立于主線程之外.
  5. 一旦動(dòng)畫配置完成并啟動(dòng),核?心動(dòng)畫就能獨(dú)?立并完全控制相應(yīng)的動(dòng)畫幀.
  6. 提?高應(yīng)?用性能.應(yīng)?用程序只有當(dāng)發(fā)?生改變的時(shí)候才會(huì)重繪內(nèi)容. 使?用Core Animation 可以不不使?用其他圖形API,例例如 OpenGL 來獲取?高效的動(dòng)畫性能.
  7. . 靈活的布局管理理模型,允許圖層相對(duì)同級(jí)圖層的關(guān)系來設(shè)置屬性的位置和?大?小

核心動(dòng)畫圖層樹結(jié)構(gòu)

使用Core Animation的應(yīng)用程序具有三組圖層對(duì)象.

  • 圖層樹是最的那些您的應(yīng)用程序進(jìn)行交互好唯。該樹中的對(duì)象是存儲(chǔ)任何動(dòng)畫的目標(biāo)值的模型對(duì)象。每當(dāng)更改圖層的屬性時(shí)燥翅,都將使用這些對(duì)象之一渠啊。
  • 呈現(xiàn)樹中的對(duì)象包含任何正在運(yùn)行的動(dòng)畫的運(yùn)行中值。圖層樹對(duì)象包含動(dòng)畫的目標(biāo)值权旷,而表示樹中的對(duì)象則反映屏幕上顯示的當(dāng)前值替蛉。您永遠(yuǎn)不要修改此樹中的對(duì)象贯溅。相反,您可以使用這些對(duì)象讀取當(dāng)前動(dòng)畫值躲查,也許可以從這些值開始創(chuàng)建新動(dòng)畫它浅。
  • 渲染樹中的對(duì)象執(zhí)行實(shí)際的動(dòng)畫,并且是Core Animation專有的镣煮。

與窗口關(guān)聯(lián)的圖層樹

image.png

三組圖層對(duì)象

image.png

圖層與視圖

一個(gè)視圖就是在屏幕上顯示的一個(gè)矩形塊(比如圖片姐霍,文字或者視頻),它能夠攔截類似于鼠標(biāo)點(diǎn)擊或者觸摸手勢(shì)等用戶輸入典唇。視圖在層級(jí)關(guān)系中可以互相嵌套镊折,一個(gè)視圖可以管理它的所有子視圖的位置.

image.png

iOS當(dāng)中,所有的視圖都從一個(gè)叫做UIVIew的基類派生而來介衔,UIView可以處理觸摸事件恨胚,可以支持基于Core Graphics繪圖,可以做仿射變換(例如旋轉(zhuǎn)或者縮放)炎咖,或者簡單的類似于滑動(dòng)或者漸變的動(dòng)畫赃泡。

圖層與視圖之間的關(guān)系

圖層不能替代您應(yīng)用程序的視圖,也就是說乘盼,您不能僅基于圖層對(duì)象創(chuàng)建可視界面升熊。圖層為您的視圖提供基礎(chǔ)結(jié)構(gòu)。特別是绸栅,圖層使繪制和動(dòng)畫化視圖內(nèi)容并使其保持動(dòng)畫狀態(tài)并保持較高的幀速率更加容易和有效级野。但是,許多事情是圖層無法做到的粹胯。層不處理事件蓖柔,繪制內(nèi)容,參與響應(yīng)者鏈或執(zhí)行其他許多事情矛双。因此,每個(gè)應(yīng)用程序仍必須具有一個(gè)或多個(gè)視圖來處理這些類型的交互.

CALayer

CALayer類在概念上和UIView類似蟆豫,同樣也是一些被層級(jí)關(guān)系樹管理的矩形塊议忽,同樣也可以包含一些內(nèi)容(像圖片,文本或者背景色)十减,管理子圖層的位置栈幸。它們有一些方法和屬性用來做動(dòng)畫和變換。和UIView最大的不同是CALayer不處理用戶的交互帮辟。

CALayer并不清楚具體的響應(yīng)鏈(iOS通過視圖層級(jí)關(guān)系用來傳送觸摸事件的機(jī)制)速址,于是它并不能夠響應(yīng)事件,即使它提供了一些方法來判斷是否一個(gè)觸點(diǎn)在圖層的范圍之內(nèi).

平行的層級(jí)關(guān)系

每一個(gè)UIview都有一個(gè)CALayer實(shí)例的圖層屬性由驹,也就是所謂的backing layer芍锚,視圖的職責(zé)就是創(chuàng)建并管理這個(gè)圖層,以確保當(dāng)子視圖在層級(jí)關(guān)系中添加或者被移除的時(shí)候,他們關(guān)聯(lián)的圖層也同樣對(duì)應(yīng)在層級(jí)關(guān)系樹當(dāng)中有相同的操作.

image.png

實(shí)際上這些背后關(guān)聯(lián)的圖層才是真正用來在屏幕上顯示和做動(dòng)畫并炮,UIView僅僅是對(duì)它的一個(gè)封裝默刚,提供了一些iOS類似于處理觸摸的具體功能,以及Core Animation底層方法的高級(jí)接口.

但是為什么iOS要基于UIView和CALayer提供兩個(gè)平行的層級(jí)關(guān)系呢?
為什么不用一個(gè)簡單的層級(jí)來處理所有事情呢逃魄?

原因在于要做職責(zé)分離荤西,這樣也能避免很多重復(fù)代碼。在iOSMac OS兩個(gè)平臺(tái)上伍俘,事件和用戶交互有很多地方的不同邪锌,基于多點(diǎn)觸控的用戶界面和基于鼠標(biāo)鍵盤有著本質(zhì)的區(qū)別,這就是為什么iOSUIKitUIView癌瘾,但是Mac OSAppKitNSView的原因觅丰。他們功能上很相似,但是在實(shí)現(xiàn)上有著顯著的區(qū)別

圖層的能力

我們已經(jīng)證實(shí)了圖層不能像視圖那樣處理觸摸事件柳弄,那么他能做哪些視圖不能做的呢舶胀?這里有一些UIView沒有暴露出來的CALayer的功能:

  1. 陰影,圓角碧注,帶顏色的邊框
  2. 3D變換
  3. 非矩形范圍
  4. 透明遮罩
  5. 多級(jí)非線性動(dòng)畫

簡單使用圖層
在屏幕上添加一個(gè)藍(lán)色view,可以通過設(shè)置CALayerbackgroundColor

 CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(100, 100, 100, 100);
    layer.backgroundColor = [UIColor greenColor].CGColor;
    _layer = layer;
    [self.view.layer addSublayer:layer];

然而嚣伐,當(dāng)滿足以下條件的時(shí)候,你可能更需要使用CALayer而不是UIView:

  • 開發(fā)同時(shí)可以在Mac OS上運(yùn)行的跨平臺(tái)應(yīng)用
  • 使用多種CALayer的子類(見第六章萍丐,“特殊的圖層“)轩端,并且不想創(chuàng)建額外的UIView去包封裝它們所有
  • 做一些對(duì)性能特別挑剔的工作,比如對(duì)UIView一些可忽略不計(jì)的操作都會(huì)引起顯著的不同(盡管如此逝变,你可能會(huì)直接想使用OpenGL繪圖)

CALayer 常用屬性詳解

contents

CALayer 有一個(gè)屬性叫做contents基茵,這個(gè)屬性的類型被定義為id,意味著它可以是任何類型的對(duì)象壳影。在這種情況下拱层,你可以給contents屬性賦任何值,你的app仍然能夠編譯通過宴咧。但是根灯,在實(shí)踐中,如果你給contents賦的不是CGImage掺栅,那么你得到的圖層將是空白的烙肺。

  • 如果要給圖層的寄宿圖賦值
UIImage *image = [UIImage imageNamed:@"test.png"];

  //add it directly to our view's layer
  self.layerView.layer.contents = (__bridge id)image.CGImage;

contents這個(gè)奇怪的表現(xiàn)是由Mac OS的歷史原因造成的。它之所以被定義為id類型氧卧,是因?yàn)樵?code>Mac OS系統(tǒng)上桃笙,這個(gè)屬性對(duì)CGImageNSImage類型的值都起作用。如果你試圖在iOS平臺(tái)上將UIImage的值賦給它沙绝,只能得到一個(gè)空白的圖層搏明。一些初識(shí)Core AnimationiOS開發(fā)者可能會(huì)對(duì)這個(gè)感到困惑

contentsGravity

CALayercontentMode對(duì)應(yīng)的屬性叫做contentsGravity鼠锈,但是它是一個(gè)NSString類型,而不是像對(duì)應(yīng)的UIKit部分熏瞄,那里面的值是枚舉脚祟。contentsGravity可選的常量值有以下一些:


* kCAGravityCenter
* kCAGravityTop
* kCAGravityBottom
* kCAGravityLeft
* kCAGravityRight
* kCAGravityTopLeft
* kCAGravityTopRight
* kCAGravityBottomLeft
* kCAGravityBottomRight
* kCAGravityResize
* kCAGravityResizeAspect
* kCAGravityResizeAspectFill

  • 使用
self.layerView.layer.contentsGravity = kCAGravityResizeAspect;

contentsScale
contentsScale屬性定義了寄宿圖的像素尺寸和視圖大小的比例,默認(rèn)情況下它是一個(gè)值為1.0的浮點(diǎn)數(shù)强饮。

如果contentsScale設(shè)置為1.0由桌,將會(huì)以每個(gè)點(diǎn)1個(gè)像素繪制圖片,如果設(shè)置為2.0邮丰,則會(huì)以每個(gè)點(diǎn)2個(gè)像素繪制圖片行您,這就是我們熟知的Retina屏幕。

  • 使用

當(dāng)我們使用UIImage類去讀取我們的雪人圖片的時(shí)候剪廉,他讀取了高質(zhì)量的Retina版本的圖片娃循。但是當(dāng)我們用CGImage來設(shè)置我們的圖層的內(nèi)容時(shí),拉伸這個(gè)因素在轉(zhuǎn)換的時(shí)候就丟失了斗蒋。不過我們可以通過手動(dòng)設(shè)置contentsScale來修復(fù)這個(gè)問題


//set the contentsScale to match image
  self.layerView.layer.contentsScale = image.scale;

maskToBounds

UIView有一個(gè)叫做clipsToBounds的屬性可以用來決定是否顯示超出邊界的內(nèi)容捌斧,CALayer對(duì)應(yīng)的屬性叫做masksToBounds.

contentsRect

CALayercontentsRect屬性允許我們?cè)趫D層邊框里顯示寄宿圖的一個(gè)子域。這涉及到圖片是如何顯示和拉伸的泉沾,所以要比contentsGravity靈活多了

bounds捞蚂,frame不同,contentsRect不是按點(diǎn)來計(jì)算的跷究,它使用了單位坐標(biāo)姓迅,單位坐標(biāo)指定在01之間,是一個(gè)相對(duì)值(像素和點(diǎn)就是絕對(duì)值)俊马。所以他們是相對(duì)與寄宿圖的尺寸的丁存。iOS使用了以下的坐標(biāo)系統(tǒng):

  • 點(diǎn) —— 在iOSMac OS中最常見的坐標(biāo)體系。點(diǎn)就像是虛擬的像素柴我,也被稱作邏輯像素解寝。在標(biāo)準(zhǔn)設(shè)備上,一個(gè)點(diǎn)就是一個(gè)像素艘儒,但是在Retina設(shè)備上聋伦,一個(gè)點(diǎn)等于2*2個(gè)像素。iOS用點(diǎn)作為屏幕的坐標(biāo)測(cè)算體系就是為了在Retina設(shè)備和普通設(shè)備上能有一致的視覺效果彤悔。

  • 像素 —— 物理像素坐標(biāo)并不會(huì)用來屏幕布局嘉抓,但是仍然與圖片有相對(duì)關(guān)系索守。UIImage是一個(gè)屏幕分辨率解決方案晕窑,所以指定點(diǎn)來度量大小。但是一些底層的圖片表示如CGImage就會(huì)使用像素卵佛,所以你要清楚在Retina設(shè)備和普通設(shè)備上杨赤,他們表現(xiàn)出來了不同的大小敞斋。

  • 單位 —— 對(duì)于與圖片大小或是圖層邊界相關(guān)的顯示,單位坐標(biāo)是一個(gè)方便的度量方式疾牲, 當(dāng)大小改變的時(shí)候植捎,也不需要再次調(diào)整。單位坐標(biāo)在OpenGL這種紋理坐標(biāo)系統(tǒng)中用得很多阳柔,Core Animation中也用到了單位坐標(biāo)焰枢。

默認(rèn)的contentsRect是{0, 0, 1, 1},這意味著整個(gè)寄宿圖默認(rèn)都是可見的舌剂,如果我們指定一個(gè)小一點(diǎn)的矩形济锄,圖片就會(huì)被裁剪


image.png

contentsCenter
contentsCenter其實(shí)是一個(gè)CGRect,它定義了一個(gè)固定的邊框和一個(gè)在圖層上可拉伸的區(qū)域霍转。

  • self.view.layer.contentsCenter = CGRectMake(0, 0, 1, 1);
image.png
  • self.view.layer.contentsCenter = CGRectMake(0, 0, 0.5, 0.5);
image.png

圖層幾何學(xué)

UIView有三個(gè)比較重要的布局屬性:frame荐绝,boundscenterCALayer對(duì)應(yīng)地叫做frame避消,boundsposition低滩。為了能清楚區(qū)分,圖層用了“position”岩喷,視圖用了“center”恕沫,但是他們都代表同樣的值。

如圖:

image.png

anchorPoint
圖層的anchorPoint通過position來控制它的frame的位置均驶,你可以認(rèn)為anchorPoint是用來移動(dòng)圖層的把柄昏兆。

image.png
image.png

anchorPoint相當(dāng)于支點(diǎn),可以用作旋轉(zhuǎn)變化妇穴、平移爬虱、縮放.

如果修改anchorPointlayerframe會(huì)發(fā)生改變,position不會(huì)發(fā)生改變.修改positionanchorPoint中任何一個(gè)屬性都不影響另一個(gè)屬性.

  • 視圖frame計(jì)算公式:
frame.origin.x = position.x - anchorPoint.x * bounds.size.width腾它;  
frame.origin.y = position.y - anchorPoint.y * bounds.size.height跑筝;

坐標(biāo)系

Core Graphics源于Mac OS X系統(tǒng),在Mac OS X中瞒滴,坐標(biāo)原點(diǎn)在左下方并且正y坐標(biāo)是朝上的曲梗,而在iOS中,原點(diǎn)坐標(biāo)是在左上方并且正y坐標(biāo)是朝下的妓忍。在大多數(shù)情況下虏两,這不會(huì)出現(xiàn)任何問題,因?yàn)閳D形上下文的坐標(biāo)系統(tǒng)是會(huì)自動(dòng)調(diào)節(jié)補(bǔ)償?shù)氖榔省5莿?chuàng)建和繪制一個(gè)CGImage`對(duì)象時(shí)就會(huì)暴露出倒置問題.

ZPosition

UIView嚴(yán)格的二維坐標(biāo)系不同定罢,CALayer存在于一個(gè)三維空間當(dāng)中。除了我們已經(jīng)討論過的positionanchorPoint屬性之外旁瘫,CALayer還有另外兩個(gè)屬性祖凫,zPositionanchorPointZ琼蚯,二者都是在Z軸上描述圖層位置的浮點(diǎn)類型。

image.png

此屬性的默認(rèn)值為0惠况。更改此屬性的值會(huì)更改屏幕上各層的從前到后的順序遭庶。較高的值比較低的值在視覺上更靠近該圖層

CALayer中HitTest屬性的實(shí)際使用

響應(yīng)者對(duì)象(Responder Object),顧名思義稠屠,指的是有響應(yīng)和處理事件能力的對(duì)象峦睡。響應(yīng)者鏈就是由一系列的響應(yīng)者對(duì)象構(gòu)成的一個(gè)層次結(jié)構(gòu)。

第一響應(yīng)者(First responder)指的是當(dāng)前接受觸摸的響應(yīng)者對(duì)象(通常是一個(gè)UIView對(duì)象)权埠,即表示當(dāng)前該對(duì)象正在與用戶交互赐俗,它是響應(yīng)者鏈的開端。整個(gè)響應(yīng)者鏈和事件分發(fā)的使命都是找出第一響應(yīng)者弊知。

  • hitTest:withEven:方法的處理流程如下

1. 首先調(diào)用當(dāng)前視圖的pointInside:withEvent:`方法判斷觸摸點(diǎn)是否在當(dāng)前視圖內(nèi)阻逮;

若返回NO,則hitTest:withEvent:返回nil;

若返回YES,則向當(dāng)前視圖的所有子視圖(subviews)發(fā)送hitTest:withEvent:消息,所有子視圖的遍歷順序是從最頂層視圖一直到到最底層視圖秩彤,即從subviews數(shù)組的末尾向前遍歷叔扼,直到有子視圖返回非空對(duì)象或者全部子視圖遍歷完畢.

如圖:

image.png
  1. AUIWindow的根視圖,因此漫雷,UIWindwo對(duì)象會(huì)首相對(duì)A進(jìn)行hit-test瓜富;

2、顯然用戶點(diǎn)擊的范圍是在A的范圍內(nèi)降盹,因此与柑,pointInside:withEvent:返回了YES,這時(shí)會(huì)繼續(xù)檢查A的子視圖蓄坏;

3价捧、這時(shí)候會(huì)有兩個(gè)分支,BC

點(diǎn)擊的范圍不再B內(nèi)涡戳,因此B分支的pointInside:withEvent:返回NO结蟋,對(duì)應(yīng)的hitTest:withEvent:返回nil

點(diǎn)擊的范圍在C內(nèi)渔彰,即CpointInside:withEvent:返回YES嵌屎;

4、這時(shí)候有DE兩個(gè)分支:

點(diǎn)擊的范圍不再D內(nèi)恍涂,因此DpointInside:withEvent:返回NO宝惰,對(duì)應(yīng)的hitTest:withEvent:返回nil

點(diǎn)擊的范圍在E內(nèi)再沧,即EpointInside:withEvent:返回YES尼夺,由于E沒有子視圖(也可以理解成對(duì)E的子視圖進(jìn)行hit-test時(shí)返回了nil),因此,EhitTest:withEvent:會(huì)將E返回汞斧,再往回回溯,就是ChitTest:withEvent:返回E--->>AhitTest:withEvent:返回E什燕。

至此粘勒,本次點(diǎn)擊事件的第一響應(yīng)者就通過響應(yīng)者鏈的事件分發(fā)邏輯成功的找到了。

若第一次有子視圖返回非空對(duì)象屎即,則hitTest:withEvent:方法返回此對(duì)象庙睡,處理結(jié)束;
如所有子視圖都返回非技俐,則hitTest:withEvent:方法返回自身(self)载迄。

如果最終hit-test沒有找到第一響應(yīng)者妥畏,或者第一響應(yīng)者沒有處理該事件,則該事件會(huì)沿著響應(yīng)者鏈向上回溯,如果UIWindow實(shí)例和UIApplication實(shí)例都不能處理該事件湿酸,則該事件會(huì)被丟棄;

  • hitTest:withEvent:方法將會(huì)忽略

1 .忽略隱藏(hidden=YES)的視圖

  1. 禁止用戶操作(userInteractionEnabled=YES)的視圖

  2. alpha級(jí)別小于0.01(alpha<0.01)的視圖

  3. 如果一個(gè)子視圖的區(qū)域超過父視圖的bound區(qū)域(父視圖的clipsToBounds 屬性為NO闸翅,這樣超過父視圖bound區(qū)域的子視圖內(nèi)容也會(huì)顯示).

那么正常情況下對(duì)子視圖在父視圖之外區(qū)域的觸摸操作不會(huì)被識(shí)別,因?yàn)楦敢晥D的pointInside:withEvent:方法會(huì)返回NO,這樣就不會(huì)繼續(xù)向下遍歷子視圖了舟铜。當(dāng)然,也可以重寫pointInside:withEvent:方法來處理這種情況仇穗。

Hit Testing 應(yīng)?用場(chǎng)景

  1. 事件穿透
image.png
  1. ?子視圖超出父視圖范圍
image.png
image.png

仿射變換數(shù)學(xué)原理講解

仿射變換 AffineTransform流部,在iOS中的實(shí)現(xiàn)類是CGAffineTransformCATransform3D,很多動(dòng)畫效果都需要用到仿射去完成纹坐,可以說仿射是動(dòng)畫基礎(chǔ).

原理是利用矩陣的相乘,得到變換后的坐標(biāo)系.

CGAffineTransform

  • CGAffineTransform是一個(gè)可以和二維空間向量(例如CGPoint)做乘法的3X2的矩陣
image.png
CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
  • 使用

CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_4);
    self.layerView.layer.affineTransform = transform;

混合變換

Core Graphics提供了一系列的函數(shù)可以在一個(gè)變換的基礎(chǔ)上做更深層次的變換枝冀,如果做一個(gè)既要縮放又要旋轉(zhuǎn)的變換.

CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)

當(dāng)操縱一個(gè)變換的時(shí)候,初始生成一個(gè)什么都不做的變換很重要--也就是創(chuàng)建一個(gè)CGAffineTransform類型的空值耘子,矩陣論中稱作單位矩陣果漾,Core Graphics同樣也提供了一個(gè)方便的常量:

CGAffineTransformIdentity
  • 使用
CGAffineTransform transform = CGAffineTransformIdentity; 
    //scale by 50%
    transform = CGAffineTransformScale(transform, 0.5, 0.5);
    //rotate by 30 degrees
    transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0);
    //translate by 200 points
    transform = CGAffineTransformTranslate(transform, 200, 0);
    //apply transform to layer
    self.layerView.layer.affineTransform = transform;

CATransform3D

CATransform3D也是一個(gè)矩陣,但是和2x3的矩陣不同谷誓,CATransform3D是一個(gè)可以在3維空間內(nèi)做變換的4x4的矩陣(圖5.6)跨晴。

image.png

蘋果提供的可變換的矩陣:


image.png

3D平移旋轉(zhuǎn)多處了一個(gè)z參數(shù),并且旋轉(zhuǎn)函數(shù)除了angle之外多出了x,y,z三個(gè)參數(shù)片林,分別決定了每個(gè)坐標(biāo)軸方向上的旋轉(zhuǎn):

CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz) 
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末端盆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子费封,更是在濱河造成了極大的恐慌焕妙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弓摘,死亡現(xiàn)場(chǎng)離奇詭異焚鹊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)韧献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門末患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來研叫,“玉大人,你說我怎么就攤上這事璧针∪侣” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵探橱,是天一觀的道長申屹。 經(jīng)常有香客問我,道長隧膏,這世上最難降的妖魔是什么哗讥? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胞枕,結(jié)果婚禮上杆煞,老公的妹妹穿的比我還像新娘。我一直安慰自己腐泻,他們只是感情好索绪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贫悄,像睡著了一般瑞驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窄坦,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天唤反,我揣著相機(jī)與錄音,去河邊找鬼鸭津。 笑死彤侍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逆趋。 我是一名探鬼主播盏阶,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼闻书!你這毒婦竟也來了名斟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤魄眉,失蹤者是張志新(化名)和其女友劉穎砰盐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坑律,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岩梳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀值。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡也物,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出列疗,到底是詐尸還是另有隱情滑蚯,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布作彤,位于F島的核電站,受9級(jí)特大地震影響乌逐,放射性物質(zhì)發(fā)生泄漏竭讳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一浙踢、第九天 我趴在偏房一處隱蔽的房頂上張望绢慢。 院中可真熱鬧,春花似錦洛波、人聲如沸胰舆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缚窿。三九已至,卻和暖如春焰扳,著一層夾襖步出監(jiān)牢的瞬間倦零,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工吨悍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扫茅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓育瓜,卻偏偏與公主長得像葫隙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躏仇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355