我希望在iOS的ImageView上实现图像掩蔽。图像掩蔽应该是具有圆角的六边形。有些第三方代码是可用的,但他们没有圆角。
请帮忙。因为我是iOS的新手。
我希望在iOS的ImageView上实现图像掩蔽。图像掩蔽应该是具有圆角的六边形。有些第三方代码是可用的,但他们没有圆角。
请帮忙。因为我是iOS的新手。
根据您显示图像的方式,可以以几种不同的方式对其进行遮罩。
您可以使用CALayer上的mask
属性。此属性是CALayer*
类型,并将适当地将目标层掩蔽到给定层的alpha通道。请注意,此属性可以是CALayer
的子类,特别是CAShapeLayer
,它允许您为掩蔽指定直接路径(在这里,您可以指定六边形)。还要注意,在掩蔽层上设置一些不透明颜色,以使掩蔽层实际上成为掩蔽。
注意:如果您需要绘制六边形的路径,请告诉我,因为我今天早些时候刚刚做了几何运算:D
您可以像这样使用CGImageMaskCreate
和CGImageCreateWithMask
:
- (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)mask {
CGImageRef cgmask = CGImageMaskCreate(CGImageGetWidth(mask.CGImage), CGImageGetHeight(mask.CGImage), CGImageGetBitsPerComponent(mask.CGImage), CGImageGetBitsPerPixel(mask.CGImage), CGImageGetBytesPerRow(mask.CGImage), CGImageGetDataProvider(mask.CGImage), NULL, false);
CGImageRef cgmaskedImage = CGImageCreateWithMask(image.CGImage, cgmask);
UIImage *retval = [UIImage imageWithCGImage:maskedImageRef];
CGImageRelease(cgmask);
CGImageRelease(cgmaskedImage);
return retval;
}
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
v.backgroundColor = [UIColor purpleColor];
CGRect rect = v.frame;
CAShapeLayer *hexagonMask = [CAShapeLayer layer];
UIBezierPath *hexagonPath = [UIBezierPath bezierPath];
CGFloat sideWidth = 2 * ( 0.5 * rect.size.width / 2 );
CGFloat lcolumn = ( rect.size.width - sideWidth ) / 2;
CGFloat rcolumn = rect.size.width - lcolumn;
CGFloat height = 0.866025 * rect.size.height;
CGFloat y = (rect.size.height - height) / 2;
CGFloat by = rect.size.height - y;
CGFloat midy = rect.size.height / 2;
CGFloat rightmost = rect.size.width;
[hexagonPath moveToPoint:CGPointMake(lcolumn, y)];
[hexagonPath addLineToPoint:CGPointMake(rcolumn, y)];
[hexagonPath addLineToPoint:CGPointMake(rightmost, midy)];
[hexagonPath addLineToPoint:CGPointMake(rcolumn, by)];
[hexagonPath addLineToPoint:CGPointMake(lcolumn, by)];
[hexagonPath addLineToPoint:CGPointMake(0, midy)];
[hexagonPath addLineToPoint:CGPointMake(lcolumn, y)];
hexagonMask.path = hexagonPath.CGPath;
v.layer.mask = hexagonMask;
你可以将你的图片视图替换为v
,它应该会自动遮罩。
编辑:带边框六边形的代码清单。请注意,在此示例中,lineWidth
只会显示为2.5
,因为它的一半将被裁剪掉。如果你想要一个真正的5
像素边框,那么请将lineWidth
指定为10
。
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
v.backgroundColor = [UIColor purpleColor];
CGRect rect = v.frame;
CAShapeLayer *hexagonMask = [CAShapeLayer layer];
CAShapeLayer *hexagonBorder = [CAShapeLayer layer];
hexagonBorder.frame = v.layer.bounds;
UIBezierPath *hexagonPath = [UIBezierPath bezierPath];
CGFloat sideWidth = 2 * ( 0.5 * rect.size.width / 2 );
CGFloat lcolumn = ( rect.size.width - sideWidth ) / 2;
CGFloat rcolumn = rect.size.width - lcolumn;
CGFloat height = 0.866025 * rect.size.height;
CGFloat y = (rect.size.height - height) / 2;
CGFloat by = rect.size.height - y;
CGFloat midy = rect.size.height / 2;
CGFloat rightmost = rect.size.width;
[hexagonPath moveToPoint:CGPointMake(lcolumn, y)];
[hexagonPath addLineToPoint:CGPointMake(rcolumn, y)];
[hexagonPath addLineToPoint:CGPointMake(rightmost, midy)];
[hexagonPath addLineToPoint:CGPointMake(rcolumn, by)];
[hexagonPath addLineToPoint:CGPointMake(lcolumn, by)];
[hexagonPath addLineToPoint:CGPointMake(0, midy)];
[hexagonPath addLineToPoint:CGPointMake(lcolumn, y)];
hexagonMask.path = hexagonPath.CGPath;
hexagonBorder.path = hexagonPath.CGPath;
hexagonBorder.fillColor = [UIColor clearColor].CGColor;
hexagonBorder.strokeColor = [UIColor blackColor].CGColor;
hexagonBorder.lineWidth = 5;
v.layer.mask = hexagonMask;
[v.layer addSublayer:hexagonBorder];