Question

J'ai un programme simple Obj C qui, pour le moment, vous permet de charger une image, il établit et devrait théoriquement vous permettre de zoomer et faire pivoter. J'utilise NSAffineTranslations.

Je veux que l'image soit verrouillée sur la partie supérieure gauche (par opposition à la norme PS / PDF en bas à gauche), donc je suis en utilisant isFlipped et appeler [Aftrans scaleXBy: 1.0 yBy: -1,0];

Le problème est que, pour une raison quelconque, après la première fois que mon drawRect est appelé, la transformation ne se produit pas.

Quand je charge une image, il se lève, et semble correct. Si je change la taille de la fenêtre (qui appelle drawRect), l'image tire, mais est à l'envers et inversée. Cela signifie que la transformation n'a pas pris effet. Je ne vois aucune différence dans l'une des données la 2ème fois par.

ici est une version dépouillée du code:

- (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: voici un peu plus du code qui pourrait être pertinent

.
-(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];
}
Était-ce utile?

La solution

Je ne sais pas exactement ce que vous essayez d'atteindre, mais si vous voulez dessiner juste une image dans un NSView et le maintenir en haut à gauche, vous pouvez faire quelque chose d'un peu plus simple, dans votre sous-classe de NSView:

- (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];
}

Je suis également en mesure d'obtenir des résultats similaires avec votre code en se débarrassant des appels [self setFrame:...]; des méthodes drawRect et setImage.

Autres conseils

En supposant que vous n'êtes pas décapage à code qui change des choses, regarder si vous dessinez l'image ailleurs. les éléments de barre, tables et ainsi de suite peuvent bien changer la propriété -flipped de l'image, l'amenant à tirer de manière incorrecte.

Essayez ceci autour de votre ligne de dessin d'image:

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

voir si cela aide. Si elle Finalité , regardez ailleurs dans votre code pour quelque chose changer la propriété de l'image retournée et non de le remettre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top