您的位置:首页 > 产品设计 > UI/UE

uiimageView遮罩层、iOS不规则的ImageView

2015-06-26 18:34 651 查看
转自 : 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];

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: