實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(八) —— Core Animation之動(dòng)畫(huà)層內(nèi)容 (五)

版本記錄

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

前言

app中好的炫的動(dòng)畫(huà)可以讓用戶(hù)耳目一新蛹磺,為產(chǎn)品增色不少锹安,關(guān)于動(dòng)畫(huà)的實(shí)現(xiàn)我們可以用基本動(dòng)畫(huà)、關(guān)鍵幀動(dòng)畫(huà)并闲、序列幀動(dòng)畫(huà)以及基于CoreGraphic的動(dòng)畫(huà)等等细睡,接下來(lái)這幾篇我就介紹下我可以想到的幾種動(dòng)畫(huà)繪制方法。具體Demo示例已開(kāi)源到Github —— 刀客傳奇帝火,感興趣的可以看我寫(xiě)的另外幾篇溜徙。
1. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(一) —— 播放GIF動(dòng)畫(huà)(一)
2. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(二) —— 播放GIF動(dòng)畫(huà)之框架FLAnimatedImage的使用(二)
3. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(三) —— 播放序列幀動(dòng)畫(huà)(一)
4. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(四) —— QuartzCore框架(一)
5. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(五) —— QuartzCore框架之CoreAnimation(二)
6. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(六) —— Core Animation Basics(三)
7. 實(shí)現(xiàn)動(dòng)畫(huà)方式深度解析(七) —— Core Animation之Setting Up Layer Objects(四)

Animating Layer Content - 動(dòng)畫(huà)層內(nèi)容

Core Animation提供的基礎(chǔ)可以輕松創(chuàng)建應(yīng)用程序圖層的復(fù)雜動(dòng)畫(huà),并擴(kuò)展到擁有這些圖層的任何視圖犀填。 示例包括更改圖層框架矩形的大小蠢壹,更改屏幕上的位置,應(yīng)用旋轉(zhuǎn)變換或更改其不透明度宏浩。 使用Core Animation知残,啟動(dòng)動(dòng)畫(huà)通常與更改屬性一樣簡(jiǎn)單,但您也可以創(chuàng)建動(dòng)畫(huà)并顯式設(shè)置動(dòng)畫(huà)參數(shù)。

有關(guān)創(chuàng)建更高級(jí)動(dòng)畫(huà)的信息求妹,請(qǐng)參閱Advanced Animation Tricks乏盐。


Animating Simple Changes to a Layer’s Properties - 動(dòng)畫(huà)圖層屬性的簡(jiǎn)單更改

您可以根據(jù)需要隱式或明確地執(zhí)行簡(jiǎn)單的動(dòng)畫(huà)。 隱式動(dòng)畫(huà)使用默認(rèn)的時(shí)間和動(dòng)畫(huà)屬性來(lái)執(zhí)行動(dòng)畫(huà)制恍,而顯式動(dòng)畫(huà)需要您使用動(dòng)畫(huà)對(duì)象自己配置這些屬性父能。 所以隱含的動(dòng)畫(huà)比較適合下面情況:你想做一個(gè)改變但是沒(méi)有大量的代碼,默認(rèn)的時(shí)間工作就適用于你净神。

簡(jiǎn)單的動(dòng)畫(huà)涉及更改圖層的屬性何吝,并讓核心動(dòng)畫(huà)隨著時(shí)間的推移動(dòng)畫(huà)化這些更改。 圖層定義了影響圖層可見(jiàn)外觀(guān)的許多屬性鹃唯。 更改這些屬性之一是一種使外觀(guān)變化動(dòng)畫(huà)化的方式爱榕。 例如,將層的不透明度從1.0更改為0.0會(huì)導(dǎo)致圖層淡出并變得透明坡慌。

重要提示:盡管有時(shí)可以使用Core Animation接口直接對(duì)層次支持的視圖進(jìn)行動(dòng)畫(huà)處理黔酥,但這樣做往往需要額外的步驟。 有關(guān)如何使用Core Animation與層支持的視圖相關(guān)的更多信息洪橘,請(qǐng)參閱如何使層疊視圖生成動(dòng)畫(huà)跪者。

