zoukankan      html  css  js  c++  java
  • iOS -雪花动画

    随机数方法

    arc4random()  //[0,2^32-1]; 

    随机数声明

    unsigned int randomNum=arc4random()% 320;

    int i = randomNum ;

    其中,unsigned 没有标记的 指的是只有正数,说明randomNum是正数

    其中 arc4random() 的括号绝对不可以忘掉

    随机数也可以直接用

    snowView.frame = CGRectMake(arc4random() % 320 , 480-snowView.frame.size.height,snowView.frame.size.width, snowView.frame.size.height);

    关于随机数的意外?

    即使是在证明的时候不用unsigned,在使用时仍然是只有正数出现

    但是如果在后面的使用过程中对randomNum进行求余运算,最后就会出现负值

    这真是一个奇怪的现象

    比如说

        for (int a=0; a<60; a++) {

            int randomNum=arc4random();

            int i=randomNum%320;

            NSLog(@"--------->>arc4random()为%d",arc4random()%320);

            

            NSLog(@"--------->>randomNum为%d",i);

        }

    在写了这样的代码之后,输出的arc4random()为后面一直都是正数,而randomNum为后面就有负数出现

    这到底是为什么呢?

    答案:    

       for (int a=0; a<60; a++) 

       {

            int randomNum=arc4random();

            int i=randomNum%320;

            NSLog(@"--------->>arc4random()为%d",arc4random()%320);

            

            NSLog(@"--------->>randomNum为%d",i);

        }

    在这段代码中,这里的int是有符号的32位,而arc4random()是无符号的32位,比int大很多,赋给int类型的变量时,超过int范围的随机数,第一个  1   会被当成符号(即负号)来看待,所以会出现负数

    对范珍老师的崇拜如滔滔江水源源不绝,这老师太牛了,简直是无所不能啊

    通过动画块传参数

                [UIView beginAnimations:nil context:(__bridge void*)snowView];

                [UIView setAnimationDuration:6];

                [UIView setAnimationDelegate:self];

                snowView.center=CGPointMake(arc4random()%320, 475);

                [UIView commitAnimations];

    这里,context后面的参数是 void* 类型,貌似是c里面的?,所以需要桥接强制转换,bridge关键字可以使不同语言之间的变量相互转换

    这里,动画块中使用了Delegate之后,动画结束之后就会自动调用DidStop方法

    下面是系统提供的DidStop方法

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

    {

        //snow melt

        UIImageView *snowView=(__bridge UIImageView*)context;

        [UIView beginAnimations:nil context:(__bridge void*)snowView];

        [UIView setAnimationDuration:1];

        [UIView setAnimationDelegate:self];

        [UIView setAnimationDidStopSelector:@selector(reAnimationDidStop:finished:context:)];

        snowView.alpha=0.1;

        [UIView commitAnimations];

        

    }

    这里,参数有三个,暫時不用写,而context后面的context代表的就是snowView,但是context是c语言中的,所以需要再次转换一下

    区分两个动画块

    因为只要动画块使用delegate,结束之后就会自动去调用DidStop方法,所以,如果有两个动画块,而只有一个DidStop方法,那么两个动画块结束之后都会去调用哪个方法,为了使不同的动画块结束之后进行不同的后续操作,需要给动画块命名,然后再DidStop语句中用if判断动画块的名字,然后执行相应操作

    下面,给动画块命名的代码

    [UIView beginAnimations:@"snowDown" context:(__bridge void *)(snowView)];

    判断动画块名字的代码

     if ([animationID isEqualToString:@"snowDown"])

    这里的animationID指的就是来调用这个DidStop方法的动画块的名字

  • 相关阅读:
    大道至简读后感--吴占鑫
    易达项目第一次冲刺周期第九天
    易达项目第一次冲刺第八天
    易达项目第一次冲刺第七天
    易达项目第一次冲刺周期第六天
    易达项目第一次冲刺周期第五天
    易达项目第一次冲刺周期第四天
    搜狗输入法软件产品评价
    易达项目的工作进程第三天
    典型用户与用户场景
  • 原文地址:https://www.cnblogs.com/chebaodaren/p/5266275.html
Copyright © 2011-2022 走看看