2010-06-17 24 views
26

Sto lavorando a un'app in cui disegno un UIView tramite codice e lo riempio con un UIColor. La prossima cosa che voglio caricare un file mask.png (senza trasparenza, solo in bianco e nero) e mascherare l'UIView per cambiare il suo aspetto visivo.Come mascherare un UIView

Qualche idea su come procedere?

risposta

5

Potreste essere in grado di utilizzare 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

Grazie drawnonward,

finito con questa funzione:

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

Ricordati di importare QuartzCore e aggiungere il quadro

#import <QuartzCore/QuartzCore.h> 

È molto facile ma non ho trovato la risposta da nessuna parte!

+1

Qualsiasi risposta che utilizza Core Animation anziché Core Graphics deve essere preferita. L'API di CA è molto più facile da capire e da usare. – zakdances

4

devo creare una categoria con il codice di cui sopra:

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

Che tipo di immagine hai in input? bianco e nero o traslucido e bianco o traslucido e nero? – Vassily

+0

Ho usato un'immagine nera con alfa. Ma non penso che questo farà la differenza. Se lo provi, fammi sapere :). – mt81

+0

Ho provato. In realtà hanno una differenza. Solo il componente alfa avrà effetto – Arsynth

11

iOS 8 introduce la proprietà maskView che consente di utilizzare una vista alternativa per fornire l'immagine della maschera. In Swift:

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

Nota che è necessario fornire un'immagine che abbia effettivamente trasparenza; un'immagine con parti bianche (opache) e nere (per trasparenti) non funzionerà.

+0

Qualche idea sul perché questo potrebbe bloccarsi con EXC_BAD_ACCESS? (- [UIImageView _maskView]: messaggio inviato all'istanza deallocata) – Yaroslav

0

Swift 2.0

passare un immagine di una maschera UIImage e a questa funzione, e si otterrà un'immagine mascherata come 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 
} 
Problemi correlati