-1

我正在编写用户可以用手指画线的应用程序。

这是代码:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ 
    NSLog(@"BEGAN");//TEST OK
    UITouch* tap=[touches anyObject]; 
    start_point=[tap locationInView:self];
}


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    NSLog(@"MOVED");//TEST OK
    UITouch* tap=[touches anyObject]; 
    current_point=[tap locationInView:self];
    [self DrawLine:start_point end:current_point];
    start_point=current_point;
} 


-(void)DrawLine: (CGPoint)start end:(CGPoint)end 
{
    context= UIGraphicsGetCurrentContext();
    CGColorSpaceRef space_color= CGColorSpaceCreateDeviceRGB(); 
    CGFloat component[]={1.0,0.0,0.0,1};
    CGColorRef color = CGColorCreate(space_color, component);

    //draw line 
    CGContextSetLineWidth(context, 1);
    CGContextSetStrokeColorWithColor(context, color);
    CGContextMoveToPoint(context, start.x, start.y);
    CGContextAddLineToPoint(context,end.x, end.y);
    CGContextStrokePath(context);
}

我的问题是当我在屏幕上画线但线不可见时。

PS我在应用程序的主视图上绘制

4

2 回答 2

3
context= UIGraphicsGetCurrentContext();

您是UIGraphicsGetCurrentContext()从方法外部调用的drawRect:。所以它会返回nil。因此,以下函数试图利用一个实际上nil显然无法工作的上下文

于 2013-09-28T16:34:33.640 回答
0

正如@Jorg 提到的,方法之外没有当前上下文drawRect:,所以很可能UIGraphicsGetCurrentContext()会返回nil

您可以使用 aCGLayerRef在屏幕外绘制,而在您的drawRect:方法中,您可以在视图上绘制图层的内容。

首先,您需要将该层声明为您的类的成员,因此在您的 @interface 声明CGLayerRef _offscreenLayer;中。您也可以为它创建一个属性,但是,我将在此示例中直接使用它。

在您的 init 方法中的某处:

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 4 * self.frame.size.width, colorspace, (uint32_t)kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorspace);
_offscreenLayer = CGLayerCreateWithContext(context, self.frame.size, NULL);

现在,让我们处理绘图:

-(void)DrawLine: (CGPoint)start end:(CGPoint)end 
{
    CGContextRef context = CGLayerGetContext(_offscreenLayer);
    // ** draw your line using context defined above
    [self setNeedsDisplay]; // or even better, use setNeedsDisplayInRect:, and compute the dirty rect using start and end points
}
-(void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); // this will work now, since we're in drawRect:
    CGRect drawRect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    CGContextDrawLayerInRect(currentContext, drawRect, _offscreenLayer);
}

请注意,您可能需要进行一些小的更改才能使代码正常工作,但应该让您对如何实现它有所了解。

于 2013-09-28T17:09:33.717 回答