2013-09-03 2 views
1

iOS 코드를 OSX 코드로 변환하려고하는데 그래픽 포팅에 어려움이 있습니다. 그러면 나는 그것을 OSX에 대한 이런 식으로 다시 썼다 ...CGAffineTransform에서 NSAffineTransform을 만드는 방법이 있습니까?

NSRect rect = NSMakeRect(centerX.doubleValue - width.doubleValue/2, 
         centerY.doubleValue - height.doubleValue/2, 
         width.doubleValue, height.doubleValue); 

UIBezierPath * path = nil; 

switch (self.shape) 
{ 
    case HSTargetShapeInvisible: 
     path = [UIBezierPath bezierPath]; 
     break; 
    case HSTargetShapeOval: 
     path = [UIBezierPath bezierPathWithOvalInRect:rect]; 
     break; 
    case HSTargetShapeRectangle: 
     path = [UIBezierPath bezierPathWithRect:rect]; 
     break; 
    default: 
     break; 
} 

CGAffineTransform translate = CGAffineTransformMakeTranslation(-1 * centerX.doubleValue, 
                   -1 * centerY.doubleValue); 
[path applyTransform:translate]; 

CGAffineTransform rotate = CGAffineTransformMakeRotation(rotation.doubleValue/180 * M_PI); 
[path applyTransform:rotate]; 

translate = CGAffineTransformMakeTranslation(centerX.doubleValue, centerY.doubleValue); 
[path applyTransform:translate]; 

이 완벽하게 일 :

NSRect rect = NSMakeRect(centerX.doubleValue - width.doubleValue/2, 
         centerY.doubleValue - height.doubleValue/2, 
         width.doubleValue, height.doubleValue); 

NSBezierPath * path = nil; 

switch (self.shape) 
{ 
    case HSTargetShapeInvisible: 
     path = [NSBezierPath bezierPath]; 
     break; 
    case HSTargetShapeOval: 
     path = [NSBezierPath bezierPathWithOvalInRect:rect]; 
     break; 
    case HSTargetShapeRectangle: 
     path = [NSBezierPath bezierPathWithRect:rect]; 
     break; 
    default: 
     break; 
} 

NSAffineTransform *rot = [NSAffineTransform transform]; 
NSAffineTransform *pos = [NSAffineTransform transform]; 

[pos translateXBy:-1*centerX.doubleValue yBy:-1*centerY.doubleValue]; 

[rot rotateByRadians:rotation.doubleValue/180 * M_PI]; 

[pos translateXBy:centerX.doubleValue 
       yBy:centerY.doubleValue ]; 

[rot appendTransform:pos]; 
[path transformUsingAffineTransform:rot]; 

을 그리고이 같은 방식으로 작동하지 않습니다

에서 아이폰 OS 나는이 있었다. 아무도 문제가 어디 있는지 아십니까?!

모든 종류의 도움을 받으실 수 있습니다.

+0

을 pos 변환은 서로 취소합니다. 모든 작업을 동일한 변환에 적용하면 효과가 있습니다. –

+0

이미 시도했습니다 .... 작동하지 않습니다. –

답변

1

원본 코드는 세 개의 변환을 사용하므로 두 개로 변환하려고했습니다. 당신은 단지 하나의 transformUsingAffineTransform:를 사용하려면

NSAffineTransform *pos1 = [NSAffineTransform transform]; 
[pos1 translateXBy:-1*centerX.doubleValue yBy:-1*centerY.doubleValue]; 
[path transformUsingAffineTransform:pos1]; 

NSAffineTransform *rot = [NSAffineTransform transform]; 
[rot rotateByRadians:rotation.doubleValue/180 * M_PI]; 
[path transformUsingAffineTransform:rot]; 

NSAffineTransform *pos2 = [NSAffineTransform transform]; 
[pos2 translateXBy:centerX.doubleValue yBy:centerY.doubleValue]; 
[path transformUsingAffineTransform:pos2]; 

은 위의 세 가지 용도를 삭제하고 코드를 추가합니다 : 그냥 세에 돌아가 (별개의 변수를 사용하면 확실하게하기 위해)

[pos1 appendTransform:rot]; 
[pos1 appendTransform:pos2]; 
[path transformUsingAffineTransform:pos1]; 

당신을 심지어 순서를 하나 그것을 할, 그러나주의 할 수 - 일을 처음부터 끝까지 :

NSAffineTransform *compound = [NSAffineTransform transform]; 
[compound translateXBy:centerX.doubleValue yBy:centerY.doubleValue]; 
[compound rotateByRadians:rotation.doubleValue/180 * M_PI]; 
[compound translateXBy:-1*centerX.doubleValue yBy:-1*centerY.doubleValue]; 
[path transformUsingAffineTransform:compound]; 

HTH

관련 문제