gpt4 book ai didi

ios - 在 iOS 中使用 Core Graphics 绘制 VU 表

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:00:53 28 4
gpt4 key购买 nike

我正在尝试使用 Core Graphics 绘制与此有点相似的图像:

enter image description here

我能画出主弧,但我无法理解,如何将弧分成几部分/在弧上画刻度?我当前绘制圆弧的代码是:

[path addArcWithCenter:point radius:radius startAngle:DEGREES_TO_RADIANS(specific_start_angle) endAngle:DEGREES_TO_RADIANS(specific_end_angle) clockwise:NO];

我尝试使用 strokeWithBlendMode,但我遇到了刻度或刻度位置的问题。

最佳答案

Teja's solution will work fine for you ,但它确实需要您计算自己的毕业起点和终点。

我建议您创建一个函数,让您可以在给定的圆弧角度绘制刻度,在给定长度的情况下计算刻度的起点和终点。

static inline void drawGraduation(CGPoint center, CGFloat radius, CGFloat angle, CGFloat length, CGFloat width, CGColorRef color) {

CGContextRef c = UIGraphicsGetCurrentContext();

CGFloat radius2 = radius+length; // The radius of the end points of the graduations
CGPoint p1 = (CGPoint){cos(angle)*radius+center.x, sin(angle)*radius+center.y}; // the start point of the graduation
CGPoint p2 = (CGPoint){cos(angle)*radius2+center.x, sin(angle)*radius2+center.y}; // the end point of the graduation

CGContextMoveToPoint(c, p1.x, p1.y);
CGContextAddLineToPoint(c, p2.x, p2.y);

CGContextSetStrokeColorWithColor(c, color);
CGContextSetLineWidth(c, width);

CGContextStrokePath(c);
}

然后,当您为 VU 表的主刻度绘制弧线时,您可以在 for 循环中调用它(或者您想要这样做)。您还可以轻松自定义给定间隔的给定刻度的颜色、宽度和长度(例如,此代码每 5 个刻度给出一条更粗和更长的红线)。

- (void)drawRect:(CGRect)rect {

CGRect r = self.bounds;

CGFloat startAngle = -M_PI*0.2; // start angle of the main arc
CGFloat endAngle = -M_PI*0.8; // end angle of the main arc

NSUInteger numberOfGraduations = 16;
CGPoint center = (CGPoint){r.size.width*0.5, r.size.height*0.5}; // center of arc
CGFloat radius = (r.size.width*0.5)-20; // radius of arc

CGFloat maxGraduationWidth = 1.5; // the maximum graduation width
CGFloat maxGraduationWidthAngle = maxGraduationWidth/radius; // the maximum graduation width angle (used to prevent the graduations from being stroked outside of the main arc)

// draw graduations
CGFloat deltaArc = (endAngle-startAngle+maxGraduationWidthAngle)/(numberOfGraduations-1); // the change in angle of the arc
CGFloat startArc = startAngle-(maxGraduationWidthAngle*0.5); // the starting angle of the arc

for (int i = 0; i < numberOfGraduations; i++) {
if (i % 5 == 0) {
drawGraduation(center, radius, startArc+(i*deltaArc), 14, 1.5, [UIColor redColor].CGColor); // red graduation every 5 graduations.
} else {
drawGraduation(center, radius, startArc+(i*deltaArc), 10, 1, [UIColor blackColor].CGColor);
}

}

// draw main arc
UIBezierPath* mainArc = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:NO];
[[UIColor blackColor] setStroke];
mainArc.lineWidth = 2;
[mainArc stroke];

}

输出

enter image description here


完整项目:https://github.com/hamishknight/VU-Meter-Arc

关于ios - 在 iOS 中使用 Core Graphics 绘制 VU 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039208/

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