gpt4 book ai didi

ios - UIBezierPath 撤销绘制 重绘 UIImageView 的图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:13 36 4
gpt4 key购买 nike

我正在尝试通过重绘我创建的 NSMutableArray 中的所有 UIBezierPaths 和关联的 UIColors 来重绘我的 UIImageView 的图像,当我点击一个撤消 UIButton 时减去最后一条路径。

但是,在这种情况下,UIImageView 的图像不会重绘并删除最后一条路径,直到 NSMutableArray 的计数小于 2,此时它将 UIImageView 的图像设置为 nil(这是正常工作的)

如果能提供任何帮助,我将不胜感激。注意:我没有包括我的 touchesMoved 方法,因为我现在只想让撤消“点”工作。

**

更新:这是我最终使用的代码,在下面接受的答案的帮助下:

**

- (void)undoLast
{
if (self.drawingPathArray.count < 2)
{
self.drawingPathArray = nil;
self.undoButton.hidden = YES;
self.drawingImageView.image = nil;
}
else
{
[self.drawingPathArray removeLastObject];

self.undoButton.tintColor = [[self.drawingPathArray lastObject] objectAtIndex:0];

UIGraphicsBeginImageContextWithOptions(self.drawingImageView.bounds.size, NO, 0.0);

for (NSArray *subArray in self.drawingPathArray)
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 3.0);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetStrokeColorWithColor(context, [[subArray objectAtIndex:0] CGColor]);
CGContextAddPath(context, [[subArray objectAtIndex:1] CGPath]);
CGContextStrokePath(context);
}

self.drawingImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
}

原题代码:

@property (nonatomic, strong) NSMutableArray *drawingPathArray;
@property (nonatomic, assign) NSInteger ctr;
@property (nonatomic, assign) CGPoint lastPoint;
CGPoint pts[4];

- (void)undoLast
{
if (self.drawingPathArray.count < 2)
{
self.drawingPathArray = nil;
self.undoButton.hidden = YES;
self.drawingImageView.image = nil;
}
else
{
[self.drawingPathArray removeLastObject];

NSArray *lastArray = [self.drawingPathArray lastObject];

UIColor *lastColor = [lastArray objectAtIndex:0];

self.undoButton.tintColor = lastColor;

for (NSArray *subArray in self.drawingPathArray)
{
// These colors and paths are getting set correctly, verified by using NSLog
UIColor *color = [subArray objectAtIndex:0];
UIBezierPath *path = [subArray objectAtIndex:1];

[self drawWithPath:path andColor:color];
}
}
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.ctr = 0;
UITouch *touch = [touches anyObject];
pts[0] = [touch locationInView:self.drawingImageView];
}

- (void)drawWithPath:(UIBezierPath *)path andColor:(UIColor *)color
{
path.lineWidth = 3.0;
path.lineCapStyle = kCGLineJoinRound;

dispatch_async(dispatch_get_main_queue(),
^{
UIGraphicsBeginImageContextWithOptions(self.drawingImageView.bounds.size, NO, 0.0);

[self.drawingImageView.image drawAtPoint:CGPointZero];
[color setStroke];
[path stroke];
self.drawingImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UIBezierPath *path = [UIBezierPath bezierPath];

if (self.ctr == 0)
{
[path moveToPoint:pts[0]];
[path addLineToPoint:pts[0]];
}

self.undoButton.hidden = NO;
[self.undoButton setTintColor:self.inkColor];

if (!self.drawingPathArray)
{
self.drawingPathArray = [[NSMutableArray alloc]init];
}

[self.drawingPathArray addObject:@[self.inkColor,path]];

[self drawWithPath:path andColor:self.inkColor];
}

最佳答案

在开始重绘剩余路径之前,您不会清除 self.drawingImageView.image。因此,您目前所做的只是在旧线上重新绘制线条。

你应该做的是:

  1. 创建一个新上下文并将所有线条绘制到其中
  2. 不要将旧图像引入新环境
  3. 不要使用 GCD 对上下文的更新进行排队,只需内联(如果需要,在后台)

然后,最后,从上下文中获取新图像 (image = UIGraphicsGetImageFromCurrentImageContext()) 并将其保存在 self.drawingImageView.image = image;


伪代码:

// create a new bitmap image context
UIGraphicsBeginImageContextWithOptions(...
ctx = UIGraphicsGetCurrentContext();

for (NSArray *subArray in self.drawingPathArray) {
// get the path and colour
CGContextSetStrokeColor(ctx, ...
CGContextAddPath(ctx, ... (path from bezier)
CGContextStrokePath(ctx);
}

// create image
image = UIGraphicsGetImageFromCurrentImageContext();

self.drawingImageView.image = image;

关于ios - UIBezierPath 撤销绘制 重绘 UIImageView 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22124385/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com