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

版本記錄

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

前言

在蘋(píng)果的API文檔中湾宙,有很多屬性和方法我們用的不是很多幕庐,所以很容易忽略和出錯(cuò)讯榕,下面我就用這一個(gè)專(zhuān)題專(zhuān)門(mén)說(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)(五)

allowsGroupOpacity

在 iOS7 中济竹,這個(gè)屬性表示 layer 的 sublayer 是否繼承父 layer 的透明度,主要用途是當(dāng)在動(dòng)畫(huà)中改變一個(gè) layer 的透明度時(shí)(會(huì)引起子 view 的透明度顯示出來(lái))霎槐。但是如果你不需要這種繪制類(lèi)型送浊,可以關(guān)閉這個(gè)屬性來(lái)提高性能。先看一下這個(gè)屬性的API文檔丘跌。

/* When true, and the layer's opacity property is less than one, the
 * layer is allowed to composite itself as a group separate from its
 * parent. This gives the correct results when the layer contains
 * multiple opaque components, but may reduce performance.
 *
 * The default value of the property is read from the boolean
 * UIViewGroupOpacity property in the main bundle's Info.plist. If no
 * value is found in the Info.plist the default value is YES for
 * applications linked against the iOS 7 SDK or later and NO for
 * applications linked against an earlier SDK. */

如果為true袭景,并且該圖層的不透明屬性小于1唁桩,則允許圖層將其自身組合為與其父級(jí)分離的組。 
當(dāng)圖層包含多個(gè)不透明的組件時(shí)耸棒,這會(huì)給出正確的結(jié)果荒澡,但可能會(huì)降低性能。 該屬性的默認(rèn)值是
從主包的Info.plist中的布爾值UIViewGroupOpacity屬性中讀取的与殃。 如果在Info.plist中
沒(méi)有找到任何值单山,則針對(duì)iOS 7 SDK或更高版本鏈接的應(yīng)用程序的缺省值為YES,而針對(duì)早期SDK鏈接的應(yīng)用程序?yàn)镹O幅疼。

@property BOOL allowsGroupOpacity;

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

  • CALayer的allowsGroupOpacity屬性米奸,UIView 的alpha屬性等同于 CALayer opacity屬性。GroupOpacity=YES爽篷,子 layer 在視覺(jué)上的透明度的上限是其父 layer 的opacity悴晰。當(dāng)父視圖的layer.opacity != 1.0時(shí),會(huì)開(kāi)啟離屏渲染逐工。當(dāng)layer.opacity == 1.0時(shí)铡溪,父視圖不用管子視圖,只需顯示當(dāng)前視圖即可钻弄。

  • 為了讓子視圖與父視圖保持同樣的透明度佃却,從 iOS 7 以后默認(rèn)全局開(kāi)啟了這個(gè)功能者吁。


compositingFilter

CoreImage過(guò)濾器窘俺,用于復(fù)合圖層及其背后的內(nèi)容,可動(dòng)畫(huà)复凳。

/* A filter object used to composite the layer with its (possibly
 * filtered) background. Default value is nil, which implies source-
 * over compositing. Animatable.
 *
 * Note that if the inputs of the filter are modified directly after
 * the filter is attached to a layer, the behavior is undefined. The
 * filter must either be reattached to the layer, or filter properties
 * should be modified by calling -setValue:forKeyPath: on each layer
 * that the filter is attached to. (This also applies to the `filters'
 * and `backgroundFilters' properties.) */

