• 雪花效果

    IOS 播放雪花的两种方式(代码方式)

    代码:


    ====================> .h 文件

    //

    //  WWCShowSnowViewController.h

    //  TestCAOrUIViewAnimationApp7-30

    //

    //  Created by Whitney.c on 15/7/30.

    //  Copyright (c) 2015 ZhongShan Sun union Medical Technology Co. Ltd. All rights reserved.

    //


    #import <UIKit/UIKit.h>


    @interface WWCShowSnowViewController : UIViewController

    {

        

        UIImage *imageSnow; // 雪花图片

        

        NSMutableArray *arrayImages; // 装载雪花的集合

        

        NSTimer *timer; // timer 控制反复播放及播放速度

        

    }

    @end



    ====================> .m 文件


    //

    //  WWCShowSnowViewController.m

    //  TestCAOrUIViewAnimationApp7-30

    //

    //  Created by Whitney.c on 15/7/30.

    //  Copyright (c) 2015 ZhongShan Sun union Medical Technology Co. Ltd. All rights reserved.

    //


    #import "WWCShowSnowViewController.h"


    @interface WWCShowSnowViewController ()


    @end


    @implementation WWCShowSnowViewController



    static int index_tag = 0;


    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        self.view.backgroundColor = [UIColor blackColor];

        // 思路

        // 1.准备雪花图片

        // 2.准备装载雪花的集合

        // 3.集合中装载UIImageView(雪花),设置好透明度,X(随机)Y固定在屏幕上放即可,W/H 随机生成

        // 4.结束动画,加入一个新的雪花(只改变X-》防止动画看起来重复

        

        // 分别加入了2种方式, 代码粗糙,希望能有帮助

        

        [self loadSelfLayoutSubViews];

        

        

        

    }


    -(void)loadSelfLayoutSubViews

    {

        

        

        imageSnow = [UIImage imageNamed:@"snow"];

        

        arrayImages = [[NSMutableArray alloc] initWithCapacity:10];

        

        float screenWidth = [[UIScreen mainScreen] bounds].size.width;

        

        for (int i = 0; i < 20; i++) {

            // 随机生成的x

            

            float x = arc4random()%(int)screenWidth;

            float w = (arc4random()%20)+ 10 ;

            float y = -30;

            NSLog(@"x:%f,y:%f,w:%f",x,y,w);

            UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(x, y, w, w)];

            iv.image = imageSnow;

            iv.alpha = ((float)(arc4random()%10))/10;

            iv.tag = i ;

            iv.backgroundColor = [UIColor clearColor];

            [self.view addSubview:iv];

            

            [arrayImages addObject:iv];

            

        }

        

        // 设定timer 轮播动画

        

        timer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(startBeginAnimation:) userInfo:nil repeats:YES];

    }



    #pragma mark - 动画开始前的准备

    -(void)startBeginAnimation:(id)sender

    {

        

        NSLog(@" start begin Animation .....");

        

        index_tag = index_tag + 1;

        

        if ( arrayImages && arrayImages.count >0) {

            UIImageView *imgv = [arrayImages objectAtIndex:0];

            imgv.tag = index_tag ;

            [arrayImages removeObjectAtIndex:0];

            

            // 开始动画

            [self animationStart1:imgv];

        }

        

    }



    #pragma mark - 开始动画1

    -(void)animationStart1:(UIImageView*)imgv

    {

        

        [UIView animateWithDuration:6 animations:^{

            

            CGRect frame = imgv.frame;

            frame.origin.y = [[UIScreen mainScreen] bounds].size.height;

            imgv.frame = frame;

            

        }completion:^(BOOL finished){

            

            CGRect frame = imgv.frame;

            frame.origin.x = arc4random()%(int)([[UIScreen mainScreen] bounds].size.width);

            frame.origin.y = -30;

            imgv.frame = frame;

            

            [arrayImages addObject:imgv];

        }];

    }



    #pragma mark - 开始动画2

    -(void)animationStart2:(UIImageView*)imgv

    {

        [UIView beginAnimations:[NSString stringWithFormat:@"%d",imgv.tag] context:nil];

        [UIView setAnimationDuration:6]; // 动画时间

        [UIView setAnimationDelegate:self]; // 动画代理

        // 要调整的Frame(原始的Frame到次Frame的过度动画)

        CGRect frame  = imgv.frame;

        imgv.frame = CGRectMake(frame.origin.x, [[UIScreen mainScreen] bounds].size.height, frame.size.width, frame.size.height);

        [UIView commitAnimations];// 提交动画

        

    }


    #pragma mark - 动画2代理实现-> 当动画停止时


    - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)contex

    {

        NSLog(@"did stop 2");

        UIImageView *imageView = (UIImageView *)[self.view viewWithTag:[animationID integerValue]];

        

        float x = arc4random()%(int)([[UIScreen mainScreen] bounds].size.width);

        float w = (arc4random()%20)+ 10 ;

        float y = -30;

        

        imageView.frame = CGRectMake(x, y, w, w);

        [arrayImages addObject:imageView];

    }


    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }


    /*

    #pragma mark - Navigation


    // In a storyboard-based application, you will often want to do a little preparation before navigation

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        // Get the new view controller using [segue destinationViewController].

        // Pass the selected object to the new view controller.

    }

    */


    @end



    // 附图




    展开全文
  • 一.ios中下载进度条功能实现(重绘) 功能图: 原理:通过监听滑块的滑动,重绘出下载进度,并且在label中显示百分比 1> 监听进度条的改变值 代码: 2> 由于显示的部分是一个自定义的UIView,在...

    一.ios中下载进度条功能实现(重绘)

    功能图:

    原理:通过监听滑块的滑动,重绘出下载进度,并且在label中显示百分比

    1> 监听进度条的改变值

    代码:

    2> 由于显示的部分是一个自定义的UIView,在view的内部设置了一个UILabel,通过拖线我们可以拿到这两个控件

    代码块:

    3> 但是由于我们是自定义的view,那么控制器是如何通过滑动滑块,达到显示的效果呢?这里我们需要在自定义的view中设置一个属性,通过1中写的set方法来简历练习

    代码块三:重写set方法和重绘设置

    4> 能随着滑块滑动而显示的进度圆是通过下面这段代码实现的

    代码块四:

    5>这样我们就可以模拟下载的进度条了

    二.雪花下落的效果图

    功能图:

    知识点:重绘;主运行循环开启;控制雪花反复的下落

    1> 自定义一个UIView,然后当storyboard加完就调用

    代码块:

    2> 控制雪花一直下落

    代码块:

    3> 重绘调用的方法

    代码块:

    三.注意点:自定义后千万要绑定自己自定义的类型,要不然是加载不出来的.


    展开全文
  • 方法一:利用NSMutableArray来实现 NSMutable *array;全局变量,在.m文件中用定时器调用 -(void)down{ static int jianGe = 0; jianGe++; if (jianGe > 2) { jianGe = 0;... [self snowState];...

    方法一:利用NSMutableArray来实现

    NSMutable *array;全局变量,在.m文件中用定时器调用

    -(void)down{
        static int jianGe = 0;
        jianGe++;
        if (jianGe > 2) {
            jianGe = 0;
            [self snowState];
        }
        [self snowDown];
    }
    
    -(void)snowState{
        for (int i  = 0; i < [array count]; i++) {
            MyImageView *img = [array objectAtIndex:i];
            if (img.tag == 0) {
                img.tag = 1;
                [self.view addSubview:img];
                break;//提取雪花单片
            }
            
        }
    }
    
    -(void)snowDown{
        for (int i = 0; i < [array count]; i++) {
            MyImageView *img = [array objectAtIndex:i];
            if (img.tag == 1) {
                img.center = CGPointMake(img.center.x, img.center.y+10);
                if (img.center.y > 480+25) {
                    img.tag = 0;
                    img.center = CGPointMake(arc4random()%370 - 50, -50);
                }
            }
        }
    }


    方法二:利用帧动画

    用定时器调用

    //ViewController.m
    -(void)snowDown{//动画效果
        UIImageView *iv = [[UIImageView alloc]init];
        int a = arc4random()%51;//雪花大小随机(0~50)
        iv.frame = CGRectMake(arc4random()%370 - 50, -50, a, a);
        iv.image = [UIImage imageNamed:@"flake"];
        [self.view addSubview:iv];
        
        [UIView beginAnimations:nil context:(__bridge void *)(iv)];
        [UIView setAnimationDuration:5];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        iv.frame = CGRectMake(arc4random()%370 - 50, 440, a, a);
        [UIView commitAnimations];
    }
    
    -(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context//到底部消除
    {
        UIImageView *image = (__bridge UIImageView *)context;
        [image removeFromSuperview];
    }
    

    帧动画比用NSMutableArray要简洁,易懂

    0522补充:

    用数组来实现雪花降落效果时,弊端很多:1、说到底只能要么单片降落,要不就是数组所以元素全部下落;2、要控制下落速度(y坐标增加量),下落速度要控制的很恰当:如果下落速度过快,则数组中会有冗余的元素;如果下落速度过慢,则有一段y轴看不到雪花。(该种编写代码偏向C)

    相比来说,帧动画自动回收,多片降落都能实现,是很理想的用法。(该种方法偏向OC)

    展开全文
  • iOS 雪花动画与跑马灯

    2016-08-03 22:57:49
    上一篇 - iOS 仿YY直播心形动画 & 烟花动画跑马灯效果演示这里贴出使用代码, 详细请下载Demo查看 下载即用~ 快餐 - -Star鼓励 下载后, 在VC中这样使用, 当然Demo中也有体现- (void)viewDidLoad { [super

    这篇是接着上一篇, 关于动画效果的收集篇, 这篇介绍了跑马灯动画以及下落雪花动画, 请看, 话说最近怎么不在状态呢, 好伤感(囧~).
    上一篇 - iOS 仿YY直播心形动画 & 烟花动画

    跑马灯效果演示

    这里贴出使用代码, 详细请下载Demo查看
    下载即用~ 快餐 - -Star鼓励

    演示
    下载后, 在VC中这样使用, 当然Demo中也有体现

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor blackColor];
    
    XTScrollLabelView *drawMarqueeView  = [[XTScrollLabelView alloc] initWithFrame:CGRectMake(0, 0, 250.f, 20)];
    drawMarqueeView.delegate          = self;
    drawMarqueeView.marqueeDirection  = FromLeftType;
    drawMarqueeView.center            = self.view.center;
    [self.view addSubview:drawMarqueeView];
    [drawMarqueeView addContentView:[self createLabelWithText:@"夏天是个很好的季节, 而夏天然后是简书的推荐作者, 喜欢分享!"
    textColor:[self randomColor]]];
    [drawMarqueeView startAnimation];
    
    }
    
    - (UILabel *)createLabelWithText:(NSString *)text textColor:(UIColor *)textColor {
    
    NSString *string = [NSString stringWithFormat:@" %@ ", text];
    CGFloat width = [string widthWithStringAttribute:@{NSFontAttributeName : [UIFont systemFontOfSize:14.f]}];
    UILabel  *label  = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 20)];
    label.font       = [UIFont systemFontOfSize:14.f];
    label.text       = string;
    label.textColor  = textColor;
    
    return label;
    }
    - (UIColor *)randomColor {
    
    return [UIColor colorWithRed:[self randomValue] green:[self randomValue] blue:[self randomValue] alpha:1];
    }
    - (CGFloat)randomValue {
    
    return arc4random() % 256 / 255.f;
    }
    - (void)drawMarqueeView:(XTScrollLabelView *)drawMarqueeView animationDidStopFinished:(BOOL)finished
    {
    [drawMarqueeView stopAnimation];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [drawMarqueeView addContentView:[self createLabelWithText:[self randomString]
    textColor:[self randomColor]]];
    [drawMarqueeView startAnimation];
    });
    }
    - (NSString *)randomString {
    
    NSArray *array = @[@"人帅",
    @"勤劳",
    @"年轻",
    @"刻苦",
    @"开玩笑",
    @"都是我编的, 前面的别跑"];
    return array[arc4random() % array.count];
    }
    
    ![演示](http://upload-images.jianshu.io/upload_images/1506501-60f6dae4324b1ba1.gif?imageMogr2/auto-orient/strip)

    雪花动画代码演示

    – 在ViewDidLoad中这样写, 注释已经很详细

    // 创建粒子Layer
    CAEmitterLayer *snowEmitter = [CAEmitterLayer layer];
    
    // 粒子发射位置
    snowEmitter.emitterPosition = CGPointMake(120,0);
    
    // 发射源的尺寸大小
    snowEmitter.emitterSize     = self.view.bounds.size;
    
    // 发射模式
    snowEmitter.emitterMode     = kCAEmitterLayerSurface;
    
    // 发射源的形状
    snowEmitter.emitterShape    = kCAEmitterLayerLine;
    
    // 创建雪花类型的粒子
    CAEmitterCell *snowflake    = [CAEmitterCell emitterCell];
    
    // 粒子的名字
    snowflake.name = @"snow";
    
    // 粒子参数的速度乘数因子
    snowflake.birthRate = 20.0;
    snowflake.lifetime  = 120.0;
    
    // 粒子速度
    snowflake.velocity  = 10.0;
    
    // 粒子的速度范围
    snowflake.velocityRange = 10;
    
    // 粒子y方向的加速度分量
    snowflake.yAcceleration = 2;
    
    // 周围发射角度
    snowflake.emissionRange = 0.5 * M_PI;
    
    // 子旋转角度范围
    snowflake.spinRange = 0.25 * M_PI;
    snowflake.contents  = (id)[[UIImage imageNamed:@"snow"] CGImage];
    
    // 设置雪花形状的粒子的颜色
    snowflake.color      = [[UIColor whiteColor] CGColor];
    snowflake.redRange   = 1.5f;
    snowflake.greenRange = 2.2f;
    snowflake.blueRange  = 2.2f;
    
    snowflake.scaleRange = 0.6f;
    snowflake.scale      = 0.7f;
    
    snowEmitter.shadowOpacity = 1.0;
    snowEmitter.shadowRadius  = 0.0;
    snowEmitter.shadowOffset  = CGSizeMake(0.0, 0.0);
    
    // 粒子边缘的颜色
    snowEmitter.shadowColor  = [[UIColor whiteColor] CGColor];
    
    // 添加粒子
    snowEmitter.emitterCells = @[snowflake];
    
    // 将粒子Layer添加进图层中
    [self.view.layer addSublayer:snowEmitter];
    
    // 形成遮罩
    UIImage *image      = [UIImage imageNamed:@"alpha"];
    _layer              = [CALayer layer];
    _layer.frame        = (CGRect){CGPointZero, self.view.bounds.size};
    _layer.contents     = (__bridge id)(image.CGImage);
    _layer.position     = self.view.center;
    snowEmitter.mask    = _layer;

    pic

    —————————————

    走心文章, 值得点赞 —文/夏天然后
    微博-点我@夏天是个大人了 || QQQ: 498143780

    展开全文
  • iOS-直播中粒子效果

    2016-12-30 17:43:05
    转载注明出处: ...主播房间右下角粒子动画 雪花/下雨/烟花等效果 QQ生日快乐一堆表情的跳动常规实现方法:// 添加粒子效果 func addParticleEffect() { // 1.创建发射器 let emitter =

    转载注明出处: http://blog.csdn.net/qxuewei/article/details/53942647

    粒子效果的应用场景:
    主播房间右下角粒子动画
    雪花/下雨/烟花等效果
    QQ生日快乐一堆表情的跳动

    常规实现方法:

    // 添加粒子效果
        func addParticleEffect() {
            // 1.创建发射器
            let emitter = CAEmitterLayer()
            // 2.发射器位置
            emitter.emitterPosition = CGPoint(x: UIScreen.main.bounds.width * 0.5, y:  -20)
            // 3.开启三维效果
            emitter.preservesDepth = true
            // 4.设置 Cell(对应其中一个粒子)
            // 4.0.创建粒子
            let cell = CAEmitterCell()
            // 4.1.每秒发射粒子数
            cell.birthRate = 20
            // 4.2.粒子存活时间
            cell.lifetime = 5
            cell.lifetimeRange = 2.5
            // 4.3.缩放比例
            cell.scale = 0.7
            cell.scaleRange = 0.3
            // 4.4.粒子发射方向
            cell.emissionLongitude = CGFloat(M_PI_2)
            cell.emissionRange = CGFloat(M_PI_4)
            // 4.5.粒子速度
            cell.velocity = 150
            cell.velocityRange = 50
            // 4.6.旋转速度
            cell.spin = CGFloat(M_PI_2)
            // 4.7.粒子内容
            cell.contents = UIImage(named: "good2_30x30")?.cgImage
            // 5.将粒子添加到发射器中
            emitter.emitterCells = [cell]
            view.layer.addSublayer(emitter)
        }
    

    可以实现简单粒子效果:
    这里写图片描述

    通常在直播等软件中粒子效果不会只有单独一种粒子样式.所以需要定义多种粒子样式实现.利用面向协议的思想封装一个 Particleable 类. 继承此协议的控制器可具备粒子效果的功能.
    核心代码:

    import Foundation
    import UIKit
    
    protocol Particleable {
        // 此处定义的方法,在继承此协议的类中必须实现否则会报错! - 保留OC特性
    //    func addParticleEffectTest(_ view : UIView)
    }
    
    extension Particleable where Self : UIViewController {
        func addParticleEffect(_ point : CGPoint = CGPoint(x: UIScreen.main.bounds.width * 0.85, y: UIScreen.main.bounds.height - 20) )  {
            // 1.创建发射器
            let emitter = CAEmitterLayer()
            // 2.发射器位置
            emitter.emitterPosition = point
            // 3.开启三维效果
            emitter.preservesDepth = true
            var cells = [CAEmitterCell]()
            for i in 0..<10 {
                // 4.设置 Cell(对应其中一个粒子)
                // 4.0.创建粒子
                let cell = CAEmitterCell()
                // 4.1.每秒发射粒子数
                cell.birthRate = Float(arc4random_uniform(4)) + 3
                // 4.2.粒子存活时间
                cell.lifetime = 5
                cell.lifetimeRange = 2.5
                // 4.3.缩放比例
                cell.scale = 0.7
                cell.scaleRange = 0.3
                // 4.4.粒子发射方向
                cell.emissionLongitude = CGFloat(-M_PI_2)
                cell.emissionRange = CGFloat(M_PI_4 * 0.6)
                // 4.5.粒子速度
                cell.velocity = 100
                cell.velocityRange = 50
                // 4.6.旋转速度
                cell.spin = CGFloat(M_PI_2)
                // 4.7.粒子内容
                cell.contents = UIImage(named: "good\(i)_30x30")?.cgImage
                cells.append(cell)
            }
            // 5.将粒子添加到发射器中
            emitter.emitterCells = cells
            view.layer.addSublayer(emitter)
        }
    
        func removeParticleEffect() {
            //方式1: 常规遍历
    //        for layer in view.layer.sublayers! {
    //            if layer.isKind(of: CAEmitterLayer.self) {
    //                layer.removeFromSuperlayer()
    //            }
    //        }
            //方式2: 映射
            view.layer.sublayers?.filter({ $0.isKind(of: CAEmitterLayer.self)}).last?.removeFromSuperlayer()
        }
    }

    实现效果
    这里写图片描述

    完整项目链接:
    https://github.com/qxuewei/XWCSDNDemos 中 XWParticleDemo-粒子效果

    展开全文
  • 简单介绍一下定时器CADisplayLink的使用,做一个飘雪花的效果创建一个UIView “XueHua” XueHua.m #import "XueHua.h"static CGFloat _snowY = 0;@implementation XueHua-(void)awakeFromNib { [super awakeFromNib...
  • IOS 雪花飘落效果

    2012-12-27 11:06:43
    UIImageView *peach2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"flower2"]];//声明一个UIImageView对象,用来添加图片  peach2.alpha = 0.8;//设置该view的alpha为0.5,半透明的 ...
  • ios CAEmitterLayer 的 雪花,烟花,火焰,爱心效果
  • // 雪花飘落效果 // // Created by YaguangZhu on 15/9/9. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <UIKit/UIKit.h> @interface HMview : UIVi...
  • CAEmitterLayer *snowEmitter = [CAEmitterLayer layer];  snowEmitter.emitterPosition = CGPointMake(self.view.bounds.size.width / 2.0, -30);  snowEmitter.emitterSize = CGSizeMake(self.view
  • 雪花效果最主要的思路就是在于循环产生带雪花图片的imageView, 产生的雪花的imageview的 x、y、宽、下落的速度都是随机的,这个可以用随机数来产生数据。 */ 实现代码:#import <UIKit/UIKit.h>@interface ...
  • 猫猫分享,必须精品原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:...代码:-(id)initWithCoder:(NSCoder *)aDecoder { //请注意这里一定要先初始化父类的构造方法 if (self=[super initW
  • 1.viewDidLoad - (void)viewDidLoad { [super viewDidLoad]; CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(makeSnow)]; [link addToRunLoop:[NSRunLoop mainR
  • iOS-各种动画特效

    2018-02-19 21:32:35
    广播跑马灯/弹幕/直播点赞/烟花/雪花等动画特效, 后续增加~
  • demo功能:基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果。 demo说明:基于Core Animation的粒子发射系统,粒子用CAEmitterCell来初始化。 粒子画在背景层盒边界上 demo截屏: demo代码说明: ...
  • AJ分享,必须精品   效果: 可以加入随机数实现真的飘落效果哦。 代码: -(id)initWithCoder:(NSCoder *)aDecoder { //请注意这里一定要先初始化父类的构造方法 if (self=[super initWithCoder:aDecoder]) { ...
  • 原文地址:雪花《苹果iOS实例编程入门教程》">第九天 雪花《苹果iOS实例编程入门教程》作者:苹果iphonesdkDAY NINE – Snow Fall雪花《苹果iOS实例编程入门教程》" TITLE="[转载]第九天 雪花《苹果iOS实例编程...
  • 最近在看《IOS疯狂讲义》这本书,看到最后里面有一个关于利用绘图和坐标变换实现雪花飘飘的效果,有点感兴趣,就按照书中的代码敲了一下,但是出来的效果和书中所说不太一样。所以把代码贴出来希望和大家交流一下,...
  • iOS -雪花动画

    2019-07-23 22:24:32
    随机数方法 arc4random() //[0,2^32-1]; 随机数声明 unsigned int randomNum=arc4random()% 320; int i = randomNum ;...其中,unsigned 没有标记的 指的是只有正数,说明randomNum是正数 ...sn...
  • 雪花/下雨/烟花等效果 QQ生日快乐一堆表情的跳动 常规实现方法(核心代码): import Foundation import UIKit extension Particleable where Self : UIViewController { func addParticleEffect(_ point : CGPoint ...
1 2 3 4 5 ... 20
收藏数 837
精华内容 334