我想在UIView上创建一个屏蔽效果,以便完成以下操作。我将在屏幕上显示一个密封的盒子,用户将能够触摸(划伤)屏幕,以显示该图像背后的内容(UIView)。类似于那些彩票的地方,你可能会在结果之上划一些封面材料。
如果有人能指出我正确的方向会很棒,我不知道如何开始这样做......
感谢
答案 0 :(得分:7)
drawnonward的方法有效。
答案 1 :(得分:2)
像素编辑通常使用CGBitmapContext完成。在这种情况下,我想你会想要创建一个灰度位图,它只代表划痕区域的alpha通道。当用户划伤时,您将在此位图中绘制。
要使用GCBitmapContext作为图像的蒙版,必须首先从位图创建蒙版图像。使用CGImageMaskCreate并传入指向用于创建位图的相同像素的数据提供程序。然后使用CGImageCreateWithMask和你的刮开图像以及作为位图的掩码图像。
您无法直接在iPhone中绘图。每次用户移动手指时,您都必须修改蒙版位图,然后使绘制图像的UIView无效。您可能只能再次绘制相同的图像,或者您可能需要在每次绘制时重建蒙版和蒙版图像。只要掩模图像直接指向位图像素数据,实际上就会分配很少的内存。
所以在psuedocode中你需要这样的东西:
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
将有一个由bitmap
指定的Alpha通道,但bitmap
具有垃圾数据。位图中的白色pixels
是不透明的,黑色像素是清晰的。在bitmap
中绘制所有白色像素,然后在用户划痕时绘制黑色像素。我认为bitmap
的更改会在每次绘制scratched
时自动应用,但如果没有,则每次绘制时都会重新创建mask
和scratched
。
您可能有自定义UIView用于跟踪用户输入。您可以从UIImageView派生自定义视图并让它绘制图像或执行以下操作:
-(void) drawRect:(CGRect)inDirty {
// assume scratched is a member
CGContextDrawImage( UIGraphicsGetCurrentContext() , [self bounds] , scratched );
}
或者,您可以跳过创建scratched
,而是使用CGContextClipToMask
并直接绘制原始scratchableImage
。如果没有scratchableImage
并且您的临时区域是纹理或视图层次结构,请采用此方法。