uiimageView遮罩层、iOS不规则的ImageView

转自 : http://www.it165.net/pro/html/201411/27187.html

又加以整理


#import "ShapedImageView.h"

@interface ShapedImageView()
{
    CALayer      *_contentLayer;
    CAShapeLayer *_maskLayer;
}
@end

@implementation ShapedImageView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)setup
{
    _maskLayer = [CAShapeLayer layer];
    _maskLayer.path = [UIBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
    _maskLayer.fillColor = [UIColor blackColor].CGColor;
    _maskLayer.strokeColor = [UIColor redColor].CGColor;
    _maskLayer.frame = self.bounds;
    _maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
    _maskLayer.contentsScale = [UIScreen mainScreen].scale;
    
    _contentLayer = [CALayer layer];
    _contentLayer.mask = _maskLayer;
    _contentLayer.frame = self.bounds;
    [self.layer addSublayer:_contentLayer];
    
}

- (void)setImage:(UIImage *)image
{
    _contentLayer.contents = (id)image.CGImage;
}

@end

 

 


_maskLayer = [CAShapeLayer layer];
_maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:20].CGPath;
_maskLayer.fillColor = [UIColor blackColor].CGColor;
_maskLayer.strokeColor = [UIColor redColor].CGColor;
_maskLayer.frame = self.bounds;
_maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
_maskLayer.contentsScale = [UIScreen mainScreen].scale;                 //非常关键设置自动拉伸的效果且不变形

_contentLayer = [CALayer layer];
_contentLayer.mask = _maskLayer;
_contentLayer.frame = self.bounds;
[self.layer addSublayer:_contentLayer];



CGMutablePathRef path = CGPathCreateMutable();
CGPoint origin = self.bounds.origin;
CGFloat radius = CGRectGetWidth(self.bounds) / 2;
CGPathMoveToPoint(path, NULL, origin.x, origin.y + 2 *radius);
CGPathMoveToPoint(path, NULL, origin.x, origin.y + radius);

CGPathAddArcToPoint(path, NULL, origin.x, origin.y, origin.x + radius, origin.y, radius);
CGPathAddArcToPoint(path, NULL, origin.x + 2 * radius, origin.y, origin.x + 2 * radius, origin.y + radius, radius);
CGPathAddArcToPoint(path, NULL, origin.x + 2 * radius, origin.y + 2 * radius, origin.x + radius, origin.y + 2  * radius, radius);
CGPathAddLineToPoint(path, NULL, origin.x, origin.y + 2 * radius);

_maskLayer = [CAShapeLayer layer];
_maskLayer.path = path;
_maskLayer.fillColor = [UIColor blackColor].CGColor;
_maskLayer.strokeColor = [UIColor clearColor].CGColor;
_maskLayer.frame = self.bounds;
_maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
_maskLayer.contentsScale = [UIScreen mainScreen].scale;                 //非常关键设置自动拉伸的效果且不变形

_contentLayer = [CALayer layer];
_contentLayer.mask = _maskLayer;
_contentLayer.frame = self.bounds;
[self.layer addSublayer:_contentLayer];




    _maskLayer = [CAShapeLayerlayer];

    _maskLayer.fillColor = [UIColorblackColor].CGColor;

    _maskLayer.strokeColor = [UIColorclearColor].CGColor;

    _maskLayer.frame = self.bounds;

    _maskLayer.contentsCenter =CGRectMake(0.5,0.5,0.1,0.1);

    _maskLayer.contentsScale = [UIScreenmainScreen].scale;

    //非常关键设置自动拉伸的效果且不变形

    _maskLayer.contents = (id)[UIImageimageNamed:@"gray_bubble_right@2x.png"].CGImage;

    _contentLayer = [CALayer layer];

    _contentLayer.mask = _maskLayer;

    _contentLayer.frame = self.bounds;

    [self.layer addSublayer:_contentLayer];

gray_bubble_right就是你想要的形状,运行效果如下:






    UIImageView *imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,0,200,300)];

    //这里就是我们需要显示的图片

    imageView.image =[UIImageimageNamed:@"1.jpg"];

    [self.viewaddSubview:imageView];

 

    

    CAShapeLayer* maskLayer = [CAShapeLayerlayer];

    maskLayer.frame = imageView.frame;

    maskLayer.contentsScale = [UIScreenmainScreen].scale;

    maskLayer.contentsCenter =CGRectMake(0.5,0.5,0.1,0.1);

    maskLayer.contents = (id)[UIImageimageNamed:@"communication_chat_right.png"].CGImage;

    [imageView.layersetMask:maskLayer];

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值