Quartz 2D 请求上下文与强制重绘

CGContextRef 

在调用drawRect:方法之前,视图对象会自动配置其描画环境,使代码可以立即进行描画。作为这些配置的一部分,UIView 对象会为当前绘制环境创建一个图形上下文,这个上下文就是CGContextRef
封装类型。

CGContextRef的对象是以栈的形式存放的,把对象放入栈中,使用CGContextSaveGState方法,将对象从栈中取出来,使用的是CGContextRestoreGState方法。

分析以下代码:

CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 将上下文压入栈中
    CGContextSaveGState(ctx);

    CGContextSetLineWidth(ctx, 10);
    CGContextSetLineCap(ctx, kCGLineCapRound);
    [[UIColor redColor] set];

    // 画线
    CGContextMoveToPoint(ctx, 50, 50);
    CGContextAddLineToPoint(ctx, 300, 450);
    CGContextStrokePath(ctx);

    CGContextRestoreGState(ctx);
    // 第二条线
    CGContextMoveToPoint(ctx, 30, 80);
    CGContextAddLineToPoint(ctx, 100, 350);
    CGContextStrokePath(ctx);

    CGContextRelease(ctx);

在绘制第二条线之前,先用CGContextRestoreGState方法获取到栈中的上下文对象,这个上下文对象是没有任何附加样式的。所以最终绘制出来的效果图如下:

限制上下文的绘制区域

默认情况下,上下文的绘制区域就是整个View所在的区域,不过我们也可以手动的规定绘制区域。可以使用CGContextClip进行绘制区域的裁切。示例代码如下:

CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextAddArc(ctx, 150, 150, 30, 0, M_PI*2, 1);
    // 裁切操作一定要放在绘制之前(裁切之后的操作,只能在裁切制定的区域进行相印的绘图操作了)
    CGContextClip(ctx);
    CGContextFillPath(ctx);

    UIImage *myImage = [UIImage imageNamed:@"www.jpg"];
    [myImage drawAtPoint:CGPointMake(110, 120)];

    CGContextRelease(ctx);

代码中,使用了CGContextClip(ctx); 所以绘制图片的区域只能在定义的圆形区域了,其他部分的任何绘制,都不会显示,最终效果图:

强制重绘: setNeedsDisplay

默认情况下,绘制工作只会在View第一次显示的时候调用,但可以通过[self setNeedsDisplay]进行手动的调用工作。

Demo:

当你拖动UISlider,上面的圆的半径也一直跟着变换。实现思路就是,UISlider的值在变化的时候,让上面的圆的半径也一直跟随着变化,并且一直在重绘。

UISlider的事件代码:

- (IBAction)drawArc:(UISlider *)sender {
    self.drawView.radius = sender.value;
}

DrawView中得主要代码:

-(void)setRadius:(CGFloat)radius {
    _radius = radius;
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    CGContextRef cxt = UIGraphicsGetCurrentContext();

    CGContextAddArc(cxt, 100, 100, self.radius, 0, M_PI*2, 1);

    CGContextStrokePath(cxt);
}
时间: 2024-08-04 03:02:59

Quartz 2D 请求上下文与强制重绘的相关文章

Quartz 2D 图形上下文栈 矩阵 裁剪

Quartz 2D 图形上下文栈  矩阵 1 // 2 // DJVIew.m 3 // 图形上下文栈 4 // 5 // Created by zjj on 15/6/30. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import "DJVIew.h" 10 11 @implementation DJVIew 12 13 - (void)drawRect:(CGRect)rect 14 { 15 CGCo

Quartz 2D简介

1.Quartz 2D是一种二维绘图库,它与iphone OS紧密结合在一起,能协同所有相关框架进行工作,包括Core Animation.OpenGL ES和UIKit. 2.Quartz的绘图功能取决与3个核心概念:上下文.路径和状态. ①上下文(context):用户描述将图形写入哪里,该过程由CGContextRef定义.通常,可以写入UIView或位图中. ②路径:路径是那些经常在Quartz中绘制的内容.起初,他们是线段和弧的集合,随后通过描边或填充的方式绘制到屏幕中. ③状态:状态

回流与重绘

强制重绘 ele.setAttribute( 'style' , ele.getAttribute('style' )); 1.当render tree (渲染树)中的部分或全部因为元素的规模尺寸,布局,隐藏等改变而需要重新构建时,称之为 回流 每个页面至少回流一次,就是在页面第一次加载的时候. 也就是将受修改影响的部分重新“流一遍”,回流完成后,浏览器重新绘制受影响的部分到屏幕中,该过程称之为  重绘 2.当渲染树中的一些元素需要更新属性,而这些属性只是影响外观风格,而不影响布局的,该元素重绘

iOS高级-QuartzCore框架-图形上下文栈、矩阵操作、裁剪、重绘(刷帧)

一.图形上下文栈1.自定义一个MJView,继承自UIView2.将默认View的Class设置为MJView3.实现drawRect:方法-(void)drawRect:(CGRect)rect{ //1.获得上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(): //将当前的ctx拷贝一份放到栈中 CGContextSaveGState(ctx): //设置绘图状态 CGContextSetLineWidth(ctx,10): [[UICo

Quartz 2D编程指南(2) - 图形上下文

一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息.字体信息.混合模式等. 我们可以通过几种方式来获取Graphics Context:Quartz提供的创建函数.Mac OS X框架或IOS的UIKit框架提供的函数.Quartz提供了多种Graphics Context的创建函数,包括bitmap和PDF,我们可以使用这些Graphics Co

[转] 使用Quartz 2D和OpenGLES绘图

有时应用程序需要能够自定义绘图.一个库是Quartz 2D,她是Core Graphics框架的一部分:另一个库是OpenGL ES,她是跨平台的图形库.OpenGL ES是跨平台图形库OpenGL的简化版.OpenGL ES是OpenGL的一个子集,OpenGL ES是专门为iPhone之类的嵌入式系统(因此缩写字母为“ES”)设计的. 12.1 图形世界的两个视图Quartz是一组函数.数据类型以及对象,专门设计用于直接在内存中对视图或图像进行控制.Quartz将正在绘制的视图或图像视为一个

iOS 开发 Quartz 2D+ UIBezierPath绘图大全详解

Quartz 2D 使用大全结构图 UIKIt UIBezierPath Core Graphics OpenGL ES Quartz2D的区别和联系 UIKIt:UIKit中的控件都是基于Core Graphics实现的 UIBezierPath:UIBezierPath属于UIKit,它是苹果对复杂的Core Graphics进行的封装,方便我们用OC语言进行简单的绘图 Core Graphics:是一套基于C语言的API,支持向量图形,线.形状.图案.路径.剃度.位图图像和pdf 内容的绘

绘图与滤镜全面解析--Quartz 2D 、Core Image

绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Qu

高性能WEB开发:重排与重绘

DOM编程可能最耗时的地方,重排和重绘. 1.什么是重排和重绘 浏览器下载完页面中的所有组件--HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构--DOM树和渲染树. DOM树表示页面结构,渲染树表示DOM节点如何显示.DOM树中的每一个需要显示的节点在渲染树种至少存在一个对应的节点(隐藏的DOM元素disply值为none 在渲染树中没有对应的节点).渲染树中的节点被称为"帧"或"盒",符合CSS模型的定义,理解页面元素为一个具有填充