容易忽略的那些小點(diǎn)總結(jié) (八) —— CALayer相關(guān)(七)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.01.23

前言

在蘋果的API文檔中堤瘤,有很多屬性和方法我們用的不是很多,所以很容易忽略和出錯(cuò)浆熔,下面我就用這一個(gè)專題專門說(shuō)一些不常用的API接口本辐,下面開(kāi)始。感興趣的可以參考前面幾篇文章医增。
1. 容易忽略的那些小點(diǎn)總結(jié) (一) —— UIView UIViewTintAdjustmentMode相關(guān)(一)
2. 容易忽略的那些小點(diǎn)總結(jié) (二) —— CALayer相關(guān)(一)
3. 容易忽略的那些小點(diǎn)總結(jié) (三) —— CALayer相關(guān)(二)
4. 容易忽略的那些小點(diǎn)總結(jié) (四) —— CALayer相關(guān)(三)
5. 容易忽略的那些小點(diǎn)總結(jié) (五) —— CALayer相關(guān)(四)
6. 容易忽略的那些小點(diǎn)總結(jié) (六) —— CALayer相關(guān)(五)
7. 容易忽略的那些小點(diǎn)總結(jié) (七) —— CALayer相關(guān)(六)

shadowPath

圖層陰影的形狀慎皱,可動(dòng)畫。

/* When non-null this path defines the outline used to construct the
 * layer's shadow instead of using the layer's composited alpha
 * channel. The path is rendered using the non-zero winding rule.
 * Specifying the path explicitly using this property will usually
 * improve rendering performance, as will sharing the same path
 * reference across multiple layers. Upon assignment the path is copied.
 * Defaults to null. Animatable. */

非空時(shí)叶骨,此路徑定義用于構(gòu)建圖層陰影的輪廓茫多,而不是使用圖層的合成Alpha通道。 路徑使用非零纏繞規(guī)則進(jìn)行渲染忽刽。使用此屬性明確指定路徑通常會(huì)提高渲染性能天揖,因?yàn)樵诙鄠€(gè)圖層之間共享相同的路徑引用。 分配后跪帝,路徑被復(fù)制今膊。 缺省為null,可動(dòng)畫伞剑。

@property(nullable) CGPathRef shadowPath;

還有幾點(diǎn)需要注意:

  • 此屬性的默認(rèn)值為nil斑唬,這會(huì)導(dǎo)致圖層使用標(biāo)準(zhǔn)的陰影形狀。如果為此屬性指定值黎泣,則圖層將使用指定的路徑而不是圖層的合成Alpha通道來(lái)創(chuàng)建其陰影恕刘。您提供的路徑定義了陰影的輪廓。它使用非零纏繞規(guī)則和當(dāng)前的陰影顏色抒倚,不透明度和模糊半徑進(jìn)行填充褐着。

  • 與大多數(shù)動(dòng)畫屬性不同,此屬性(與所有CGPathRef動(dòng)畫屬性一樣)不支持隱式動(dòng)畫衡便。但是献起,路徑對(duì)象可以使用CAPropertyAnimation的任何具體子類來(lái)動(dòng)畫。路徑將作為on-line點(diǎn)的線性混合進(jìn)行插值; off-line點(diǎn)可以非線性插值(以保持曲線導(dǎo)數(shù)的連續(xù)性)镣陕。如果兩個(gè)路徑的控制點(diǎn)或段數(shù)不同,則結(jié)果是不確定的姻政。如果路徑延伸到圖層邊界之外呆抑,則只有在正常的圖層遮罩規(guī)則導(dǎo)致該圖層時(shí),才會(huì)自動(dòng)被圖層剪切汁展。

  • 指定顯式路徑通常會(huì)提高渲染性能鹊碍。

  • 使用Core Foundation retain/release語(yǔ)義來(lái)保留此屬性的值厌殉。即使屬性聲明似乎使用對(duì)象保留的默認(rèn)分配語(yǔ)義事實(shí)發(fā)生此行為。

  • 您可以使用圖層的陰影路徑來(lái)創(chuàng)建特殊效果侈咕,例如模擬Pages中可用的陰影公罕。Listing 1顯示了將橢圓陰影添加到圖層底部以模擬Pages Contact Shadow效果所需的代碼。

// Listing 1 Creating a contact shadow path

let layer = CALayer()
     
layer.frame = CGRect(x: 75, y: 75, width: 150, height: 150)
layer.backgroundColor = NSColor.darkGray.cgColor
layer.shadowColor = NSColor.gray.cgColor
layer.shadowRadius = 5
layer.shadowOpacity = 1
     
let contactShadowSize: CGFloat = 20
let shadowPath = CGPath(ellipseIn: CGRect(x: -contactShadowSize,
                                          y: -contactShadowSize * 0.5,
                                          width: layer.bounds.width + contactShadowSize * 2,
                                          height: contactShadowSize),
                        transform: nil)
     