要觸發(fā)隱式動(dòng)畫(huà),您只需要更新圖層對(duì)象的屬性即可熄求。 當(dāng)修改圖層樹(shù)中的圖層對(duì)象時(shí)渣玲,您的更改將立即被這些對(duì)象反映出來(lái)。 但是弟晚,層對(duì)象的視覺(jué)外觀(guān)不會(huì)立即更改忘衍。 反而會(huì)發(fā)生的是,Core Animation使用您的更改作為觸發(fā)器來(lái)創(chuàng)建和調(diào)度一個(gè)或多個(gè)隱式動(dòng)畫(huà)來(lái)執(zhí)行指巡。 因此淑履,進(jìn)行下面代碼所示的更改導(dǎo)致Core Animation為您創(chuàng)建一個(gè)動(dòng)畫(huà)對(duì)象隶垮,并計(jì)劃該動(dòng)畫(huà)從下一個(gè)更新周期開(kāi)始運(yùn)行藻雪。

//Animating a change implicitly

theLayer.opacity = 0.0;

要使用動(dòng)畫(huà)對(duì)象明確地進(jìn)行相同的更改,請(qǐng)創(chuàng)建CABasicAnimation對(duì)象并使用該對(duì)象來(lái)配置動(dòng)畫(huà)參數(shù)狸吞。 在將動(dòng)畫(huà)添加到圖層之前勉耀,您可以設(shè)置動(dòng)畫(huà)的開(kāi)始和結(jié)束值,更改持續(xù)時(shí)間或更改任何其他動(dòng)畫(huà)參數(shù)蹋偏。 下面代碼顯示了如何使用動(dòng)畫(huà)對(duì)象淡出圖層。 創(chuàng)建對(duì)象時(shí)厦凤,可以指定要進(jìn)行動(dòng)畫(huà)化的屬性的鍵路徑,然后設(shè)置動(dòng)畫(huà)參數(shù)晋渺。 要執(zhí)行動(dòng)畫(huà)镰绎,您可以使用addAnimation:forKey:方法將其添加到要?jiǎng)赢?huà)化的圖層畴栖。

// Animating a change explicitly

CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
fadeAnim.duration = 1.0;
[theLayer addAnimation:fadeAnim forKey:@"opacity"];
 
// Change the actual data value in the layer to the final value.
theLayer.opacity = 0.0;

創(chuàng)建顯式動(dòng)畫(huà)時(shí)八千,建議您始終為動(dòng)畫(huà)對(duì)象的fromValue屬性賦值。 如果不為此屬性指定值照皆,Core animation將使用圖層的當(dāng)前值作為起始值。 如果您已經(jīng)將該屬性更新為其最終值沸停,則可能無(wú)法生成所需的結(jié)果纵寝。

與更新層對(duì)象的數(shù)據(jù)值的隱式動(dòng)畫(huà)不同,顯式動(dòng)畫(huà)不會(huì)修改圖層樹(shù)中的數(shù)據(jù)星立。 顯式動(dòng)畫(huà)只產(chǎn)生動(dòng)畫(huà)爽茴。 在動(dòng)畫(huà)結(jié)束時(shí),Core Animation從圖層中刪除動(dòng)畫(huà)對(duì)象绰垂,并使用其當(dāng)前數(shù)據(jù)值重新繪制圖層室奏。 如果要將顯式動(dòng)畫(huà)的更改設(shè)置為永久性,還必須更新圖層的屬性劲装,如上例所示胧沫。

隱式和顯式動(dòng)畫(huà)通常在當(dāng)前運(yùn)行循環(huán)循環(huán)結(jié)束后開(kāi)始執(zhí)行,當(dāng)前線(xiàn)程必須具有運(yùn)行循環(huán)才能執(zhí)行動(dòng)畫(huà)占业。 如果您更改多個(gè)屬性绒怨,或者將多個(gè)動(dòng)畫(huà)對(duì)象添加到圖層,則所有這些屬性更改都將同時(shí)進(jìn)行動(dòng)畫(huà)處理谦疾。 例如南蹂,通過(guò)同時(shí)配置兩個(gè)動(dòng)畫(huà),您可以在屏幕外移動(dòng)圖層念恍。 但是六剥,您也可以將動(dòng)畫(huà)對(duì)象配置為在特定時(shí)間開(kāi)始。 有關(guān)修改動(dòng)畫(huà)時(shí)間的更多信息峰伙,請(qǐng)參閱 Customizing the Timing of an Animation疗疟。


Using a Keyframe Animation to Change Layer Properties - 使用關(guān)鍵幀更改圖層的屬性

