2012-02-22 10 views
4

角度で線形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); 

答えて

0

私はこのグラデーションの仕組みがどのように機能するかはわかりませんが、書いたものから基本的には、開始点から矩形の辺に当たるまで線の長さを求めていると仮定しています。

これが当てはまる場合は、単に三角法を行うだけです。距離xと角度aを呼び出します。 0と45度の間

:45と90 degress間の幅= xcos(a)のようにX =幅/ COS(A)

:高さ= xsin(a)のようにX =高さ/ SIN(A)

90度から135度の間に新しいコーナーに移動しました。ここで、x =高さ/ cos(a-90)。

我々はコーナーを再び移動した180と225の間でX =幅/罪(90)

135〜180。ここで、x =幅/ cos(a-180)。 225と270のx =高さ/罪(180)

最終コーナーの間

! 270の間と315のx =高さ/罪( - 270)

そして最後に、315と360のx =幅/ COS( - 270)

間のこれらのいくつかは、おそらく考えるように単純化するが、その最も簡単なあなたの出発点の計算で起こるように見える左回りのコーナーを右に向かって左回りに反時計回りに開始します。

1

少し違ったやり方で、同じ問題を扱っていますが、中心点と角度を使って左右の端を左右に伸ばして、私の問題は白です天井が軸を指していない場合は空白、描画オプションの場合、関数は "kCGGradientDrawsBeforeStartLocationまたはkCGGradientDrawsAfterEndLocation"を提供するので、片側が空になるように見えます。

CGGradientRef grRef = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)gradient.colorArray, NULL); 
CGFloat degree = angle * M_PI/180; 
CGPoint center = CGPointMake(width/2, height/2); 
CGPoint startPoint = CGPointMake(center.x - cos (degree) * width/2, center.y - sin(degree) * height/2); 
CGPoint endPoint = CGPointMake(center.x + cos (degree) * width/2, center.y + sin(degree) * height/2); 

NSLog(@"start point:%@ \n, end point: %@",NSStringFromCGPoint(startPoint),NSStringFromCGPoint(endPoint)); 

CGContextDrawLinearGradient(gradientContext, grRef, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation|kCGGradientDrawsAfterEndLocation); 
:|

しかし、それは私が持つ2つのオプションを組み合わせることができ判明「」、その問題が解決し、ここに私のコードです

関連する問題