Pregunta

Soy un novato en Cocoa, tengo algunas dudas sobre NSImage.

<×Pregunta1:

Cambiar el origen de los límites de una imagen no parece tener ningún efecto.Esperaba que la imagen se extrajera del origen recién establecido, pero ese no parece ser el caso.¿Me falta algo?

< wentcode:

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 es un IBOutlet

<×Pregunta2:

Estaba intentando recortar una imagen, pero parece que no está recortando la imagen, puedo ver la imagen completa.¿Qué es lo que me estoy perdiendo?

<×code:

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

Gracias

¿Fue útil?

Solución

Cambiar el origen de los límites de una imagen no parece tener ningún efecto. …

//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);

Esa es una vista de imagen, no una imagen.

El efecto de cambiar los límites de una vista depende de lo que haga la vista para dibujar. Efectivamente, esto significa que no debe cambiar los límites de una vista que no es una instancia de una clase de vista que creó, ya que no puede predecir exactamente cómo un NSImageView dibujará su imagen (presumiblemente, dado que es un control, involucra su celda, pero más que eso, no confiaría).

De manera más general, es bastante raro cambiar el origen de los límites de una vista. No recuerdo haberlo hecho nunca, y no puedo pensar en una razón que se me ocurra para hacerlo. Cambiar el tamaño de sus límites se escalará, no se recortará.

Estaba intentando recortar una imagen, pero parece que no está recortando la imagen, puedo ver la imagen completa. ¿Qué es lo que me estoy perdiendo?

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

[self.imageView setImage:carImage];

Decirle a una imagen que se dibuje no cambia nada sobre la imagen. No “recortará la imagen” de modo que la imagen sea más pequeña o más grande. Le estás diciendo que dibuje, nada más.

En consecuencia, la declaración posterior establece la imagen de la vista de imagen en la imagen completa, exactamente como si no le hubieras dicho a la imagen que dibujara, porque decirle que dibuje no hizo ninguna diferencia.

Lo que hace que una imagen dibuje es exactamente eso: le dice a la imagen que dibuje. Solo hay dos lugares correctos para hacer eso:

  1. Entre los mensajes lockFocus y unlockFocus a una vista o imagen (o después de configurar el NSGraphicsContext actual).
  2. Dentro del método drawRect: de una vista.

En cualquier otro lugar, no debes decirle a ningún objeto Cocoa que dibuje.

Una forma correcta de recortar una imagen es crear una nueva imagen del tamaño deseado / ajustado, bloquear el enfoque, dibujar la parte deseada de la imagen original y desbloquear el enfoque en la nueva imagen. Entonces tendrás tanto la versión original como la versión recortada.

Otra forma correcta sería crear su propia vista de imagen personalizada que tiene dos propiedades: una posee una imagen para dibujar y la otra sostiene un rectángulo. Cuando se le dice que dibuje, esta vista personalizada le indicará a la imagen que dibuje el rectángulo dado dentro de los límites de la vista. Luego, siempre mantendría la imagen original y simplemente dibujaría solo la sección deseada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top