基于屬性的動(dòng)畫(huà)將屬性從起始值更改為結(jié)束值,CAKeyframeAnimation對(duì)象允許您以一種可能是或可能不是線(xiàn)性的方式對(duì)一組目標(biāo)值進(jìn)行動(dòng)畫(huà)化瞳氓。 關(guān)鍵幀動(dòng)畫(huà)由一組目標(biāo)數(shù)據(jù)值和每個(gè)值達(dá)到的時(shí)間組成策彤。 在最簡(jiǎn)單的配置中,您可以使用數(shù)組指定值和時(shí)間。 對(duì)于層的位置的更改店诗,您還可以按照路徑進(jìn)行更改。 動(dòng)畫(huà)對(duì)象采用您指定的關(guān)鍵幀必指,并通過(guò)在給定時(shí)間段內(nèi)從一個(gè)值插值到下一個(gè)值來(lái)構(gòu)建動(dòng)畫(huà)塔橡。

下圖展示的是5s的layer position屬性變化的動(dòng)畫(huà)。

5-second keyframe animation of a layer’s position property

該位置被動(dòng)畫(huà)化以遵循使用CGPathRef數(shù)據(jù)類(lèi)型指定的路徑癞谒。 這個(gè)動(dòng)畫(huà)的代碼如下代碼所示弹砚。

// Creating a bounce keyframe animation

// create a CGPath that implements two arcs (a bounce)

CGMutablePathRef thePath = CGPathCreateMutable();

CGPathMoveToPoint(thePath,NULL,74.0,74.0);

CGPathAddCurveToPoint(thePath,NULL,74.0,500.0,

320.0,500.0,

320.0,74.0);

CGPathAddCurveToPoint(thePath,NULL,320.0,500.0,

566.0,500.0,

566.0,74.0);

CAKeyframeAnimation * theAnimation;

// Create the animation object, specifying the position property as the key path.

theAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];

theAnimation.path=thePath;

theAnimation.duration=5.0;

// Add the animation to the layer.

[theLayer addAnimation:theAnimation forKey:@"position"];

下圖示例中的路徑對(duì)象用于定義動(dòng)畫(huà)每幀的層的位置。也就是上個(gè)動(dòng)畫(huà)中的路徑茅诱。

1. Specifying Keyframe Values - 指定關(guān)鍵幀的值

關(guān)鍵幀值是關(guān)鍵幀動(dòng)畫(huà)中最重要的部分。 這些值定義了動(dòng)畫(huà)在其執(zhí)行過(guò)程中的行為摆寄。 指定關(guān)鍵幀值的主要方式是對(duì)象數(shù)組椭迎,但對(duì)于包含CGPoint數(shù)據(jù)類(lèi)型(例如圖層的anchorPointposition屬性)的值缴阎,可以指定CGPathRef數(shù)據(jù)類(lèi)型。

當(dāng)指定值的數(shù)組時(shí)痹升,放入數(shù)組的內(nèi)容取決于屬性所需的數(shù)據(jù)類(lèi)型疼蛾。 您可以直接向數(shù)組中添加一些對(duì)象; 然而,在添加之前转唉,必須將某些對(duì)象轉(zhuǎn)換為id赠法,并且所有標(biāo)量類(lèi)型或結(jié)構(gòu)都必須由對(duì)象包裝款侵。 例如:

  • 對(duì)于采用CGRect(例如bounds和frame屬性)的屬性侧纯,將每個(gè)矩形包裝在NSValue對(duì)象中壕鹉。
  • 對(duì)于圖層的transform屬性晾浴,將每個(gè)CATransform3D矩陣包裝在NSValue對(duì)象中脊凰。 動(dòng)畫(huà)化此屬性會(huì)導(dǎo)致關(guān)鍵幀動(dòng)畫(huà)依次將每個(gè)變換矩陣應(yīng)用于圖層。
  • 對(duì)于borderColor屬性最岗,將每個(gè)CGColorRef數(shù)據(jù)類(lèi)型轉(zhuǎn)換為類(lèi)型id般渡,然后再將其添加到數(shù)組。
  • 對(duì)于采用CGFloat值的屬性儒老,將NSNumber對(duì)象中的每個(gè)值都包含到數(shù)組中驮樊。
  • 當(dāng)動(dòng)畫(huà)化圖層layer的content屬性時(shí),指定一個(gè)CGImageRef數(shù)據(jù)類(lèi)型的數(shù)組佳魔。

