zoukankan      html  css  js  c++  java
  • 同一个页面多个CALayer重绘的办法

    //知识点,CALayer的重绘,-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 方法,CALayer的渐变色。多个CALayer重绘的方法。

    //本例是一个,ViewController类,没有继承任何delegate,同一个页面多个CALayer重绘的办法[原创]

    也就是说下边的ca1,ca2,ca3的delegate直接设置为self,不用继承像<UITextFieldDelegate>这样的委托。CALyer好像没有委托,直接用就是了。不用搞清楚,直接写就是了。

     

    //测试这个例子的随便建一个基于UIViewController类的,我选的是SingleViewApplication如图:同一个页面多个CALayer重绘的办法[原创]

    独立的视图应用)第一排的第四个,随便起个名字,进去将所有的AnimationController(我的项目名)改成你自己的项目的名字。就可以运行了。

    //还得添加一个QuartzCore.framework,怎么添加就不说了,已经说的很清楚了,哪里不会留言...

    //怎么添加QuartzCore.framework还是说下吧:

    //1,在左侧点击点击项目同一个页面多个CALayer重绘的办法[原创]

    //2,中间的位置往上拖一点,看到四个黄色的小工具箱,左下角有个加号,点击出来很多个黄色的小箱子,找到QuartzCore.framework 点Add。就添加进来了,然后在m文件中声明,这都是必要的过程,就像我的m文件里的#import <QuartzCore/QuartzCore.h>。

    同一个页面多个CALayer重绘的办法[原创]

     

    //h文件:

    #import <UIKit/UIKit.h>

    @interface AnimationController : UIViewController

    //注意UIViewController后边没有<委托>;

    @property (nonatomic, retain)CALayer *layer1;

    @property (nonatomic, retain)CALayer *layer2;

    @property (nonatomic, retain)CALayer *layer3;

    //定义三个CALayer *layer1,*layer2,*layer3;

    @end

     

    //M文件:

    #import "AnimationController.h"

    #import <QuartzCore/QuartzCore.h>

    @interface AnimationController ()

    #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >>16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue &0xFF))/255.0 alpha:1.0]

    //这个地方是一个常量,用来设置RGB颜色,不用可以不写,我的例子用了,所以请你照抄,蛮有用处的,留着也可以以后用。

     

    @end

     

    @implementation AnimationController

     

    @synthesize layer1 = _layer1;

    @synthesize layer2 = _layer2;

    @synthesize layer3 = _layer3;

    //上边是3个CALayer类_layer1,_layer2,_layer3,就是h文件中的 *layer1; *layer2; *layer3,这个是IOS开发的机制,不解释;

     

    - (void)viewDidLoad

    {

      [super viewDidLoad];   

     

        self.view.layer.backgroundColor = [UIColor whiteColor].CGColor;

    //设置self.view.layer背景色。

     

         CALayer *ca1 = [CALayer layer];

    //实例化一个CALayer:ca1;

             ca1.backgroundColor = [UIColor whiteColor].CGColor;

    //设置ca1的背景颜色。

         ca1.frame = CGRectMake(50, 500, 200, 200);

    //设置ca1的frame(坐标和大小);

        ca1.delegate = self;

    //ca1.delegate = self;这一步非常重要,

        ca1.name = @"fuck";

    //这个ca1.name设置不设置都行,没有用到。

        [ca1 setNeedsDisplay];

    //ca1调用setNeedsDisplay,来绘制自己的页面。

     

        CALayer *ca2 = [CALayer layer];

        ca2.backgroundColor = [UIColor orangeColor].CGColor;

        ca2.frame = CGRectMake(300, 500, 200, 200);

        ca2.name = @"you";

        ca2.delegate = self;

        [ca2 setNeedsDisplay];

    //ca2的和ca1没什么区别,就是颜色和坐标不同,还有name不同。

        

        CALayer *ca3 = [CALayer layer];

        ca3.backgroundColor = [UIColor yellowColor].CGColor;

        ca3.frame = CGRectMake(550, 500, 200, 200);

        ca3.name = @"man";

        ca3.delegate = self;

        [ca3 setNeedsDisplay];

    //ca3的和ca1没什么区别,就是颜色和坐标不同,还有name不同。    

     

        [self.view.layer addSublayer:ca1];

    //向self.view.layer添加ca1,记住一定要是self.view的layer中添加。

        [self.view.layer addSublayer:ca2];

    //向self.view.layer添加ca2

        [self.view.layer addSublayer:ca3];

    //向self.view.layer添加ca3

        self.layer1 = ca1;

        //将ca1赋值给self.layer1;

        self.layer2 = ca2;

        //将ca2赋值给self.layer2;

        self.layer3 = ca3;

        //将ca2赋值给self.layer3;

    }

     

    //这个方法是很重要的:-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx,传进来两个参数(CALayer *)类型的layer和(CGContextRef)类型的ctx,也就是说我们在调用[ca1 setNeedsDisplay]的时候他传进来的layer==ca1因为我们将ca1赋值给了self.layer1所以layer也==self.layer1,ctx是ca1这个层的上下文,也就相当于是一个画板,让我们在上边重绘,这个方法就相当于UIView的:-(void)drawRect;方法,能理解理解,不能理解你就知道他就是传进来两个参数,一个层,一个画板,在我们调用[ca1 setNeedsDisplay]的时候;

    -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx

    {

        NSLog(@"layer.name ==== %@",layer.name);

    //输出当前的layer的name,可有可无,只是告诉我们当前是哪个layer。

         if(layer == self.layer1)

    //这里加一个判断,当layer是self.layer1的时候是一种重绘办法,也就是说三个层self.layer1,self.layer2,self.layer3你可能需要一个画树,一个画草,一个画小鸟,只是举个例子哦,我画不了小鸟的。我这里画的是,self.layer1:一个渐变的层,右上角画了一个灰色的三角符号,self.layer2:在一个层的右上角画了一个蓝色的三角符号,self.layer3:在一个层的右上角画了一个黑色的三角符号。

         {

             CGGradientRef myGradient;

             CGColorSpaceRef myColorSpace;

             size_t locationCount = 3;

             CGFloat locationList[] = {0.0,0.1,1.0};

             CGFloat colorList[]={

                 1.0,0.0,0.5,1.0,

                 1.0,0.0,1.0,1.0,

                 0.3,0.5,1.0,1.0,

             };

             myColorSpace = CGColorSpaceCreateDeviceRGB();

             myGradient = CGGradientCreateWithColorComponents(myColorSpace, colorList, locationList, locationCount);//核心函数就是这个了,要搞清楚一些量化的东西了.

             CGPoint startPoint,endPoint;

             startPoint.x = 0;

             startPoint.y = 0;

             endPoint.x = CGRectGetMaxX(layer.bounds);

             endPoint.y = CGRectGetMaxY(layer.bounds);

             CGContextDrawLinearGradient(ctx, myGradient, startPoint, endPoint, 0);//这个是绘制的,你可以通过裁剪来完成特定形状的过度。

             CGColorSpaceRelease(myColorSpace);

             CGGradientRelease(myGradient);

             CGContextSetLineCap(ctx, kCGLineCapSquare);

             

             CGContextSetLineWidth(ctx, 1.0);

             

             CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);

    //上边是设置层的渐变色的过程,代码具体我不讲了,没事自己研究研究IOS的一些绘画代码,以此为分割线,下边是画的一个简单的三角形。         

     

             CGContextBeginPath(ctx);

             //开始一个路径

             CGContextMoveToPoint(ctx, layer.bounds.size.width * 3/4,layer.bounds.origin.y + 1);

             //设置一个起点坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width - 1, layer.bounds.origin.y + 1);

             //移动到下一个点的坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width - 1, layer.bounds.size.width *1/4);

             //移动到下一个点的坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width * 3/4, layer.bounds.origin.y +1);

             //移动到下一个点的坐标

             

             CGContextSetFillColorWithColor(ctx, UIColorFromRGB(0x555555).CGColor);

    //设置填充色,这里就用到了我们上边定义的UIColorFromRGB()一般这个括号里输入的是(0x******)零x开头的后边是6位16进制的RGB颜色数,0x不变变换后边六位数就可以改变颜色,网上一搜一大把,或者我的博客里找有专门的RGB颜色网站集合。

             CGContextFillPath(ctx);

             //填充.

             

             CGContextStrokePath(ctx);

    //连接所有点,就成了一个三角形了。

         }

         if(layer == self.layer2)

         {

             CGContextSetLineCap(ctx, kCGLineCapSquare);

             

             CGContextSetLineWidth(ctx, 1.0);

             

             CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);

             

             CGContextBeginPath(ctx);

             

             CGContextMoveToPoint(ctx, layer.bounds.size.width * 3/4,layer.bounds.origin.y + 1);

             //设置一个起点坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width - 1, layer.bounds.origin.y + 1);

             //移动到下一个点的坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width - 1, layer.bounds.size.width *1/4);

             //移动到下一个点的坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width * 3/4, layer.bounds.origin.y +1);

             //移动到下一个点的坐标

             

             CGContextSetFillColorWithColor(ctx, UIColorFromRGB(0x8F9FEA).CGColor);

             CGContextFillPath(ctx);

             CGContextStrokePath(ctx);

    //这个和self.layer1的画三角一样,只是我改变了他的RGB便于区别。

             //把这些坐标连起来

         }

         if(layer == self.layer3)

         {

             CGContextSetLineCap(ctx, kCGLineCapSquare);

             

             CGContextSetLineWidth(ctx, 1.0);

             

             CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);

             

             CGContextBeginPath(ctx);

             

             CGContextMoveToPoint(ctx, layer.bounds.size.width * 3/4,layer.bounds.origin.y + 1);

             //设置一个起点坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width - 1, layer.bounds.origin.y + 1);

             //移动到下一个点的坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width - 1, layer.bounds.size.width *1/4);

             //移动到下一个点的坐标

             CGContextAddLineToPoint(ctx, layer.bounds.size.width * 3/4, layer.bounds.origin.y +1);

             //移动到下一个点的坐标

             

             CGContextSetFillColorWithColor(ctx, UIColorFromRGB(0x000000).CGColor);

             CGContextFillPath(ctx);

             

             

             CGContextStrokePath(ctx);

    //这个和self.layer2的画三角一样,也只是改变了颜色。

         }

    }

    @end
     
    运行结果是这样的:同一个页面多个CALayer重绘的办法[原创]
    弄了很久,想方便你们,拿走请注明出处。
  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5118817.html
Copyright © 2011-2022 走看看