角度で線形CGグラジエントを描画しようとしています。 "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);