用于將圖層與其背景(可能已過(guò)濾)進(jìn)行合成的過(guò)濾器對(duì)象瘤泪,默認(rèn)值為nil,這意味著基于源的
合成育八,可動(dòng)畫(huà)对途。 請(qǐng)注意,如果過(guò)濾器的輸入在過(guò)濾器連接到圖層后被直接修改髓棋,則行為是不確定的实檀。
過(guò)濾器必須重新附加到圖層,或者應(yīng)通過(guò)在過(guò)濾器所附的每個(gè)圖層上調(diào)用-setValue:forKeyPath:
來(lái)修改過(guò)濾器屬性按声。 (這也適用于`filters'和`backgroundFilters'屬性膳犹。)

@property(nullable, strong) id compositingFilter;

還有幾點(diǎn)需要說(shuō)明:

  • 此屬性的默認(rèn)值為nlil,這會(huì)導(dǎo)致圖層使用源合成签则。 盡管可以使用任何Core Image濾鏡作為圖層的合成濾鏡须床,但為了獲得最佳效果,請(qǐng)使用CICategoryCompositeOperation類(lèi)別中的濾鏡渐裂。

  • 在macOS中豺旬,可以在將濾波器附加到圖層后修改過(guò)濾器的參數(shù)钠惩,但是必須使用圖層的setValue:forKeyPath:方法。 例如族阅,要更改過(guò)濾器的inputRadius參數(shù)篓跛,可以使用類(lèi)似于以下內(nèi)容的代碼:

CIFilter *filter = ...;
CALayer *layer = ...;
 
layer.compositingFilter = filter;
[layer setValue:[NSNumber numberWithInt:1] forKeyPath:@"compositingFilter.inputRadius"];
  • 在將CIFilter對(duì)象連接到圖層后,直接更改其輸入會(huì)導(dǎo)致未定義的行為坦刀。該屬性不支持iOS的圖層举塔。

filters

應(yīng)用于圖層及其子圖層內(nèi)容的Core Image過(guò)濾器數(shù)組,可動(dòng)畫(huà)求泰。

/* An array of filters that will be applied to the contents of the
 * layer and its sublayers. Defaults to nil. Animatable. */

  一組應(yīng)用于圖層及其子圖層的濾鏡央渣,默認(rèn)值是nil,可動(dòng)畫(huà)渴频。

@property(nullable, copy) NSArray *filters;

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

  • 添加到此屬性的過(guò)濾器會(huì)影響圖層的內(nèi)容芽丹,包括其邊框,填充的背景和子圖層卜朗。 此屬性的默認(rèn)值為零拔第。

  • 在將 CIFilter對(duì)象連接到圖層后,直接更改其輸入會(huì)導(dǎo)致未定義的行為场钉。 將濾鏡附加到圖層后可以修改濾鏡參數(shù)蚊俺,但是您必須使用該圖層的setValue:forKeyPath:方法。 另外逛万,您必須為過(guò)濾器指定一個(gè)名稱(chēng)泳猬,以便您可以在數(shù)組中識(shí)別它。 例如宇植,要更改過(guò)濾器的inputRadius參數(shù)得封,可以使用類(lèi)似于以下內(nèi)容的代碼:

CIFilter *filter = ...;
CALayer *layer = ...;
 
filter.name = @"myFilter";
layer.filters = [NSArray arrayWithObject:filter];
[layer setValue:[NSNumber numberWithInt:1] forKeyPath:@"filters.myFilter.inputRadius"];
  • iOS中的圖層不支持此屬性。

backgroundFilters

Core Image過(guò)濾器數(shù)組指郁,適用于圖層后面的內(nèi)容忙上。動(dòng)畫(huà)。

/* An array of filters that are applied to the background of the layer.
 * The root layer ignores this property. Animatable. */

一個(gè)可以應(yīng)用到圖層背景的一組濾鏡闲坎,根圖層忽略這個(gè)屬性疫粥,可動(dòng)畫(huà)。

@property(nullable, copy) NSArray *backgroundFilters;

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

  • 背景濾鏡會(huì)影響顯示在圖層本身之后的圖層的內(nèi)容腰懂。 通常這個(gè)內(nèi)容屬于作為圖層的父層的超層梗逮。 這些過(guò)濾器不會(huì)影響圖層本身的內(nèi)容,包括圖層的背景顏色和邊框悯恍。

  • 此屬性的默認(rèn)值為零库糠。

  • 在將CIFilter對(duì)象連接到圖層后,直接更改其輸入會(huì)導(dǎo)致未定義的行為。 在macOS中瞬欧,可以在將圖層附加到圖層后修改濾鏡參數(shù)贷屎,但是您必須使用圖層的setValue:forKeyPath:方法來(lái)執(zhí)行此操作。 另外艘虎,您必須為過(guò)濾器指定一個(gè)名稱(chēng)唉侄,以便您可以在數(shù)組中識(shí)別它。 例如野建,要更改過(guò)濾器的inputRadius參數(shù)属划,可以使用類(lèi)似于以下內(nèi)容的代碼:

CIFilter *filter = ...;
CALayer *layer = ...;
 
filter.name = @"myFilter";
layer.backgroundFilters = [NSArray arrayWithObject:filter];
[layer setValue:[NSNumber numberWithInt:1] forKeyPath:@"backgroundFilters.myFilter.inputRadius"];
  • 您可以使用圖層的 masksToBounds來(lái)控制其背景濾鏡效果的范圍,iOS中的圖層不支持此屬性候生。

shouldRasterize

一個(gè)布爾值同眯,指示在合成之前該圖層是否呈現(xiàn)為位圖,可動(dòng)畫(huà)唯鸭。

/* When true, the layer is rendered as a bitmap in its local coordinate
 * space ("rasterized"), then the bitmap is composited into the
 * destination (with the minificationFilter and magnificationFilter
 * properties of the layer applied if the bitmap needs scaling).
 * Rasterization occurs after the layer's filters and shadow effects
 * are applied, but before the opacity modulation. As an implementation
 * detail the rendering engine may attempt to cache and reuse the
 * bitmap from one frame to the next. (Whether it does or not will have
 * no affect on the rendered output.)
 *
 * When false the layer is composited directly into the destination
 * whenever possible (however, certain features of the compositing
 * model may force rasterization, e.g. adding filters).
 *
 * Defaults to NO. Animatable. */

如果為true须蜗,則圖層將在其局部坐標(biāo)空間(“柵格化”)中呈現(xiàn)為位圖bitmap,然后將位圖
合成到目標(biāo)中(如果位圖需要縮放目溉,則應(yīng)用圖層的minificationFilter和magnificationFilter屬性)明肮。 
在應(yīng)用圖層的過(guò)濾器和陰影效果之后,但在不透明度調(diào)制之前發(fā)生柵格化缭付。 作為一個(gè)實(shí)現(xiàn)細(xì)節(jié)柿估,渲
染引擎可能會(huì)試圖緩存和重用從一幀到下一幀的位圖。 (無(wú)論是否對(duì)渲染的輸出沒(méi)有任何影響)陷猫。
如果為false秫舌,則盡可能將圖層直接合成到目標(biāo)中(但是,合成模型的某些功能可能會(huì)強(qiáng)制進(jìn)行柵格化烙丛,
例如添加過(guò)濾器filters)舅巷。 默認(rèn)為NO,可動(dòng)畫(huà)河咽。

@property BOOL shouldRasterize;

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

  • 在給圖片加圓角的時(shí)候,可以很好的利用這個(gè)屬性赋元,當(dāng)shouldRasterize 設(shè)成 true 時(shí)忘蟹,layer 被渲染成一個(gè) bitmap,并緩存起來(lái)搁凸,等下次使用時(shí)不會(huì)再重新去渲染了媚值。實(shí)現(xiàn)圓角本身就是在做顏色混合(blending),如果每次頁(yè)面出來(lái)時(shí)都blending护糖,消耗太大褥芒,這時(shí)shouldRasterize = yes,下次就只是簡(jiǎn)單的從渲染引擎的 cache 里讀取那張 bitmap,節(jié)約系統(tǒng)資源锰扶。

  • 對(duì)于layer的shouldRasterize屬性默認(rèn)為NO献酗,將此屬性設(shè)置為YES時(shí),會(huì)在對(duì)應(yīng)的本地坐標(biāo)空間創(chuàng)建一張bitmap圖片坷牛,用來(lái)緩存圖片罕偎,當(dāng)在layer上添加filters或者shadow effects等特效時(shí),將自動(dòng)開(kāi)啟光柵化的功能京闰,光柵化的開(kāi)啟與否不會(huì)影響最終的render output 颜及,即最終的渲染輸出,但是有一點(diǎn)要注意蹂楣,開(kāi)啟光柵化雖然不會(huì)影響最終的輸出結(jié)果俏站,但是卻可能?chē)?yán)重影響性能。


