如何绘制不同颜色的填充路径/形状

我需要在屏幕上为我想要的任何颜色着色。 我目前正试图用UIImage做这个,我想重新调整我的欲望。 据我所知,唯一的方法是获取UIImage的各个像素,这需要更多代码行,我想写这些代码来解决这个问题。 除了我写的东西之外,还有什么方法可以改变UIImage的颜色吗? 在上下文中绘制形状并填充它会更容易吗?

TY。

更新: Hexagon正在以正确的方式绘制自己,但它根本没有填充。 这是代码:

self.Hexagon.lineWidth=10; [self.Hexagon moveToPoint:CGPointMake(hexWidth/2, 0)]; [self.Hexagon addLineToPoint:CGPointMake(hexWidth, hexHeight/4)]; [self.Hexagon addLineToPoint:CGPointMake(hexWidth, hexHeight*0.75)]; [self.Hexagon addLineToPoint:CGPointMake(hexWidth/2, hexHeight)]; [self.Hexagon addLineToPoint:CGPointMake(0, hexHeight*0.75)]; [self.Hexagon addLineToPoint:CGPointMake(0, hexHeight/4)]; [self.Hexagon addLineToPoint:CGPointMake(hexWidth/2, 0)]; [self.Hexagon closePath]; [[UIColor blackColor] setStroke]; [self.Hexagon stroke]; [[UIColor whiteColor] setFill]; [self.Hexagon fill]; 

我建议使用CAShapeLayer 。 您甚至可以为填充颜色设置动画。 您的表现将非常好,您的内存使用率也会很低。

此函数创建一个包含六边形的CGPath :(基于OP问题)

 CGPathRef CGPathCreateHexagon( CGFloat hexWidth, CGFloat hexHeight ) { CGMutablePathRef p = CGPathCreateMutable() ; CGPathMoveToPoint( p, NULL, hexWidth * 0.5, 0.0 ) ; CGPathAddLineToPoint( p, NULL, hexWidth, hexHeight * 0.75 ) ; CGPathAddLineToPoint( p, NULL, hexWidth, hexHeight * 0.75 ) ; CGPathAddLineToPoint( p, NULL, hexWidth * 0.5, hexHeight ) ; CGPathAddLineToPoint( p, NULL, 0.0, hexHeight * 0.75 ) ; CGPathAddLineToPoint( p, NULL, hexWidth * 0.5, 0.0 ) ; CGPathAddLineToPoint( p, NULL, 0.0, hexHeight * 0.25 ) ; CGPathAddLineToPoint( p, NULL, hexWidth * 0.5, 0.0 ) ; CGPathCloseSubpath( p ) ; return p ; } 

