문제

NSView의 서브 클래스에 NSIMAGE가 그려져 있습니다. 이전 질문에서, 나는 왼쪽 상단 구석에 똑바로 그리는 데 도움이되었습니다. 이제 이미지를 회전시킬 수 있기를 원합니다. 회전 변수 %4를 증가시키는 버튼이 있고,이를 -90으로 곱하여 회전 각도를 찾습니다. 그런 다음 nsaffinetransform을 사용하여 이미지를 회전시키고 화면으로 다시 번역합니다. 그러나 그것은 내가 기대하는 방식으로 작동하지 않는 것 같습니다. 두 가지 문제가 있습니다.

1) 회전하면 이전 프레임에 없었던 영역에있는 이미지의 일부가 올바르게 그려집니다. 그러나 이전에 있었던 물약은 원래 이미지로 남아 있습니다. 이것은 여러 회전 후 원래의 직립 이미지의 정사각형이 있고 회전 이미지의 아래 또는 왼쪽에 사각형이 있음을 의미합니다.

2) 창을 다시 크기를 조정하면 이미지가 원래 직립 방향으로 (그렇지 않아야하는지)를 다시 그리기합니다.

기본적으로, 나는 nsaffinetransform이 내가 생각하는 방식대로 작동하지 않는다는 결론에 도달했습니다. 이미지를 회전하고 번역 할 수있는 다른 방법이 있습니까? 감사해요

대형 코드 청크 : ( "Works"와 "End Works"사이의 코드는 이미지를 그리기 위해 코드가 작동합니다. 이전 질문에서 나왔습니다).

오래된 코드 삭제, 새 코드로 하위 대체

감사해요

편집 : 조금 더 연구에 따르면 nsaffinettransform을 수행하는 대신보기를 회전시킬 수 있습니다. 이것은 더 잘 작동하는 것 같습니다. 그러나 나는 번역이 제대로 작동하도록 할 수 없습니다. 아래의 새 코드 (공간 저장을 위해 삭제 된 원본 코드)

- (void)drawRect:(NSRect)rect
{

//WORKS
    NSRect frame;
    frame.origin = NSZeroPoint;
    frame.size = [image size];
// end works

    float deltaX, deltaY, height, width;

// if the rotate button was just clicked, we need to rotate by 90 deg, otherwise not
    double rotateDeg = justRot ? -90.0 : 0;

    justRot = NO;

// rotate

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            break;
        case 1: 
            deltaX += width;
            break;
        case 2:
            deltaX += width;
            deltaY +=  height;  
            break;
        case 3:
            deltaY += height;
            break;
    }


    NSPoint orig;
    if (rotation != 0)
    {
        orig.x = -100;
        orig.y = -100;
    }
    [self rotateByAngle: rotateDeg];
    NSLog(@"orig %f %f", orig.x, orig.y);
//  WORKS
    [self setFrame: frame];
    [image drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
// end works
    [self translateOriginToPoint: orig];    
}
도움이 되었습니까?

해결책

좋아, 역사의 경우, 다른 사람 이이 질문이있는 경우 여기에 내가 생각해 낸 답변이 있습니다.

프레임 회전은 DrawRect에 유지되며 다른 모든 것은 회전 메소드로 이동합니다.

-(void)rotate
{
    float deltaX, deltaY, height, width;

    rotation = (rotation +1) % 4 ;

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            deltaY -= width;
        break;
        case 1: 
            deltaY -= height;
            break;
        case 2:
            deltaX += height-width;
            deltaY -= height ;  
            break;
        case 3:
            deltaX += height-width;
            deltaY -= width;
            break;
    }

    NSPoint orig;
    orig.x = deltaX;
    orig.y = deltaY;

    [self rotateByAngle: 90.0];
    [self translateOriginToPoint: orig];

    [self setNeedsDisplay:YES];
}

다른 팁

중앙에 대한 이미지를 회전시키고 싶다고 생각합니다. 그렇다면 아핀 변환의 원점을 이미지의 중심으로 번역 한 다음 회전 한 다음 다시 번역해야합니다. 이제 previos 위치의 아티팩트가 남아 있다면 아마도 올바른 사각형으로 호출하지 않았기 때문일 것입니다. 이전 이미지와 새로운 위치를 모두 무효화해야합니다.

업데이트 : 방금 DrawRect 내에서 View의 프레임을 변경하는 것을 알았습니다. 프레임을 변경하기에는 너무 늦었습니다. 대신, 뷰의 프레임을 변경하지 않고 올바른 위치에 이미지를 그립니다.

내 오래된 변환 된 이미지 샘플 코드를 살펴보십시오. http://developer.apple.com/mac/library/samplecode/transformed_image/index.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top