Как стереть запаренный вид - PullRequest
0 голосов
/ 10 февраля 2012

Я работаю над приложением, которое имеет расширенный вид, который пользователь может стереть пальцем.Я взломал это с чем-то, что, как я надеялся, сработает, и это работает, но это очень медленно.Код ниже объединяет код рисования и код маскирования.Код чертежа рисует черно-белое изображение, которое затем используется в качестве маски для маскировки изображения тумана.

Кто-нибудь знает какой-либо пример кода для достижения этого эффекта, или есть какие-либо предложения о том, как сделатьэто быстрее?

static CGPoint midPoint(CGPoint p1, CGPoint p2){
    return CGPointMake((p1.x+p2.x)*0.5f, (p1.y+p2.y)*0.5f);
}

- (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)maskImage{
    CGImageRef maskRef = [maskImage CGImage];
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
    CGImageRelease(mask);
    UIImage *maskedImage = [UIImage imageWithCGImage:masked];
    CGImageRelease(masked);
    return maskedImage;

}

- (void)setMaskImage:(UIImage *)maskImage{
    [_maskImage release];
    _maskImage = [maskImage retain];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];

    _previousPoint1 = [touch previousLocationInView:self];
    _previousPoint2 = [touch previousLocationInView:self];
    _currentPoint = [touch locationInView:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];

    _previousPoint2 = _previousPoint1;
    _previousPoint1 = [touch previousLocationInView:self];
    _currentPoint = [touch locationInView:self];

    CGPoint mid1 = midPoint(_previousPoint1, _previousPoint2); 
    CGPoint mid2 = midPoint(_currentPoint, _previousPoint1);

    CGRect imageRect = CGRectZero;
    imageRect.size = _fogView.frame.size;
    UIGraphicsBeginImageContext(imageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [_maskImage drawInRect:imageRect];

    CGContextMoveToPoint(context, mid1.x, mid1.y);
    CGContextAddQuadCurveToPoint(context, _previousPoint1.x, _previousPoint1.y, mid2.x, mid2.y); 

    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, 40.0f);
    CGContextSetRGBStrokeColor(context, 1.0f, 1.0f, 1.0f, 1.0f);
    CGContextStrokePath(context);

    [self setMaskImage:UIGraphicsGetImageFromCurrentImageContext()];
    UIGraphicsEndImageContext();

    _fogView.image = [self maskImage:[UIImage imageNamed:@"Fog"] withMask:_maskImage];
}

1 Ответ

0 голосов
/ 14 февраля 2012

С помощью @ badeen решение состояло в том, чтобы использовать два слоя CALay, один для изображения тумана и один для маски, в которую втягивается маска, когда пользователь перемещает палец по экрану.

...