2012-02-10 10 views
-1

私は、ユーザーが指で拭き取ることができる蒸し上がったビューを持っているアプリを開発中です。私は仕事をしたいと思っていたものでそれに亀裂を入れました。以下のコードは、描画コードとマスクコードを組み合わせたものです。描画コードは白黒画像に描画され、マスクとしてマスクとして使用されてフォグ画像がマスクされます。スチームアップビューを消去する方法

誰でもこの効果を得るためのサンプルコードを知っていますか、それとももっと速くするための提案がありますか? @badeenからヘルプ溶液で

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]; 
} 

答えて

0

は、2つのCALayers、フォグ画像用とマスクのいずれかを使用することで、マスクは、ユーザが画面の周りに指を移動したときに引き込まれます。

関連する問題