版本記錄
版本號(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
-
Listing 2
顯示了如何創(chuàng)建一個(gè)模擬Pages Curved Shadow
的路徑耀销。 路徑的左側(cè)楼眷,上側(cè)和右側(cè)是直線,底部是凹曲線熊尉,如圖2所示罐柳。
// 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
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)畫。
參考文章
后記
本篇已結(jié)束朱转,后面更精彩~~~