iOS實(shí)現(xiàn)大雪紛飛動(dòng)畫(huà)
本文實(shí)例為大家分享了iOS實(shí)現(xiàn)大雪紛飛動(dòng)畫(huà)的具體代碼,供大家參考,具體內(nèi)容如下
1.結(jié)果展示
美麗的雪花,勾起了多少美好的回憶。

2.制作思路
其實(shí)創(chuàng)作這樣一個(gè)大學(xué)紛飛的場(chǎng)景是十分簡(jiǎn)單的,簡(jiǎn)單到你看了教程之后想不會(huì)都不行。OK,下面國(guó)際慣例,講解一下思路吧。
1.創(chuàng)建一個(gè)數(shù)組用來(lái)保存大量的雪花
_imagesArray = [[NSMutableArray alloc] init];
for (int i = 0; i < 1000; ++ i) {
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"snow"]];
float x = IMAGE_WIDTH;
imageView.frame = CGRectMake(IMAGE_X, -30, x, x);
imageView.alpha = IMAGE_ALPHA;
[self.view addSubview:imageView];
[_imagesArray addObject:imageView];
}
2.使用時(shí)鐘(CADisplayLink)來(lái)控制下雪,為什么不使用NSTimer呢。其實(shí)是可以的,只是(CADisplayLink)刷幀更快一些。
//創(chuàng)建時(shí)鐘,并且添加到主循環(huán)中 CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(makeSnow)]; [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
3.下雪,就是把數(shù)組當(dāng)做隊(duì)列來(lái)使用。
每次從數(shù)組頭部取出一個(gè)雪花并且刪除其在數(shù)組中的占位。
讓雪花飄落,通過(guò)UIView動(dòng)畫(huà)完成frame,transform等改變。
當(dāng)動(dòng)畫(huà)完成之后,將取出的雪花再次放進(jìn)數(shù)組的尾部
- (void)makeSnow
{
if (_imagesArray.count > 0) {
UIImageView *imageView = _imagesArray[0];
[_imagesArray removeObjectAtIndex:0];
[self snowFall:imageView];
}
}
- (void)snowFall:(UIImageView *)imageView
{
[UIView animateWithDuration:10 animations:^{
imageView.frame = CGRectMake(imageView.frame.origin.x, Main_Screen_Height, imageView.frame.size.width, imageView.frame.size.height);
imageView.transform = CGAffineTransformMakeScale(0.3, 0.3);
imageView.transform = CGAffineTransformRotate(imageView.transform, M_PI);
} completion:^(BOOL finished) {
float x = IMAGE_WIDTH;
imageView.frame = CGRectMake(IMAGE_X, -30, x, x);
[_imagesArray addObject:imageView];
}];
}
3.有代碼有真相
#define IMAGE_X arc4random()%(int)Main_Screen_Width
#define IMAGE_ALPHA ((float)(arc4random()%10))/10
#define IMAGE_WIDTH arc4random()%20 + 10
#define PLUS_HEIGHT Main_Screen_Height/25
#define Main_Screen_Height [[UIScreen mainScreen] bounds].size.height
#define Main_Screen_Width [[UIScreen mainScreen] bounds].size.width
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic ,strong) NSMutableArray *imagesArray;
@property (nonatomic , strong) UIImageView *imageView;
@end
@implementation ViewController
- (void)loadView
{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];
imageView.image = [UIImage imageNamed:@"backgound.jpg"];
imageView.contentMode = UIViewContentModeScaleAspectFill;
self.view = imageView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_imagesArray = [[NSMutableArray alloc] init];
for (int i = 0; i < 1000; ++ i) {
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"snow"]];
float x = IMAGE_WIDTH;
imageView.frame = CGRectMake(IMAGE_X, -30, x, x);
imageView.alpha = IMAGE_ALPHA;
[self.view addSubview:imageView];
[_imagesArray addObject:imageView];
}
//創(chuàng)建時(shí)鐘,并且添加到主循環(huán)中
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(makeSnow)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)makeSnow
{
if (_imagesArray.count > 0) {
UIImageView *imageView = _imagesArray[0];
[_imagesArray removeObjectAtIndex:0];
[self snowFall:imageView];
}
}
- (void)snowFall:(UIImageView *)imageView
{
[UIView animateWithDuration:10 animations:^{
imageView.frame = CGRectMake(imageView.frame.origin.x, Main_Screen_Height, imageView.frame.size.width, imageView.frame.size.height);
imageView.transform = CGAffineTransformMakeScale(0.3, 0.3);
imageView.transform = CGAffineTransformRotate(imageView.transform, M_PI);
} completion:^(BOOL finished) {
float x = IMAGE_WIDTH;
imageView.frame = CGRectMake(IMAGE_X, -30, x, x);
[_imagesArray addObject:imageView];
}];
}
4.Demo也不能少
下載地址:snow
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
99%?iOS開(kāi)發(fā)都不知道的KVO崩潰分析詳解
這篇文章主要為大家介紹了99%?iOS開(kāi)發(fā)都不知道的KVO崩潰分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
詳解iOS App開(kāi)發(fā)中改變UIButton內(nèi)部控件的基本方法
這篇文章主要介紹了iOS App開(kāi)發(fā)中改變UIButton內(nèi)部控件的基本方法,文章開(kāi)頭也順帶總結(jié)了一些UIButton的基本用法,示例代碼為Objective-C,需要的朋友可以參考下2016-03-03
iOS實(shí)現(xiàn)頂部標(biāo)簽式導(dǎo)航欄及下拉分類菜單
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)頂部標(biāo)簽式導(dǎo)航欄及下拉分類菜單的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
iOS仿微信搖一搖動(dòng)畫(huà)效果加震動(dòng)音效實(shí)例
這篇文章主要介紹了iOS仿微信搖一搖動(dòng)畫(huà)效果加震動(dòng)音效實(shí)例,詳細(xì)介紹了微信搖一搖功能的實(shí)現(xiàn)原理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03
Swift 進(jìn)階 —— map 和 flatMap的使用
這篇文章主要介紹了Swift map和flatMap的相關(guān)資料,幫助大家更好的理解和使用Swift,感興趣的朋友可以了解下2020-09-09
IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法
這篇文章主要介紹了IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法的相關(guān)資料,這里主要介紹了IOS 10如何通過(guò)設(shè)置來(lái)實(shí)現(xiàn)禁止縮放及實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07

