我正在尝试在一个角度上绘制线性CGGradient。因为不存在“ CGContextDrawLinearGradientWithAngle()”,所以我尝试使用CGContextDrawLinearGradient(CGContextRef,CGGradientRef,CGPoint起点,CGPoint终点,CGGradientDrawingOptions)。
考虑到这一点,我需要将角度(度)转换为起点和终点。我想模仿NSGradient的drawInBezierPath:angle。(不幸的是,作为AppKit的一部分,NSGradient不适用于iOS开发人员。)幸运的是,该文档告诉我们如何获得起始渐变:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,文档没有告诉我们如何获得终点。(使用矩形的高度或宽度,因为该距离仅适用于某些角度。)那里的几个位置告诉我们如何找到终点。不幸的是,在计算终点之前需要知道距离。然而,需要计算终点以获得距离。显然还有更多,因为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 …Run Code Online (Sandbox Code Playgroud)