如何掩盖UIView

Tho*_*oos 27 iphone masking uiview

我正在开发一个应用程序,我通过代码绘制UIView,然后用UIColor填充它.接下来我想加载一个mask.png文件(没有透明度,只是黑白),并掩盖UIView来改变它的视觉外观.

知道怎么做吗?

小智 52

// 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;
Run Code Online (Sandbox Code Playgroud)

记得导入QuartzCore并添加框架

#import <QuartzCore/QuartzCore.h>
Run Code Online (Sandbox Code Playgroud)

这很容易,但我没有找到答案!


Rob*_*ert 12

iOS 8引入了maskView属性,允许您使用备用视图来提供蒙版图像.在Swift中:

if let maskImage = UIImage(named: "MaskImage") {
    myView.maskView = UIImageView(image: maskImage)
}
Run Code Online (Sandbox Code Playgroud)

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


dra*_*ard 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 );
}
Run Code Online (Sandbox Code Playgroud)


mt8*_*t81 5

我用上面的代码创建了一个类别:

UIView+ImageMask.h :

#import <UIKit/UIKit.h>

@interface UIView (ImageMask)

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

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)