• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 使用 Coregraphics 一次绘制多个 Guage 图表

[复制链接]
菜鸟教程小白 发表于 2022-12-13 02:52:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我只使用 CORE GRAPHICS 制作图表。我已经成功完成了折线图、条形图和单线图的绘制。

现在我的要求是 My requirement

但是当我在上下文中绘制时,我只得到一个这样的图表

What i got 我已经获取了数组中图表的百分比并使用 for 循环,我一直在绘制数组中的所有百分比,但我得到的最终结果只是一个量表是数组中的最后一个对象。

我使用这些 link 绘制了这些图表

稍微改一下代码和画图这样

我用来绘制量规图的代码是

首先我从我的 Viewcontroller 调用 guagegraph(UIView 的子类)

percentageArray 包含每个量表的百分比

percentageArray = [[NSArray alloc] initWithObjects"80", @"76", @"92", @"49", nil];
for (int i = 0; i < percentageArray.count; i++)
    {
        [guageGraph setPercent:[percentageArray[i] intValue] withIndex:i];
    }

然后在guagegraph下面的方法

- (void)setPercentint)percent withIndexint)i
{
CGFloat floatPercent = percent / 100.0;
floatPercent = MIN(1, MAX(0, floatPercent));
percentLayer.percent = floatPercent;
percentLayer.i = i;
[self setNeedsLayout];
[percentLayer setNeedsDisplay];
}

然后调用 percentLayer 类(CALayer 的子类)并绘制上下文

-(void)drawInContextCGContextRef)ctx
{
[self DrawRight:ctx];
[self DrawLeft:ctx];

}
-(void)DrawRightCGContextRef)ctx
{
CGPoint center = CGPointMake(self.frame.size.width / 2, 160);

CGFloat delta = -toRadians(270 * percent);


CGContextSetFillColorWithColor(ctx, [UIColor orangeColor].CGColor);

CGContextSetLineWidth(ctx, 1);

CGContextSetLineCap(ctx, kCGLineCapRound);

CGContextSetAllowsAntialiasing(ctx, YES);

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddRelativeArc(path, NULL, center.x, center.y, 135 - 5 - (15 * i), (3 * M_PI / 4), -delta);
CGPathAddRelativeArc(path, NULL, center.x, center.y, 150 - 5 - (15 * i), (3 * M_PI / 4) - delta, delta);
CGPathAddLineToPoint(path, NULL, center.x, center.y);

CGContextAddPath(ctx, path);
CGContextFillPath(ctx);
}

-(void)DrawLeftCGContextRef)ctx
{
CGPoint center = CGPointMake(self.frame.size.width / 2, 160);
CGFloat delta = toRadians(270 * (1 - percent));


CGContextSetFillColorWithColor(ctx, [UIColor groupTableViewBackgroundColor].CGColor);

CGContextSetLineWidth(ctx, 1);

CGContextSetLineCap(ctx, kCGLineCapRound);

CGContextSetAllowsAntialiasing(ctx, YES);

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddRelativeArc(path, NULL, center.x, center.y, 135 - 5 - (15 * i), (M_PI / 4), -delta);
CGPathAddRelativeArc(path, NULL, center.x, center.y, 150 - 5 - (15 * i), (M_PI / 4) - delta, delta);
CGPathAddLineToPoint(path, NULL, center.x, center.y);

CGContextAddPath(ctx, path);
CGContextFillPath(ctx);
}

drawRight 方法是绘制橙色的,draw left 方法是绘制grouptableviewbackground 的颜色。

循环开始时,绘制第一个百分比图,当第二个循环开始时,第一个绘制的图表被当前循环百分比覆盖并绘制第二个图表,这样只显示最后一个图表

感谢任何帮助。



Best Answer-推荐答案


我相信你的问题就在这里 ->

 percentageArray = [[NSArray alloc] initWithObjects"80", @"76", @"92", @"49", nil];
 for (int i = 0; i < percentageArray.count; i++)
{
    [guageGraph setPercent:[percentageArray[i] intValue] withIndex:i];
}

我觉得您应该将它们添加到数组中。并在绘制完所有对象后显示它们。

编辑

第一 让你的 precentLayer 类显示不同的颜色仪表。所以将这段代码添加到 -(void)drawRight

CGFloat hue = ( arc4random() % 256 / 256.0 );  //  0.0 to 1.0
CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from white
CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from black
UIColor *randomColor = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];

//update this line
CGContextSetFillColorWithColor(ctx, randomColor.CGColor);

如果不是这样,看看它们是否只是相互重叠......

================================================ ==============================

那么因为只有一个 View ,试试这样的。

percentageArray = [[NSArray alloc] initWithObjects"80", @"76", @"92", @"49", nil];

for (int i = 0; i < percentageArray.count; i++) {

    UIView *percentGauge =[self setPercent:[percentageArray[i] intValue] withIndex:i];

    //make background clear so we can see the guage behind it
    percentGauge.backgroundColor = [UIColor clearColor];
}

并让 -(void)setPercent: withIndex: 返回一个 UIView 所以....

- (UIView *)setPercentint)percent withIndexint)i {
    CGFloat floatPercent = percent / 100.0;
    floatPercent = MIN(1, MAX(0, floatPercent));
    percentLayer.percent = floatPercent;
    percentLayer.i = i;
    [self setNeedsLayout];
    [percentLayer setNeedsDisplay];


    return self;
}

如果这没有任何帮助,您可以将您正在使用的文件上传到 Dropbox,我可以试一试。

关于ios - 使用 Coregraphics 一次绘制多个 Guage 图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26629360/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap