demo ios 图片 飘动_ios 图片预览demo - CSDN
  • 转自:http://blog.csdn.net/wqybsxf12/article/details/8210671 Genie View  介绍: 实现所谓的genie effect。即点击最小化或删除按钮,... http://ios.itmdc.com/forum.php?mod=viewthread&tid=15&fromuid=15

    转自:http://blog.csdn.net/wqybsxf12/article/details/8210671


    Genie View

           介绍: 实现所谓的genie effect。即点击最小化或删除按钮,视图会被吸进某个地方。 
           http://ios.itmdc.com/forum.php?mod=viewthread&tid=15&fromuid=15


    Animated Hovering Views
          介绍:实现飘动视图(Hovering Views)的效果。Demo中,飘动的视图是一朵朵白云,可以自定义每朵白云的飘动速度和、文字和颜色等等。只支  持ARC。 
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=16&fromuid=15


    AHEasing
          介绍: 实现动画中的缓动函数(easing function)。Easing function就是让物体的运动过程遵循某类数学公式,即定好起点和终点,物体在这个移动过程中,按照某个线性或者非线性的速度来进行移动,这样会让物体的运动看起来更加真实、更加符合真实世界的物理规律。
          AHEasing支持的移动模式包括:Linear,Quadratic,Cubic,Quartic,Quintic,Sine,Circular,Elastic,Back,Bounce。 
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=17&fromuid=15


    Wave Animation
          介绍: 实现点击屏幕出现波纹效果。可以设置波纹的大小、波纹扩散的速度、波纹扩散的大小、持续时间等等参数。
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=19&fromuid=15


    Core Animation Fun House
          介绍: 利用Core Animation 框架实现各种各样动画效果。包括:图形变大变小、改变颜色、改变透明度等动画(implicit animations),倒影(reflection)、抖动、三角函数取消等等动画
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=20&fromuid=15


    FireBall
          介绍: 实现小球在屏幕不停的来回反弹,反弹后有小球轨迹。
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=21&fromuid=15 


    PRTween
          介绍: 实现某些Core Animation无法实现或很难实现的动画效果,比如物体弹跳(bounce)、给运动物体一个加速度、让运动物体逐渐停止等等动画效果。
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=22&fromuid=15


    Dazzle
         介绍:利用Core Animation、CAEmitterCell 以及 CAEmitterLayer在iOS5中实现各种粒子动画效果,包括雪花、火焰、烟雾、飘动的花瓣、爆炸等效果。 
        http://ios.itmdc.com/forum.php?mod=viewthread&tid=23&fromuid=15


    Path去睡觉超炫特效
          介绍: Path2.0 iOS应用中,用户有两种状态,分别是睡眠和唤醒状态。切换睡眠状态时,一个月亮会慢慢升起来,背景图案也会慢慢变化。唤醒之后,月亮慢慢消失。这份代码就是实现了这种超炫特效。需将模拟器的语言区域设置成中国。
          http://ios.itmdc.com/forum.php?mod=viewthread&tid=24&fromuid=15


    Full Screen Animations
          介绍: 这个代码实现了两种比较酷的动画效果:
                   1. 程序启动画面(splash画面)到程序界面(root view controller)之间的过渡动画效果是翻书的效果。即开机画面停留一小段时间后,慢慢像翻书一样翻到程序主页面。
                   2. 第二个效果十分特殊,是当用户点击星星的按钮(收藏按钮)之后,按钮上的星星图标会慢慢坠落到tab bar上面。在星星坠落的过程,tab bar上其他的tab慢慢变暗,只留下图标是星星的tab。也就是让用户慢慢看到收藏的效果。     
           http://ios.itmdc.com/forum.php?mod=viewthread&tid=25&fromuid=15   
    展开全文
  • iOS 一个小动画效果-b

    2019-01-06 11:11:14
    近期工作不忙,来一个需求感觉棒棒的,是一个比较简单的页面,如下图(图1) 图1 ...应该很简单吧,没什么大的功能,就是一个展示,一个拨打电话,拨打电话不需要说,几行代码搞定,基本UI也不用说了,刚培训...

    近期工作不忙,来一个需求感觉棒棒的,是一个比较简单的页面,如下图(图1)


    图1


    应该很简单吧,没什么大的功能,就是一个展示,一个拨打电话,拨打电话不需要说,几行代码搞定,基本UI也不用说了,刚培训完的孩子们都能做,但是如果让这个页面动起来呢,会不会很漂亮呢(方然,这不是屁话么,先看看我做的效果吧,图2)


    123.gif

    正题

    会动得有云彩在飘,对号的缩放,添加绿色线条,我们一个一个的看

    云彩的飘动

    要做到这个会飘动的云彩,其实很简单,他是一个平移动画,我画了一个简单的图,可以看一下,便于理解嘛


    456.gif


    只要云彩有透明部分,就可以了,但是当云彩向右移动的时候,屏幕上会有一快没有云彩试图覆盖的区域,尤其是当X等于屏幕的宽的时候


    Paste_Image.png


    思路:
    其实解决这个问题也是很简单的,我用两个imageView,imageView2的初始X值只要为负的屏幕宽,当imageView1移动的时候,让imageView2也跟着一起移动,他们两个以同样的速度来移动就可以了,等到imageView1的x等于屏幕的宽的时候,把imageView1的x值变成0然后继续执行这个动画,同时,当imageView2的X等于屏幕的宽的时候,把它的X变成初始的坐标


    789.gif


    这样就可以了吧,代码如下:

    + (void)translationAnimationView:(UIView *)view animationDuration:(NSTimeInterval)timer animationBlock:(QuitRentAnimationBlock)block
    {
        [UIView animateWithDuration:timer animations:^{
            view.x = view.x + SCREEN_WIDTH;
        } completion:^(BOOL finished) {
            if (finished) {
                block();
            }
        }];
    }

    然后两个imageview分别调用,在完成的block里面继续调用自己

    //给云彩1做平移动画
    - (void)cloudImageView_1Animation
    {
        [QuitRentAnimation translationAnimationView:self.cloudImageView_1 animationDuration:10 animationBlock:^{
            self.cloudImageView_1.x = 0;
            [self cloudImageView_1Animation];
        }];
    }
    //给云彩2做平移动画
    - (void)cloudImageView_2Animation
    {
        [QuitRentAnimation translationAnimationView:self.cloudImageView_2 animationDuration:10 animationBlock:^{
            self.cloudImageView_2.x = -SCREEN_WIDTH;
            [self cloudImageView_2Animation];
        }];
    }
    加好缩放以及绘制绿色虚线

    由上面的效果gif可以看出来,加好缩放以及绘制绿色虚线是一个动画完成的
    思路:
    加好缩放以及绘制绿色虚线,他们是有先后顺序的,UIView动画有一个回调,我们在一个动画完成后再进行另外一个
    第一,加号试图是一个缩放动画,做这个缩放动画其实很简单,按照上面的思路,先把他放大一下,再缩小一下,再放大,复原即可,demo如下:

    + (void)scalingAnimationView:(UIView *)view animationBlock:(QuitRentAnimationBlock)block
    {
        view.transform = CGAffineTransformMakeScale(1.0, 1.0);
    
        [UIView animateWithDuration:0.3 animations:^{
    
             view.transform = CGAffineTransformMakeScale(1.2, 1.2);
    
    
         }completion:^(BOOL finish){
    
             [UIView animateWithDuration:0.3 animations:^{
    
                 view.transform = CGAffineTransformMakeScale(0.9, 0.9);
    
             }completion:^(BOOL finish){
    
                 [UIView animateWithDuration:0.3 animations:^{
    
                     view.transform = CGAffineTransformMakeScale(1.1, 1.1);
    
                 }completion:^(BOOL finish){
                     [UIView animateWithDuration:0.3 animations:^{
    
                         view.transform = CGAffineTransformMakeScale(1, 1);
    
                     }completion:^(BOOL finish){
                         block();
                     }];
                 }];
             }];
         }];
    }

    然后是绘制绿色虚线,这地方我遇到了挺多的坑,在现在的放慢gif中可以看出很大的缺点,就是绿色的线没有完全按照灰色的点上走,我目前还没有想到更好的优化方法,先把这个给大家分享出来,大家看一下吧
    先创建一个绘制虚线试图

    - (void)drawRect:(CGRect)rect{
        [super drawRect:rect];
    
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
    
        //设置虚线颜色
        CGContextSetStrokeColorWithColor(currentContext, self.lineColor.CGColor);
        //设置虚线宽度
        CGContextSetLineWidth(currentContext, 2);
    
        //设置虚线绘制起点
        CGContextMoveToPoint(currentContext, 2 * 0.5, 0.0);
        //设置虚线绘制终点
        CGContextAddLineToPoint(currentContext, 2 * 0.5, CGRectGetHeight(self.bounds));
        //设置虚线排列的宽度间隔:下面的arr中的数字表示先绘制3个点再绘制1个点
        CGFloat arr[] = {2,2};
        //下面最后一个参数“2”代表排列的个数。
        CGContextSetLineDash(currentContext, 0, arr, 2);
        CGContextDrawPath(currentContext, kCGPathStroke);
        CGContextStrokePath(currentContext);
    }

    然后继承于这个view,做宽度为1,高度为我们想要的动画,动画代码如下:

    //垂直移动动画
    + (void)verticalAnimationView:(UIView *)view animationDuration:(NSTimeInterval)timer  animationDistance:(CGFloat)animationDistance animationBlock:(QuitRentAnimationBlock)block
    {
        [UIView animateWithDuration:timer animations:^{
            view.height = view.height + animationDistance;
    
        } completion:^(BOOL finished) {
            if (finished) {
                block();
            }
        }];
    }

    结合上面的思路,把每个动画点起来

    //给对号线条,垂直虚线做动画
    - (void)quitRentSucessImageViewAnimation
    {
        int i = 2;
    //    int i = 2;
    //    int i = 3;
        CGFloat greenLine_1_Distance;
        CGFloat greenLine_2_Distance;
        if (i == 0) {
            greenLine_1_Distance = 30 * KHeight_Scale;
        }else if (i == 1){
            greenLine_1_Distance = 60 * KHeight_Scale;
            greenLine_2_Distance = 55 * KHeight_Scale;
        }else if (i == 2){
            greenLine_1_Distance = 60 * KHeight_Scale;
            greenLine_2_Distance = 110 * KHeight_Scale;
        }
        WEAKSELF
        [QuitRentAnimation scalingAnimationView:weakSelf.quitRentSucessImageView  animationBlock:^{
    
            [self addSubview:self.greenLine1];
            [self.greenLine1 mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(weakSelf.quitRentSucessImageView.mas_bottom);
                make.centerX.mas_equalTo(weakSelf.detainMoneyAccountTitleLabel.mas_right).offset(25/2+5);
                make.width.mas_equalTo(2);
                make.height.mas_equalTo(greenLine_1_Distance);
            }];
    
            [QuitRentAnimation verticalAnimationView:weakSelf.greenLine1 animationDuration:0.8 animationDistance:greenLine_1_Distance animationBlock:^{
                if (i == 0) return ;
    
                weakSelf.houseConnectSucessImageView.image = [UIImage imageNamed:@"icon_pay_money_duihao"];
                [QuitRentAnimation scalingAnimationView:weakSelf.houseConnectSucessImageView animationBlock:^{
    
                    [weakSelf addSubview:weakSelf.greenLine2];
    
                    [weakSelf.greenLine2 mas_makeConstraints:^(MASConstraintMaker *make) {
                        make.top.mas_equalTo(weakSelf.houseConnectSucessImageView.mas_bottom);
                        make.centerX.mas_equalTo(weakSelf.detainMoneyAccountTitleLabel.mas_right).offset(25/2+5);
                        make.width.mas_equalTo(2);
                        make.height.mas_equalTo(greenLine_2_Distance);
                    }];
                    [QuitRentAnimation verticalAnimationView:weakSelf.greenLine2 animationDuration:1 animationDistance:greenLine_2_Distance animationBlock:^{
                        weakSelf.detainMoneyAccountSucessImageView.image = [UIImage imageNamed:@"icon_pay_money_duihao"];
                        [QuitRentAnimation scalingAnimationView:weakSelf.detainMoneyAccountSucessImageView animationBlock:^{
                            //
                        }];
                    }];
                }];
    
            }];
    
    
    
        }];
    }

    链接:http://www.jianshu.com/p/9c3ccd2eeafe

     

    展开全文
  • 同时支持iOS和Mac系统什么意思?用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发。 开发中比较常用的是截屏/裁剪/自定义UI控件。 Quartz2D在iOS开发中的价值就是自定义UI控件。

    什么是Quartz2D?二维的绘图引擎
    什么是二维?平面
    什么是引擎?经包装的函数库,方便开发者使用。也就是说苹果帮我们封装了一套绘图的函数库
    同时支持iOS和Mac系统什么意思?用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发。
    开发中比较常用的是截屏/裁剪/自定义UI控件。
    Quartz2D在iOS开发中的价值就是自定义UI控件。


    使用图形上下文画图,要遵循一下四个步骤
    1.获取图像上下文
    2.创建路径
    3.将路径添加到图形上下文(add)
    4.渲染图像上下文(fill,stroke)

    以下方法请在UIView的drawRect方法中调用~

    一.绘制一条直线的方法

    #pragma mark - 直接使用图形上下文画图
    - (void)oneMethod
    {
        //1.获取图形上下文,目前我们现在使用的都是UIGraphics开头,CoreGraphics,项目简称CG
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        //2.描述路径
        //2.1 创建路径
        CGContextMoveToPoint(ctx, 10, 50);
        //2.2 添加线到一个点
        CGContextAddLineToPoint(ctx, 10,100);
        
        //3.完成路线
        CGContextStrokePath(ctx);
    
    }
    #pragma mark - 图形上下文 + CGPathRef画线
    - (void)twoMethod
    {
        //1.获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        //2.使用path画线
        CGMutablePathRef path = CGPathCreateMutable();
        
        //3.添加点
        CGPathMoveToPoint(path, NULL, 20, 50);
        CGPathAddLineToPoint(path, NULL, 20, 100);
        
        //4.将path添加到图形上下文
        CGContextAddPath(ctx, path);
        
        //5.渲染上下文
        CGContextStrokePath(ctx);
    }
    #pragma mark - 贝塞尔曲线
    - (void)threeMethod
    {
        //1.创建路径
        UIBezierPath *path = [UIBezierPath bezierPath];
        
        //2.画线
        [path moveToPoint:CGPointMake(30, 50)];
        [path addLineToPoint:CGPointMake(30, 100)];
        
        //3.渲染
        [path stroke];
    }
    #pragma mark - 图形上下文 + 贝塞尔曲线
    - (void)fourMethod
    {
        //1.获得图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        //2.创建路径
        UIBezierPath *path = [UIBezierPath bezierPath];
        
        //3.画线
        [path moveToPoint:CGPointMake(40, 50)];
        [path addLineToPoint:CGPointMake(40, 100)];
        
        //4.将path添加到上下文
        CGContextAddPath(ctx, path.CGPath);
        
        //5.渲染
        CGContextStrokePath(ctx);
    }
    
    

    二.画两个相交的线,并且设置属性

    #pragma mark - 画两个相交的线,并设置属性
    - (void)drawTwoLineCrossSetAttribute
    {
        //1.获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        //2.将绘制路径,并且将其添加到图形上下文
        CGContextMoveToPoint(ctx, 123, 45);
        CGContextAddLineToPoint(ctx, 45, 80);
        
        //3.添加另一条线
        CGContextAddLineToPoint(ctx, 223, 159);
        
        //设置颜色
        [[UIColor greenColor] set];
        //设置线的宽度
        CGContextSetLineWidth(ctx, 10);
        //设置链接外的链接类型
        CGContextSetLineJoin(ctx, kCGLineJoinRound);
        //设置线的头部方式
        CGContextSetLineCap(ctx, kCGLineCapRound);
        
        //4.渲染
        CGContextStrokePath(ctx);
    }
    


    画出了两条有链接的线,其中设置颜色的时候,是区分设置线的颜色,和设置图片的颜色的,可以设置他们各自的属性(但是经常设置错误),懒得去区分并且保证不会设置错误,建议设置[[UIColor greenColor] set]就不用考虑实线还是填充图形了。还有,CGContextSetLineJoin是设置连接处的样式,是枚举,CGContextSetLineCap是设置线的顶部的样式,也是枚举。
    注意:设置各种属性的时候,一定要记住在渲染之前,否则无效

    三.绘制两条不相交的线,并且设置各自属性


    #pragma mark - 画两个不相交的线,并且设置各自属性
    - (void)drawTwoLineNoCrossSetAttribute
    {
        //1.创建贝塞尔曲线路径
        UIBezierPath *path = [UIBezierPath bezierPath];
        
        //2.绘制路径
        [path moveToPoint:CGPointMake(12, 49)];
        [path addLineToPoint:CGPointMake(68, 34)];
        [[UIColor redColor] set];
        [path setLineWidth:5];
        //3.渲染
        [path stroke];
        
        //绘制第二条路径
        UIBezierPath *path2 = [UIBezierPath bezierPath];
        [path2 moveToPoint:CGPointMake(145, 167)];
        [path2 addLineToPoint:CGPointMake(98, 34)];
        [[UIColor greenColor] set];
        [path2 setLineWidth:10];
        [path2 setLineCapStyle:kCGLineCapRound];
        [path2 stroke];
        
    }
    

    使用贝塞尔曲线画图的好处在于,1.每一个贝塞尔底层都有一个图形上线文,如果是用CGContextMoveToPoint画图,实际上就是一个图形上下文,不好去控制,所以建议没多条线可以使用贝塞尔曲线或者说使用底层的CGMutablePathRef画线,比较靠谱。


    四.绘制曲线


    #pragma mark - 绘制曲线
    - (void)drawQuadCurve
    {
        //1.获得图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        //2.设置起点
        CGContextMoveToPoint(ctx, 10, 50);
        
        /**
         *  添加曲线的五个参数
         *
         *  @param c#>   图形上下文
         *  @param cpx#> 将来要突出的x值
         *  @param cpy#> 要突出的y值
         *  @param x#>   曲线结束时的x
         *  @param y#>   曲线结束时的y
         */
        
        CGContextAddQuadCurveToPoint(ctx, 160, 300, 310, 50);
        
        //设置颜色
        [[UIColor redColor] set];
        //设置宽度
        CGContextSetLineWidth(ctx, 5);
        
        //3.渲染图层
        CGContextStrokePath(ctx);
    }
    


    五.绘制带有圆角边框的正方形


    #pragma mark - 绘制一个带有圆角边框的正方形
    - (void)drawRoundSquare
    {
        //绘制一个空心的圆角矩形
        //1.创建路径 贝塞尔曲线
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 50, 100, 40) cornerRadius:5];
        //设置颜色
        [[UIColor redColor] set];
        //2.渲染
        [path stroke];
        
        //绘制一个实心的圆角正方形
        //1.创建路径 贝塞尔曲线
        UIBezierPath *path2 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 140, 100, 100) cornerRadius:5];
        //设置颜色
        [[UIColor orangeColor] set];
        //2.渲染
        [path2 fill];
        
        //绘制一个实心的圆
        //1.创建路径 贝塞尔曲线
        UIBezierPath *path3 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 290, 100, 100) cornerRadius:50];
        //设置颜色
        [[UIColor blueColor] set];
        //2.渲染
        [path3 fill];
    
    }
    


    • 1.stroke设置边框的颜色,fill填充内部的颜色
    • 2.fill并不是随意使用的,必须是封闭的图形。
    • 3.可以通过设置圆角是正方形的高度,生成一个原形,但不是最规范绘制原形的方法,不过也可以使用。

    六.绘制一个弧度曲线


    #pragma mark - 绘制一个弧度曲线
    - (void)drawCurve
    {
        /**
         *  绘制弧度曲线
         *
         *  @param ArcCenter 曲线中心
         *  @param radius       半径
         *  @param startAngle 开始的弧度
         *  @param endAngle 结束的弧度
         *  @param clockwise YES顺时针,NO逆时针
         */
        
        //绘制一条半圆曲线
        //1.创建路径 贝塞尔曲线
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:50 startAngle:0 endAngle:M_PI clockwise:YES];
        [[UIColor redColor] set];
        [path setLineWidth:10];
        [path setLineCapStyle:(kCGLineCapRound)];
        //2.渲染
        [path stroke];
        
        //绘制一条3/4圆曲线
        //1.创建路径 贝塞尔曲线
        UIBezierPath *path2 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 350) radius:50 startAngle:0 endAngle:270/360.0*(M_PI * 2) clockwise:YES];
        [[UIColor yellowColor] set];
        [path2 setLineWidth:10];
        [path2 setLineCapStyle:(kCGLineCapRound)];
        //2.渲染
        [path2 stroke];
        
        //绘制一个圆形曲线
        //1.创建路径 贝塞尔曲线
        UIBezierPath *path3 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 550) radius:50 startAngle:0 endAngle:(M_PI * 2) clockwise:YES];
        [[UIColor blueColor] set];
        [path3 setLineWidth:10];
        [path3 setLineCapStyle:(kCGLineCapRound)];
        //2.渲染
        [path3 stroke];
        
    }
    


    1.M_PI是180度.M_PI_2是90°
    2.这里的角度都是弧度制度,如果我们需要15°,可以用15°/180°*π得到。
    3.clockwise这个是顺时针,如果穿1,就是顺时针,穿0,是逆时针

    七.绘制一个一个扇形

    <span style="font-size:18px;">#pragma mark - 绘制扇形
    - (void)drawFanShaped
    {
        //1.获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //绘制曲线
        CGFloat centerX = 100;
        CGFloat centerY = 100;
        CGFloat radius = 50;
        //2.添加一根线
        CGContextMoveToPoint(ctx, centerX, centerY);
        CGContextAddArc(ctx, centerX, centerY, radius, M_PI, (230 / 360.0)*(M_PI * 2), NO);
        
        //3.关闭线段
        CGContextClosePath(ctx);
        //4.渲染
        CGContextFillPath(ctx);
        
    }</span>
    
    1.线添加一个点CGContextMoveToPoint
    2.添加一个圆弧CGContextAddArc
    3.闭合绘图CGContextClosePath
    4.给路径设置颜色CGContextStrokePath,或者给图形内部设置颜色CGContextFillPath
    5.使用贝塞尔曲线,也要设置闭合路径CGContextClosePath



    学有所成,来个小练习~

    八.简单下载进度的demo

    自定义一个View
    CustomProgressView.h
    @interface CustomProgressView : UIView
    @property (nonatomic,assign) CGFloat progressValue;
    @end

    CustomProgressView.m
    @implementation CustomProgressView
    - (void)setProgressValue:(CGFloat)progressValue
    {
        _progressValue = progressValue;
        [self setNeedsDisplay];
    }
    -(void)drawRect:(CGRect)rect
    {
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.center radius:100 startAngle:-M_PI_2 endAngle:(_progressValue / 100.0) *(2 * M_PI) - M_PI_2 clockwise:YES];
        [[UIColor redColor] set];
        [path setLineWidth:10];
        [path setLineCapStyle:(kCGLineCapRound)];
        [path stroke];
    }
    
    @end
    ViewController.m
    @interface ViewController ()
    @property (nonatomic,retain) UISlider *slider;
    @property (nonatomic,retain) CustomProgressView *progressView;
    @property (nonatomic,retain) UILabel *label;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.progressView = [[CustomProgressView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.width)];
        self.progressView.backgroundColor = [UIColor whiteColor];
        
        self.label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 80, 50)];
        self.label.center = self.progressView.center;
        self.label.textAlignment = NSTextAlignmentCenter;
        [self.progressView addSubview:self.label];
        
        [self.view addSubview:self.progressView];
        
        
        self.slider = [[UISlider alloc]initWithFrame:CGRectMake(10, 500, self.view.frame.size.width - 20, 50)];
        self.slider.minimumValue = 0;
        self.slider.maximumValue = 100;
        [self.slider addTarget:self action:@selector(changeValue:) forControlEvents:(UIControlEventValueChanged)];
        [self.view addSubview:self.slider];
    }
    - (void)changeValue:(UISlider *)sender
    {
        self.progressView.progressValue = sender.value;
        self.label.text = [NSString stringWithFormat:@"%.f%%",sender.value];
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    


    想调用这个方法drawRect:(CGRect)rect,必须要使用setNeedsDisplay,其他的无效。

    九.饼状图

    PieView.m

    @interface PieView ()
    @property (nonatomic,retain) NSArray *nums;
    @property (nonatomic,assign) NSInteger total;
    @end
    @implementation PieView
    - (NSInteger)total
    {
        if (_total == 0) {
            for (int i = 0; i < self.nums.count ; i ++) {
                _total += [self.nums[i] integerValue];
            }
        }
        return _total;
    }
    - (NSArray *)nums
    {
        if (!_nums) {
            self.nums = @[@"10",@"20",@"30",@"40"];
        }
        return _nums;
    }
    - (void)drawRect:(CGRect)rect
    {
        //绘制一个饼图
        CGFloat radius = 150;
        CGFloat startA = 0;
        CGFloat endA = 0;
        
        for (int i = 0; i < self.nums.count; i++) {
            NSNumber *num = self.nums[i];
            startA = endA;
            endA = startA + [num floatValue]/self.total * (2 * M_PI);
            UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.center radius:radius startAngle:startA endAngle:endA clockwise:YES];
            [path addLineToPoint:self.center];
            
            CGFloat randRed = arc4random_uniform(256)/255.0;
            CGFloat randGreen = arc4random_uniform(256)/255.0;
            CGFloat randBlue = arc4random_uniform(256)/255.0;
            UIColor *randomColor = [UIColor colorWithRed:randRed green:randGreen blue:randBlue alpha:1];
            [randomColor set];
            
            [path fill];
        }
    }
    
    @end
    

    ViewController.m
     PieView *pie = [[PieView alloc]initWithFrame:[UIScreen mainScreen].bounds];
        pie.backgroundColor = [UIColor whiteColor];
        [self.view addSubview:pie];




    十.柱状图


    BarChartView.h
    @interface BarChartView()
    @property (nonatomic,retain) NSArray *nums;
    @end
    @implementation BarChartView
    - (NSArray *)nums
    {
        if (!_nums) {
            self.nums = @[@"10",@"20",@"30",@"40",@"50",@"60",@"70",@"80"];
        }
        return _nums;
    }
    - (void)drawRect:(CGRect)rect
    {
        //1.获取图形上下文
        CGContextRef ctz = UIGraphicsGetCurrentContext();
        //2.绘制图像
        //设置间距
        CGFloat margin = 30;
        //当柱状图的数量多于5的时候缩小它们的间距
        if (self.nums.count > 5) {
            margin = 10;
        }
        //柱状图的宽度 = ( view的宽度 - 间隔的总宽度 )/ 柱状图的个数
        CGFloat width = (rect.size.width - (self.nums.count + 1) *margin) / self.nums.count;
        for (int i = 0; i < self.nums.count; i++) {
            
            //求出 每一个数字所占的比例
            CGFloat num = [self.nums[i] floatValue]/100;
            //起点位置
            CGFloat x = margin + (width + margin) * i ;
            CGFloat y = rect.size.height * (1 - num);
            CGFloat height = rect.size.height * num;
            
            CGRect rectA = CGRectMake(x, y, width, height);
            CGContextAddRect(ctz, rectA);
            
            CGFloat randRed = arc4random_uniform(256)/255.0;
            CGFloat randGreen = arc4random_uniform(256)/255.0;
            CGFloat randBlue = arc4random_uniform(256)/255.0;
            UIColor *randomColor = [UIColor colorWithRed:randRed green:randGreen blue:randBlue alpha:1];
            
            [randomColor set];
            //渲染
            CGContextFillPath(ctz);
           
        }
    }
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect {
        // Drawing code
    }
    */
    
    @end
    

    ViewController.m
     BarChartView *view = [[BarChartView alloc]initWithFrame:[UIScreen mainScreen].bounds];
        view.backgroundColor = [UIColor whiteColor];
        [self.view addSubview:view];



    十一.绘制图片

    绘制文字和图片的时候,是不用去获取图像上下文的

    -(void)drawRect:(CGRect)rect
    {
        //剪切图片,超出的图片位置都要剪切掉!必须要在绘制之前写,否则无效
    //    UIRectClip(CGRectMake(0, 0, 100, 50));
        
        UIImage *image = [UIImage imageNamed:@"image"];
        
        //独立
        //在什么范围内(原图大小)
        [image drawInRect:rect];
        
        //在哪个位置开始画
        [image drawAtPoint:CGPointMake(10, 10)];
        
        //平铺
        [image drawAsPatternInRect:rect];
    }


     [image drawInRect:rect]; //拉伸效果

        [image drawAtPoint:CGPointMake(10, 10)];//适应效果
    

    [image drawAsPatternInRect:rect];//平铺效果

    十二.绘制富文本


    - (void)drawRect:(CGRect)rect
    {
        NSString *str = @"不管开心与否\n每天都要努力生活\n爱自己\n爱家人";
        //设置文字的属性
        NSMutableDictionary * paras = [NSMutableDictionary dictionary];
        //设置字体大小
        paras[NSFontAttributeName] = [UIFont systemFontOfSize:40];
        //设置字体颜色
        paras[NSForegroundColorAttributeName] = [UIColor blackColor];
        //设置镂空渲染颜色
        paras[NSStrokeColorAttributeName] = [UIColor orangeColor];
        //设置镂空渲染宽度
        paras[NSStrokeWidthAttributeName] = @3;
        
        //创建阴影对象
        NSShadow *shodow = [[NSShadow alloc] init];
        //阴影颜色
        shodow.shadowColor = [UIColor yellowColor];
        //阴影偏移量
        shodow.shadowOffset = CGSizeMake(5, 6);
        //阴影的模糊半径
        shodow.shadowBlurRadius = 4;
        //苹果的富文本就是这样搞出来的
        paras[NSShadowAttributeName]  = shodow;
        [str drawAtPoint:CGPointZero withAttributes:paras];
    }



    十三.雪花飘动



    雪花动画
    //只有在drawRect方法中才能拿到图形上下文,才可以画图
    - (void)drawRect:(CGRect)rect {
        //设置下雪的动画
        UIImage *image = [UIImage imageNamed:@"snow"];
        _snowY += 10;
    
        [image drawAtPoint:CGPointMake(0, _snowY)];
        if (_snowY >= rect.size.height) {
            _snowY = 0;
        }
    }
    // 如果在绘图的时候需要用到定时器,通常使用CADisplayLink
    // NSTimer很少用于绘图,因为调度优先级比较低,并不会准时调用
    - (void)awakeFromNib
    {
        // 创建定时器
        CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(timeChange)];
    
        // 添加主运行循环
        [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    }
    // CADisplayLink:每次屏幕刷新的时候就会调用,屏幕一般一秒刷新60次
    - (void)timeChange{
        [self setNeedsDisplay];
    }

    1.本质就是调用drawRect方法,一直刷新雪花的y值
    2.每一次调用drawRect,都创建大量的对象,有人说可能性能不好,不过你可能多虑了,没吃都是在内存加载,不会创建新的UIImage

    十四.图形上下文栈

    我自己详细的介绍了一下,上下文栈,可以看一下~
    图形上下文详解

    十五.图形上下文矩阵

    到底是个啥?
    就是图形上下文画出的东西永远是方方正正的,你要是想画个偏离的矩形,按照过去的方法画不出来,只能使用矩阵的方式。分别有偏移,缩放,旋转


    正常尺寸的椭圆

    x,y各自平移10px后的椭圆

    旋转后的椭圆

    缩放后的椭圆
    - (void)drawRect:(CGRect)rect {
        //图形上下文矩阵
        //1.画一个椭圆
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    //    CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 100));
        CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, 200, 100),nil);
        [[UIColor redColor] set];
        //1.偏移
    //    CGContextTranslateCTM(ctx, 10, 10);
       //2.旋转
    //    CGContextRotateCTM(ctx, M_PI_4);
        //3.缩放
        CGContextScaleCTM(ctx, 0.25, 2);
        CGContextAddPath(ctx, path);
        CGContextFillPath(ctx);
    }

    1.绘制变化的图形的步骤

    • 先绘制path
    • 设置图形上下文矩阵
    • 将path添加到图形上下文(这一步很重要,一定按照步骤来)
    • 渲染

    2.绘图的时候,我们要使用底层的 CGPathRef,或者贝塞尔,然后 CGContextRef+path的方式。
    如不这样,我注释的CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 100))方法,这个方法中已经先去添加了path到图形上下文,即使我们在去添加图形上下文矩阵,也是无效
    3.可以和图形上下文栈一起使用,给特定的一些图案设置一些属性,还有一些不会受到影响


    本文为我的实践所写,部分实例已上传至GitHub点击打开链接
    特别感谢简书作者王鑫20111无私分享~
    原文传送门点击打开链接

    展开全文
  • Genie View 介绍: 实现所谓的genie effect。... http://ios.itmdc.com/forum.php?mod=viewthread&amp;tid=15&amp;fromuid=15Animated Hovering Views 介绍:实现飘动视图...Demo中,飘动的视图是一朵朵...
    Genie View
    介绍: 实现所谓的genie effect。即点击最小化或删除按钮,视图会被吸进某个地方。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=15&fromuid=15


    Animated Hovering Views
    介绍:实现飘动视图(Hovering Views)的效果。Demo中,飘动的视图是一朵朵白云,可以自定义每朵白云的飘动速度和、文字和颜色等等。只支持ARC。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=16&fromuid=15


    AHEasing
    介绍: 实现动画中的缓动函数(easing function)。Easing function就是让物体的运动过程遵循某类数学公式,即定好起点和终点,物体在这个移动过程中,按照某个线性或者非线性的速度来进行移动,这样会让物体的运动看起来更加真实、更加符合真实世界的物理规律。
    AHEasing支持的移动模式包括:Linear,Quadratic,Cubic,Quartic,Quintic,Sine,Circular,Elastic,Back,Bounce。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=17&fromuid=15


    Wave Animation
    介绍: 实现点击屏幕出现波纹效果。可以设置波纹的大小、波纹扩散的速度、波纹扩散的大小、持续时间等等参数。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=19&fromuid=15


    Core Animation Fun House
    介绍: 利用Core Animation 框架实现各种各样动画效果。包括:图形变大变小、改变颜色、改变透明度等动画(implicit animations),倒影(reflection)、抖动、三角函数取消等等动画
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=20&fromuid=15


    FireBall
    介绍: 实现小球在屏幕不停的来回反弹,反弹后有小球轨迹。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=21&fromuid=15


    PRTween
    介绍: 实现某些Core Animation无法实现或很难实现的动画效果,比如物体弹跳(bounce)、给运动物体一个加速度、让运动物体逐渐停止等等动画效果。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=22&fromuid=15


    Dazzle
    介绍:利用Core Animation、CAEmitterCell 以及 CAEmitterLayer在iOS5中实现各种粒子动画效果,包括雪花、火焰、烟雾、飘动的花瓣、爆炸等效果。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=23&fromuid=15


    Path去睡觉超炫特效
    介绍: Path2.0 iOS应用中,用户有两种状态,分别是睡眠和唤醒状态。切换睡眠状态时,一个月亮会慢慢升起来,背景图案也会慢慢变化。唤醒之后,月亮慢慢消失。这份代码就是实现了这种超炫特效。需将模拟器的语言区域设置成中国。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=24&fromuid=15


    Full Screen Animations
    介绍: 这个代码实现了两种比较酷的动画效果:
    1. 程序启动画面(splash画面)到程序界面(root view controller)之间的过渡动画效果是翻书的效果。即开机画面停留一小段时间后,慢慢像翻书一样翻到程序主页面。
    2. 第二个效果十分特殊,是当用户点击星星的按钮(收藏按钮)之后,按钮上的星星图标会慢慢坠落到tab bar上面。在星星坠落的过程,tab bar上其他的tab慢慢变暗,只留下图标是星星的tab。也就是让用户慢慢看到收藏的效果。
    http://ios.itmdc.com/forum.php?mod=viewthread&tid=25&fromuid=15
    展开全文
  • 网上没找到,于是自己写了一个,简单的算法,利用 PropertyValuesHolder实现多个动画的集合,不多说,直接上代码吧,非常好理解: /** *气泡漂浮动画 *@paramview *@paramduration动画运行时间 ...
  • ios实例开发精品源码文章推荐(8.28) 摘要: iOS源码:游戏引擎-推箱子游戏http://www.apkbus.com/android-106392-1-11.htmliOS源码:进度条-Colorful ProgressViewhttp://www.apkbus.com/android-106653-1-11.htmliOS...
  • 博主声明: 转载请在开头附加本文链接及作者信息,并... 直接步入正题,我们要实现的是一个 Android 客户端应用里面的一种点赞效果,比如你点一下那个爱心型的图片,就会产生一个小爱心,而且会以曲线的方式进行上...
  • 废话就不多说了,开始。。。 在网上载下了一个UITabBarController和UInavigationController的结合demo,我自己...风,渐渐吹起,吹乱了我的发丝,也让我的长裙有些飘动。绿叶仿佛在风中起舞,离开了树,投向了大地...
  • iOS学习笔记-动画篇1

    2019-02-27 22:12:35
    自学iOS以来一直没有做笔记的习惯,但是看了很多大牛关于技术总结、探索以及学习的技术博客,感觉还是很有必要的保证学习笔记的积累和更新的。 最近买了一本关于iOS动画的书,书名《A Guide To iOS Animation》,...
  • Genie View  介绍: 实现所谓的genie effect。...   http://ios.itmdc.com/forum.php?mod=viewthread&tid=15&fromuid=15 ...Animated Hovering Views ... 介绍:实现飘动视图(Hovering Views)的
  • Reprint address:http://www.cnblogs.com/aimeng/archive/2012/12/05/2803803.html Authors :qianqianlianmeng Genie View 介绍: 实现所谓的genie effect。即点击最小化或删除按钮,视图... http://ios.itmdc....
  • 同时支持iOS和Mac系统什么意思?用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发。 开发中比较常用的是截屏/裁剪/自定义UI控件。 Quartz2D在iOS开发中的价值就是自定义UI控件。 ...
  • 之前看了一款有点黄的17app底角的爱心各种乱飞,好奇这种效果的实现方式,恰巧看到这篇文章:程序亦非猿:一步一步教你实现Periscope点赞效果,遂按照其思路实现了一个落叶飘零的效果,如下动图:实现的要点如下: ...
  • 先来个效果图 这个动画效果主要几个关注点是: 一、自定义的RelativeLayout中动态加载ImageView 二、刚开始的三个还没移动的动画效果anpha和scaleX,scaleY ,用ObjectAnimator加载 三、红心移动效果,运用了...
1 2 3
收藏数 43
精华内容 17
关键字:

demo ios 图片 飘动