Domanda

Sono un principiante di Cocoa, ho qualche dubbio su NSImage.

<”Domanda1:

La modifica dell'origine dei limiti di un'immagine non sembra avere alcun effetto.Mi aspettavo che l'immagine venisse disegnata dall'origine appena impostata, ma non sembra il caso.Mi manca qualcosa?

<”code:

NSImage* carImage = [NSImage imageNamed:@"car"];

[self.imageView setImage:carImage];

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

Nota : imageView è un IBOutlet

<”Domanda2:

Stavo cercando di ritagliare un'immagine, ma non sembra ritagliare l'immagine, posso vedere l'immagine completa.Cosa mi manca?

<”codice:

NSRect sourceRect = CGRectMake(150, 25, 100, 50);
NSRect destRect = CGRectMake(0, 0, 100, 50);

NSImage* carImage = [NSImage imageNamed:@"car"];

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

Grazie

È stato utile?

Soluzione

La modifica dell'origine dei limiti di un'immagine non sembra avere alcun effetto. ...

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

Questa è una visualizzazione immagine, non un'immagine.

L'effetto della modifica dei limiti di una vista dipende da ciò che la vista fa per disegnare. In effetti, questo significa che non dovresti modificare i limiti di una visualizzazione che non è un'istanza di una classe di visualizzazione che hai creato, poiché non puoi prevedere esattamente come un NSImageView disegnerà la sua immagine (presumibilmente, poiché è un controllo, coinvolge la sua cella, ma più di questo, non farei affidamento su).

Più in generale, è piuttosto raro cambiare l'origine dei limiti di una vista. Non ricordo di averlo mai fatto, e non riesco a pensare a una ragione fuori dalla mia testa per farlo. La modifica della dimensione dei suoi limiti verrà ridimensionata, non tagliata.

Stavo cercando di ritagliare un'immagine, ma non sembra ritagliare l'immagine, posso vedere l'immagine completa. Cosa mi manca?

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

Dire a un'immagine di disegnare non cambia nulla dell'immagine. Non "ritaglierà l'immagine" in modo tale che l'immagine sarà successivamente più piccola o più grande. Gli stai dicendo di disegnare, niente di più.

Di conseguenza, l'istruzione successiva imposta l'immagine della vista dell'immagine sull'intera immagine, esattamente come se non avessi detto all'immagine di disegnare, perché dirle di disegnare non ha fatto differenza.

Ciò che dice a un'immagine di disegnare è esattamente questo: dice all'immagine di disegnare. Ci sono solo due posizioni corrette per farlo:

  1. Tra i messaggi lockFocus e unlockFocus in una vista o immagine (o dopo aver impostato l'attuale NSGraphicsContext).
  2. All'interno del metodo drawRect: di una vista.

In qualsiasi altro luogo, non dovresti dire a nessun oggetto Cocoa di disegnare.

Un modo corretto per ritagliare un'immagine è creare una nuova immagine della dimensione desiderata / regolata, bloccare la messa a fuoco su di essa, disegnare la porzione desiderata dell'immagine originale e sbloccare la messa a fuoco sulla nuova immagine. Avrai quindi sia la versione originale che una versione ritagliata.

Un altro modo corretto sarebbe creare la propria visualizzazione dell'immagine personalizzata che abbia due proprietà: una che possiede un'immagine da disegnare e l'altra che contiene un rettangolo. Quando viene detto di disegnare, questa vista personalizzata dice all'immagine di disegnare il rettangolo dato nei limiti della vista. Quindi manterrai sempre l'immagine originale e disegnerai semplicemente solo la sezione desiderata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top