Objective-C剪返,從0開始寫一個自定義加載動畫

今天在精選 20 個優(yōu)質的加載動畫中發(fā)現(xiàn)了一個蠻有意思的加載動畫:

效果圖

正好最近原來的加載動畫用的膩了??
所以決定用OC實現(xiàn)一下這個動畫來用看看辛辨。
那么我們開始

首先十饥,分析一下這個動畫:

1.元素分析

從gif上看丧蘸,主體由一個盒子(三角形的洞)和一些飄落的元素組成(下方的字表示??)漂洋。

2.動畫分析

我們看到飄落的字從紅框的位置隨機出現(xiàn),然后落向黃線的隨機位置消失力喷,同時透明度也從0開始變成1刽漂。

分析圖

動畫過程中,伴隨著不同的角速度進行旋轉弟孟,下落的速度也各不相同贝咙。
因此我們需要準備以下幾個方法來實現(xiàn)動畫效果:
1.產生隨機的起點坐標
2.產生隨機的終點坐標
3.產生隨機的速度、角速度
4.實現(xiàn)位移拂募、旋轉庭猩、透明度改變的動畫
從上面的分析來看窟她,要實現(xiàn)這個效果并不是很困難??。
So,Les's do it.

3.需要用到的知識儲備

Core Animation
然后...嗯...貌似就夠了...

4.代碼實現(xiàn)

1.隨機產生起點和終點坐標

//獲取起點坐標
- (CGPoint)randomBeginPoint{
    return [self getRandomFrameInRect:CGRectMake(0, 0, self.frame.size.width, 10)];
}

//獲取終點坐標
- (CGPoint)randomEndPoint{
    return [self getRandomFrameInRect:CGRectMake(0, self.frame.size.height - 20, self.frame.size.width, 10)];
}

//方形區(qū)域內產生隨機點
- (CGPoint)getRandomFrameInRect:(CGRect)rect{
    CGFloat minX = rect.origin.x;
    CGFloat width = rect.size.width;
    CGFloat minY = rect.origin.y;
    CGFloat height = rect.size.height;
    //產生隨機數
    CGFloat randomX = minX + (float)(arc4random() % (int)width);
    CGFloat randomY = minY + (float)(arc4random() % (int)height);
    return CGPointMake(randomX, randomY);
}

2.產生隨機的角速度與下落速度
下落速度:通過下落到終點所需時間(即動畫時間)設定
角速度:下落到終點時旋轉的角度 和 動畫時間 共同決定旋轉的角速度

//獲取隨機的動畫時間
- (CGFloat)getRandomDuration{
    //產生隨機數(這里我們定義的動畫時間為0.5s~1.0s)
    int time = arc4random()%50 + 50;
    CGFloat duration = time/100;
    return duration;
}

//獲取隨機的角度
- (CGFloat)getRandomRotation{
    //產生隨機數(這里我們定義的旋轉角度范圍為 -180度~180度)
    int angle = arc4random()%360 - 180;
    CGFloat rotation = angle*180/M_PI;
    return rotation;
}

3.產生動畫的方法

- (void)addAnimationToLayer:(CALayer*)layer{
    //獲取隨機參數
    CGFloat duration = [self getRandomDuration];
    CGFloat rotation = [self getRandomRotation];
    CGPoint beginPoint = [self getRandomBeginPoint];
    CGPoint endPoint = [self getRandomEndPoint];
    
    //平移
    CABasicAnimation *positionAnim = [CABasicAnimation animationWithKeyPath:@"position"];
    positionAnim.duration = duration;
    positionAnim.fromValue = [NSValue valueWithCGPoint:beginPoint];
    positionAnim.toValue = [NSValue valueWithCGPoint:endPoint];
    positionAnim.fillMode = kCAFillModeForwards;
    
    //旋轉
    CABasicAnimation *transformAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
    transformAnim.duration = duration;
    // 繞著(0, 0, 1)這個向量軸順時針旋轉rotation
    transformAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(rotation, 0, 0, 1)];
    
    //透明度
    CABasicAnimation *opacityAnimation =[CABasicAnimation animationWithKeyPath:@"opacity"];
    opacityAnimation.fromValue = @0.f;
    opacityAnimation.toValue = @1.f;
    opacityAnimation.duration = duration;
    opacityAnimation.fillMode = kCAFillModeForwards;
    
    [layer addAnimation:positionAnim forKey:@"lposition"];
    [layer addAnimation:transformAnim forKey:@"ltransform"];
    [layer addAnimation:opacityAnimation forKey:@"lopacity"];
    layer.opacity = 0;

    //循環(huán)動畫
    if (animation) {
        [self performSelector:@selector(addAnimationToLayer:) withObject:layer afterDelay:duration];
    }
}

