Frage

Ich habe ein einfaches Obj C-Programm, das in dem Moment, können Sie ein Bild laden, zieht es auf, und theoretisch sollten Sie zoomen und drehen lassen. Ich verwende NSAffineTranslations.

Ich möchte das Bild in der oberen linken Ecke gesperrt werden (im Gegensatz zu den PS / PDF-Standard von links unten), so bin ich mit isFlipped und rufen [afTrans scaleXBy: 1,0 yBy: -1,0];

Das Problem ist, dass aus irgendeinem Grunde, nach dem ersten Mal meines drawRect genannt wird, wird die Transformation nicht passieren.

Wenn ich ein Bild zu laden, kommt es auf und sieht richtig. Wenn ich die Größe des Fensters ändern (welche Anrufe drawRect), das Bild zieht, ist aber der Kopf und umgekehrt. Dies bedeutet, dass die Umwandlung nicht wirksam ist. Ich sehe keine Unterschiede in jedem der das 2. Mal durch die Daten.

Hier ist eine abgespeckte Version des Codes:

- (void)drawRect:(NSRect)rect 
{
    // Drawing code here.

//    NSLog(@"window type: %d", [[self window] backingType]);
   NSAffineTransform *afTrans = [[NSAffineTransform alloc] init];
   NSGraphicsContext *context = [NSGraphicsContext currentContext];
   NSSize sz;
   NSRect windowFrame = [[self window] frame];
   NSRect cv =[[[self window] contentView] frame];
   float deltaX, deltaY;
   NSSize superSize = [[self superview] frame].size;
   float height, width, sHeight, sWidth;

   NSRect imageRect;

   sz = [ image size];
   imageRect.size = sz;
   imageRect.origin = NSZeroPoint;

   height = sz.height  ;
   width = sz.width  ;

//    sHeight and sWidth are the hieght and with of the super-view. ie,
//    the size of the whole window view including the space for the
//    scroll bars, etc, but not including the panel or the borders,
   sHeight = superSize.height;
   sWidth = superSize.width;

   [context saveGraphicsState];

   deltaX = 0;
   deltaY = 0;

   deltaY += height; // account for flipping

   [afTrans translateXBy:deltaX yBy:deltaY];

   [afTrans scaleXBy:1.0 yBy:-1.0];

   [afTrans concat];

   NSRect drawingRect = imageRect;
   NSRect frame = imageRect;
   [self setFrame:frame];

   [image drawInRect:drawingRect
         fromRect:imageRect
         operation:NSCompositeSourceOver
         fraction:1];

   [afTrans release];
   [context restoreGraphicsState];
}

ETA: hier einige mehr Code, der relevant sein könnte

.
-(void )setImage:( NSImage * )newImage
{
    [newImage retain];
    [image release];

    rotation = 0;

    zoom = 1.0;

    image = newImage;
    NSSize imageSize = [newImage size];
    NSRect tFrame = [self frame];
    tFrame = [[self window] frame];

    tFrame.size.width = MAX(tFrame.size.width, imageSize.width);
    tFrame.size.height = MAX(tFrame.size.height, imageSize.height);
    [self setFrame:tFrame];

    [self setNeedsDisplay:YES];
}
War es hilfreich?

Lösung

Ich bin nicht genau sicher, was Sie erreichen wollen, aber wenn Sie wollen einfach nur ein Bild in einem NSView ziehen und es in der oberen linken Ecke zu halten, können Sie etwas ein bisschen einfacher, in Ihrer NSView Unterklasse tun:

- (BOOL)isFlipped
{
    return YES;
}

- (void)setImage:(NSImage *)newImage
{
    [newImage retain];
    [image release];
    image = newImage;

    [image setFlipped:YES];
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)rect
{
    [image drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];

    // Or stretch image to fill view
    //[image drawInRect:[self bounds] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
}

Ich war auch ähnliche Ergebnisse mit Ihrem Code erhalten kann, indem die [self setFrame:...]; Anrufe in drawRect und setImage Methoden loszuwerden.

Andere Tipps

Angenommen, Sie sind nicht Code Strippen, die Sachen ändert, aufpassen, wenn Sie das Bildmotiv Zeichnung an anderer Stelle. Elemente der Symbolleiste, Tabellen und so weiter gut können die -flipped Eigenschaft des Bildes ändern, so dass es falsch ziehen.

Versuchen Sie, diese um Ihr Bild Zeichnung Zeile:

BOOL wasFlipped = [image isFlipped];
[image setFlipped:[self isFlipped]];
[image drawInRect:drawingRect
             fromRect:imageRect
            operation:NSCompositeSourceOver
             fraction:1];
[image setFlipped:wasFlipped];

Sehen Sie, ob das hilft. Wenn es hat , schauen Sie an anderer Stelle in Ihrem Code für etwas ändert die blätterte Eigenschaft Bild und legt es nicht zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top