На самом деле мы работаем над приложением краски,Как нарисовать UIBezierPath с изображением, чтобы стереть изображение
Мы делали мазки, используя Безье путь, тракты массива .. мы почти заполнить заявку,
Но являются некоторые проблемы с производительностью для штрихов рисования краски от PathsArray, которые имеют нарисованные безырпаты, как лакированные штрихи, так как малые штрихи замедляются после рисования некоторого количества штрихов,
Так, чтобы избежать этой проблемы с производительностью, мы использовали темный образ iamge за sketchImage View,
Мы обращаемся недавними один ход на Top Эскиз зрения изображения и обновленные нижний Temperary iamge вида с PathsArray,
это работает отлично и imrove производительности, но есть проблема в Eraser ..
Хотя делать резинку в Backgroun temperary iamge просматривать обновления только в конце хода,
Таким образом, мы планировали удалить изображение, когда ластик выбирает, как это сделать .. любые другие способы
-(void)updateTempararyBottomLayerImageView
{
TempararyBottomLayerImageView.frame = CGRectMake(TopLayerImageView.frame.origin.x, TopLayerImageView.frame.origin.y, TopLayerImageView.frame.size.width, TopLayerImageView.frame.size.height);
UIGraphicsBeginImageContext(TempararyBottomLayerImageView.bounds.size);
for (NSDictionary *dict in pathsArray)
{
UIBezierPath *p = (UIBezierPath*)[dict objectForKey:@"path"];
p.lineWidth = [[dict objectForKey:@"size"]floatValue];
if ([[dict objectForKey:@"red"] floatValue] == 0) //When eraser selected
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
}
else
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);
[[UIColor colorWithRed:[[dict objectForKey:@"red"]floatValue]
green:[[dict objectForKey:@"green"]floatValue]
blue:[[dict objectForKey:@"blue"]floatValue]
alpha:[[dict objectForKey:@"alpha"]floatValue]] setStroke];
}
[p stroke];
}
[[UIColor colorWithRed:red green:green blue:blue alpha:opacity] setStroke];
if(isEraser) //When eraser selected, change color as clear
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
}
else
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);
}
if (!isTouchEnd)
[bzierPath stroke];
TempararyBottomLayerImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
- (void) updateDrawingBoard
{
UIGraphicsBeginImageContext(TopLayerImageView.bounds.size);
if (pathsArray.count > 0)
{
NSDictionary * dict = [pathsArray lastObject];
UIBezierPath *p ;
@try {
p = (UIBezierPath*)[dict objectForKey:@"path"];
}
@catch (NSException *exception)
{
NSLog(@"xxxxxxxxxxxx");
return;
}
p.lineWidth = [[dict objectForKey:@"size"]floatValue];
if ([[dict objectForKey:@"red"] floatValue] == 0) //When eraser selected
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
}
else
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);
[[UIColor colorWithRed:[[dict objectForKey:@"red"]floatValue]
green:[[dict objectForKey:@"green"]floatValue]
blue:[[dict objectForKey:@"blue"]floatValue]
alpha:[[dict objectForKey:@"alpha"]floatValue]] setStroke];
}
[p stroke];
[[UIColor colorWithRed:red green:green blue:blue alpha:opacity] setStroke];
if(isEraser) //When eraser selected, change color as clear
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
}
else
{
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);
}
if (!isTouchEnd)
[bzierPath stroke];
self.TopLayerImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
}
# pragma =====UITouch delegates=====
//==============================================
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if([[event touchesForView:self.TopLayerImageView] count] == 1)
{
CGPoint touchPoint = [[touches anyObject] locationInView:self.TopLayerImageView];
bzierPath = [UIBezierPath bezierPath];
bzierPath.lineCapStyle = kCGLineCapRound;
bzierPath.lineJoinStyle = kCGLineJoinRound;
bzierPath.lineWidth = brushSize;
[bzierPath moveToPoint:touchPoint];
isTouchEnd = NO;
UIBezierPath *tempPath = bzierPath;
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
tempPath,@"path",
[NSNumber numberWithFloat:red], @"red",
[NSNumber numberWithFloat:green], @"green",
[NSNumber numberWithFloat:blue], @"blue",
[NSNumber numberWithFloat:opacity], @"alpha",
[NSNumber numberWithFloat:brushSize], @"size", nil];
if (isEraser)
{
dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
tempPath,@"path",
[NSNumber numberWithFloat:0], @"red",
[NSNumber numberWithFloat:0], @"green",
[NSNumber numberWithFloat:0], @"blue",
[NSNumber numberWithFloat:0], @"alpha",
[NSNumber numberWithFloat:brushSize], @"size", nil];
}
[pathsArray addObject:dict];
[self updateDrawingBoard];
}
//To hide bottom scroll wheel where ever tap in view
UITouch *touch = [[event allTouches] anyObject];
if ([touch view] != bottomScrollWheel)
{
[self minimizeScrollWheel];
}
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if([[event touchesForView:self.TopLayerImageView] count] == 1)
{
CGPoint touchPoint = [[touches anyObject] locationInView:self.TopLayerImageView];
[bzierPath addLineToPoint:touchPoint];
[bzierPath moveToPoint:touchPoint];
isTouchEnd = NO;
[self updateDrawingBoard];
}
}
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if([[event touchesForView:self.TopLayerImageView] count] == 1)
{
// NSLog(@"**********************bzierPath == \r\n %@",bzierPath);
CGPoint touchPoint = [[touches anyObject] locationInView:self.TopLayerImageView];
[bzierPath moveToPoint:touchPoint];
[bzierPath addLineToPoint:touchPoint];
//bzierPath = nil;
isTouchEnd = YES;
[self updateDrawingBoard];
[self updateTempararyBottomLayerImageView];
if (TopLayerImageView.image != nil)
{
[undoArray addObject:TempararyBottomLayerImageView.image];
[redoArray removeAllObjects];
[redoPathsArray removeAllObjects];
}
self.TopLayerImageView.image = nil;
[self EnableDisableUndoRedo];
}
}
# pragma mark =====Settings =====
//==============================
// Slider Position can be changed from left to right or right to left
-(void)sliderPositionChange
{
if (settingsPopoverVC.index == 0)
{
if (iOS7)
[sliderView setFrame:CGRectMake(19, 128, 100, 357)];
else
[sliderView setFrame:CGRectMake(19, 108, 100, 357)];
}
else if(settingsPopoverVC.index == 1)
{
if (iOS7)
[sliderView setFrame:CGRectMake(900, 128, 100, 357)];
else
[sliderView setFrame:CGRectMake(900, 108, 100, 357)];
}
}
Пробовали ли вы с [себе] setNeedDisplay – codercat
я ДНТ знать о точности, связанные с [само setNeedDisplay]; Вы можете объяснить подробно. – user2732294