Моя задача - создать что-то вроде инструмента для стирания (управляемый пальцем), который будет показывать фоновое изображение вместо стертого изображения.
Здесь являются моими исходными и целевыми изображениями (только для теста настоящие будут отличаться):
http://img232.imageshack.us/img232/6030/29572847.png
А вот мой код. Создание шаблона:
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
if(revealPattern) CGPatternRelease(revealPattern);
CGPatternCallbacks callbacks = { 0, &patternCallback, NULL};
revealPattern = CGPatternCreate(self, self.bounds, CGAffineTransformIdentity, self.bounds.size.width, self.bounds.size.height, kCGPatternTilingConstantSpacing, true, &callbacks);
}
Функция обратного вызова шаблона (** info * содержит указатель на self ):
void patternCallback(void *info, CGContextRef context) {
CGRect rect = ((DrawView *)info).bounds;
CGImageRef imageRef = ((DrawView *)info).backgroundImage.CGImage;
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, imageRef);
}
И метод рисования:
- (void)drawPoints:(CGContextRef)context{
if([points count] < 2) return;
CGPoint lastPoint = [[points objectAtIndex: 0] CGPointValue];
CGContextBeginPath(context);
CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGColorSpaceRef revealPatternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetStrokeColorSpace(context, revealPatternSpace);
CGFloat revealAlpha = 1.0;
CGContextSetStrokePattern(context, revealPattern, &revealAlpha);
CGContextSetAlpha(context, 0.1);
CGColorSpaceRelease(revealPatternSpace);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineWidth(context, self.lineWidth);
for(int i = 1; i < [points count]; i++){
CGPoint currPoint = [[points objectAtIndex: i] CGPointValue];
CGContextAddLineToPoint(context, currPoint.x, currPoint.y);
lastPoint = currPoint;
}
CGContextStrokePath(context);
}
Если локальная переменная раскрытьAlpha имеет значение 1.0 (как показано в последнем фрагменте кода), все работает нормально. Но мне нужно, чтобы стирание было полупрозрачным (чтобы пользователю нужно было провести по одному и тому же месту несколько раз, чтобы стереть его полностью). И вот тут возникает проблема. Если я сделаю ShowAlpha меньшим, чем 1.0 , обнаруженное целевое изображение будет выглядеть поврежденным.
Вот результаты для detectAlpha == 1.0 и ] detectAlpha == 0.1 :
http://img593.imageshack.us/img593/1809/69373874.png
Если вы посмотрите достаточно близко, вы заметите, что синий градиент на правом изображении больше не гладко.