對(duì)于采用CGPoint數(shù)據(jù)類(lèi)型的屬性鞠鲜,可以創(chuàng)建一個(gè)點(diǎn)陣列(包含在NSValue對(duì)象中)贤姆,也可以使用CGPathRef對(duì)象來(lái)指定要遵循的路徑。 當(dāng)您指定點(diǎn)數(shù)組時(shí)薄疚,關(guān)鍵幀動(dòng)畫(huà)對(duì)象在每個(gè)連續(xù)點(diǎn)之間繪制一條直線(xiàn)砰碴,并跟隨該路徑呈枉。 當(dāng)指定CGPathRef對(duì)象時(shí)猖辫,動(dòng)畫(huà)從路徑的起點(diǎn)開(kāi)始啃憎,并按照其輪廓荧飞,包括沿著任何曲面叹阔。 您可以使用打開(kāi)或關(guān)閉的路徑耳幢。

2. Specifying the Timing of a Keyframe Animation - 指定關(guān)鍵幀動(dòng)畫(huà)的時(shí)序

關(guān)鍵幀動(dòng)畫(huà)的時(shí)間和步進(jìn)比基本動(dòng)畫(huà)更復(fù)雜睛藻,有幾種屬性可用于控制它:

  • calculateMode屬性定義了用于計(jì)算動(dòng)畫(huà)時(shí)序的算法。 該屬性的值影響其他與時(shí)間相關(guān)的屬性的使用方式按摘。

    • 線(xiàn)性和立方體動(dòng)畫(huà) - 即將calculateMode屬性設(shè)置為kCAAnimationLinearkCAAnimationCubic的動(dòng)畫(huà) - 使用提供的時(shí)間信息來(lái)生成動(dòng)畫(huà)炫贤。 這些模式可以讓您最大限度地控制動(dòng)畫(huà)的時(shí)間。
    • 步進(jìn)動(dòng)畫(huà) - 即將calculationMode屬性設(shè)置為kCAAnimationPacedkCAAnimationCubicPaced的動(dòng)畫(huà)不依賴(lài)于keyTimestimingFunction屬性提供的外部定時(shí)值掠河。 相反,定時(shí)值被隱式計(jì)算跃闹,以提供恒定速度的動(dòng)畫(huà)望艺。
    • 離散動(dòng)畫(huà) - 即將calculationMode屬性設(shè)置為kCAAnimationDiscrete的動(dòng)畫(huà) - 使動(dòng)畫(huà)屬性從一個(gè)關(guān)鍵幀值跳轉(zhuǎn)到下一個(gè),而不進(jìn)行任何插值惩激。 此計(jì)算模式使用keyTimes屬性中的值风钻,但忽略timingFunctions屬性
  • keyTimes 屬性指定應(yīng)用每個(gè)關(guān)鍵幀值的時(shí)間標(biāo)記骡技。 僅當(dāng)計(jì)算模式設(shè)置為kCAAnimationLinear囤萤,kCAAnimationDiscretekCAAnimationCubic時(shí)才使用此屬性涛舍。 它不用于paced動(dòng)畫(huà)。

  • timingFunctions屬性指定要用于每個(gè)關(guān)鍵幀段的時(shí)序曲線(xiàn)吹榴。 (此屬性替代繼承的timingFunction屬性。)

如果要自己處理動(dòng)畫(huà)時(shí)間远剩,請(qǐng)使用kCAAnimationLinearkCAAnimationCubic模式以及keyTimestimingFunction屬性。 keyTimes定義應(yīng)用每個(gè)關(guān)鍵幀值的時(shí)間點(diǎn)痢掠。 所有中間值的時(shí)序由定時(shí)timing functions控制,允許您對(duì)每個(gè)段應(yīng)用簡(jiǎn)單易用的曲線(xiàn)淹辞。 如果沒(méi)有指定任何時(shí)間函數(shù)象缀,時(shí)序是線(xiàn)性的霞怀。


Stopping an Explicit Animation While It Is Running - 在運(yùn)行時(shí)停止顯式動(dòng)畫(huà)

