Je travaille sur une application dans laquelle je dessine un code UIView via un code et je le remplis avec un UIColor. La prochaine chose que je veux charger un fichier mask.png (pas de transparence, juste en noir et blanc) et masquer UIView pour changer son apparence.
Une idée comment faire ça?
// 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;
N'oubliez pas d'importer QuartzCore et d'ajouter le cadre
#import <QuartzCore/QuartzCore.h>
C'est très facile mais je n'ai trouvé la réponse nulle part!
iOS 8 introduit la propriété maskView
qui vous permet d’utiliser une autre vue pour fournir l’image de masque. En rapide:
if let maskImage = UIImage(named: "MaskImage") {
myView.maskView = UIImageView(image: maskImage)
}
Notez que vous devez fournir une image qui présente une transparence. une image avec des parties blanches (pour les opaques) et noires (pour les transparentes) ne fonctionnera pas.
Vous pourrez peut-être utiliser 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 );
}
J'ai créer une catégorie avec le code ci-dessus:
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
Merci drawonward,
fini avec cette fonction:
- (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];
}
Swift 2.0
Passez une image UIImage et une image de masque à cette fonction et vous obtiendrez une image masquée sous la forme d'une image UII.
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
}