在 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 IOS 上绘制圆圈的最佳方法

在 UIImageview 上覆盖 UIImageview 保存

在 UIImageView 上绘制 UIBezierPath

HTML5画布:用颜色填充透明图像并在顶部绘制

MonoTouch,在 UIImageView 上绘制裁剪区域层