【问题标题】:How to mask a UIView如何屏蔽 UIView
【发布时间】:2011-03-04 19:54:40
【问题描述】:

我正在开发一个应用程序,通过代码绘制 UIView 并用 UIColor 填充它。接下来我要加载一个 mask.png 文件(没有透明度,只有黑色和白色)并屏蔽 UIView 以更改其视觉外观。

知道怎么做吗?

【问题讨论】:

    标签: iphone uiview masking


    【解决方案1】:
    // 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 并添加框架

    #import <QuartzCore/QuartzCore.h>
    

    这很容易,但我在任何地方都没有找到答案!

    【讨论】:

    • 任何使用核心动画而不是核心图形的答案都应该是首选。 CA 的 API 更易于理解和使用。
    【解决方案2】:

    iOS 8 引入了maskView 属性,它允许您使用备用视图来提供遮罩图像。在斯威夫特:

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

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

    【讨论】:

    • 知道为什么这可能会因 EXC_BAD_ACCESS 而崩溃吗? (-[UIImageView _maskView]: 消息发送到释放的实例)
    【解决方案3】:

    您也许可以使用 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 );
    }
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 你有什么样的图像输入?黑白或半透明和白色或半透明和黑色?
      • 我使用了带有 alpha 的黑色图像。但我不认为这会有所作为。如果你尝试一下,请告诉我:)。
      • 我试过了。其实还是有区别的。只有 alpha 组件才会生效
      • 是的,图像需要是带有 alpha 分量的 PNG。只有 alpha 会被屏蔽,其余的可以是白色或黑色,没关系
      【解决方案5】:

      感谢drawonward,

      结束了这个功能:

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

      【讨论】:

        【解决方案6】:

        Swift 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
        }
        

        【讨论】:

          猜你喜欢
          • 2011-10-11
          • 2011-07-24
          • 1970-01-01
          • 2019-04-14
          • 2011-11-06
          • 2014-09-04
          • 1970-01-01
          • 2017-05-09
          • 1970-01-01
          相关资源
          最近更新 更多