layer.shadowPath = shadowPath
Figure 1 Layer with contact shadow effect
  • Listing 2顯示了如何創(chuàng)建一個(gè)模擬Pages Curved Shadow的路徑耀销。 路徑的左側(cè)楼眷,上側(cè)和右側(cè)是直線,底部是凹曲線熊尉,如圖2所示罐柳。
Figure 2 Shadow path for curved shadow effect
// Listing 2  Creating a curved shadow path

let layer = CALayer()
layer.frame = CGRect(x: 75, y: 75, width: 150, height: 150)
layer.backgroundColor = NSColor.darkGray.cgColor
     
layer.shadowColor = NSColor.black.cgColor
layer.shadowRadius = 5
layer.shadowOpacity = 1
     
let shadowHeight: CGFloat = 10
let shadowPath = CGMutablePath()
shadowPath.move(to: CGPoint(x: layer.shadowRadius,
                            y: -shadowHeight))
shadowPath.addLine(to: CGPoint(x: layer.shadowRadius,
                               y: shadowHeight))
shadowPath.addLine(to: CGPoint(x: layer.bounds.width - layer.shadowRadius,
                               y: shadowHeight))
shadowPath.addLine(to: CGPoint(x: layer.bounds.width - layer.shadowRadius,
                               y: -shadowHeight))
     
shadowPath.addQuadCurve(to: CGPoint(x: layer.shadowRadius,
                                    y: -shadowHeight),
                        control: CGPoint(x: layer.bounds.width / 2,
                                         y: shadowHeight))
     
layer.shadowPath = shadowPath
Figure 3 Layer with curved shadow effect

preferredFrameSize

返回在其父層坐標(biāo)空間中圖層的首選大小

/** Layout methods. **/

/* Returns the preferred frame size of the layer in the coordinate
 * space of the superlayer. The default implementation calls the layout
 * manager if one exists and it implements the -preferredSizeOfLayer:
 * method, otherwise returns the size of the bounds rect mapped into
 * the superlayer. */

返回父層坐標(biāo)空間中圖層的首選frame大小。 默認(rèn)實(shí)現(xiàn)調(diào)用布局管理器layout manager
(如果存在的話)狰住,它實(shí)現(xiàn)-preferredSizeOfLayer:方法张吉,否則返回映射到父層的邊界矩形的大小。

- (CGSize)preferredFrameSize;

下面我們看一下和View綁定的layer的preferredFrameSize催植,使用的是8plus的模擬器肮蛹,代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    NSLog(@"preferredFrameSize = %@", NSStringFromCGSize(self.view.layer.preferredFrameSize));
}

下面看輸出結(jié)果

2018-01-23 12:22:02.879272+0800 JJLayer_demo3[49845:33682697] preferredFrameSize = {414, 736}

+ (nullable id<CAAction>)defaultActionForKey:(NSString *)event;

返回當(dāng)前類默認(rèn)的action。返回給定key對(duì)應(yīng)的合適的action或者當(dāng)與key關(guān)聯(lián)的action對(duì)象不存在時(shí)返回nil创南。

/** Action methods. **/

/* An "action" is an object that responds to an "event" via the
 * CAAction protocol (see below). Events are named using standard
 * dot-separated key paths. Each layer defines a mapping from event key
 * paths to action objects. Events are posted by looking up the action
 * object associated with the key path and sending it the method
 * defined by the CAAction protocol.
 *
 * When an action object is invoked it receives three parameters: the
 * key path naming the event, the object on which the event happened
 * (i.e. the layer), and optionally a dictionary of named arguments
 * specific to each event.
 *
 * To provide implicit animations for layer properties, an event with
 * the same name as each property is posted whenever the value of the
 * property is modified. A suitable CAAnimation object is associated by
 * default with each implicit event (CAAnimation implements the action
 * protocol).
 *
 * The layer class also defines the following events that are not
 * linked directly to properties:
 *
 * onOrderIn
 *      Invoked when the layer is made visible, i.e. either its
 *      superlayer becomes visible, or it's added as a sublayer of a
 *      visible layer
 *
 * onOrderOut
 *      Invoked when the layer becomes non-visible. */

/* Returns the default action object associated with the event named by
 * the string 'event'. The default implementation returns a suitable
 * animation object for events posted by animatable properties, nil
 * otherwise. */

“action”是通過(guò)CAAction協(xié)議響應(yīng)“event”的對(duì)象伦忠。 Events使用標(biāo)準(zhǔn)的點(diǎn)分離鍵路徑命名。 
每個(gè)圖層都定義了從事件鍵路徑到動(dòng)作對(duì)象的映射扰藕。 通過(guò)查找與關(guān)鍵路徑關(guān)聯(lián)的操作對(duì)象來(lái)發(fā)布事件缓苛,
并把由CAAction協(xié)議定義的方法發(fā)送給它。

當(dāng)一個(gè)action對(duì)象被調(diào)用時(shí)邓深,它接收三個(gè)參數(shù):命名事件的關(guān)鍵路徑未桥,事件發(fā)生位置的對(duì)象(即圖層),
以及可選的特定于每個(gè)事件的命名參數(shù)的字典芥备。