動(dòng)畫(huà)通常運(yùn)行直到它們完成等曼,但是如果需要里烦,可以使用以下技術(shù)之一來(lái)阻止它們:

  • 要從圖層中刪除單個(gè)動(dòng)畫(huà)對(duì)象凿蒜,請(qǐng)調(diào)用圖層的 removeAnimationForKey:方法來(lái)刪除動(dòng)畫(huà)對(duì)象禁谦。 此方法使用傳遞給 addAnimation:forKey:方法來(lái)標(biāo)識(shí)動(dòng)畫(huà)的鍵。 您指定的密鑰不能為零废封。

  • 要從圖層中刪除所有動(dòng)畫(huà)對(duì)象州泊,請(qǐng)調(diào)用圖層的removeAllAnimations方法。 此方法立即刪除所有正在進(jìn)行的動(dòng)畫(huà)漂洋,并使用其當(dāng)前狀態(tài)信息重新繪制圖層遥皂。

注意:您不能直接從圖層中刪除隱式動(dòng)畫(huà)样悟。

當(dāng)您從圖層中刪除動(dòng)畫(huà)時(shí),Core Animation會(huì)通過(guò)使用其當(dāng)前值重新繪制圖層來(lái)進(jìn)行響應(yīng)优炬。 因?yàn)楫?dāng)前值通常是動(dòng)畫(huà)的最終值秀又,這可能會(huì)導(dǎo)致圖層的外觀(guān)突然跳過(guò)尊沸。 如果您希望圖層的外觀(guān)保留在動(dòng)畫(huà)的最后一幀上,則可以使用展示樹(shù)中的對(duì)象來(lái)檢索最終的值恤筛,并將其設(shè)置在圖層樹(shù)中的對(duì)象上屡谐。


Animating Multiple Changes Together - 多個(gè)變化的動(dòng)畫(huà)化

如果要同時(shí)對(duì)圖層對(duì)象應(yīng)用多個(gè)動(dòng)畫(huà),可以使用CAAnimationGroup對(duì)象將它們分組在一起。 使用組對(duì)象通過(guò)提供單個(gè)配置點(diǎn)來(lái)簡(jiǎn)化多個(gè)動(dòng)畫(huà)對(duì)象的管理粹舵。 應(yīng)用于組的時(shí)間和持續(xù)時(shí)間值會(huì)覆蓋單個(gè)動(dòng)畫(huà)對(duì)象中的相同值。

下面代碼顯示了如何使用動(dòng)畫(huà)組在同一時(shí)間和持續(xù)時(shí)間內(nèi)執(zhí)行兩個(gè)與邊框相關(guān)的動(dòng)畫(huà)料睛。

//Animating two animations together

// Animation 1
CAKeyframeAnimation* widthAnim = [CAKeyframeAnimation animationWithKeyPath:@"borderWidth"];
NSArray* widthValues = [NSArray arrayWithObjects:@1.0, @10.0, @5.0, @30.0, @0.5, @15.0, @2.0, @50.0, @0.0, nil];
widthAnim.values = widthValues;
widthAnim.calculationMode = kCAAnimationPaced;
 
