CGBitmapContextCreate如何拷贝的当前CGContext中

oldmtn 2015-03-18 04:02:24
做一个画板程序, CGBitmapContextCreate返回的CGContextRef作为缓存。如何做?
...全文
288 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayuyellow 2015-12-11
  • 打赏
  • 举报
回复
我用一种偷巧的方法,就是 touchBegin的时候将画布用高清的方法存到一个image上 touchMove的时候用低清的方法缓存图像,并且用一个数组缓存下用户所有的操作。 touchEnd的时候,获取begin时候的image,重新绘制用户的所有操作,然后调一次高清的方法。 这样在MOve的时候会变低清,最终的时候变高清。流畅很多,不容易看的出来。
ayuyellow 2015-12-11
  • 打赏
  • 举报
回复
引用 19 楼 zhangao0086 的回复:
[quote=引用 18 楼 ayuyellow 的回复:] [quote=引用 3 楼 zhangao0086 的回复:] 我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
你的实现方法里, UIGraphicsBeginImageContext(self.bounds.size) 换成高清的api UIGraphicsBeginImageContextWithOptions(self.frame.size, false, [UIScreen mainScreen].scale); 在ipad air上面卡的不行了。2k的分辨率,就不能一直调用UIGraphicsBeginImageContextWithOptions这个方法了。 低清的方法UIGraphicsBeginImageContext就可以,但是可以看出边缘处模糊了。印上图案的画,图案也会模糊。 所以你的只是低清或者iphone的方案。[/quote] 猜测是因为图片缓存的太慢,手上没有 ipad air 可以测试怎么破(只有 ipad2)。感觉还是很容易优化好的。[/quote] 找台ipad retina就可以测试了。高分辨率太吃cpu,一些偷巧的办法应该可以优化,但是想从技术上突破,估计不能用UIGraphicsBeginImageContextWithOptions这个方法。
Bannings 2015-12-11
  • 打赏
  • 举报
回复
引用 21 楼 ayuyellow 的回复:
我用一种偷巧的方法,就是 touchBegin的时候将画布用高清的方法存到一个image上 touchMove的时候用低清的方法缓存图像,并且用一个数组缓存下用户所有的操作。 touchEnd的时候,获取begin时候的image,重新绘制用户的所有操作,然后调一次高清的方法。 这样在MOve的时候会变低清,最终的时候变高清。流畅很多,不容易看的出来。
我不认为需要偷巧的办法 每个需求都有最佳实现,我在 6sp 、4s、5s、iPad2 上都有测试通过,然而这些设备要么 CPU 太好,要么 CPU 和屏幕都一般,没有 air 那种情况,所以测试的时候没有测到 touchMove 的时候绘制低清图是一种好方案如果那样的话,只需要写一个 Board 的子类把画布的创建提取出来就行了
Bannings 2015-12-10
  • 打赏
  • 举报
回复
引用 18 楼 ayuyellow 的回复:
[quote=引用 3 楼 zhangao0086 的回复:] 我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
你的实现方法里, UIGraphicsBeginImageContext(self.bounds.size) 换成高清的api UIGraphicsBeginImageContextWithOptions(self.frame.size, false, [UIScreen mainScreen].scale); 在ipad air上面卡的不行了。2k的分辨率,就不能一直调用UIGraphicsBeginImageContextWithOptions这个方法了。 低清的方法UIGraphicsBeginImageContext就可以,但是可以看出边缘处模糊了。印上图案的画,图案也会模糊。 所以你的只是低清或者iphone的方案。[/quote] 猜测是因为图片缓存的太慢,手上没有 ipad air 可以测试怎么破(只有 ipad2)。感觉还是很容易优化好的。
ayuyellow 2015-12-10
  • 打赏
  • 举报
