Pergunta

Sou um novato no Cocoa, tenho algumas dúvidas em relação ao NSImage.

<✓Questão1:

Alterar a origem dos limites de uma imagem não parece ter nenhum efeito.Eu esperava que a imagem fosse desenhada a partir da origem recém-definida, mas não parece ser o caso.Estou perdendo alguma coisa?

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

Observação : imageView é um IBOutlet

<✓Questão2:

Eu estava tentando cortar uma imagem, mas não parece estar cortando a imagem, posso ver a imagem completa.O que é que estou perdendo?

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

Obrigado

Foi útil?

Solução

Alterar a origem dos limites de uma imagem não parece ter nenhum efeito. …

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

Isso é uma visualização de imagem, não uma imagem.

O efeito de alterar os limites de uma visualização depende do que a visualização faz para desenhar. Efetivamente, isso significa que você não deve alterar os limites de uma visualização que não é uma instância de uma classe de visualização que você criou, uma vez que você não pode prever exatamente como um NSImageView desenhará sua imagem (presumivelmente, já que é um controle, envolve sua célula, mas mais do que isso, eu não confiaria).

De modo mais geral, é muito raro alterar a origem dos limites de uma visualização. Não me lembro de ter feito isso, e não consigo pensar em uma razão de início para fazer isso. Alterar o tamanho de seus limites aumentará, não cortará.

Eu estava tentando cortar uma imagem, mas não parece estar cortando a imagem, posso ver a imagem completa. O que é que estou perdendo?

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

[self.imageView setImage:carImage];

Dizer a uma imagem para desenhar não muda nada em relação à imagem. Ele não “cortará a imagem” de forma que a imagem fique menor ou maior. Você está dizendo para desenhar, nada mais.

Consequentemente, a declaração seguinte define a imagem da visualização da imagem para a imagem inteira, exatamente como se você não tivesse dito para a imagem desenhar, porque dizer para ela desenhar não faz diferença.

O que dizer a uma imagem para desenhar faz exatamente isso: diz à imagem para desenhar. Existem apenas dois lugares corretos para fazer isso:

  1. Entre as mensagens lockFocus e unlockFocus para uma visualização ou imagem (ou depois de definir o NSGraphicsContext atual).
  2. No método drawRect: de uma visualização.

Em qualquer outro lugar, você não deve dizer a nenhum objeto Cocoa para desenhar.

Uma maneira correta de cortar uma imagem é criar uma nova imagem com o tamanho desejado / ajustado, travar o foco nela, desenhar a parte desejada da imagem original nela e destravar o foco na nova imagem. Você terá então a versão original e uma recortada.

Outra maneira correta seria criar sua própria visualização de imagem personalizada com duas propriedades: uma possuindo uma imagem para desenhar e a outra segurando um retângulo. Quando instruído a desenhar, esta visualização personalizada dirá à imagem para desenhar o retângulo dado dentro dos limites da visualização. Você sempre manteria a imagem original e simplesmente desenharia apenas a seção desejada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top