在 UIImageView 上绘制使图像透明
Posted
技术标签:
【中文标题】在 UIImageView 上绘制使图像透明【英文标题】:Drawing on top of UIImageView to make the image transparent 【发布时间】:2011-12-26 03:06:46 【问题描述】:我正在开发一个 iPhone 应用程序,当用户在图像上围绕手指移动时,我需要通过将其 alpha 级别设置为 0 来使图像的一部分透明。基本上,如果您碰巧知道应用商店应用程序 iSteam,用户应该能够在顶部图像上移动手指,这将使背景图像透明。
目前我正在使用两个 UIImageView。一个保存背景图像,另一个在其顶部保存较暗的图像。现在用户应该能够在这个较暗的图像上绘制随机曲线,这将使背景图像的一部分出现在顶部。我无法弄清楚应该如何使两个 UIImageView 中最顶部的顶部图像透明。
对此有任何想法吗?另外我应该用什么来做这个?石英或 Open GL。我是 iPhone App Dev 的新手,完全不了解这些 API,因此专家的一些指导肯定会帮助我在 iPhone SDK 开发方面取得进展。
【问题讨论】:
【参考方案1】:UIImageView 有一个层,您可以将其称为layer
,并在您将项目链接到 QuartzCore 时与之交谈。当用户移动手指时,在与 UIImageView 相同大小的不透明颜色填充图形上下文中剪切一个清晰的形状,将其转换为 CGImageRef,将其设置为 CALayer 的contents
(同样,此 CALayer 需要相同大小为 UIImageView),并将该层设置为 UIImageView 的layer.mask
。只要遮罩清晰,就会在图层中打出一个透明的孔,这意味着视图,也就是 UIImageView 正在显示的图像。 (如果这不起作用,因为 UIImageView 不喜欢你干扰它的层,你可以使用 UIImageView 的超级视图。)
编辑(第二天)- 这是在中心打一个圆孔的层代表的示例代码:
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)c
CGRect r = CGContextGetClipBoundingBox(c);
CGRect r2 = CGRectInset(r, r.size.width/2.0 - 10, r.size.height/2.0 - 10);
UIImage* maskim;
UIGraphicsBeginImageContextWithOptions(r.size, NO, 0);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(c, r2);
CGContextAddRect(c, r);
CGContextEOClip(c);
CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);
CGContextFillRect(c, r);
maskim = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CALayer* mask = [CALayer layer];
mask.frame = r;
mask.contents = (id)maskim.CGImage;
layer.mask = mask;
因此,如果该层是视图的层,并且 UIImageView 是该视图的子视图,则在 UIImageView 上打一个洞。
这是结果的屏幕截图:
【讨论】:
以上是关于在 UIImageView 上绘制使图像透明的主要内容,如果未能解决你的问题,请参考以下文章
使 UIImageView 透明并在触摸时显示其下方的 UIImageView
在 UIImageview 上覆盖 UIImageview 保存