2012-02-22 2 views
4

각도로 선형 CG 그라데이션을 그리려합니다. "CGContextDrawLinearGradientWithAngle()"이 존재하지 않기 때문에 CGContextDrawLinearGradient (CGContextRef, CGGradientRef, CGPoint startPoint, CGPoint endPoint, CGGradientDrawingOptions)를 사용하려고합니다.CGGradient : 각도에서 선형 그라디언트 그리기

그 점을 염두에두고 각도 (도)를 시작점과 끝점으로 변환해야합니다. NSGradient의 drawInBezierPath : 흉내를 흉내 내고 싶습니다. (AppKit의의 일환으로, NSGradient 슬프게도 아이폰 OS 개발자들에게 사용할 수 없습니다.) 다행히, 문서가 어떻게 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도 : 가로 = xcos (a) 그러므로 X = 폭/코사인 (a) 45 ~ 90의 degress 사이

: 세로 = xsin (a) 그러므로 X = 높이/죄 (a)

90도에서 135도 사이에 새로운 구석으로 이동했습니다. 여기서 x = 높이/cos (a-90). 135, 180, X = 폭/죄 (a-90)

우리는 다시 이동 한 180 내지 225 사이의 코너

. 여기서 x = width/cos (a-180). 225, 270, X = 높이/죄 (A-180)

마지막 코너 사이

! 270, 315 X = 높이/죄 사이 (A-270)

그리고 마지막으로 사이 315와 360 X = 폭/애거 (A-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); 
: |

하지만 내가 가진 두 가지 옵션을 결합 할 수 있습니다 밝혀 '', 그래서 문제가 해결 여기 내 코드입니다

관련 문제