没有透明部分的图像掩膜
我一直在调查这一段时间。没有透明部分的图像掩膜
我试图把一个灰度图像在杯
我目前的伸展与UIImageView的灰色背景的滑块已经量。
-(void) sliderChanged:(CGFloat) value{
drinksView.grayArea.frame = CGRectMake(0 , -value ,372 ,value);
我知道这是很肮脏的,不是我想要的......
什么,我想要的是灰色部分仅涵盖那里是一个杯的部分(例如,部分地方的图像不透明)。杯子的图像只有透明背景
有没有人有如何实现这个想法?我是一个带面具的小菜鸟,许多教程让我无处可去,我甚至不知道它是否可能。
PS:周围绘制杯的路径是不可能的,因为杯子图像可以换到玻璃
我能想到的就是用一个蒙面的CALayer最简单的方法。这就是你需要做什么:
- 而不是使用一个
UIImageView
的,使用CALayer
与灰色背景为您的覆盖。您的sliderChanged:
方法将保持不变,但drinksView.grayArea
将是一个图层而不是视图。 -
到目前为止效果与以前完全一样。现在,你需要设置
grayArea
的面具。请执行以下操作:CALayer * maskLayer = [CALayer new]; maskLayer.contents = myCupImage.CGImage; grayArea.mask = maskLayer;
我认为默认情况下,图层会随着比例尺的变化而拉伸内容。我们不希望这样。您可以通过将图层的
contentsGravity
设置为kCAGravityTop
来解决此问题。
这应该做你想做的。
一个警告:我不太确定掩码如何应对改变内容重力。如果有在这一方面的问题,可以通过将容器固定层它:
设置
grayArea
固定帧(等于杯图像的尺寸)。-
代替直接加入
grayArea
的,因为它引入一个容器层:CALayer * container = [CALayer new]; container.masksToBounds = YES; [container addSublayer:grayArea]; [drinksView.layer addSublayer:container];
在你
sliderChanged:
,更改的container
代替grayArea
帧。
希望这项工作。
首先,你需要熟悉这种方法的
// 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;
}
,做什么是你将它的杯子图像和面具图像一起喂它,它会掩盖你的杯子图像。它只会掩盖你的杯子形象,没有什么在下面,所以你不必担心。
您遇到的问题是灰框调整大小。我如何处理这个问题是根据滑块值裁剪蒙版。所以制作一个黑盒子,然后改变它的大小,在你通过该方法喂食之前如何处理grayBG。这应该很快这样做,所以我不会详细说明,但最后你会有这样的事情。请原谅半阐述图形
由于第一次的答案为我工作,我没有尝试这种(固定价格项目;))谢谢你的努力反正 – SnK 2012-04-02 13:22:39
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];
这工作就像一个魅力,我会在底部cuz它后我的最终代码确实需要一些增强。 Ty非常感谢 – SnK 2012-04-02 13:21:07