版本記錄
版本號(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é)束藤乙,后面更精彩~~~