rasterizationScale

柵格化內(nèi)容的比例痊土,相對(duì)于圖層的坐標(biāo)空間乾翔,可動(dòng)畫(huà)。

/* The scale at which the layer will be rasterized (when the
 * shouldRasterize property has been set to YES) relative to the
 * coordinate space of the layer. Defaults to one. Animatable. */

將圖層相對(duì)于圖層的坐標(biāo)空間進(jìn)行柵格化的比例(當(dāng)shouldRasterize屬性設(shè)置為YES時(shí))施戴。 默認(rèn)為1反浓,可動(dòng)畫(huà)。

@property CGFloat rasterizationScale;

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

  • 當(dāng)shouldRasterize屬性中的值為YES時(shí)赞哗,圖層使用此屬性來(lái)確定是否縮放柵格化內(nèi)容(以及多少)雷则。 此屬性的默認(rèn)值為1.0,表示該圖層應(yīng)當(dāng)按其當(dāng)前大小進(jìn)行柵格化肪笋。 較大的值放大內(nèi)容月劈,較小的值縮小內(nèi)容。

  • 一般都像下面這樣設(shè)置圓角

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;

參考文章

1. iOS開(kāi)發(fā)-視圖渲染與性能優(yōu)化

后記

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猜揪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坛梁,更是在濱河造成了極大的恐慌而姐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件划咐,死亡現(xiàn)場(chǎng)離奇詭異拴念,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)褐缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)政鼠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人队魏,你說(shuō)我怎么就攤上這事公般。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵官帘,是天一觀的道長(zhǎng)瞬雹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)遏佣,這世上最難降的妖魔是什么挖炬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮状婶,結(jié)果婚禮上意敛,老公的妹妹穿的比我還像新娘。我一直安慰自己膛虫,他們只是感情好草姻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著稍刀,像睡著了一般撩独。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上账月,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天综膀,我揣著相機(jī)與錄音,去河邊找鬼局齿。 笑死剧劝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抓歼。 我是一名探鬼主播讥此,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谣妻!你這毒婦竟也來(lái)了萄喳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹋半,失蹤者是張志新(化名)和其女友劉穎他巨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體湃窍,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闻蛀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了您市。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡役衡,死狀恐怖茵休,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤榕莺,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布俐芯,位于F島的核電站,受9級(jí)特大地震影響钉鸯,放射性物質(zhì)發(fā)生泄漏吧史。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一唠雕、第九天 我趴在偏房一處隱蔽的房頂上張望贸营。 院中可真熱鬧,春花似錦岩睁、人聲如沸钞脂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冰啃。三九已至,卻和暖如春刘莹,著一層夾襖步出監(jiān)牢的瞬間阎毅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工点弯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扇调,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓蒲拉,卻偏偏與公主長(zhǎng)得像肃拜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雌团,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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