设置UIView时使用的方法:

 -(void)addHexagonLayer { CAShapeLayer * layer = [ CAShapeLayer layer ] ; layer.lineWidth = 10.0 ; { CGPathRef p = CGPathCreateHexagon( 100.0, 100.0 ) ; layer.path = p ; CGPathRelease( p ) ; } layer.fillColor = [[ UIColor redColor ] CGColor ] ; // put your fill color here layer.position = (CGPoint){ CGRectGetMidX( self.view.bounds ), CGRectGetMidY( self.view.bounds ) } ; // position your hexagon layer appropriately. [ self.view.layer addSublayer:layer ] ; // add layer to your view and position appropriately } 

编辑我创建了一个完整的演示只是为了好玩:

 #import "AppDelegate.h" static CGPathRef CGPathCreateHexagon( CGAffineTransform * t, CGFloat w, CGFloat h ) { CGFloat w_4 = w * 0.25 ; CGFloat w_2 = w * 0.5f ; CGFloat h_2 = h * 0.5f ; CGMutablePathRef p = CGPathCreateMutable() ; CGPathAddLines( p, t, (CGPoint[]){ { -w_4, h_2 }, { w_4, h_2 }, { w_2, 0 }, { w_4, -h_2 }, { -w_4, -h_2 }, { -w_2, 0 } }, 6 ) ; CGPathCloseSubpath( p ) ; return p ; } @implementation CALayer (SetPositionPixelAligned) -(CGPoint)pixelAlignedPositionForPoint:(CGPoint)p { CGSize size = self.bounds.size ; CGPoint anchorPoint = self.anchorPoint ; CGPoint result = (CGPoint){ roundf( px ) + anchorPoint.x * fmodf( size.width, 2.0f ), roundf( py ) + anchorPoint.y * fmodf( size.height, 2.0f ) } ; return result; } @end @interface HexagonsView : UIView @property ( nonatomic ) CGFloat hexHeight ; @property ( nonatomic ) CGFloat hexWidth ; @property ( nonatomic, readonly ) CGPathRef hexagonPath ; @end @implementation HexagonsView @synthesize hexagonPath = _hexagonPath ; -(void)dealloc { CGPathRelease( _hexagonPath ) ; _hexagonPath = NULL ; } -(CGPathRef)hexagonPath { if ( !_hexagonPath ) { _hexagonPath = CGPathCreateHexagon( NULL, self.hexWidth, self.hexHeight ) ; } return _hexagonPath ; } -(void)setHexWidth:(CGFloat)w { _hexWidth = w ; CGPathRelease( _hexagonPath ) ; _hexagonPath = NULL ; } -(void)setHexHeight:(CGFloat)h { _hexHeight = h ; CGPathRelease( _hexagonPath ) ; _hexagonPath = NULL ; } -(void)layoutSubviews { [ super layoutSubviews ] ; CGRect bounds = self.bounds ; bounds.size.height += self.hexHeight * 0.5 ; // make sure we cover last row ; CGPoint p ; px = CGRectGetMinY( bounds ) ; while( py < CGRectGetMaxY( bounds ) ) { px = CGRectGetMinX( bounds ) ; while( px < CGRectGetMaxX( bounds ) ) { { CAShapeLayer * layer = [ CAShapeLayer layer ] ; layer.path = self.hexagonPath ; layer.fillColor = [[ UIColor colorWithHue:(CGFloat)arc4random_uniform( 100 ) / 256.0 saturation:1.0 brightness:1.0 alpha:1.0 ] CGColor ] ; layer.position = [ layer pixelAlignedPositionForPoint:p ] ; [ self.layer addSublayer:layer ] ; } CGPoint p2 = { px + self.hexWidth * 0.75f, py + self.hexHeight * 0.5f } ; if ( p2.y < CGRectGetMaxY( bounds )) // no unnecessary hexagons { CAShapeLayer * layer = [ CAShapeLayer layer ] ; layer.path = self.hexagonPath ; layer.fillColor = [[ UIColor colorWithHue:(CGFloat)arc4random_uniform( 256 ) / 256.0 saturation:1.0 brightness:1.0 alpha:1.0 ] CGColor ] ; layer.position = [ layer pixelAlignedPositionForPoint:p2 ] ; [ self.layer addSublayer:layer ] ; } px += self.hexWidth * 1.5 ; } py += self.hexHeight ; } } @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; HexagonsView * view = [[ HexagonsView alloc ] initWithFrame:self.window.bounds ] ; view.hexHeight = 100.0f ; view.hexWidth = 100.0f ; [ self.window addSubview:view ] ; [self.window makeKeyAndVisible]; return YES; } @end 

创建一个描述您的形状的UIBezierPath,然后使用它的填充方法绘制您想要的颜色。

将UIView子类化并添加以下代码:

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); //Set color of the border CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); //Set color of the fill CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0); // Set width of border line CGContextSetLineWidth(context, 2.0); //Pseudocode: Draw your hexagons with something like this for(int idx = 0; idx < self.points.count; idx++) { point = [self.points objectAtIndex:idx];//Edited if(idx == 0) { // move to the first point CGContextMoveToPoint(context, point.x, point.y); } else { //Add a point to the hexagon. The last point should be equal to the first point CGContextAddLineToPoint(context, point.x, point.y); } } //Fill in the hexagon CGContextDrawPath(context, kCGPathFillStroke) } 

对要绘制的每个六边形重复此操作。 理想情况下,您可以在arrays中获得六边形的所有点,以便于参考。