drawrect_drawrectangle - CSDN
  • drawRect()

    2013-04-08 22:27:59
    drawRect public void drawRect(int x, int y, int width, int height)绘制指定矩形的边框。矩形的左边和右边位于 x 和 x + width。顶边和底边位于 y 和 y + height。使用图形上下文的当前颜色绘
    drawRect
    public void drawRect(int x,
                         int y,
                         int width,
                         int height)绘制指定矩形的边框。矩形的左边和右边位于 x 和 x + width。顶边和底边位于 y 和 y + height。使用图形上下文的当前颜色绘制该矩形。 
    
    参数:
    x - 要绘制矩形的 x 坐标。
    y - 要绘制矩形的 y 坐标。
    width - 要绘制矩形的宽度。
    height - 要绘制矩形的高度。
    展开全文
  • 昨天写了一个View视图,在上面画了一个矩形,这个视图的最后效果如图: 主要代码如下: package com.view; import com.example.testsql.R; import android.content....import android.graphics.BitmapFa

    昨天写了一个View视图,在上面画了一个矩形,这个视图的最后效果如图:

    主要代码如下:

    package com.view;
    
    import com.example.testsql.R;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.view.View;
    
    public class MyView extends View {
    
    	MyView(Context context) {
    		super(context);
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		// TODO Auto-generated method stub
    		super.onDraw(canvas);
    
    		// 首先定义一个paint
    		Paint paint = new Paint();
    
    		paint.setColor(Color.RED);
    		// 设置样式-空心矩形
    		paint.setStyle(Style.STROKE);
    		// 绘制一个矩形
    		canvas.drawRect(150, 75, 250, 120, paint);
    
    		paint.setColor(Color.YELLOW);
    		canvas.drawRect(250, 75, 350, 120, paint);
    
    		paint.setColor(Color.GREEN);
    
    		canvas.drawRect(150, 120, 250, 170, paint);
    
    		paint.setColor(Color.CYAN);
    		canvas.drawRect(250, 120, 350, 170, paint);
    
    		// 绘文字
    		// 设置颜色
    		paint.setColor(Color.BLACK);
    		// 绘文字
    		canvas.drawText("Hello1", 200, 90, paint);
    		canvas.drawText("Hello2", 300, 100, paint);
    		canvas.drawText("Hello3", 200, 150, paint);
    		canvas.drawText("Hello4", 300, 170, paint);
    
    		// 绘图
    		// 从资源文件中生成位图
    		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
    				R.drawable.back);
    
    		// 绘图
    		canvas.drawBitmap(bitmap, 270, 140, paint);
    	}
    
    }
    


    其中关于canvas.drawRect(150, 75, 250, 120, paint); 的这个方法,我想说一下关于Canvas 的 drawRect 几个参数理解,

    其实网上大部分的解释是

    left:矩形的左边位置。

    top:矩形的上边位置。

    right:矩形的右边位置。

    bottom:矩形的下边位置。

    但是我个人怎么看都不是很懂,于是我就开始问自己一个问题,如果要两个点来确定一个矩形,那这两个点应该怎样放呢?不用多想,一定是对角!那确定了对角关系后,我就开始尝试画四方格,实际上也就是四个矩形拼凑而成。 于是我自己在纸上画了一下,如下图:

    canvas.drawRect(150, 75, 250, 120, paint);  A1     A2
    canvas.drawRect(250, 75, 350, 120, paint);        B1    B2
    canvas.drawRect(150, 120, 250, 170, paint);     C1    C2
    canvas.drawRect(250, 120, 350, 170, paint);     D1    D2

    只要先确认第一个矩形,那么B1的坐标就是于A1同Y轴与A2同x轴。以此类推。

    canvas.drawText("Hello1", 200, 90, paint);

    canvas.drawText("Hello2", 300, 100, paint);

    canvas.drawText("Hello3", 200, 150, paint);

    canvas.drawText("Hello4", 300, 170, paint);

    而文字hello1,只要x轴只要在A1和B1的x轴之间,Y轴在B1和A2的Y轴之间,文字就不会出边框,其它以此类推。

     

    而这个类的调用方法也很简单:

    package com.view;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    
    @SuppressLint("WrongCall")
    public class DisplayView extends Activity{
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		
    		super.onCreate(savedInstanceState);
    	
    		 setContentView(new MyView(this));
    	
    	}	
    	
    }
    


     

     

    展开全文
  • 我在整理自己曾经收藏的技术文章时发现这么一个文章, 是关于layoutSubviews和drawRect的触发时机的。今天,就根据这篇文章来做一些测试,证实一些文章中的说法。 请先以了解为主阅读下面的这个文章,如下: 一、...

    探究前了解

    我在整理自己曾经收藏的技术文章时发现这么一个文章, 是关于layoutSubviews和drawRect的触发时机的。今天,就根据这篇文章来做一些测试,证实一些文章中的说法。
    请先以了解为主阅读下面的这个文章,如下:

    一、layoutSubviews在以下情况下会被调用:
    1、init初始化不会触发layoutSubviews。
    2、addSubview会触发layoutSubviews。
    3、改变一个UIView的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
    4、滚动一个UIScrollView引发UIView的重新布局会触发layoutSubviews。
    5、旋转Screen会触发父UIView上的layoutSubviews事件。
    6、直接调用setNeedsLayout 或者 layoutIfNeeded。

    二、drawRect在以下情况下会被调用:
    1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).
    2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
    3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
    4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
    以上1,2推荐;而3,4不提倡

    三、drawRect方法使用注意点:
    1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
    2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
    3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来调用setNeedsDisplay实时刷新屏幕

    探究

    layoutSubviews调用时机测试

    #import <UIKit/UIKit.h>
    
    @interface TestView : UIView
    
    @end
    
    
    #import "TestView.h"
    
    @implementation TestView
    
    - (id)initWithFrame:(CGRect)frame
    {
      self = [super initWithFrame:frame];
      if (self)
      {
        NSLog(@"initWithFrame:%@" ,NSStringFromCGRect(frame));
      }
      return self;
    }
    
    - (void)layoutSubviews
    {
      NSLog(@"layoutSubviews %@", self);
      [super layoutSubviews];
    }
    
    @end
    
    #import "RootViewController.h"
    #import "TestView.h"
    
    @interface RootViewController ()
    
    @property (nonatomic, strong) NSTimer   *timer;
    @property (nonatomic, strong) TestView  *largeView;
    @property (nonatomic, strong) TestView  *smallView;
    
    @end
    
    @implementation RootViewController
    
    
    - (void)viewDidLoad
    {
      [super viewDidLoad];
    
      // 1、init初始化不会触发layoutSubviews [正确的]
      // 2、addSubview会触发layoutSubviews [不完全正确,当frame为0时是不会触发的]
      // 3、设置view的Frame的 size 发生变化会触发layoutSubviews [正确]
      
    //	[self test_1];
    //	[self test_2];
    //	[self test_3];
      
      // 4、滚动一个UIScrollView会触发layoutSubviews[错误,不用滚动就会触发]
    //	[self test_4];
      
      // 5、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
      [self test_5];
    }
    
    
    - (void)test_1
    {
      /* 
       解释:
       
       走了initWithFrame:方法,但是又有frame值为{{0, 0}, {0, 0}},并不需要绘制任何的东西,
       所以即使添加了test,也没必要绘制它,同时也验证了addSubview会触发layoutSubviews是错
       误的,只有当被添加的view有着尺寸的时候才会触发layoutSubviews
       */
      
      TestView *test = [TestView new];
      [self.view addSubview:test];
    }
    
    - (void)test_2
    {
      TestView *test = [TestView new];
      test.frame = CGRectMake(0, 0, 100, 100);
      [self.view addSubview:test];
    }
    
    - (void)test_3
    {
      /*
       解释:
       
       layoutSubviews这个方法自身无法调用,是被父类添加的时候才执行的方法
       */
      
      TestView *test = [TestView new];
      test.frame = CGRectMake(0, 0, 50, 50);
      UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
      [test addSubview:showView];
    }
    
    - (void)test_4
    {
      CGRect rect	= self.view.bounds;
      CGFloat height = rect.size.height;
      CGFloat width  = rect.size.width;
      
      UIScrollView *rootScroll = [[UIScrollView alloc] initWithFrame:self.view.bounds];
      NSArray *data			= @[@"", @"", @"", @""];
      [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        TestView *tmp		= [[TestView alloc] initWithFrame:CGRectMake(width*idx, 0,
                                          width, height)];
        [rootScroll addSubview:tmp];
      }];
      rootScroll.contentSize   = CGSizeMake(width * data.count, height);
      [self.view addSubview:rootScroll];
    }
    
    - (void)test_5
    {
      _timer = [NSTimer scheduledTimerWithTimeInterval:1.f
                            target:self
                          selector:@selector(timerEvent:)
                          userInfo:nil
                           repeats:YES];
      _largeView = [[TestView alloc] initWithFrame:self.view.bounds];
      [self.view addSubview:_largeView];
      
      _smallView = [[TestView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
      [_largeView addSubview:_smallView];
    }
    
    - (void)timerEvent:(id)sender
    {
      _smallView.frame = CGRectMake(arc4random()%100 + 20,
                      arc4random()%100 + 20,
                      arc4random()%100 + 20,
                      arc4random()%100 + 20);
      NSLog(@"_smallView %@", _smallView);
      NSLog(@"_smallView %@", _largeView);
    }
    
    @end
    

    官方文档中介绍:

    You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.

    layoutSubviews 测试后的结论:

    1.一个view是不能够自己调用layoutSubviews,如果要调用,需要调用 setNeedsLayout或者 layoutIfNeeded
    2.如果view的frame值为0,即使被addSubview也不会调用layoutSubviews
    3.如果一个view的frame中的 size 值前后发生了改变,那么layoutSubviews也会被触发。 重新设置 frame 但 size 不变的话,是不会触发的

    drawRect调用时机测试

    #import <UIKit/UIKit.h>
    
    @interface AView : UIView
    
    @end
    
    #import "AView.h"
    
    @implementation AView
    
    - (void)drawRect:(CGRect)rect {
        // Drawing code
        
        NSLog(@"drawRect");
        
    }
    -(void)layoutSubviews
    {
        NSLog(@"layoutSubviews");
    }
    
    @end
    
    #import "ViewController.h"
    #import "AView.h"
    @interface ViewController ()
    @property (nonatomic, strong)AView *a;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        self.a = [[AView alloc]initWithFrame:CGRectMake(0, 0, 300, 200)];
        self.a.backgroundColor = [UIColor greenColor];
        [self.view addSubview:_a];
        
        
    }
    - (void)viewWillAppear:(BOOL)animated
    {
        
    }
    -(void)viewDidAppear:(BOOL)animated
    {
        
    }
    - (IBAction)click:(id)sender {
    //    self.a.backgroundColor = [UIColor redColor];
        self.a.frame = CGRectMake(50, 10, 200, 200);
    //    [self.a setNeedsLayout];
    
    }
    @end
    
    

    drawRect 测试后的结论:

    1.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 调用是在Controller->viewWillAppear, Controller->viewDidAppear 两方法之间调用的.所以这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).
    2.直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是frame的 size 不能为0
    3.当 addSubview 时, frame 中的 size 为 (0,0)时, 不会触发 drawRect 方法
    4.改变 view 的 size 的时候, 不会触发 drawRect, 但是更改其颜色变化的时候, 会触发 drawRect
    5.当一个view第一次显示或当一个事件发生,该事件导致view的可视部分无效时,才会被调用。

    drawRect官方文档:

    The default implementation of this method does nothing. Subclasses that use technologies such as Core Graphics and UIKit to draw their view’s content should override this method and implement their drawing code there. You do not need to override this method if your view sets its content in other ways. For example, you do not need to override this method if your view just displays a background color or if your view sets its content directly using the underlying layer object.

    该方法的默认实现并不会做任何事情。子类使用诸如Core Graphics和UIKit技术绘制其控件的内容应该重写该方法,并且把实现的代码写在该方法中。如果你控件的内容是用其他方式设置的,那么你就不需要重写该方法。例如,如果你的控件仅仅只是展示背景颜色,则不需要重写该方法或者你的控件内容是直接使用layer对象设置的,也不需要调用该方法。

    By the time this method is called, UIKit has configured the drawing environment appropriately for your view and you can simply call whatever drawing methods and functions you need to render your content. Specifically, UIKit creates and configures a graphics context for drawing and adjusts the transform of that context so that its origin matches the origin of your view’s bounds rectangle. You can get a reference to the graphics context using the UIGraphicsGetCurrentContext function, but do not establish a strong reference to the graphics context because it can change between calls to the drawRect: method.

    当调用该方法时,UIKit框架已经为你的控件配置好合适的绘制环境,你可以轻松的调用任何绘制方法和函数来渲染你的控件内容。特别地,UIKit会创建并配置一个图形上下文,然后调整该上下文的形变,以使该图形上下文的原点与你控件的bounds的原点相匹配。你可以通过调用UIGraphicsGetCurrentContext函数获得图形上下文的引用,但是不要对该图形上下文建立强引用,因为多次调用drawRect:方法期间,图形上下文会改变。

    If you subclass UIView directly, your implementation of this method does not need to call super. However, if you are subclassing a different view class, you should call super at some point in your implementation.

    如果你直接创建UIView的子类,该方法的实现不需要调用super。但是,如果你创建的是不同的view类,你需要在实现代码的某个时候调用super。

    This method is called when a view is first displayed or when an event occurs that invalidates a visible part of the view. You should never call this method directly yourself. To invalidate part of your view, and thus cause that portion to be redrawn, call the setNeedsDisplay or setNeedsDisplayInRect: method instead.

    当一个view第一次显示或当一个事件发生,该事件导致view的可视部分无效时,才会被调用。永远不要手动调用该方法。为了使控件的某个部分失效,并且因此导致某个部分重绘,应该调用setNeedsDisplay或者setNeedsDisplayInRect:而不是drawRect:方法。

    参考资料:
    When is layoutSubviews called?

    展开全文
  • setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。 综上两个方法都是异步执行的,...

    UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。

    综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。

     

    先大概看下ios layout机制相关的这几个方法:

    - (CGSize)sizeThatFits:(CGSize)size

    - (void)sizeToFit

    ——————-

    - (void)layoutSubviews

    - (void)layoutIfNeeded

    - (void)setNeedsLayout

    ——————–

    - (void)setNeedsDisplay

    - (void)drawRect

     

    一、

    layoutSubviews在以下情况下会被调用:

    1、init初始化不会触发layoutSubviews。

    2、addSubview会触发layoutSubviews。

    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。

    4、滚动一个UIScrollView会触发layoutSubviews。

    5、旋转Screen会触发父UIView上的layoutSubviews事件。

    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

    7、直接调用setLayoutSubviews。

    8、直接调用setNeedsLayout。

    在苹果的官方文档中强调:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want. 

    layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。

    反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

     

     刷新子对象布局

    -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写

    -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

    -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

    如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

    在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]

     

    二、

    drawRect在以下情况下会被调用:

    1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量 值).

    2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。

    sizeToFit会自动调用sizeThatFits方法;

    sizeToFit不应该在子类中被重写,应该重写sizeThatFits

    sizeThatFits传入的参数是receiver当前的size,返回一个适合的size

    sizeToFit可以被手动直接调用

    sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

    3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。

    4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。

    -setNeedsDisplay方法:标记为需要重绘,异步调用drawRect

    -setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

    以上1,2推荐;而3,4不提倡

     

    drawRect方法使用注意点:

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

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

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

     

    三、

    layoutSubviews对subviews重新布局

    layoutSubviews方法调用先于drawRect

    setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews

    layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的

    layoutIfNeeded遍历的不是superview链,应该是subviews

    drawRect是对receiver的重绘,能获得context

    setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘

    展开全文
  • 两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。 layoutSubviews对subviews重新布局 layoutSubviews方法调用先于drawRect

    两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。

    layoutSubviews对subviews重新布局
    layoutSubviews方法调用先于drawRect 

    展开全文
  • layoutsubviews 与drawRect

    2014-07-23 14:12:55
    layoutSubviews方便数据计算,drawRect方便视图重绘。     layoutSubviews在以下情况下会被调用:   1、init初始化不会触发layoutSubviews。 2、addSubview会触发layoutSubviews。 3、设置view...
  • 布局/定位相关 @interface UIView(UIViewHierarchy) - (void)setNeedsLayout; 注意: 1.在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews。 - (void)layoutIfNeeded;...
  • 通过重写UIView的drawRect方法进行绘制使用,如绘制文本字符、绘制图片、绘制图形等。 注意事项: 1、设置frame的属性,或调用setNeedsDisplay时才会调用drawRect方法。 2、在绘制过程中 (1)针对实际情况获取图形...
  • UIView的DrawRect方法,简单说:用来干啥的:就是用来绘图的。如果需要在View中绘制新的一些图形,比如曲线,直线,椭圆等,都需要重写DrawRect方法才可以;什么时候调用:当View显示的时候调用(ViewWillAppear和...
  • DrawRect 图形

    2014-06-11 12:56:51
    DrawRect - (void)drawRect:(CGRect)rect {  // Drawing code  // 当前视图绘制信息  CGContextRef context = UIGraphicsGetCurrentContext();  // 设置线条的宽度  CGContextSetLineWidth(context,...
  • drawRect:调用周期

    2018-06-08 19:06:51
    iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。 重绘操作仍然在...
  • 一、重绘机制iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。...
  • 对于drawRect的评价倒是一点都不过分。在平日的开发中,随意覆盖drawRect方法,稍有不慎就会让你的程序内存暴增。下面我们来看一个例子。去年的某天午后,北京的雾霾依旧像现在这样醇厚,我的同事辉哥像往常一样与我...
  • 这个时候如何处理,那么你就要好好学习一下这个canvas.drawRect()的用法,它可以帮助你解决这个问题!言归正传,先看几个示例你就懂了. 一. 首先我们要看canvas.drawRect()方法的最后一个参数(至关重要一个参数)
  • 创建自定义视图,在继承UIView之后,最关键的就是重写drawRect方法了。 这里暂不介绍具体怎样重写这个方法来实现想要的效果,重点介绍drawRect方法所带的CGRect类型的参数的作用。 drawRect接受的唯一参数就是"脏...
  • 绘图中的drawRect

    2019-06-19 15:30:13
    1 为什么要在drawRect方法里面写绘图代码 因为只有在这个方法中才能获取到当前view相关的图形上下文对象 有了这个图形上写文对象后才能进行绘图操作 2 为什么是在这个方法中能够获取图形上下文? 图形上下文对象...
  • drawRect & 内存 -> 深究

    2016-04-05 12:29:37
    在平日的开发中,随意覆盖drawRect方法,稍有不慎就会让你的程序内存暴增。下面我们来看一个例子。 去年的某天午后,北京的雾霾依旧像现在这样醇厚,我的同事辉哥像往常一样与我楼下约烟。我见辉哥表情凝重,便...
  • iOS DrawRect简单使用

    2016-05-16 15:56:09
    今天发现有些人被表格所难住了,我的想法是用 DrawRect进行表格的绘制,那么问题来了,对于 DrawRect我感觉只有大神对其会比较了解,于是我就试着写下关于 DrawRect的简单用法,至于更深的,还需要话时间去研究,今天只...
  • iOS重绘机制drawRect

    2019-08-20 18:55:03
    iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。 下面先说明一下...
  • 关于view重绘drawRect

    2012-12-28 18:53:16
    有了view的子类,只要 重载一个方法drawRect -(void)drawRect:(CGRect)aRect; 它的参数是个矩形,这个矩形就是你要重绘的区域,你可以忽略参数,它只是为了性能优化,只在固定的区域绘图. 注意!!! 永远不要去...
1 2 3 4 5 ... 20
收藏数 44,874
精华内容 17,949
关键字:

drawrect