// Animation 2
CAKeyframeAnimation* colorAnim = [CAKeyframeAnimation animationWithKeyPath:@"borderColor"];
NSArray* colorValues = [NSArray arrayWithObjects:(id)[UIColor greenColor].CGColor,
            (id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor,  nil];
colorAnim.values = colorValues;
colorAnim.calculationMode = kCAAnimationPaced;
 
// Animation group
CAAnimationGroup* group = [CAAnimationGroup animation];
group.animations = [NSArray arrayWithObjects:colorAnim, widthAnim, nil];
group.duration = 5.0;
 
[myLayer addAnimation:group forKey:@"BorderChanges"];

將動(dòng)畫(huà)組合在一起的更高級(jí)的方法是使用事務(wù)對(duì)象瓤摧。 事務(wù)提供了更多的靈活性,通過(guò)允許您創(chuàng)建嵌套動(dòng)畫(huà)集并為每個(gè)動(dòng)畫(huà)參數(shù)分配不同的動(dòng)畫(huà)參數(shù)残邀。 有關(guān)如何使用事務(wù)對(duì)象的信息痹换,請(qǐng)參閱Explicit Transactions Let You Change Animation Parameters


Detecting the End of an Animation - 動(dòng)畫(huà)結(jié)束的監(jiān)測(cè)

核心動(dòng)畫(huà)提供了檢測(cè)動(dòng)畫(huà)何時(shí)開(kāi)始或結(jié)束的支持振劳。 這些通知是與動(dòng)畫(huà)相關(guān)聯(lián)的任何內(nèi)務(wù)處理任務(wù)的好時(shí)機(jī)鸟辅。 例如棍鳖,您可以使用啟動(dòng)通知來(lái)設(shè)置一些相關(guān)的狀態(tài)信息祟辟,并使用相應(yīng)的結(jié)束通知來(lái)拆除該狀態(tài)。

通知有關(guān)動(dòng)畫(huà)狀態(tài)的兩種不同的方式:

  • 使用setCompletionBlock:方法將完成塊添加到當(dāng)前事務(wù)。 當(dāng)事務(wù)中的所有動(dòng)畫(huà)完成時(shí)绽左,事務(wù)執(zhí)行完成塊。
  • 將代理分配給您的CAAnimation對(duì)象并實(shí)現(xiàn)animationDidStart:animationDidStop:finished:代理方法专酗。

如果要將兩個(gè)動(dòng)畫(huà)鏈接在一起橄碾,以便在其他完成時(shí)啟動(dòng),請(qǐng)勿使用動(dòng)畫(huà)通知颠锉。 相反法牲,使用動(dòng)畫(huà)對(duì)象的beginTime屬性可以在所需的時(shí)間啟動(dòng)每個(gè)動(dòng)畫(huà)對(duì)象。 要將兩個(gè)動(dòng)畫(huà)連接起來(lái)琼掠,將第二個(gè)動(dòng)畫(huà)的開(kāi)始時(shí)間設(shè)置為第一個(gè)動(dòng)畫(huà)的結(jié)束時(shí)間拒垃。 有關(guān)動(dòng)畫(huà)和時(shí)間值的更多信息,請(qǐng)參閱 Customizing the Timing of an Animation瓷蛙。


How to Animate Layer-Backed Views - 如何將layer層支持的view動(dòng)畫(huà)化

如果圖層屬于圖層支持視圖悼瓮,建議使用創(chuàng)建動(dòng)畫(huà)的方法是使用UIKit或AppKit提供的基于視圖的動(dòng)畫(huà)界面。 有一些方法可以直接使用Core Animation界面來(lái)動(dòng)畫(huà)化圖層艰猬,但是如何創(chuàng)建這些動(dòng)畫(huà)取決于目標(biāo)平臺(tái)横堡。

1. Rules for Modifying Layers in iOS - iOS修改圖層的規(guī)則

因?yàn)閕OS視圖總是具有底層,所以UIView類(lèi)本身直接從圖層對(duì)象中導(dǎo)出大部分?jǐn)?shù)據(jù)冠桃。 因此命贴,您對(duì)圖層所做的更改也將自動(dòng)反映在視圖對(duì)象中。 此行為意味著您可以使用Core AnimationUIView界面進(jìn)行更改食听。

如果要使用Core Animation類(lèi)啟動(dòng)動(dòng)畫(huà)胸蛛,則必須從基于視圖的動(dòng)畫(huà)塊內(nèi)部發(fā)出所有Core Animation調(diào)用。 默認(rèn)情況下樱报,UIView類(lèi)禁用圖層動(dòng)畫(huà)葬项,但在動(dòng)畫(huà)塊內(nèi)重新啟用它們。 所以在動(dòng)畫(huà)塊之外進(jìn)行的任何更改都不會(huì)動(dòng)畫(huà)化肃弟。 下面代碼顯示了如何顯式更改圖層的透明度及其位置的示例玷室。 在此示例中零蓉,myNewPosition變量事先計(jì)算并由塊捕獲。 兩個(gè)動(dòng)畫(huà)同時(shí)開(kāi)始穷缤,但是不透明度動(dòng)畫(huà)以默認(rèn)時(shí)序運(yùn)行敌蜂,而位置動(dòng)畫(huà)以其動(dòng)畫(huà)對(duì)象中指定的時(shí)間運(yùn)行。

//Animating a layer attached to an iOS view

[UIView animateWithDuration:1.0 animations:^{

// Change the opacity implicitly.

myView.layer.opacity = 0.0;

// Change the position explicitly.

CABasicAnimation* theAnim = [CABasicAnimation animationWithKeyPath:@"position"];

theAnim.fromValue = [NSValue valueWithCGPoint:myView.layer.position];

theAnim.toValue = [NSValue valueWithCGPoint:myNewPosition];

theAnim.duration = 3.0;

[myView.layer addAnimation:theAnim forKey:@"AnimateFrame"];

}];

