gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:09:51 29 4
gpt4 key购买 nike

我需要为屏幕上的形状着色任何我想要的颜色。我目前正在尝试使用 UIImage 来执行此操作,我想根据自己的需要重新着色。据我所知,执行此操作的唯一方法是获取 UIImage 的各个像素,这需要更多我想编写的代码行来解决此问题。除了我写的以外,还有什么方法可以改变 UIImage 的颜色吗?在上下文中绘制形状并填充它会更容易吗?

TY.

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

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( p.x ) + anchorPoint.x * fmodf( size.width, 2.0f ), roundf( p.y ) + 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 ;
p.x = CGRectGetMinY( bounds ) ;

while( p.y < CGRectGetMaxY( bounds ) )
{
p.x = CGRectGetMinX( bounds ) ;
while( p.x < 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 = { p.x + self.hexWidth * 0.75f, p.y + 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 ] ;
}

p.x += self.hexWidth * 1.5 ;
}
p.y += 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

关于ios - 如何绘制不同颜色的填充路径/形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17415730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com