所以我见过如何将UIImages裁剪成某些形状的解决方案,但六角形?以六角形的形状裁剪UIImage?
想法:子类UIImage,更改drawRect方法只绘制某些部分?
编辑:更具体地说,我希望保持图像边界相同,但使图像数据在六边形之外是透明的,所以它出现图像是六角形的形状,当实际上它具有相同的矩形边界,而图像的一部分是透明的。
不知道。很想听听你们的想法。
所以我见过如何将UIImages裁剪成某些形状的解决方案,但六角形?以六角形的形状裁剪UIImage?
想法:子类UIImage,更改drawRect方法只绘制某些部分?
编辑:更具体地说,我希望保持图像边界相同,但使图像数据在六边形之外是透明的,所以它出现图像是六角形的形状,当实际上它具有相同的矩形边界,而图像的一部分是透明的。
不知道。很想听听你们的想法。
你可以把图片放在UIImageView
?如果是这样的话:
创建一个新的CAShapeLayer
(记得要导入QuartzCore!)。创建六边形形状的CGPathRef
或UIBezierPath
,并将其设置为形状图层的path
属性。将您的形状图层设置为图像视图图层的mask
。
如果你想修改UIImage
本身,你可能会想添加一个类中的方法类似- (UIImage)hexagonImage
其绘制图像到由使用CGContextClipPath
,然后你的六边形路径钳位的CGGraphicsContext
返回从图形创建UIImage
上下文。
编辑:这里是代码样本
(注:我有点构建我的回答冲昏头脑,你可以同时看到下面提到的技术,除了一些代码生成UIBezierPath
ñ边形,在ZEPolygon示例项目)
方法1:面膜的图像与图CAShapeLayer
UIImageView *maskedImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
// insert your code for generating a hexagon here, or use mine from ZEPolygon
UIBezierPath *nonagon = [UIBezierPath bezierPathWithPolygonInRect:maskedImageView.frame numberOfSides:9];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = nonagon.CGPath;
maskedImageView.layer.mask = shapeLayer;
[self.view addSubview:maskedImageView];
方法2:UIImage
类返回一个蒙面版本
在UIImage+PolygonMasking.h
:
#import <UIKit/UIKit.h>
@interface UIImage (ABCPolygonMasking)
- (UIImage *)abc_imageMaskedWithPolygonWithNumberOfSides:(NSUInteger)numberOfSides;
@end
在UIImage+PolygonMasking.m
:
#import "UIImage+PolygonMasking.h"
#import "UIBezierPath+ZEPolygon.h"
@implementation UIImage (ABCPolygonMasking)
- (UIImage *)abc_imageMaskedWithPolygonWithNumberOfSides:(NSUInteger)numberOfSides
{
UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
CGContextRef ctx = UIGraphicsGetCurrentContext();
// insert your code for generating a hexagon here, or use mine from ZEPolygon
UIBezierPath *path = [UIBezierPath bezierPathWithPolygonInRect:CGRectMake(0, 0, self.size.width, self.size.height)
numberOfSides:numberOfSides];
CGContextSaveGState(ctx);
[path addClip];
[self drawAtPoint:CGPointMake(0, 0)];
CGContextRestoreGState(ctx);
UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return retImage;
}
@end
Zev - 非常感谢您对该做什么的高级概述。但是 - 我几乎没有使用CA和修改图像的经验。当你有机会时,你介意发布代码示例吗?这将不胜感激!谢谢。 –
发布示例代码。 –
。这里的'crop'是什么意思?由此产生的图像仍然会像以前一样有界限,所以你想要在六边形之外的图像数据发生什么?你是否希望它透明并将产生的图像保存到磁盘?您是否想直接绘制图像,而不用六边形遮盖部分? – schmubob
上面做了编辑! –