UIView

2010-06-17 17 views
26

मास्क कैसे करें मैं एक ऐप पर काम कर रहा हूं जहां मैं कोड के माध्यम से UIView खींचता हूं और मैं इसे यूआईसीओलर से भरता हूं। अगली बात मैं एक mask.png फ़ाइल (कोई पारदर्शिता, सिर्फ काले और सफेद) लोड करना चाहता हूं और अपनी दृश्य उपस्थिति को बदलने के लिए UIView को मुखौटा करना चाहता हूं।UIView

कोई विचार यह कैसे करना है?

उत्तर

5

आप उपयोग करने के लिए सक्षम हो सकता है CGContextClipToMask:

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

धन्यवाद drawnonward,

इस समारोह के साथ समाप्त हो गया

#import <QuartzCore/QuartzCore.h> 

यह बहुत आसान है लेकिन मुझे कहीं भी जवाब नहीं मिला!

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 आयात और ढांचे जोड़ने का ध्यान रखें:

-(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); 
} 
+1

कोर ग्राफिक्स के बजाय कोर एनीमेशन का उपयोग करने वाले किसी भी उत्तर को प्राथमिकता दी जानी चाहिए। सीए का एपीआई समझने और उपयोग करने के लिए बहुत आसान है। – zakdances

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

+0

मैंने अल्फा के साथ एक काला छवि का उपयोग किया। लेकिन मुझे नहीं लगता कि इससे कोई फर्क पड़ेगा। यदि आप इसे आजमाते हैं, तो मुझे बताएं :)। – mt81

+0

मैंने कोशिश की। असल में एक अंतर है। केवल अल्फा घटक – Arsynth

11

iOS 8 maskView संपत्ति का परिचय जो आपको मुखौटा छवि प्रदान करने के लिए वैकल्पिक दृश्य का उपयोग करने की अनुमति देता है। स्विफ्ट में:

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

ध्यान दें कि आप एक छवि है जो वास्तव में पारदर्शिता है आपूर्ति की जरूरत; सफेद भागों (अपारदर्शी के लिए) और काले हिस्सों (पारदर्शी के लिए) वाली एक छवि काम नहीं करेगी।

+0

कोई विचार क्यों यह EXC_BAD_ACCESS के साथ क्रैश हो सकता है? (- [UIImageView _maskView]: संदेश को आवंटित उदाहरण पर भेजा गया) – Yaroslav

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 
}