【发布时间】:2026-02-11 08:35:01
【问题描述】:
我正在尝试在某个角度上绘制线性 CGGradient。因为“CGContextDrawLinearGradientWithAngle()”不存在,所以我尝试使用 CGContextDrawLinearGradient(CGContextRef, CGGradientRef, CGPoint startPoint, CGPoint endPoint, CGGradientDrawingOptions)。
考虑到这一点,我需要将角度(度)转换为起点和终点。我想模仿 NSGradient 的 drawInBezierPath:angle。 (遗憾的是,作为 AppKit 的一部分,iOS 开发人员无法使用 NSGradient。)幸运的是,文档告诉我们如何get the starting gradient:
- (CGPoint)startingPointForAngle:(CGFloat)angle rect:(CGRect)rect {
CGPoint point = CGPointZero;
if (angle < 90.0f)
point = CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect));
else if (angle < 180.0f)
point = CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect));
else if (angle < 270.0f)
point = CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect));
else
point = CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect));
return point;
}
不幸的是,文档没有告诉我们如何获得终点。 (使用矩形的高度或宽度作为距离仅适用于某些角度。)Several sites out there 告诉我们如何找到终点。不幸的是,在我计算终点之前需要知道距离。然而,需要计算终点以获得距离。显然还有更多,因为 NSGradient 似乎已经弄清楚了。
- (CGPoint)endingPointForAngle:(CGFloat)angle rect:(CGRect)rect startingPoint:(CGPoint)startingPoint {
//http://www.zahniser.net/~russell/computer/index.php?title=Angle%20and%20Coordinates
//(x + distance * cos(a), y + distance * sin(a))
CGFloat angleInRadians = (CGFloat)M_PI/180.0f * angle;
CGFloat distance = ????????;
CGPoint point = CGPointMake(startingPoint.x + distance * cosf(angleInRadians), startingPoint.y + distance * sinf(angleInRadians));
return point;
}
CGPoint startingGradientPoint = [self startingPointForAngle:self.fillGradientAngle rect:rect];
CGPoint endingGradientPoint = [self endingPointForAngle:self.fillGradientAngle rect:rect startingPoint:startingGradientPoint];
CGContextDrawLinearGradient(graphicsContext, self.fillGradient, startingGradientPoint, endingGradientPoint, 0);
任何想法。
【问题讨论】:
-
你可以在你的边界矩形周围画一个假想的圆(半径==矩形
diagonal的一半(!))并计算angle和angle + CGFloat.pi的圆上的两个点。
标签: iphone objective-c ios core-graphics