Iphone 无透明部分的图像掩模

Iphone 无透明部分的图像掩模,iphone,ios,xcode,ipad,Iphone,Ios,Xcode,Ipad,我已经调查了一段时间了 我想在杯子上画一个灰色的图像 目前,我正在拉伸一个带有灰色背景的uiimageview,使其达到滑块的大小 -(void) sliderChanged:(CGFloat) value{ drinksView.grayArea.frame = CGRectMake( 0 , -value ,372 ,value); 我知道这很肮脏,不是我想要的 我想要的是灰色部分仅覆盖有杯子的部分(例如图像不透明的部分)。杯子的图像只是有一个透明的背景 有人知道如何做到这一点吗?我是一

我已经调查了一段时间了

我想在杯子上画一个灰色的图像

目前,我正在拉伸一个带有灰色背景的uiimageview,使其达到滑块的大小

-(void) sliderChanged:(CGFloat) value{
drinksView.grayArea.frame = CGRectMake( 0 , -value ,372 ,value);
我知道这很肮脏,不是我想要的

我想要的是灰色部分仅覆盖有杯子的部分(例如图像不透明的部分)。杯子的图像只是有一个透明的背景

有人知道如何做到这一点吗?我是一个戴着面具的傻瓜,很多教程都让我一无所获,我甚至不知道这是否可能


注:无法在杯子周围绘制路径,因为杯子图像可能会变为玻璃

首先,您需要熟悉此方法

    // masks the item based on the MaskImage
- (UIImage*) itemMask : (UIImage*)image withMask:(UIImage*)maskImage
{
    UIImage* afterMasking = nil;

    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);
    CFRelease(mask);
    afterMasking = [UIImage imageWithCGImage:masked];
    CFRelease(masked);
    return afterMasking;
}
它的作用是,你把你的杯子图像和面具图像放在一起,它会遮住你的杯子图像。它只会掩盖你的杯子形象,下面什么都没有,所以你不必担心

您遇到的问题是,灰色框会调整大小。我的方法是根据滑块值裁剪遮罩。因此,制作一个黑匣子,并改变它的大小,在你通过这个方法输入它之前,你是如何处理灰度背景的。这样做应该很快,所以我不会详细说明,但最后你会有这样的东西。请原谅那些不太精细的图形


我能想到的最简单的方法就是用一个蒙面炉。这是您需要做的:

  • 不要使用
    UIImageView
    ,而是使用灰色背景的
    CALayer
    作为覆盖层。您的
    幻灯片更改:
    方法将保持不变,除了
    drinksView.grayArea
    将是一个层而不是一个视图
  • 到目前为止,效果将与以前完全相同。现在,您需要设置
    灰色区域的遮罩。请执行以下操作:

    CALayer * maskLayer = [CALayer new];
    maskLayer.contents = myCupImage.CGImage;
    grayArea.mask = maskLayer;
    
  • 我认为默认情况下,随着比例的改变,图层将拉伸内容。我们不想那样。您可以通过将层的
    contentsGravity
    设置为,例如,
    kCAGravityTop
    来解决此问题

  • 那应该是你想要的

    有一个警告:我不太清楚面具如何应对内容重力的变化。如果在这方面存在问题,可以通过添加容器层来修复:

  • 灰色区域设置固定边框(等于杯子图像的大小)

  • 与其直接添加
    灰色区域
    ,不如为其引入容器层:

    CALayer * container = [CALayer new];
    container.masksToBounds = YES;
    [container addSublayer:grayArea];
    [drinksView.layer addSublayer:container];
    
  • 在您的
    幻灯片更改:
    中,更改
    容器的框架,而不是
    灰色区域


  • 希望这能起作用。

    这很有效,我会在底部发布我的最终代码,因为它确实需要一些增强。由于第一个答案对我很有效,我没有尝试这个(固定价格项目),无论如何谢谢你的努力
        drinksView.grayLayer = [CALayer new];
        drinksView.grayLayer.frame = CGRectMake(0, 0, 372, 0);
        drinksView.grayLayer.contentsGravity = kCAGravityTop;
    
        CALayer * topLayer = [CALayer new];
        topLayer.frame = CGRectMake(0, 0, 372, 367);
        UIImage * grayImage = [UIImage imageNamed:@"grayDrink.png"];
        topLayer.contents = (id) grayImage.CGImage;
    
        CALayer * maskLayer = [CALayer new];
        maskLayer.contents = (id)cupImage.CGImage;
        maskLayer.masksToBounds = YES;
    
        maskLayer.bounds = CGRectMake(0, 0, 372, 367);
        maskLayer.position = CGPointMake(186,184);
    
        [topLayer setMask:maskLayer];
        [drinksView.grayLayer addSublayer:topLayer];
        [drinksView.grayLayer setMasksToBounds:YES];
        [[drinksView layer]addSublayer:drinksView.grayLayer];