iOS CADisplayLink实现雪花飘落的效果

屏幕快照 2016-12-27 下午1.33.12.png
#import 

@interface CADisplayView : UIView
@property (nonatomic, strong) UIImageView *bgImageViiew;
@property (nonatomic, copy) NSString *snowImgName;
+(instancetype)snowFladeFallingViewWithBackGroundImgName:(NSString *)bgImageName snowImageName:(NSString *)snowImageName initWithFrame:(CGRect)frame;
- (void)beginSnow;

@end
#import "CADisplayView.h"
#import "HJCornerRadius.h"
@implementation CADisplayView

+(instancetype)snowFladeFallingViewWithBackGroundImgName:(NSString *)bgImageName snowImageName:(NSString *)snowImageName initWithFrame:(CGRect)frame {
    CADisplayView *view = [[CADisplayView alloc]initWithFrame:frame];
    view.bgImageViiew.image = [UIImage imageNamed:bgImageName];
    view.snowImgName = snowImageName;
    return view;
}
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.clipsToBounds = YES;
        self.bgImageViiew = [[UIImageView alloc] init];
        self.bgImageViiew.frame = self.bounds;
        self.bgImageViiew.contentMode = UIViewContentModeScaleAspectFill;
        [self addSubview:self.bgImageViiew];
    }
    return self;
}
- (void)beginSnow {
    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)drawRect:(CGRect)rect {
    if (self.subviews.count>250) {
        return;
    }
    //雪花的宽度
    int width = 8;
    //雪花的速度
    int speed = arc4random()%15;
    while (speed<5) {
        speed = arc4random()%15;
    }
    int startY = - (arc4random() % 100);
    //雪花起点x
    int startX = arc4random() % (int) [UIScreen mainScreen].bounds.size.width;
    //雪花终点x
    int endX = arc4random() % (int) [UIScreen mainScreen].bounds.size.width;
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:self.snowImgName]];
    imageView.frame = CGRectMake(startX, startY, width, width);
    imageView.aliCornerRadius = width/2;
    [self addSubview:imageView];
    [UIView animateWithDuration:speed animations:^{
        //设置雪花最终的frame
        imageView.frame = CGRectMake(endX, [UIScreen mainScreen].bounds.size.height, width, width);
        //设置雪花的旋转
        imageView.transform = CGAffineTransformRotate(imageView.transform, M_PI);
        imageView.alpha = 0.3;
    } completion:^(BOOL finished) {
        [imageView removeFromSuperview];
    }];
}

@end

#import "CADisplayViewController.h"
#import "CADisplayView.h"

@interface CADisplayViewController ()

@end

@implementation CADisplayViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading theview.
    self.view.backgroundColor = [UIColor whiteColor];
    CADisplayView *snow = [CADisplayView snowFladeFallingViewWithBackGroundImgName:@"smilegirl" snowImageName:@"ll" initWithFrame:self.view.bounds];
    [snow beginSnow];
    [self.view addSubview:snow];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

你可能感兴趣的:(iOS CADisplayLink实现雪花飘落的效果)