如何在iOS中的imageview上进行六角型图像遮罩?

Dar*_*han 3 iphone xcode objective-c ios xcode5

我想在iOS中的图像视图上实现图像遮罩。图像遮罩应为带有圆角的六边形。可以使用某些第三方代码,但是它们没有圆角。

请帮我。因为我是iOS新手。

Dan*_*imm 5

根据您显示图像的方式,可以用几种不同的方法对其进行遮罩。

情况1:CALayer

您可以mask在CALayer上使用该属性。此属性是CALayer*类型的,将目标层适当地遮罩到给定层的alpha通道。请注意,此属性可以是的子类CALayer,尤其是CAShapeLayer允许您为遮罩指定直接路径(在此可以指定六边形)。还要注意确保在蒙版层上设置一些不透明的颜色,以使被蒙版层真正变为蒙版。

注意:如果您需要帮助绘制六边形的路径,请告诉我,我最近做了今天早些时候的几何图形:D

情况2:CoreGraphics

您可以像这样使用CGImageMaskCreateCGImageCreateWithMask

- (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;
}
Run Code Online (Sandbox Code Playgroud)

蒙版图像应该在要蒙版放置的地方为黑色。这样,您可以在photoshop中创建一个六边形,然后使用此方法来创建蒙版图像。好的是,如果需要的话,它将自动缩放蒙版图像。

我个人更喜欢使用CALayers,因为即使UIImageView也由CALayer支持,并且我对CALayers 非常熟悉。就是说,我不确定哪种性能更好或执行此操作的正确方法。

编辑:添加六角形绘图代码。

在这里,我将创建一些代码来创建表示六边形的CGPathRef。

  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;
Run Code Online (Sandbox Code Playgroud)

您可以用替换图像视图v,它会自动将其遮盖。

编辑:带有边框的六边形的代码清单。请注意,此示例中的lineWidth只会出现,2.5因为一半会被裁剪。如果您想要一个真实的5像素边框,则将其指定lineWidth10

  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];
Run Code Online (Sandbox Code Playgroud)