自iOS5,蘋果引入了新的CALayer子類 CAEmitterLayer

宜君ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
CAEMitterCell 的屬性基本上可以分為 三種:
CAEmitterLayer 的屬性它 自己控制著整個(gè)粒子系統(tǒng)的位置和形狀。
一些屬性比如birthRate,lifetime和celocity,這些屬性在CAEmitterCell中也有。
CAEMitterCell的屬性很多,組合屬性獲得更多的粒子效果。
最近購(gòu)入了某米的一臺(tái)安卓機(jī),使用了一段時(shí)間安卓系統(tǒng)后,發(fā)現(xiàn)iOS系統(tǒng)的動(dòng)畫效果還是很好的。好吧進(jìn)入正題
UIView Animation 實(shí)際上是對(duì) Core Animation(核心動(dòng)畫) 的封裝.使用UIView動(dòng)畫十分簡(jiǎn)單
UIViewAnimationOptions 動(dòng)畫效果枚舉
動(dòng)畫效果相關(guān)
時(shí)間函數(shù)曲線相關(guān)
轉(zhuǎn)場(chǎng)動(dòng)畫相關(guān)
增加關(guān)鍵幀的方法
UIViewKeyframeAnimationOptions 的枚舉值
關(guān)鍵幀動(dòng)畫栗子????
單個(gè)視圖的過(guò)渡效果
從舊視圖轉(zhuǎn)到新視圖的動(dòng)畫效果
fromView 會(huì)從父視圖中移除,并將toView 添加到父視圖中
篇一:iOS 8自定義動(dòng)畫轉(zhuǎn)場(chǎng)上手指南
iOS 5發(fā)布的時(shí)候,蘋果針對(duì)應(yīng)用程序界面的設(shè)計(jì),提出了一種全新的,革命性的方法—Storyboard,它從根本上改變了現(xiàn)有的設(shè)計(jì)理念。iOS 5之前,每個(gè)視圖控制器通常都伴有一個(gè)Interface Builder的文件,叫nib或者xib,這個(gè)想法比較簡(jiǎn)單:每個(gè)視圖控制器的界面應(yīng)該在各自的nib文件中設(shè)計(jì),而所有的nib文件一起構(gòu)成了整個(gè)應(yīng)用程序的界面。一方面,這個(gè)是很方便的,因?yàn)樗鼜?qiáng)迫開發(fā)者在界面設(shè)計(jì)的時(shí)候?qū)⒆⒁饬性诮缑嫔希硪环矫妫阶詈螅嗟奈募坏貌槐粍?chuàng)建,開發(fā)者將不能概覽應(yīng)用的整體界面。
隨著storyboard的產(chǎn)生,上面的這些都成為了歷史,因?yàn)檫@種新方法受到了開發(fā)者社區(qū)的廣泛使用。相比老的技術(shù),storyboards提供了三個(gè)重要的優(yōu)勢(shì):
整個(gè)界面設(shè)計(jì)只發(fā)生在一個(gè)文件里。項(xiàng)目的總文件數(shù)量大大減少了,特別是在大項(xiàng)目里。當(dāng)然你可以使用額外的nib文件,并且允許只創(chuàng)建輔助視圖。
開發(fā)者能即時(shí)瀏覽應(yīng)用的界面和流程。 視圖控制器之間的轉(zhuǎn)換(界面設(shè)計(jì)的專業(yè)術(shù)語(yǔ)叫場(chǎng)景(scene)),以及轉(zhuǎn)換是如何發(fā)生的,在storyboard中已被完美地定義并清楚地呈現(xiàn)給了開發(fā)者。
綜上所述,場(chǎng)景之間的轉(zhuǎn)換構(gòu)成storyboard的特殊部分,我們一般把它叫做轉(zhuǎn)場(chǎng)(segue)。
轉(zhuǎn)場(chǎng)跟應(yīng)用的導(dǎo)航和處理是密切相關(guān)的,因?yàn)樗鞔_定義了一個(gè)視圖切換到另一個(gè)視圖的轉(zhuǎn)換細(xì)節(jié)。這些細(xì)節(jié)指定了是否應(yīng)用動(dòng)畫,動(dòng)畫的類型,當(dāng)然還有實(shí)際轉(zhuǎn)換時(shí)的準(zhǔn)備和性能。除此之外,轉(zhuǎn)場(chǎng)也用來(lái)將傳遞數(shù)據(jù)到下一個(gè)視圖控制器里,這個(gè)用法也很常見。
從編程的角度看,場(chǎng)景是UIStoryboardSegue類的一個(gè)對(duì)象,它第一次在iOS 5中介紹到。和其它類的對(duì)象
不同的是,這種對(duì)象不能直接的創(chuàng)建或使用。不過(guò)你可以指定轉(zhuǎn)場(chǎng)的屬性,然后在轉(zhuǎn)場(chǎng)即將發(fā)生時(shí)提供給它以達(dá)到目的。UIKit框架提供了一些帶默認(rèn)動(dòng)畫過(guò)渡的預(yù)定義的轉(zhuǎn)場(chǎng),包括:push segues(包括導(dǎo)航控制器的app),帶有動(dòng)畫選擇的模態(tài)轉(zhuǎn)場(chǎng)(modal segues), popover segues。更高級(jí)的情況下,iOS SDK默認(rèn)的轉(zhuǎn)場(chǎng)可能不夠用,所以開發(fā)者必須實(shí)現(xiàn)他們的自定義轉(zhuǎn)場(chǎng)(custom segues)。 創(chuàng)建一個(gè)自定義轉(zhuǎn)場(chǎng)并不難,因?yàn)樗莍OS標(biāo)準(zhǔn)編程技術(shù)的組成部分。實(shí)際上你只需要生成UIStoryboardSegue的子類,并重載一個(gè)叫perform的方法即可。這個(gè)perform方法中必須實(shí)現(xiàn)自定義動(dòng)畫的邏輯。從一個(gè)視圖控制器轉(zhuǎn)換到另一個(gè)以及返回操作的觸發(fā),也需要由開發(fā)者編程提供,這是一個(gè)標(biāo)準(zhǔn)的步驟。 在本教程中,我的目標(biāo)是向你們展示如何實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng),并通過(guò)一個(gè)簡(jiǎn)單的演示應(yīng)用介紹這個(gè)概念的所有方面。擁有創(chuàng)建自定義轉(zhuǎn)場(chǎng)的知識(shí), 可以將你導(dǎo)
向開發(fā)更強(qiáng)大的app的道路。此外,對(duì)于最大化用戶體驗(yàn),并開發(fā)引人注目的漂亮應(yīng)用,自定義轉(zhuǎn)場(chǎng)也很有幫助。 如果你有興趣學(xué)習(xí)我剛剛說(shuō)的話,就一起來(lái)探索教程里的`所有細(xì)節(jié)和自定義轉(zhuǎn)場(chǎng)的奧秘吧。
應(yīng)用程序概述不像我之前幾個(gè)教程提供了一個(gè)啟動(dòng)項(xiàng)目,本教程我們將從頭開始創(chuàng)建app。事實(shí)上,我是故意這么做的,因?yàn)椋?xiàng)目中一些重要部分需要用到Interface Builder,所以我認(rèn)為從頭開始按部就班的來(lái)做,能讓你看清里面的細(xì)節(jié)。
正如我先前所說(shuō),我們將開發(fā)一個(gè)非常簡(jiǎn)單的app,在這個(gè)應(yīng)用中我們將創(chuàng)建兩個(gè)自定義轉(zhuǎn)場(chǎng)。需要提前說(shuō)明的是,我們的演示應(yīng)用將有三個(gè)視圖控制器,也就是在Interface Builder中有三個(gè)場(chǎng)景和三個(gè)相關(guān)類。默認(rèn)情況下,第一個(gè)是由Xcode創(chuàng)建的,因此我們只要再添加兩個(gè)。我們將創(chuàng)建的自定義轉(zhuǎn)場(chǎng)用來(lái)導(dǎo)航第一個(gè)視圖控制器到第二個(gè)
(以及返回),以及從第一個(gè)到第三個(gè)(以及返回)。第二個(gè)和第三個(gè)視圖控制器之間我們不添加任何聯(lián)系。
因此,我們需要?jiǎng)?chuàng)建兩個(gè)自定義轉(zhuǎn)場(chǎng)。因?yàn)橐ǚ祷兀恳粋€(gè)轉(zhuǎn)場(chǎng)需要?jiǎng)?chuàng)建兩個(gè)對(duì)應(yīng)的類(因此,共四個(gè)):第一個(gè)類里我們將實(shí)現(xiàn)從第一個(gè)視圖控制器到另一個(gè)轉(zhuǎn)換的所有自定義邏輯。第二個(gè)類實(shí)現(xiàn)返回到第一個(gè)視圖控制器的邏輯,或者換句話說(shuō)要實(shí)現(xiàn)解除轉(zhuǎn)場(chǎng)(unwind segue)。后面會(huì)講到解除轉(zhuǎn)場(chǎng),現(xiàn)在只需要記住這就是用來(lái)讓我們返回到前一個(gè)視圖控制器的轉(zhuǎn)場(chǎng)。
視圖控制器本身沒什么需要做的。我們會(huì)用一個(gè)label注明視圖控制器的名稱,每一個(gè)會(huì)有一個(gè)不同的背景顏色,可以讓我們很容易地查看轉(zhuǎn)換(是的,這將是一個(gè)五顏六色的應(yīng)用)。第一個(gè)和第二個(gè)視圖控制器也會(huì)多一個(gè)label,其中從其他視圖控制器傳來(lái)的自定義的消息將被顯示出來(lái)。
最后,轉(zhuǎn)場(chǎng)將在以下的動(dòng)作發(fā)生的時(shí)候
篇二:Swift常用UIView Animation API使用
Swift常用UIView Animation API使用
本文默認(rèn)讀者有基礎(chǔ)動(dòng)畫編寫能力
參數(shù)解釋
*如解釋有誤,請(qǐng)指出,謝謝*
1 duration: 動(dòng)畫執(zhí)行時(shí)間
2 delay:動(dòng)畫延遲執(zhí)行時(shí)間
3 options:
.Repeat:動(dòng)畫永遠(yuǎn)重復(fù)的運(yùn)行
.Autoreverse:動(dòng)畫執(zhí)行結(jié)束后按照相反的行為繼續(xù)執(zhí)行。該屬性只能和.Repeat屬性組合使用
.CurveLinear:動(dòng)畫做線性運(yùn)動(dòng)
.CurveEaseIn:動(dòng)畫緩慢開始,然后逐漸加速
.CurveEaseOut:動(dòng)畫迅速開始,在結(jié)束時(shí)減速
.CurveEaseInOut:動(dòng)畫慢慢開始,然后加速,在結(jié)束之前減速.TransitionNone:沒有轉(zhuǎn)場(chǎng)動(dòng)畫
.TransitionFlipFromTop :從頂部圍繞水平軸做翻轉(zhuǎn)動(dòng)畫 .TransitionFlipFromBottom:從底部圍繞水平軸做翻轉(zhuǎn)動(dòng)畫
.TransitionFlipFromLeft :從左側(cè)圍繞垂直軸做翻轉(zhuǎn)動(dòng)畫
.TransitionFlipFromRight:從右側(cè)圍繞垂直軸做翻轉(zhuǎn)動(dòng)畫
.TransitionCurlUp:從下往上做翻頁(yè)動(dòng)畫
.TransitionCurlDown :從上往下做翻頁(yè)動(dòng)畫
.TransitionCrossDissolve:視圖溶解消失顯示新視圖動(dòng)畫
4 usingSpringWithDamping:彈簧阻力,取值范圍為0.0-1.0,數(shù)值越小“彈簧”振動(dòng)效果越明顯。
5 initialSpringVelocity:動(dòng)畫初始的速度(pt/s),數(shù)值越大初始速度越快。但要注意的是,初始速度取值較高而時(shí)間較短時(shí),也會(huì)出現(xiàn)反彈情況。普通動(dòng)畫
animateWithDuration:delay:options:animations:completion: class func animateWithDuration(_ duration: NSTimeInterval,
delay delay: NSTimeInterval,
options options: UIViewAnimationOptions,
animations animations: () - Void,
completion completion: ((Bool) - Void))
Animate changes to one or more views using the specified duration, delay, options, and completion handler.
對(duì)一個(gè)或者多個(gè)視圖按照相應(yīng)參數(shù)做固定動(dòng)畫(翻譯純屬個(gè)人見解,有錯(cuò)請(qǐng)指出)
animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
class func animateWithDuration(_ duration: NSTimeInterval,
delay delay: NSTimeInterval,
usingSpringWithDamping dampingRatio: CGFloat,
initialSpringVelocity velocity: CGFloat,
options options: UIViewAnimationOptions,
animations animations: () - Void,
completion completion: ((Bool) - Void))
Performs a view animation using a timing curve corresponding to the motion of a physical spring.
對(duì)一個(gè)視圖按照相應(yīng)參數(shù)做彈性動(dòng)畫(類似于彈簧,翻譯純屬個(gè)人見解,有錯(cuò)請(qǐng)指出)
圖片借鑒Renfei Song's Blog,只為更清楚的展示調(diào)用兩個(gè)API的不同效果
Spring Animation 和普通的動(dòng)畫的運(yùn)動(dòng)曲線的對(duì)比:
Spring Animation, Ease-Out Animation 和 Linear Animation 的動(dòng)畫效果:
轉(zhuǎn)場(chǎng)動(dòng)畫
transitionWithView:duration:options:animations:completion: class func transitionWithView(_ view: UIView,
duration duration: NSTimeInterval,
options options: UIViewAnimationOptions,
animations animations: (() - Void),
completion completion: ((Bool) - Void))
Creates a transition animation for the specified container view.為指定的視圖構(gòu)建一個(gè)過(guò)渡動(dòng)畫(翻譯純屬個(gè)人見解,有錯(cuò)請(qǐng)指出)transitionFromView:toView:duration:options:completion:
class func transitionFromView(_ fromView: UIView,
toView toView: UIView,
duration duration: NSTimeInterval,
options options: UIViewAnimationOptions,
completion completion: ((Bool) - Void))
Creates a transition animation between the specified views using the given parameters.
在兩個(gè)給定視圖之間構(gòu)建過(guò)渡動(dòng)畫(翻譯純屬個(gè)人見解,有錯(cuò)請(qǐng)指出)
以上為UIView Animation的基礎(chǔ)動(dòng)畫API,使用其實(shí)很簡(jiǎn)單,就是要理解不同參數(shù)的意義。
篇三:iOS開發(fā)學(xué)習(xí)之核心動(dòng)畫
核心動(dòng)畫基本概念
基礎(chǔ)動(dòng)畫(CABasicAnimation)
關(guān)鍵幀動(dòng)畫(CAKeyframeAnimation)
動(dòng)畫組
轉(zhuǎn)場(chǎng)動(dòng)畫-CATransition
UIView的轉(zhuǎn)場(chǎng)動(dòng)畫-雙視圖
一、核心動(dòng)畫基本概念
1.導(dǎo)入QuartzCore.framework框架
開發(fā)步驟
1).初始化一個(gè)動(dòng)畫對(duì)象(CAAnimation)并且設(shè)置一些動(dòng)畫相關(guān)屬性
2).CALayer中很多屬性都可以通過(guò)CAAnimation實(shí)現(xiàn)動(dòng)畫效果,包括:opacity、position、transform、bounds、contents等(可以在API文檔中搜索:CALayer Animatable Properties)
3).添加動(dòng)畫對(duì)象到層(CALayer)中,開始執(zhí)行動(dòng)畫
4).通過(guò)調(diào)用CALayer的addAnimation:forKey增加動(dòng)畫到層(CALayer)中,這樣就能觸發(fā)動(dòng)畫。通過(guò)調(diào)用removeAnimationForKey可以停止層中的動(dòng)畫
5).Core Animation的動(dòng)畫執(zhí)行過(guò)程都是后臺(tái)操作的,不會(huì)阻塞主線程
2.屬性
1).duration:動(dòng)畫的持續(xù)時(shí)間
2).repeatCount:重復(fù)次數(shù)(HUGE_VALF、MAX FLOAT無(wú)限重復(fù))
3).repeatDuration:重復(fù)時(shí)間(用的很少)
4).removedOnCompletion:默認(rèn)為Yes。動(dòng)畫執(zhí)行完后默認(rèn)會(huì)從圖層刪除掉
5).fillMode
6).biginTime
7).timingFunction:速度控制函數(shù),控制動(dòng)畫節(jié)奏
8).delegate
二、基礎(chǔ)動(dòng)畫(CABasicAnimation)
如果只是實(shí)現(xiàn)簡(jiǎn)單屬性變化的動(dòng)畫效果,可以使用UIView的塊動(dòng)畫替代基本動(dòng)畫
1.屬性說(shuō)明
-fromValue:keyPath相應(yīng)屬性值的初始值
-toValue:keyPath相應(yīng)屬性的結(jié)束值
2.動(dòng)畫過(guò)程說(shuō)明:
-隨著動(dòng)畫的就行,在duration的持續(xù)時(shí)間內(nèi),keyPath相應(yīng)的屬性值從fromValue漸漸變?yōu)閠oValue
-keyPath內(nèi)容是CALayer的可動(dòng)畫Animation屬性
-如果fillMode=kCAFillModeForwards同時(shí)removedOnCompletion=NO,那么在動(dòng)畫執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫執(zhí)行后的狀態(tài),但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫執(zhí)行前的初始值,并沒有真正改變
3.代碼實(shí)現(xiàn)
位移需要考慮目標(biāo)點(diǎn)設(shè)定的問題
1.將動(dòng)畫的所有方法封裝到一個(gè)類里面
MyCAHelper.h
#import
#import
#define kCAHelperAlphaAnimation @"opacity"; ?// 淡入淡出動(dòng)畫 #define kCAHelperScaleAnimation @"transform.scale";// 比例縮放動(dòng)畫
#define kCAHelperRotationAnimation @"transform.rotation";// 旋轉(zhuǎn)動(dòng)畫
#define kCAHelperPositionAnimation @"position"; // 平移位置動(dòng)畫
@interface MyCAHelper : NSObject
#pragma mark - 基本動(dòng)畫統(tǒng)一調(diào)用方法
+ (CABasicAnimation *)myBasicAnimationWithType:(NSString *)animationTypeduration:(CFTimeInterval)duration from:(NSValue *)from
to:(NSValue *)to
autoRevereses:(BOOL)autoRevereses;
#pragma mark - 關(guān)鍵幀動(dòng)畫方法
#pragma mark 搖晃動(dòng)畫
+ (CAKeyframeAnimation
*)myKeyShakeAnimationWithDuration:(CFTimeInterval)duration
angle:(CGFloat)angle
repeatCount:(CGFloat)repeatCount;
#pragma mark 貝塞爾路徑動(dòng)畫
+ (CAKeyframeAnimation *)myKeyPathAnimationWithDuration:(CFTimeInterval)durationpath:(UIBezierPath *)path;
#pragma mark 彈力仿真動(dòng)畫
+ (CAKeyframeAnimation *)myKeyBounceAnimationFrom:(CGPoint)from
to:(CGPoint)to
duration:(CFTimeInterval)duration;
@end
MyCAHelper.m
#import "MyCAHelper.h"
@implementation MyCAHelper
#pragma mark - 基本動(dòng)畫統(tǒng)一調(diào)用方法
+ (CABasicAnimation *)myBasicAnimationWithType:(NSString *)animationTypeduration:(CFTimeInterval)duration
from:(NSValue *)from
to:(NSValue *)to
autoRevereses:(BOOL)autoRevereses
{
// 1. 實(shí)例化一個(gè)CA動(dòng)畫對(duì)象
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:animationType];
// 2. 設(shè)置動(dòng)畫屬性
[anim setDuration:duration];
[anim setFromValue:from];
[anim setToValue:to];
[anim setAutoreverses:autoRevereses];
return anim;
}
#pragma mark - 關(guān)鍵幀動(dòng)畫方法
#pragma mark 搖晃動(dòng)畫
+ (CAKeyframeAnimation
*)myKeyShakeAnimationWithDuration:(CFTimeInterval)duration
angle:(CGFloat)angle
repeatCount:(CGFloat)repeatCount
{
// 1. 初始化動(dòng)畫對(duì)象實(shí)例
CAKeyframeAnimation *anim = [CAKeyframeAnimation
animationWithKeyPath:@"transform.rotation"];
// 2. 設(shè)置動(dòng)畫屬性
[anim setDuration:duration];
[anim setValues:@[@(angle), @(-angle), @(angle)]];
[anim setRepeatCount:repeatCount];
return anim;
}
#pragma mark 貝塞爾路徑動(dòng)畫
+ (CAKeyframeAnimation *)myKeyPathAnimationWithDuration:(CFTimeInterval)duration path:(UIBezierPath *)path
{
// 1. 初始化動(dòng)畫對(duì)象實(shí)例
CAKeyframeAnimation *anim = [CAKeyframeAnimation
animationWithKeyPath:@"position"];
// 2. 設(shè)置動(dòng)畫屬性
[anim setDuration:duration];
下邊有整體效果,希望能幫助到你!
定義一個(gè)視圖
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
一、圖片旋轉(zhuǎn)三種方式:
第一種:根據(jù)CGPathAddArc 繪畫圖片旋轉(zhuǎn)路線:
/*
1、#CGMutablePathRef? _Nullable path# 路線
2、確定圓心#CGFloat x# #CGFloat y#
3、半徑#CGFloat radius#
4、起點(diǎn) #CGFloat startAngle# 結(jié)束 #CGFloat endAngle#
*/
CGPathAddArc(path, NULL, self.view.center.x, self.view.center.y, 0.1, 0, M_PI *2, 1);
CAKeyframeAnimation * frameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
frameAnimation.path= path;
CGPathRelease(path);
frameAnimation.delegate=self;
frameAnimation.duration=10;// 持續(xù)時(shí)間
frameAnimation.repeatCount = -1;// 重復(fù)次數(shù) 如果為0表示不執(zhí)行,-1表示不限制次數(shù),默認(rèn)為0
frameAnimation.autoreverses=NO;
frameAnimation.rotationMode = kCAAnimationRotateAuto;// 樣式
frameAnimation.fillMode = kCAFillModeForwards;
[self.imageView.layeraddAnimation:frameAnimationforKey:nil];
第二種:
[UIView animateWithDuration:20.0f animations:^{
? ? if (self.imageView) {
? ? ? ?self.imageView.transform = CGAffineTransformMakeRotation(M_PI*5);
?}
}];
第三種:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//默認(rèn)是順時(shí)針效果,若將fromValue和toValue的值互換,則為逆時(shí)針效果
animation.fromValue = [NSNumber numberWithFloat:0.f];
animation.toValue = [NSNumber numberWithFloat: M_PI *2];
animation.duration=30;
animation.autoreverses=NO;
animation.fillMode = kCAFillModeForwards;
animation.repeatCount = MAXFLOAT; //如果這里想設(shè)置成一直自旋轉(zhuǎn),可以設(shè)置為MAXFLOAT,否則設(shè)置具體的數(shù)值則代表執(zhí)行多少次
[self.imageView.layer addAnimation:animation forKey:nil];
持續(xù)旋轉(zhuǎn):
@property(nonatomic,assign) double angle;
CGAffineTransform endAngle = CGAffineTransformMakeRotation(self.angle * (M_PI / 180.0f));
[UIView animateWithDuration:0.01 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
? ? self.imageView.transform= endAngle;
}completion:^(BOOLfinished) {
? ? self.angle+=10;
? ? [self startAnimation2];// 上邊任意一種方法回調(diào)
}];
// 當(dāng)視圖停止轉(zhuǎn)動(dòng)時(shí)調(diào)用此方法重新轉(zhuǎn)動(dòng)
-(void)endAnimation {
self.angle+=4;
[self startAnimation2];
}
二、水波紋動(dòng)畫
屬性定義:幾個(gè)波紋定義幾個(gè)X 寬度可以用一個(gè) 也可以分開定義
@property (weak, nonatomic) IBOutlet UIView *backView;
@property(nonatomic,strong) CAShapeLayer * waterLayer1;
@property(nonatomic,strong) CAShapeLayer * waterLayer2;
@property(nonatomic,assign) CGFloat x;
@property(nonatomic,assign) CGFloat y;
@property(nonatomic,assign) CGFloat waveHeight;
@property(nonatomic,assign) CGFloat waveWidth;
@property(nonatomic,assign) int speedWave;
@property(nonatomic,assign) CGFloat waveAmplitude;
@property(nonatomic,assign) int speed;
@property(nonatomic,assign) CGFloat speed_H;
@property(nonatomic,assign) CGFloat offsetXT;
-(instancetype)init {// 給個(gè)初始值,下邊被除數(shù)不能為0
if (self == [super init]) {
self.speedWave = 3;
self.waveAmplitude = 3;
self.speed=3;
self.waveWidth = self.backView.frame.size.width;
self.waveHeight = self.backView.frame.size.height;
self.speed_H = self.backView.frame.size.height-20;
}
return self;
}
-(void)waterAnimation {
//? ? CGFloat y = _waveHeight*sinf(2.5*M_PI*i/_waveWidth + 3*_offset*M_PI/_waveWidth + M_PI/4) + _h;
self.waterLayer1 = [CAShapeLayer layer];
self.waterLayer1.fillColor = [UIColor yellowColor].CGColor;
[self.backView.layer addSublayer:self.waterLayer1];
self.waterLayer2 = [CAShapeLayer layer];
self.waterLayer2.fillColor = [UIColor redColor].CGColor;
[self.backView.layer addSublayer: self.waterLayer2];
//創(chuàng)建一個(gè)新的 CADisplayLink 對(duì)象,把它添加到一個(gè)runloop中,并給它提供一個(gè) target 和selector 在屏幕刷新的時(shí)候調(diào)用
//CADispayLink相當(dāng)于一個(gè)定時(shí)器 會(huì)一直繪制曲線波紋 看似在運(yùn)動(dòng),其實(shí)是一直在繪畫不同位置點(diǎn)的余弦函數(shù)曲線
CADisplayLink * waveDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(getCurrentWave)];
[waveDisplayLinkaddToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}
-(void)getCurrentWave {
// x位置
self.x+=self.speed;
//聲明第一條波曲線的路徑
CGMutablePathRef path = CGPathCreateMutable();
//設(shè)置起始點(diǎn)
CGPathMoveToPoint(path,nil,0,self.waveHeight);
CGFloaty =0.f;
//第一個(gè)波紋的公式
for(floatx =0.f; x =self.waveWidth; x++) {
? ? y =self.waveAmplitude*sin((200/self.waveWidth) * (x *M_PI/70) -self.x*M_PI/170) +self.speed_H*1;
? ? CGPathAddLineToPoint(path,nil, x, y);
? ? x++;
}
//把繪圖信息添加到路徑里
CGPathAddLineToPoint(path, nil, self.waveWidth, self.backView.frame.size.height);
CGPathAddLineToPoint(path, nil, 0, self.backView.frame.size.height);
//結(jié)束繪圖信息
CGPathCloseSubpath(path);
self.waterLayer1.path= path;
//釋放繪圖路徑
CGPathRelease(path);
[self? ? X2];
}
/// 第二條水波
-(void)X2 {
self.offsetXT += self.speedWave;
CGMutablePathRef pathT = CGPathCreateMutable();
CGPathMoveToPoint(pathT,nil,0,self.waveHeight+50);
CGFloatyT =0.f;
for(floatx =0.f; x =self.waveWidth; x++) {
? ? yT =self.waveAmplitude*1.6*sin((200/self.waveWidth) * (x *M_PI/100) -self.offsetXT*M_PI/170) +self.waveHeight;
? ? CGPathAddLineToPoint(pathT,nil, x, yT-10);
}
CGPathAddLineToPoint(pathT, nil, self.waveWidth, self.backView.frame.size.height);
CGPathAddLineToPoint(pathT, nil, 0, self.backView.frame.size.height);
CGPathCloseSubpath(pathT);
self.waterLayer2.path= pathT;
CGPathRelease(pathT);
}
三、脈沖效果動(dòng)畫
@property (weak, nonatomic) IBOutlet UIView *pulseView;
@property(nonatomic,strong) CAShapeLayer * pulseLayer;
-(void)pulseAnimation {
CGFloat width = self.pulseView.bounds.size.width;
self.pulseLayer = [CAShapeLayer layer];
self.pulseLayer.bounds=CGRectMake(0,0, width, width);
self.pulseLayer.position=CGPointMake(width/2, width/2);
self.pulseLayer.backgroundColor = [UIColor clearColor].CGColor;
self.pulseLayer.path = [UIBezierPath bezierPathWithOvalInRect:self.pulseLayer.bounds].CGPath;
self.pulseLayer.fillColor = [UIColor colorWithRed: 0.3490196078 green:0.737254902 blue:0.8039215686 alpha:1].CGColor;
self.pulseLayer.opacity = 0.0;
CAReplicatorLayer * replicatorLayer = [CAReplicatorLayer layer];
replicatorLayer.bounds=CGRectMake(0,0, width, width);
replicatorLayer.position=CGPointMake(width/2, width/2);
replicatorLayer.instanceCount=4;// 復(fù)制層
replicatorLayer.instanceDelay=1;/// 頻率
[replicatorLayeraddSublayer:self.pulseLayer];
[self.pulseView.layeraddSublayer:replicatorLayer];
[self.pulseView.layerinsertSublayer:replicatorLayeratIndex:0];
}
-(void)startPulseAnimation {
CABasicAnimation * opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.fromValue=@20;// 起始值 (strong 修飾的id值)
opacityAnimation.toValue=@30;// 結(jié)束值(strong 修飾的id值)
CABasicAnimation * scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DIdentity, 0.0, 0.0, 0.0)];
scaleAnimation.toValue =[NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DIdentity, 1.0, 1.0, 1.0)];
CAAnimationGroup * groupAnimation = [CAAnimationGroup animation];
groupAnimation.animations=@[opacityAnimation, scaleAnimation];
groupAnimation.duration=20;
groupAnimation.autoreverses=NO;
groupAnimation.repeatCount=HUGE;
[self.pulseLayeraddAnimation:groupAnimationforKey:nil];
}
在此附上效果:
聽說(shuō)有好得三方庫(kù),我還沒有去找過(guò),歡迎各位大佬推薦一個(gè)優(yōu)質(zhì)的三方。。。。。
喜歡的朋友點(diǎn)個(gè)贊唄!
對(duì)CoreGraphics,QuartzCore, CoreAnimation 這三個(gè)概念傻傻分不清,先梳理一下
它是iOS的核心圖形庫(kù),包含Quartz2D繪圖API接口,常用的是point,size,rect等這些圖形,都定義在這個(gè)框架中,類名以CG開頭的都屬于CoreGraphics框架,它提供的都是C語(yǔ)言函數(shù)接口,是可以在iOS和mac OS 通用的
Quartz是位于Mac OS X的Drawin核心之上的繪圖層,這個(gè)框架感覺不是很清晰,但是看頭文件可以發(fā)現(xiàn),它就是CoreAnimation,這個(gè)框架頭文件只包含了CoreAnimation.h
框架關(guān)系
圖層的 frame、bounds、position 和 anchorPoint 關(guān)系如下圖所示
anchorPoint 默認(rèn)值為(0.5,0.5),位于圖層的中心點(diǎn)。圖層的 position 值為(100.0,100.0),bounds 為(0.0,0.0,120,80.0)。通過(guò)計(jì)算得到圖層的 frame為(40.0,60.0,120.0,80.0)
iOS開發(fā)中,UIKit為我們封裝好的核心動(dòng)畫層的方法,通過(guò)這些方法,基本能達(dá)到我們項(xiàng)目的大多需求,其中UIView動(dòng)畫使用簡(jiǎn)便,開發(fā)中應(yīng)用十分廣泛
例如:
[UIView animateWithDuration:1 animations:^{
_myView.alpha=0;
} completion:^(BOOL finished) {
if (finished) {
_myView.alpha=1;
}
}];
```
支持動(dòng)畫的屬性
如果你想更加自由的通過(guò)動(dòng)畫操作視圖的屬性,你就需要跳過(guò)UIKit的封裝,使用CoreAnimation核心動(dòng)畫層的方法來(lái)實(shí)現(xiàn)動(dòng)畫,CoreAnimation能夠?qū)崿F(xiàn)更多復(fù)雜、好看、高效的動(dòng)畫效果
CAAnimation是CoreAnimation框架中執(zhí)行動(dòng)畫的基類,是個(gè)抽象類,不具備動(dòng)畫效果,必須用它的子類才有動(dòng)畫效果,是所有動(dòng)畫對(duì)象的父類,負(fù)責(zé)控制動(dòng)畫的持續(xù)時(shí)間和速度
CAAnimation相關(guān)的幾個(gè)動(dòng)畫類的關(guān)系圖
是CAAnimation的子類,也是個(gè)抽象類,要想創(chuàng)建動(dòng)畫對(duì)象,應(yīng)該使用它的兩個(gè)子類:CABasicAnimation和CAKeyframeAnimation
通過(guò)指定CALayer的一個(gè)屬性名稱為keyPath(NSString類型),并且對(duì)CALayer的這個(gè)屬性的值進(jìn)行修改,達(dá)到相應(yīng)的動(dòng)畫效果
基本動(dòng)畫,通過(guò)設(shè)定起始點(diǎn),終點(diǎn),時(shí)間,動(dòng)畫會(huì)沿著你這設(shè)定點(diǎn)進(jìn)行移動(dòng),
隨著動(dòng)畫的進(jìn)行,在長(zhǎng)度為duration的持續(xù)時(shí)間內(nèi),keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)閠oValue。
主要操作屬性有keyPath和values值組合,以通過(guò)設(shè)定CALayer的始點(diǎn)、中間關(guān)鍵點(diǎn)、終點(diǎn)的frame,時(shí)間,動(dòng)畫會(huì)沿你設(shè)定的軌跡進(jìn)行移動(dòng)
與CABasicAnimation的區(qū)別是:
可以保存一組動(dòng)畫對(duì)象,將CAAnimationGroup對(duì)象加入層后,組中所有動(dòng)畫對(duì)象可以同時(shí)并發(fā)運(yùn)行
用于做轉(zhuǎn)場(chǎng)動(dòng)畫,能夠?yàn)閷犹峁┮瞥銎聊缓鸵迫肫聊坏膭?dòng)畫效果。iOS比Mac OS X的轉(zhuǎn)場(chǎng)動(dòng)畫效果少一點(diǎn)。
UINavigationController就是通過(guò)CATransition實(shí)現(xiàn)了將控制器的視圖推入屏幕的動(dòng)畫效果。
CATransaction 是核心動(dòng)畫里負(fù)責(zé)協(xié)調(diào)多個(gè)動(dòng)畫更新顯示操作,保證多個(gè)動(dòng)畫同時(shí)進(jìn)行,用于配置隱式動(dòng)畫,即CALayer屬性修改依賴CATransaction.
另外事務(wù)可以嵌套,當(dāng)事務(wù)嵌套時(shí)候,只有最外層的事務(wù)commit了之后,整個(gè)動(dòng)畫才會(huì)執(zhí)行。
幾種常用Layer的使用解析
貝塞爾曲線原理(簡(jiǎn)單闡述)
在iOS中常見的特性中有有陰影,下面我將詳細(xì)闡述一下關(guān)于視圖陰影的故事
iOS中陰影的屬性是 shadowOpacity 它的默認(rèn)值是0,只要設(shè)置一個(gè)大于0的值就會(huì)在視圖的上面出現(xiàn)陰影的效果,但它的浮點(diǎn)值在0~1之間.
但你會(huì)發(fā)現(xiàn)其陰影的特點(diǎn)是上面陰影效果最明顯,左右也有陰影效果,但是在下面是沒有的陰影的,因?yàn)橄到y(tǒng)在設(shè)置陰影效果時(shí)設(shè)置了默認(rèn)的陰影偏移量,你可以通過(guò)另一個(gè)屬性 shadowOffset 來(lái)改變陰影的偏移效果,它的類型值是CGSize類型(當(dāng) shadowOffset 的值設(shè)為 CGSizeMake(0, 0) 時(shí),四周就都會(huì)出現(xiàn)陰影)
改變陰影效果的屬性還有一個(gè)是 shadowRadius , 它的效果是陰影的半徑,其值越大,陰影效果就越明顯.
但是當(dāng)我們?cè)诮o imageView 添加陰影效果時(shí)也會(huì)有效果,但是在當(dāng)我們?cè)谠O(shè)置視圖的圓角時(shí),我們會(huì)發(fā)現(xiàn)陰影效果就消失了,這很讓人頭疼,下面我將提供一個(gè)解決辦法,其實(shí)很簡(jiǎn)單,只要在 ImageView 下面鋪一個(gè) view 就可以解決問題了,但要注意的是下面的 view 不要給顏色,要一個(gè)透明view,同時(shí)設(shè)置陰影效果,并且不設(shè)置圓角, ImageView 不用設(shè)置陰影,但要設(shè)置圓角,這樣就可以解決問題了.
文章題目:ios開發(fā)核心動(dòng)畫,ios app動(dòng)畫
瀏覽地址:http://chinadenli.net/article42/dsiojhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、域名注冊(cè)、標(biāo)簽優(yōu)化、營(yíng)銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)