webentwicklung-frage-antwort-db.com.de

Wie man eine UIView maskiert

Ich arbeite an einer App, bei der ich einen UIView per Code zeichne und mit einem UIColor fülle. Als Nächstes möchte ich eine Datei mask.png laden (keine Transparenz, nur Schwarzweiß) und die UIView-Maske maskieren, um ihr visuelles Erscheinungsbild zu ändern.

Irgendeine Idee, wie das geht? 

27
Thomas Joos
// 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;

Denken Sie daran, QuartzCore zu importieren und das Framework hinzuzufügen

#import <QuartzCore/QuartzCore.h>

Es ist sehr einfach, aber ich habe nirgendwo die Antwort gefunden!

52
JEzu

iOS 8 führt die Eigenschaft maskView ein, mit der Sie eine alternative Ansicht verwenden können, um das Maskenbild bereitzustellen. In Swift:

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

Beachten Sie, dass Sie ein Bild angeben müssen, das tatsächlich transparent ist. Ein Bild mit weißen (für undurchsichtigen) und schwarzen (für transparenten) Bereichen funktioniert nicht.

12
Robert

Möglicherweise können Sie CGContextClipToMask verwenden:

-(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 );
}
5
drawnonward

Ich habe eine Kategorie mit dem obigen Code erstellt:

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
4
mt81

Vielen Dank,

endete mit dieser Funktion:

- (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];

}
3
Thomas Joos

Swift 2.0

Übergeben Sie einen UIImage und ein Maskenbild an diese Funktion, und Sie erhalten ein maskiertes Bild als 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
}
0
Ashutosh Jha