2. Rules for Modifying Layers in OS X - OS X中修改圖層的規(guī)則

要在OS X中對(duì)層次支持的視圖進(jìn)行動(dòng)畫(huà)更改津肛,最好使用視圖本身的接口章喉。 您很少(如果有的話(huà))直接修改附加到其中一個(gè)層支持的NSView對(duì)象的圖層。 AppKit負(fù)責(zé)在應(yīng)用程序運(yùn)行時(shí)創(chuàng)建和配置這些圖層對(duì)象并進(jìn)行管理身坐。 修改圖層可能導(dǎo)致它與視圖對(duì)象不同步秸脱,并可能導(dǎo)致意想不到的結(jié)果。 對(duì)于層次支持的視圖部蛇,您的代碼絕對(duì)不能修改圖層對(duì)象的以下屬性:

重要提示:上述限制不適用于圖層托管視圖摊唇。 如果您創(chuàng)建了圖層對(duì)象并將其與視圖手動(dòng)關(guān)聯(lián),則負(fù)責(zé)修改該圖層的屬性并保持對(duì)應(yīng)的視圖對(duì)象同步涯鲁。

默認(rèn)情況下巷查,AppKit會(huì)禁用其層次支持的視圖的隱式動(dòng)畫(huà)。 視圖的動(dòng)畫(huà)師代理對(duì)象為您自動(dòng)重新啟用隱式動(dòng)畫(huà)抹腿。 如果要直接對(duì)圖層屬性設(shè)置動(dòng)畫(huà)岛请,您還可以通過(guò)將當(dāng)前NSAnimationContext對(duì)象的allowedImplicitAnimation屬性更改為YES來(lái)以編程方式重新啟用隱式動(dòng)畫(huà)。 同樣警绩,您應(yīng)該只對(duì)不在上述列表中的動(dòng)畫(huà)屬性執(zhí)行此操作崇败。

3. Remember to Update View Constraints as Part of Your Animation - 記住將視圖約束更新為動(dòng)畫(huà)的一部分

如果您使用基于約束的布局規(guī)則來(lái)管理視圖的位置,則必須刪除可能干擾動(dòng)畫(huà)的任何約束肩祥,作為配置該動(dòng)畫(huà)的一部分后室。 約束影響對(duì)視圖的位置或大小所做的任何更改。 它們也影響視圖與其子視圖之間的關(guān)系混狠。 如果您正在對(duì)任何這些項(xiàng)目進(jìn)行動(dòng)畫(huà)更改咧擂,您可以刪除約束,進(jìn)行更改檀蹋,然后應(yīng)用所需的新約束。

有關(guān)約束的更多信息以及如何使用它們來(lái)管理視圖的布局云芦,請(qǐng)參閱 Auto Layout Guide俯逾。

后記

未完,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舅逸,一起剝皮案震驚了整個(gè)濱河市桌肴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琉历,老刑警劉巖坠七,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件水醋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡彪置,警方通過(guò)查閱死者的電腦和手機(jī)拄踪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拳魁,“玉大人,你說(shuō)我怎么就攤上這事潘懊。” “怎么了救恨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵释树,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我躏哩,道長(zhǎng)扫尺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任弊攘,我火速辦了婚禮,結(jié)果婚禮上襟交,老公的妹妹穿的比我還像新娘捣域。我一直安慰自己宴合,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布贞言。 她就那樣靜靜地躺著阀蒂,像睡著了一般弟蚀。 火紅的嫁衣襯著肌膚如雪义钉。 梳的紋絲不亂的頭發(fā)上级零,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音鉴嗤,去河邊找鬼序调。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硬耍,可吹牛的內(nèi)容都是我干的边酒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坯认,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼氓涣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起引润,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痒玩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后燃观,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡到涂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了践啄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昭灵,死狀恐怖烂完,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抠蚣,我是刑警寧澤履澳,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布距贷,位于F島的核電站,受9級(jí)特大地震影響忠蝗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜什湘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一闽撤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哟旗,春花似錦、人聲如沸饱亮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)壹无。三九已至,卻和暖如春地淀,著一層夾襖步出監(jiān)牢的瞬間岖是,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工烈疚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留前硫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓阶剑,卻偏偏與公主長(zhǎng)得像牧愁,于是被迫代替她去往敵國(guó)和親外莲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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