iOS:重新定位UIGraphicsBeginImageContext和UIImageView

时间:2013-07-31 09:58:26

标签: ios objective-c uiimageview core-graphics cgcontext

我有代码可以让我在UIImageView上绘制   - 但我希望能够限制绘图区域。

我已经能够限制大小,但现在我无法定位它:如果我将(0,0)改为其他任何东西,我的图像完全消失并且绘制的能力停止工作

drawImage - 是一个UIImageView

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    mouseSwiped = YES;

    UITouch *touch = [touches anyObject];
    currentPoint = [touch locationInView:self];

    UIGraphicsBeginImageContext(CGSizeMake(560, 660));
    [drawImage.image drawInRect:CGRectMake(0, 0, 560, 660)];

    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0, 1, 0, 1);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());

    [drawImage setFrame:CGRectMake(0, 0, 560, 660)];
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    lastPoint = currentPoint;

    [self addSubview:drawImage];
} 

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

我不确定我完全明白你要做什么,但我会采取行动:

[drawImage.image drawInRect:CGRectMake(0, 0, 560, 660)];

这告诉分配给drawImage的图像在0,0的当前上下文中绘制自己。由于上下文是位图图像上下文,因此其范围将从0,0560,660。在我看来,这可能是你想要做的,否则你的位图中会有空白区域。如果您要将0,0更改为10,0,我预计结果位图中会出现10pt宽的空白区域(这看起来很浪费)。

然后你会这样做:

[drawImage setFrame:CGRectMake(0, 0, 560, 660)];

这是在超视图的坐标系中设置UIImageView的坐标。如果您将 0,0更改为5,5,我希望您的UIImageView在其超级视图中向下显示5pt并向右显示5pt。

你说你想“限制绘图区域”。我假设你指的是你正在绘制图像的部分。最简单的方法是在绘制之前在位图上下文中设置一个剪辑矩形。例如,如果你想阻止在图像边缘周围的10pt波段绘图,你可以这样做:

UIGraphicsBeginImageContext(CGSizeMake(560, 660));
[drawImage.image drawInRect:CGRectMake(0, 0, 560, 660)];

CGContextClipToRect(UIGraphicsGetCurrentContext(), CGRectMake(10,10,540,640));
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
// ... and so on

不是100%确定这是否是您正在寻找的,但希望它有所帮助。

答案 1 :(得分:1)

尝试限制currentPoint

if (currentPoint.x <= 20 || currentPoint.x >= 280 || 
    currentPoint.y <= 20 || currentPoint.y >= 400)
{
    lastPoint = currentPoint;
    return;
}