4.測試一下動畫的效果

UILabel *label = [[UILabel alloc]init];
label.text = @"0";
label.font = [UIFont systemFontOfSize:20];
label.textColor = [UIColor whiteColor];
[label sizeToFit];
[self addSubview:label];
[self addAnimationToLayer:label.layer];

5.循環(huán)動畫
增加一個屬性animation來判斷是否循環(huán)執(zhí)行動畫(這樣如果要停止循環(huán)只要把它設置為NO就好了)眯娱,然后在addAnimationToLayer:添加循環(huán)調用的方法:

//循環(huán)動畫
    if (_animation) {
        [self performSelector:@selector(addAnimationToLayer:) withObject:layer afterDelay:duration];
    }

6.添加細節(jié)
經過上面的過程礁苗,動畫的效果已經解決了。
接下來就是產生4個元素徙缴,再加上下面終點的圖片试伙,基本上就可以達到想要的效果了。
上圖:


效果圖

好了 今天先實現(xiàn)到這里于样,后續(xù)有空到話再繼續(xù)優(yōu)化疏叨,代碼已經上傳到GZCLoding,如果有什么建議穿剖,歡迎留言告訴我哦蚤蔓。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市糊余,隨后出現(xiàn)的幾起案子秀又,更是在濱河造成了極大的恐慌,老刑警劉巖贬芥,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吐辙,死亡現(xiàn)場離奇詭異,居然都是意外死亡蘸劈,警方通過查閱死者的電腦和手機昏苏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來威沫,“玉大人贤惯,你說我怎么就攤上這事“袈樱” “怎么了孵构?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長句柠。 經常有香客問我浦译,道長,這世上最難降的妖魔是什么溯职? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任精盅,我火速辦了婚禮,結果婚禮上谜酒,老公的妹妹穿的比我還像新娘叹俏。我一直安慰自己,他們只是感情好僻族,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布粘驰。 她就那樣靜靜地躺著屡谐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝌数。 梳的紋絲不亂的頭發(fā)上愕掏,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音顶伞,去河邊找鬼饵撑。 笑死,一個胖子當著我的面吹牛唆貌,可吹牛的內容都是我干的滑潘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锨咙,長吁一口氣:“原來是場噩夢啊……” “哼语卤!你這毒婦竟也來了?” 一聲冷哼從身側響起酪刀,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粹舵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骂倘,有當地人在樹林里發(fā)現(xiàn)了一具尸體齐婴,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年稠茂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片情妖。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡睬关,死狀恐怖,靈堂內的尸體忽然破棺而出毡证,到底是詐尸還是另有隱情电爹,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布料睛,位于F島的核電站丐箩,受9級特大地震影響,放射性物質發(fā)生泄漏恤煞。R本人自食惡果不足惜屎勘,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望居扒。 院中可真熱鬧概漱,春花似錦、人聲如沸喜喂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至照弥,卻和暖如春腻异,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背这揣。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工悔常, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曾沈。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓这嚣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塞俱。 傳聞我的和親對象是個殘疾皇子姐帚,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜障涯,今天將帶大家一窺iOS動畫全貌罐旗。在這里你可以看...
    F麥子閱讀 5,111評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜唯蝶,今天將帶大家一窺ios動畫全貌九秀。在這里你可以看...
    每天刷兩次牙閱讀 8,490評論 6 30
  • 概覽 在iOS中隨處都可以看到絢麗的動畫效果鼓蜒,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌征字。在這里你...
    被吹落的風閱讀 1,563評論 1 2
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫都弹、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62