2010-06-17 100 views
26

我正在一个应用程序,我通过代码绘制UIView,并用UIColor填充它。接下来我想加载一个mask.png文件(不透明,只是黑白),并掩盖UIView以改变其视觉外观。如何掩盖UIView

任何想法如何做到这一点?

回答

5

您可能能够使用CGContextClipToMask:

-(void) drawRect:(CGRect)dirty { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextClipToMask(context , [self bounds] , [self maskImage]); 
    [super drawRect:dirty]; // or draw your color manually 
    CGContextRestoreGState(context); 
} 
3

感谢drawnonward,

结束了此功能:

- (UIImage*) maskImage:(UIView *)image withMask:(UIImage *)maskImage { 

    UIGraphicsBeginImageContext(image.bounds.size); 
    [image.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 


    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([viewImage CGImage], mask); 
    return [UIImage imageWithCGImage:masked]; 

} 
51
// Create your mask layer 
CALayer* maskLayer = [CALayer layer]; 
maskLayer.frame = CGRectMake(0,0,yourMaskWidth ,yourMaskHeight); 
maskLayer.contents = (__bridge id)[[UIImage imageNamed:@"yourMaskImage.png"] CGImage]; 

// Apply the mask to your uiview layer   
yourUIView.layer.mask = maskLayer; 

记得导入QuartzCore并添加框架

#import <QuartzCore/QuartzCore.h> 

这很容易,但我没有在任何地方找到答案!

+1

应该首选任何使用Core Animation而不是Core Graphics的答案。 CA的API更易于理解和使用。 – zakdances 2013-04-24 05:15:37

4

我已创建与上述代码的类别:

的UIView + ImageMask.h:

#import <UIKit/UIKit.h> 

@interface UIView (ImageMask) 

- (void) maskWithImage:(UIImage*) mask; 
- (void) maskWithImage:(UIImage*)mask size:(CGSize)maskSize; 
- (void) removeMask; 

@end 

的UIView + ImageMask.m:

#import <QuartzCore/QuartzCore.h> 

#import "UIView+ImageMask.h" 

@implementation UIView (ImageMask) 

- (void) maskWithImage:(UIImage*) mask { 
    [self maskWithImage:mask size:mask.size]; 
} 

- (void) maskWithImage:(UIImage*)mask size:(CGSize)maskSize { 
    CALayer* maskLayer = [CALayer layer]; 
    maskLayer.frame = CGRectMake(0, 0, maskSize.size.width, maskSize.size.height); 
    maskLayer.contents = (__bridge id)[mask CGImage]; 

    // Apply the mask to your uiview layer 
    self.layer.mask = maskLayer; 
} 

- (void) removeMask { 
    self.layer.mask = nil; 
} 

@end 
+0

你有什么样的图像输入?黑色或白色或半透明,白色或半透明和黑色? – Vassily 2014-02-20 16:53:40

+0

我用一个黑色的图像与阿尔法。但我不认为这会有所作为。如果你尝试它,让我知道:)。 – mt81 2014-02-20 20:16:33

+0

我试过了。其实有区别。只有alpha分量才会生效 – Arsynth 2014-02-27 15:09:57

11

iOS 8的介绍maskView属性它允许您使用替代视图来提供遮罩图像。在Swift中:

if let maskImage = UIImage(named: "MaskImage") { 
    myView.maskView = UIImageView(image: maskImage) 
} 

请注意,您需要提供实际具有透明度的图像;具有白色部分(用于不透明)和黑色部分(用于透明)的图像将不起作用。

+0

任何想法为什么这可能会崩溃与EXC_BAD_ACCESS? ( - [UIImageView _maskView]:发送到释放实例的消息) – Yaroslav 2016-05-07 18:17:38

0

雨燕2.0

传递一个UIImage和遮掩图像这个功能,你会得到一个遮盖的图像作为一个UIImage。

func maskImage(image:UIImage, mask:(UIImage))->UIImage{ 

    let imageReference = image.CGImage 
    let maskReference = mask.CGImage 

    let imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
            CGImageGetHeight(maskReference), 
            CGImageGetBitsPerComponent(maskReference), 
            CGImageGetBitsPerPixel(maskReference), 
            CGImageGetBytesPerRow(maskReference), 
            CGImageGetDataProvider(maskReference), nil, true) 

    let maskedReference = CGImageCreateWithMask(imageReference, imageMask) 

    let maskedImage = UIImage(CGImage:maskedReference!) 

    return maskedImage 
}