2010-06-09 66 views
1

我想通过UIView创建遮罩效果以完成以下操作。我将在屏幕上显示一个密封的盒子,用户将能够触摸(划伤)屏幕以揭示该图像背后的内容(UIView)。一些类似于那些彩票的地方,我们假设你会在结果上划出一些覆盖材料。在视图上创建遮罩效果

如果有人能指向我的方向是正确的,我不知道如何开始这样做。 ..

感谢

回答

2

像素编辑通常用CGBitmapContext完成。在这种情况下,我认为您会希望创建一个灰度位图,该位图仅表示刮擦区域的Alpha通道。当用户划痕时,您将在此位图中绘制。

要使用GCBitmapContext作为图像的遮罩,必须首先从位图创建遮罩图像。使用CGImageMaskCreate并传入指向用于创建位图的相同像素的数据提供程序。然后使用CGImageCreateWithMask和您的刮除图像以及作为位图的蒙版图像。

你不能直接在iPhone上画图。每次用户移动手指时,都必须修改遮罩位图,然后使绘制图像的UIView无效。您可能会再次绘制相同的图像,或者您可能需要在每次绘制时重建蒙版和蒙版图像。只要掩模图像直接指向位图像素数据,实际分配的内存很少。

所以在伪代码,你想是这样的:

scratchableImage = ... 
width = CGImageGetWidth(scratchableImage); 
height = CGImageGetHeight(scratchableImage); 
colorspace = CGColorSpaceCreateDeviceGray(); 
pixels = CFDataCreateMutable(NULL , width * height); 
bitmap = CFBitmapContextCreate(CFDataGetMutableBytePtr(pixels) , width , height , 8 , width , colorspace , kCGImageAlphaNone); 
provider = CGDataProviderCreateWithCFData(pixels); 
mask = CGImageMaskCreate(width , height , 8 , 8 , width , provider , NULL , false , kCGRenderingIntentDefault); 
scratched = CGImageCreateWithImageInRect(scratchableImage , mask); 

在这一点上,scratched将有一个alpha通道由bitmap决定,但bitmap有垃圾数据。位图中的白色pixels不透明,黑色像素清晰。在bitmap中绘制所有白色像素,然后在用户划痕时绘制黑色像素。我认为bitmap的更改会在每次绘制scratched时自动应用,但如果没有,那么每次绘制时只需重新创建maskscratched

您可能有一个用于跟踪用户输入的自定义UIView。你可以从你的UIImageView派生自定义视图,让它绘制图像或执行以下操作:

-(void) drawRect:(CGRect)inDirty { 
    // assume scratched is a member 
    CGContextDrawImage(UIGraphicsGetCurrentContext() , [self bounds] , scratched); 
} 

或者你可以跳过创建scratched,而使用CGContextClipToMask和直接绘制原scratchableImage。如果没有scratchableImage并且您的划痕区域是纹理或视图层次结构,请采用此方法。