从 UIImage 清除 UIView 绘图

Posted

技术标签:

【中文标题】从 UIImage 清除 UIView 绘图【英文标题】:clear UIView drawing from UIImage 【发布时间】:2014-01-15 15:43:35 【问题描述】:

好吧,快吓坏了……

制作绘图应用程序: 主视图(按钮、广告等) 然后是占据屏幕一部分的容器视图(带有自定义绘图类) 当用户单击主视图中的按钮时,它会在容器视图中触发一个事件(可能是更好的方法,但我找不到)

当用户按下容器内的某个位置时,它会记录该点,添加一条线,然后更新 draw:rect 方法:

- (void)drawRect:(CGRect)rect

    [incImage drawInRect:rect];
    [path stroke];

(当用户绘制时,UIImage('incImage')被添加到它上面,它被绘制到视图上)

绘图代码:

- (void)drawBitmap

    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);
    [[UIColor colorWithRed:_brushR green:_brushG blue:_brushB alpha:_brushO] setStroke];
    [incImage drawAtPoint:CGPointZero];
    [path stroke];
    incImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

但是我无法清除视图! 我尝试将 draw:Rect 方法分成两部分(如果 clear 为真,如果不是)并这样做:

UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);
rectpath = [UIBezierPath bezierPathWithRect:CGRectMake(0,0,incImage.size.width,incImage.size.height)];
[[UIColor whiteColor] setFill];
[rectpath fill];
[incImage drawAtPoint:CGPointZero];
incImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
_clear=true;
[self setNeedsDisplay];

然后将 draw:Rect 更改为:

- (void)drawRect:(CGRect)rect

    if (clear) 
        [incImage drawInRect:rect];
        [rectpath fill];
    
    else 
        [incImage drawInRect:rect];
        [path stroke];
    

但它不起作用(我也尝试创建一个 CGRect 然后用白色填充它并制作图像并尝试将该图像绘制到视图但没有运气)。我也检查过,问题不是主视图从容器视图通信和调用方法,我试图解决这个问题的方式或我的绘制方法有问题。

任何帮助将不胜感激,我的 Mac 的生命可能取决于它:)

【问题讨论】:

您是否在任何地方清除矩形?我没有看到它,但不确定我们是否看到了所有代码。如果没有,请将其添加到您的 drawRect:CGContextClearRect(ctx, rect); 我确实尝试在我的 draw:rect 方法中这样做: - (void)drawRect:(CGRect)rect if (!_clr) [incImage drawInRect:rect]; [路径行程]; if (_clr) CGContextClearRect(UIGraphicsGetCurrentContext(), rect); incImage = UIGraphicsGetImageFromCurrentImageContext(); [incImage drawInRect:rect]; 还是什么都没有 【参考方案1】:

像这样创建函数:

-(void) clearDrawing 
    incImage = nil;
    [self setNeedsDisplay];

它将删除incImage,因此它将不再显示在-(void) drawRect中。如果你想再次显示一些东西,你可以调用 -(void)drawBitmap 来执行这个:incImage = UIGraphicsGetImageFromCurrentImageContext(); 并且 incImage 将通过一些绘图再次重新创建。

【讨论】:

如果您 edited 解释它为什么起作用,这将是一个更好的答案。【参考方案2】:

-drawRect: 被调用时,视图已经被删除了。听起来您正在通过将它们添加到 path 来记录这些点。当您想“清除”视图时,您需要更新存储正在呈现的数据的对象 - 在您的情况下,这可能意味着通过调用 -removeAllPoints 或简单地丢弃旧路径来重置 path并从一个新的开始。

【讨论】:

我明白你在说什么,但这对问题没有帮助,我应该说的是,当用户绘制时,点的位置记录在“路径”中,然后它们被绘制,只要用户将手指从屏幕上抬起,“路径”就会删除所有点(因此当用户再次绘制时,它只会绘制新线而不是所有内容 - 或者至少我是这样理解的)所以我不明白这会如何工作。 是的,对问题的详细描述总是有帮助的。听起来您是在每次新的触摸开始时创建一条新路径,在触摸移动时向路径添加点,并在触摸结束时破坏路径?在任何情况下,请仔细查看路径对象在触摸进行时和结束后发生的情况。路径是如何存储的? (如果它没有被存储,这就是问题的一部分。)您可能需要阅读 ios 中使用的 Model View Controller 范例。

以上是关于从 UIImage 清除 UIView 绘图的主要内容,如果未能解决你的问题,请参考以下文章

使用drawRect延迟加载UIView:绘图

UIView 中的 CG 绘图用作 UIImage?

使 UIImageView 及其 UIImage 按比例缩放而无需额外的填充

Swift UIImage 不能用重力动画

UIImageView + UIImage vs CALayer + 内容效率

Playground,无法将同一个 UIImageView 设置为多个 UIView