我想通过触摸并在屏幕上拖动来在iPhone上绘制一条简单的线条。我设法通过继承UIView并更改默认的drawRect:方法来做到这一点。同时在我的viewcontroller中,我检测到触摸事件并在必要时调用[myView setNeedsDisplay]。问题是,当我尝试绘制第二行时,前一行消失。有没有办法在屏幕上保留上一行?
非常感谢任何输入。
答案 0 :(得分:4)
通常的方法是使用CGBitmapContextCreate()。在-init / -init-WithFrame:/ etc中创建它,并在-dealloc中调用CGContextRelease()。我不确定你是如何使用CGBitmapContextCreate()来处理“视网膜显示”的2x比例。
(UIGraphicsBeginImageContext()更容易,但UIGraphicsBeginImageContext(); myContext = CFRetain(UIGraphicsGetCurrentContext()); UIGraphicsEndImageContext();
可能不安全。)
然后执行类似
的操作#import <QuartzCore/CALayer.h>
-(void)displayLayer:(CALayer*)layer
{
UIGraphicsPushContext(mycontext);
... Update the bitmap context by drawing a line...
UIGraphicsPopContext();
CGImageRef cgImage = CGBitmapContextCreateImage(mycontext);
layer.contents = (id)cgImage;
CFRelease(cgImage);
}
我使用-displayLayer:
(一个CALayer委托函数;一个UIView是它的图层委托)而不是-drawRect:
来提高效率:如果你使用-drawRect:
,CALayer会创建一个第二个上下文(因此是位图的第二个副本)。
或者,您可能会对CGLayer感到满意。我从未见过使用它而不是位图上下文的理由; 可能在某些情况下会更有效率。
或者,可能会设置self.clearsContextBeforeDrawing = NO
,,但这很可能会中断。 UIKit(或者更确切地说,CoreAnimation)期望你绘制剪辑rect中包含的整个视图(这是-drawRect:
的“rect”参数;它不能保证是边界)。如果你的视图在屏幕外,CoreAnimation可能会决定它想要内存。或者CoreAnimation可能只绘制屏幕上的视图部分。或者CoreAnimation可能会进行双缓冲绘制,导致您的视图在两种状态之间翻转。
答案 1 :(得分:0)
如果使用drawRect:绘制,则需要绘制整个区域。因此,您不仅需要存储最新部件的数据,还需要存储所有数据。
作为替代方案,您可以直接绘制到位图中,或者为您的线生成动态子视图(仅对非常有限的绘图有意义(即一些基于矢量的内容)。