我想繪製角度上的線性CGGradient。由於「CGContextDrawLinearGradientWithAngle()」不存在,我試圖使用CGContextDrawLinearGradient(CGContextRef,CGGradientRef,CGPoint startPoint,CGPoint endPoint,CGGradientDrawingOptions)。CGGradient:在角度上繪製線性漸變
考慮到這一點,我需要將角度(度)轉換爲起點和終點。我想模仿NSGradient的drawInBezierPath:angle。 (作爲了AppKit的一部分,NSGradient可悲的是不提供給iOS開發)。幸運的是,文件告訴我們如何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);
任何想法。