回复
引用 3 楼 zhangao0086 的回复:
我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
你的实现方法里, UIGraphicsBeginImageContext(self.bounds.size) 换成高清的api UIGraphicsBeginImageContextWithOptions(self.frame.size, false, [UIScreen mainScreen].scale); 在ipad air上面卡的不行了。2k的分辨率,就不能一直调用UIGraphicsBeginImageContextWithOptions这个方法了。 低清的方法UIGraphicsBeginImageContext就可以,但是可以看出边缘处模糊了。印上图案的画,图案也会模糊。 所以你的只是低清或者iphone的方案。
Bannings 2015-03-19
  • 打赏
  • 举报
回复
引用 8 楼 oldmtn 的回复:
[quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
引用 7 楼 zhangao0086 的回复:
我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。
Bannings 2015-03-19
  • 打赏
  • 举报
回复
我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
ReyZhang 2015-03-19
  • 打赏
  • 举报
回复
引用 5 楼 oldmtn 的回复:
[quote=引用 3 楼 zhangao0086 的回复:] 我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
我看了下代码 你从UIImageView里面继承的,并且这里面没有drawRect函数,直接使用自定义的的drawingImage绘制。 [/quote] zhangao 写的相对优雅一些。它把各个画笔封装成独立的类,通过“属性注入”的方式来切换画笔。封装了画笔的各个实现,使得Board类相对稳定。如果再有其它画笔加入的话,只需要继承BaseBrush,完成实现,调用的时候通过“属性注入”就可完成画笔的切换, 去除了swich语句的分支判断。他里面也有判断是否支持继续绘制的接口,在代码中有判断,如果支持也是使用drawInRect 方式将已存在的图片绘制到当前Image上下文
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
引用 3 楼 zhangao0086 的回复:
我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
我看了下代码 你从UIImageView里面继承的,并且这里面没有drawRect函数,直接使用自定义的的drawingImage绘制。
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
引用 3 楼 zhangao0086 的回复:
我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
你使用swift语言啊, 可惜咱们这xCode5编译不了啊。。。
Bannings 2015-03-19
  • 打赏
  • 举报
回复
引用 16 楼 oldmtn 的回复:
path限制主要有两点:做不了橡皮擦(我暂时没找到方法); 也可以使用背景色的Path来代替橡皮擦啊。。。
如果你要做一个支持改变背景色的app就接受不了了,我到时会发一个真正意义上的橡皮擦
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
path限制主要有两点:做不了橡皮擦(我暂时没找到方法); 也可以使用背景色的Path来代替橡皮擦啊。。。
Bannings 2015-03-19
  • 打赏
  • 举报
回复
引用 14 楼 oldmtn 的回复:
[quote=引用 12 楼 zhanglei5415 的回复:] [quote=引用 10 楼 oldmtn 的回复:] [quote=引用 9 楼 zhangao0086 的回复:] [quote=引用 8 楼 oldmtn 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里[/quote] 1. 你这个函数是在drawRect里面调用的嘛? 因为当你在 drawRect里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,UIGraphicsBeginImageContext返回的上下文是空的, 但是你若是在touchedMoved里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,在UIGraphicsBeginImageContext代码被调用之前,此时的当前上下文是什么?[/quote] CGContextRef context = UIGraphicsGetCurrentContext();这个绘制的上下文是必须在drawRect 方法中才可以调用。也就是说你需要在这个drawRect方法中来完成你的绘制。 而你的做法是将绘制与touch的动作建立了紧密的联系。其实你是可以参考zhangao的做法,在touch事件中只需要处理你在绘制中感兴趣的东西,就是touch的点(起始点,终止点)得到这些点,再通过[self setNeedsDisplay] 让drawRect 进行绘制。[/quote] I got it. 1. 做动作的时候, 记录划过的点, 并设定相关标志。然后指定重绘 2. 重绘时根据这些信息来绘制。 [/quote] 不要在drawRect里重画,不然你得把touchBegin和touchEnd记录到path里去,path限制主要有两点:做不了橡皮擦(我暂时没找到方法);虽然能放到CALayer里去(避免每次重绘),但是需要每个子类去创建CALayer(CALayer只能对应CGPath,无法对应CGContext),无法进行良好的封装。 我放在GitHub上的代码在持续更新,已经加入了橡皮擦等工具,还在找能够提升效率的方法
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
引用 12 楼 zhanglei5415 的回复:
[quote=引用 10 楼 oldmtn 的回复:] [quote=引用 9 楼 zhangao0086 的回复:] [quote=引用 8 楼 oldmtn 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里[/quote] 1. 你这个函数是在drawRect里面调用的嘛? 因为当你在 drawRect里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,UIGraphicsBeginImageContext返回的上下文是空的, 但是你若是在touchedMoved里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,在UIGraphicsBeginImageContext代码被调用之前,此时的当前上下文是什么?[/quote] CGContextRef context = UIGraphicsGetCurrentContext();这个绘制的上下文是必须在drawRect 方法中才可以调用。也就是说你需要在这个drawRect方法中来完成你的绘制。 而你的做法是将绘制与touch的动作建立了紧密的联系。其实你是可以参考zhangao的做法,在touch事件中只需要处理你在绘制中感兴趣的东西,就是touch的点(起始点,终止点)得到这些点,再通过[self setNeedsDisplay] 让drawRect 进行绘制。[/quote] I got it. 1. 做动作的时候, 记录划过的点, 并设定相关标志。然后指定重绘 2. 重绘时根据这些信息来绘制。
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
引用 11 楼 zhangao0086 的回复:
[quote=引用 10 楼 oldmtn 的回复:] [quote=引用 9 楼 zhangao0086 的回复:] [quote=引用 8 楼 oldmtn 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里[/quote] 1. 你这个函数是在drawRect里面调用的嘛? 因为当你在 drawRect里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,UIGraphicsBeginImageContext返回的上下文是空的, 但是你若是在touchedMoved里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,在UIGraphicsBeginImageContext代码被调用之前,此时的当前上下文是什么?[/quote] 当然不是在drawRect里,之前已经说了,是在自定义方法里,默认是没有上下文的,要自己通过UIGraphicsBeginImageContext开启一个新的[/quote] Hi, 参考你的回复。我使用了如下代码,可以实现基本的功能。 思想是这样... 1. 建立一成员变量UIImage 2. 第一次绘制时
    UIGraphicsBeginImageContext(self.bounds.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    CGRect rect = CGRectMake(12, 12, 300, 500); //_beginPoint.x, _beginPoint.y, _endPoint.x - _beginPoint.x, _endPoint.y - _beginPoint.y);
    
    // 实心矩形
    CGRect rc1 = rect;
    rc1.origin.x += 4;
    rc1.origin.y += 4;
    rc1.size.width -= 8;
    rc1.size.height -= 8;
    CGContextSetLineWidth(ctx, 5);
    CGContextSetRGBFillColor(ctx, 0.5, 0.2, 0, 1);
    CGContextFillRect(ctx, rc1);
    CGContextStrokePath(ctx);
    
    // …
    m_pCacheImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
绘制矩形A. 2. 第二次绘制时:
- (void)test2 {
    UIGraphicsBeginImageContext(self.bounds.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [m_pCacheImage drawAtPoint:CGPointMake(0, 0)];
    
    CGRect rect = CGRectMake(512, 312, 200, 200); //_beginPoint.x, _beginPoint.y, _endPoint.x - _beginPoint.x, _endPoint.y - _beginPoint.y);
    
    // 实心矩形
    CGRect rc1 = rect;
    rc1.origin.x += 4;
    rc1.origin.y += 4;
    rc1.size.width -= 8;
    rc1.size.height -= 8;
    CGContextSetLineWidth(ctx, 5);
    CGContextSetRGBFillColor(ctx, 0.5, 0.2, 0, 1);
    CGContextFillRect(ctx, rc1);
    CGContextStrokePath(ctx);
    
    // …
    m_pCacheImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    [self setNeedsDisplay];
}
构建一个上下文,将当前的UIImage先绘制上去,然后再绘制本次需要绘制的内容,完成后再刷新 3. drawRect里面只要简单的
- (void)drawRect:(CGRect)rect
{

    if( m_pCacheImage ) {
        [m_pCacheImage drawAtPoint:CGPointMake(0, 0)];
    }
}
就ok了。。。。
ReyZhang 2015-03-19
  • 打赏
  • 举报
回复
引用 10 楼 oldmtn 的回复:
[quote=引用 9 楼 zhangao0086 的回复:] [quote=引用 8 楼 oldmtn 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里[/quote] 1. 你这个函数是在drawRect里面调用的嘛? 因为当你在 drawRect里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,UIGraphicsBeginImageContext返回的上下文是空的, 但是你若是在touchedMoved里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,在UIGraphicsBeginImageContext代码被调用之前,此时的当前上下文是什么?[/quote] CGContextRef context = UIGraphicsGetCurrentContext();这个绘制的上下文是必须在drawRect 方法中才可以调用。也就是说你需要在这个drawRect方法中来完成你的绘制。 而你的做法是将绘制与touch的动作建立了紧密的联系。其实你是可以参考zhangao的做法,在touch事件中只需要处理你在绘制中感兴趣的东西,就是touch的点(起始点,终止点)得到这些点,再通过[self setNeedsDisplay] 让drawRect 进行绘制。
Bannings 2015-03-19
  • 打赏
  • 举报
回复
引用 10 楼 oldmtn 的回复:
[quote=引用 9 楼 zhangao0086 的回复:] [quote=引用 8 楼 oldmtn 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里[/quote] 1. 你这个函数是在drawRect里面调用的嘛? 因为当你在 drawRect里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,UIGraphicsBeginImageContext返回的上下文是空的, 但是你若是在touchedMoved里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,在UIGraphicsBeginImageContext代码被调用之前,此时的当前上下文是什么?[/quote] 当然不是在drawRect里,之前已经说了,是在自定义方法里,默认是没有上下文的,要自己通过UIGraphicsBeginImageContext开启一个新的
oldmtn 2015-03-19
  • 打赏
  • 举报
回复
引用 9 楼 zhangao0086 的回复:
[quote=引用 8 楼 oldmtn 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] 我是准备写一篇博客的,主要是说设计模式,以画板为例子。 我刚开始也是使用drawRect,但是限制很多,尤其是context无法保存,每次还是要重画;后来用layer保存每一条path,但是无法做到真正意义上的“橡皮檫”,只能做个假的:画笔颜色和背景色相同,而且path也不支持clearRect这样的方法;最后就采用了image的方式,之后我会想想怎么样让它不用每次重绘。
这里的“drawRect,但是限制很多,尤其是context无法保存”对我很有帮助。 因为我想要实现的功能就是可以保存context的,看来我再期望寻找从drawRect保存context的方法已经没有意义了。 另外你这里说的“image的方式”, 有没有相关的代码,供我参考一下。 [/quote] 我目前是用image来保存context的,drawRect会默认开启一个context,但是不是ImageContext,所以我就放弃drawRect而改用自定义方法了,其实就是:

UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
把context保存到image里[/quote] 1. 你这个函数是在drawRect里面调用的嘛? 因为当你在 drawRect里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,UIGraphicsBeginImageContext返回的上下文是空的, 但是你若是在touchedMoved里面调用
UIGraphicsBeginImageContext(self.bounds.size)
// …
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
的时候,在UIGraphicsBeginImageContext代码被调用之前,此时的当前上下文是什么?
Bannings 2015-03-18
  • 打赏
  • 举报
回复
我也正在做一个画板,目前似乎没遇到性能问题:https://github.com/zhangao0086/DrawingBoard
加载更多回复(1)

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