zoukankan      html  css  js  c++  java
  • drawRect: 小注

    drawRect:()默认是什么都不做的,

    1.如果基础一个UIView,子类可以使用Core Graphics框架和UIKit在这个方法中完成绘制操作。

    2.如果使用其他方法设置子类的content,可以不适用这个方法。

    如:你只是改变背景颜色,或者使用他的underlying layer对象(包括直接使用子类的基本层,或者子类添加subview)。

    3.如果是直接从一个UIView对象(包括所有系统提供的UIView的子类)继承来的selfVIew,打开这个方法的时候可以不用call super,但是如果你是继承一个自定义的UIView子类,这样myView:selfView,则如果myView需要使用到drawRect:方法的时候需要call super at some point in your implementation。

    4.这个方法在第一次displayed view的时候,或者一个事件发生需要改变可见视图的时候被自动调用,你不能够直接调用这个方法,如果需要,可以使用方法setNeedsDisplay或者setNeedsDisplayInRect:替代方法来实现。

    5、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect ,让系统自动调该方法。

    6、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法。

    7、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕

    ——————————代码:

    #import "InfoView.h"

    @interface UIView (CanvasImageView)//类别加一个

    //多边形

    -(void)drawPolygon:(NSArray *)pointArray;

    @end

    @implementation UIView (CanvasImageView)

    -(void)drawPolygon:(NSArray *)pointArray

    {

    //    NSAssert(pointArray.count>=2,@"数组长度必须大于等于2");

    //    NSAssert([[pointArray[0] class] isSubclassOfClass:[NSValue class]], @"数组成员必须是CGPoint组成的NSValue");

        CGContextRef     context = UIGraphicsGetCurrentContext();

        NSValue *startPointValue = pointArray[0];

        CGPoint  startPoint      = [startPointValue CGPointValue];

        CGContextMoveToPoint(context, startPoint.x, startPoint.y);

        for(int i = 1;i<pointArray.count;i++)

        {

    //        NSAssert([[pointArray[i] class] isSubclassOfClass:[NSValue class]], @"数组成员必须是CGPoint组成的NSValue");

            NSValue *pointValue = pointArray[i];

            CGPoint  point      = [pointValue CGPointValue];

            CGContextAddLineToPoint(context, point.x,point.y);

        }

        [[UIColor redColor] setFill];

        [[UIColor yellowColor] setStroke];

         CGContextDrawPath(context, kCGPathFillStroke);

    }

    @end

    @implementation InfoView

    - (id)initWithFrame:(CGRect)frame

    {

        self = [super initWithFrame:frame];

        if (self) {

            // Initialization code 

        }

        return self;

    }

    /* Only override drawRect: if you perform custom drawing. An empty implementation adversely affects performance during animation.*/

    - (void)drawRect:(CGRect)rect

    {

        // Drawing code

        CGPoint uppoint = CGPointMake(rect.size.width/2, rect.size.height/2-15);

        CGPoint downpoint = CGPointMake(rect.size.width/2, rect.size.height/2+15);

        CGPoint arrowpoint = CGPointMake(0, rect.size.height);

        NSArray *pointArr = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:uppoint],[NSValue valueWithCGPoint:downpoint],[NSValue valueWithCGPoint: arrowpoint],[NSValue valueWithCGPoint:uppoint], nil];

        //这一块代码绘图使用的CGContext,只能够再DrawRect:方法中使用,放到别的地方将失效,因为最终调用了这个方法,会将VIew的从新绘制,并将之前的尝试给覆盖了。在别的地方可以进行underlying layer层次的绘图操作~

        [self drawPolygon:pointArr];

    }

    @end

  • 相关阅读:
    如何用vue-cli4.0构建多页面模板脚手架!?本文实战教你
    最新ES6+中数组的拓展总结,面试必备
    2020最新Vue项目性能优化实战,80%的人都不会
    vue 运行环境安装与配置
    css 文本缩进+间距+溢出
    vue 生成二维码+截图
    vue 缓存界面
    webpack 4 入坑及爬坑记录
    移动端页面使用单位的问题:关于px、百分比、em、rem开发中逐渐转换的问题记录
    基于vuejs和element-ui的表单验证——循环表单和循环表格验证
  • 原文地址:https://www.cnblogs.com/longtaozi/p/3839951.html
Copyright © 2011-2022 走看看