CoreAnimation讓CAAnimation和CALayer都繼承于NSKeyValueCoding協(xié)議脖咐,因?yàn)檫@個(gè)繼承關(guān)系為它們?cè)黾恿艘恍┠J(rèn)的keys(對(duì)應(yīng)的value),添加的keyPath中包括了CGPoint,CGRect,CGSize和CATransform3D類型滑废。
1.鍵值編碼兼容的容器類
CAAnimation和CALayer類就是作為鍵值編碼兼容的容器類闰挡,我們可以根據(jù)任意的keys來(lái)設(shè)置對(duì)應(yīng)的value鹃觉,即便這個(gè)key不是CALayer公開(kāi)的屬性酷鸦,比如:
[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"someKey"];
同樣也可以通過(guò)任意已知的keys來(lái)查找對(duì)應(yīng)的values荆责,可以使用下面的代碼通過(guò)預(yù)先設(shè)置好的somekey來(lái)檢索values:
someKeyValue=[theLayer valueForKey:@"someKey"];
2.默認(rèn)支持的value
CoreAnimation在鍵值編碼時(shí)規(guī)定:一個(gè)類可以給沒(méi)有value的key提供一個(gè)默認(rèn)值滥比。CAAnimation和CALayer類都提供了類方法defaultValueForKey
。
對(duì)于為key提供了默認(rèn)value的類做院,在創(chuàng)建這個(gè)類的子類時(shí)必須要重寫它的
defaultValueForKey
方法盲泛。
當(dāng)你在實(shí)現(xiàn)這個(gè)方法的時(shí)候,需要檢查key的參數(shù)列表键耕,并且返回一個(gè)合適的value值查乒,下面提供了一個(gè)例子,layer提供了defaultValueForKey:
方法郁竟,為maskToBounds
屬性設(shè)置默認(rèn)值:
+ (id)defaultValueForKey:(NSString *)key{
if ([key isEqualToString:@"masksToBounds"])
return [NSNumber numberWithBool:YES];
return [super defaultValueForKey:key];
}
3.封裝
當(dāng)一個(gè)key的數(shù)據(jù)是由一個(gè)標(biāo)量值或者一個(gè)C的數(shù)據(jù)結(jié)構(gòu)時(shí)玛迄,你必須要在其被分配到layer之前對(duì)其進(jìn)行封裝。同樣的棚亩,當(dāng)要訪問(wèn)這些Type時(shí)蓖议,也必須檢查對(duì)象,然后使用合適的方法來(lái)打開(kāi)合適的值讥蟆。下表顯示了Objective-c和c類型封裝
C type | 輸入 |
---|---|
CGPoint | NSValue |
CGSize | NSValue |
CGRect | NSValue |
CATransform3D | NSValue |
CGAffineTransform | NSAffineTransform (OS X only) |
不同類型封裝的類
4.為KeyPath的提供的結(jié)構(gòu)
CAAnimation和CALayer類使用KeyPath來(lái)訪問(wèn)指定的字段勒虾,這功能可以讓你在做動(dòng)畫時(shí)為特定的KeyPath提供數(shù)據(jù)。使用setValue:forKeyPath和valueForKeyPath:
方法設(shè)置瘸彤,然后用valueForKeyPath:
獲取相應(yīng)的值修然。
(1)、CATransform3D KeyPaths
你可以使用更強(qiáng)大的KeyPath质况,查找包含了CATransform3D
類型屬性的值愕宋。在需要指定layer的transforms
完整的KeyPath時(shí),我們可以根據(jù)下表中提供的數(shù)據(jù)结榄,使用transform
和sublayerTransform
的值中贝。例如,我們需要制定繞著layer的z軸旋轉(zhuǎn)時(shí)臼朗,我就需要指定KeyPath為transform.rotation.z
邻寿。
Field Key Path | 描述 |
---|---|
rotation.x | 圍繞X軸,旋轉(zhuǎn)值為弧度视哑,NSNumber 類型 |
rotation.y | 圍繞y軸绣否,旋轉(zhuǎn)值為弧度,NSNumber 類型 |
rotation.z | 圍繞z軸挡毅,旋轉(zhuǎn)值為弧度蒜撮,NSNumber 類型 |
rotation | 圍繞z軸,旋轉(zhuǎn)值為弧度慷嗜,NSNumber 類型淀弹,它和設(shè)置rotation.z 一樣 |
scale.x | x軸縮放丹壕,NSNumber 類型 |
scale.y | y軸縮放,NSNumber 類型 |
scale.z | z軸縮放薇溃,NSNumber 類型 |
scale | 三個(gè)軸縮放的平均值菌赖,NSNumber 類型 |
translation.x | x軸位移,NSNumber 類型 |
translation.y | y軸位移沐序,NSNumber 類型 |
translation.z | z軸位移琉用,NSNumber 類型 |
translation | x,y上面位移策幼,NSSize 和CGSize
|
下面展示了怎樣通過(guò)setValue:forKeyPath方法來(lái)修改一個(gè)layer邑时,這個(gè)例子設(shè)置了layer在x軸上位移了10個(gè)像素點(diǎn),來(lái)顯示layer在x軸上的移動(dòng):
[myLayer setValue:[NSNumber numberWithFloat:10.0] forKeyPath:@"transform.translation.x"];
?注意:通過(guò)keyPath來(lái)設(shè)置value值的時(shí)候不能像Objective-C里面對(duì)屬性的賦值特姐,必須配合KeyPath字符串使用setValue:forKeyPath方法來(lái)進(jìn)行賦值晶丘。
(2)、CGPoint KeyPath
如果當(dāng)前給的是一個(gè)CGPoint
類型唐含,則可以根據(jù)下表進(jìn)行設(shè)置浅浮。例如,當(dāng)我們想要修改layer的position
的x值時(shí)捷枯,可以在KeyPath中寫position.x
滚秩。
Structure Field | 描述 |
---|---|
x | x的分量 |
y | y的分量 |
(3)、CGSize KeyPath
Structure Field | 描述 |
---|---|
width | size的width值 |
height | size的height值 |
(4)淮捆、CGRect KeyPath
例如郁油,要更改layer的bounds
屬性的width值,可以寫入關(guān)鍵路徑bounds.size.width
Structure Field | 描述 |
---|---|
origin | 坐標(biāo)攀痊,類型CGPoint
|
origin.x | 坐標(biāo)的x值桐腌,類型CGFloat
|
origin.y | 坐標(biāo)的y值,類型CGFloat
|
size | 大小蚕苇,類型CGSize
|
size.width | size的width值 |
size.height | size的height值 |
結(jié)語(yǔ)
翻譯這篇文章的目的因?yàn)槲以谧鰟?dòng)畫中需要每次都差到對(duì)應(yīng)的KeyPath哩掺,很麻煩,索性我就將其翻譯出來(lái)涩笤。
到目前為止,這片文章大部分翻譯算是完成了盒件,看起來(lái)很粗糙蹬碧,能看懂就最好了。
原來(lái)地址:Key-Value Coding Extensions