要為圖層屬性提供隱式動(dòng)畫冬耿,只要修改了屬性的值,就會(huì)發(fā)布與每個(gè)屬性同名的事件萌壳。 一個(gè)合適
的CAAnimation對(duì)象默認(rèn)與每個(gè)隱式事件關(guān)聯(lián)(CAAnimation實(shí)現(xiàn)action協(xié)議)亦镶。

圖層類還定義以下不直接鏈接到屬性的事件:

onOrderIn:在圖層可見(jiàn)時(shí)調(diào)用,即其父圖層變?yōu)榭梢?jiàn)袱瓮,或者將其添加為可見(jiàn)圖層的子圖層缤骨。

onOrderOut:當(dāng)圖層變?yōu)椴豢梢?jiàn)時(shí)調(diào)用。

返回與由字符串“event”命名的事件關(guān)聯(lián)的默認(rèn)action對(duì)象尺借。 默認(rèn)實(shí)現(xiàn)返回適合動(dòng)畫屬性發(fā)布的
事件的動(dòng)畫對(duì)象绊起,否則為nil。

+ (nullable id<CAAction>)defaultActionForKey:(NSString *)event;

還要注意以下幾點(diǎn):

  • 想要提供默認(rèn)的actions的類可以重寫這個(gè)方法并返回這些actions燎斩。

  • 我們知道Core Animation通常對(duì)CALayer的所有屬性(可動(dòng)畫的屬性)做動(dòng)畫虱歪,但是UIView把它關(guān)聯(lián)的圖層的這個(gè)特性關(guān)閉了蜂绎。為了更好說(shuō)明這一點(diǎn),我們需要知道隱式動(dòng)畫是如何實(shí)現(xiàn)的笋鄙。我們把改變屬性時(shí)CALayer自動(dòng)應(yīng)用的動(dòng)畫稱作行為师枣,當(dāng)CALayer的屬性被修改時(shí)候,它會(huì)調(diào)-actionForKey:方法萧落,傳遞屬性的名稱践美。圖層首先檢測(cè)它是否有委托,并且是否實(shí)現(xiàn)CALayerDelegate協(xié)議指定的-actionForLayer:forKey方法铐尚。如果有拨脉,直接調(diào)用并返回結(jié)果。如果沒(méi)有委托宣增,或者委托沒(méi)有實(shí)現(xiàn)-actionForLayer:forKey方法玫膀,圖層接著檢查包含屬性名稱對(duì)應(yīng)行為映射的actions字典。如果actions字典沒(méi)有包含對(duì)應(yīng)的屬性爹脾,那么圖層接著在它的style字典接著搜索屬性名帖旨。最后,如果在style里面也找不到對(duì)應(yīng)的行為灵妨,那么圖層將會(huì)直接調(diào)用定義了每個(gè)屬性的標(biāo)準(zhǔn)行為的-defaultActionForKey:方法解阅。所以一輪完整的搜索結(jié)束之后,-actionForKey:要么返回空(這種情況下將不會(huì)有動(dòng)畫發(fā)生)泌霍,要么是CAAction協(xié)議對(duì)應(yīng)的對(duì)象货抄,最后CALayer拿這個(gè)結(jié)果去對(duì)先前和當(dāng)前的值做動(dòng)畫。

參考文章

1. iOS之讓你的App動(dòng)起來(lái)

后記

本篇已結(jié)束朱转,后面更精彩~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟹地,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子藤为,更是在濱河造成了極大的恐慌怪与,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缅疟,死亡現(xiàn)場(chǎng)離奇詭異分别,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)存淫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門耘斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人桅咆,你說(shuō)我怎么就攤上這事煌往。” “怎么了景东?”我有些...
    開(kāi)封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵垂涯,是天一觀的道長(zhǎng)搭综。 經(jīng)常有香客問(wèn)我环戈,道長(zhǎng)吊档,這世上最難降的妖魔是什么簇爆? 我笑而不...
    開(kāi)封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任镀琉,我火速辦了婚禮硕糊,結(jié)果婚禮上院水,老公的妹妹穿的比我還像新娘。我一直安慰自己简十,他們只是感情好檬某,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著螟蝙,像睡著了一般恢恼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胰默,一...
    開(kāi)封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天场斑,我揣著相機(jī)與錄音,去河邊找鬼牵署。 笑死漏隐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奴迅。 我是一名探鬼主播青责,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼取具!你這毒婦竟也來(lái)了脖隶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤者填,失蹤者是張志新(化名)和其女友劉穎浩村,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體占哟,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡心墅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榨乎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎燥。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜜暑,靈堂內(nèi)的尸體忽然破棺而出铐姚,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布隐绵,位于F島的核電站之众,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏依许。R本人自食惡果不足惜棺禾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峭跳。 院中可真熱鬧膘婶,春花似錦、人聲如沸蛀醉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拯刁。三九已至脊岳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筛璧,已是汗流浹背逸绎。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夭谤,地道東北人棺牧。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朗儒,于是被迫代替她去往敵國(guó)和親颊乘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容