2012-01-16 132 views
0

我是可可的新手,我对NSImage有一些疑问。更改边界原点+裁剪图像

问题1:

更改图像的边界起源似乎没有任何效果。我预计这幅图像是从新设置的起源中得出的,但似乎并非如此。我错过了什么吗?

代码:

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

注意:ImageView的是一个IBOutlet

问题2:

我试图裁剪图像,但它似乎没有不裁剪图像,我可以看到完整的图像。我错过了什么?

代码:

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

感谢

回答

2

更改图像的边界起源似乎没有任何效果。 ...

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

这是一个图像视图,而不是图像。

更改视图边界的效果取决于视图的绘制内容。实际上,这意味着你不应该改变不是你创建的视图类实例的视图边界,因为你无法准确预测NSImageView如何绘制其图像(大概是因为它是一个控件,它涉及它的细胞,但不止于此,我不会依赖)。

更一般地说,改变视图的边界原点非常罕见。我不记得曾经这样做过,我想不出有什么理由要做。更改其边界大小将缩放,而不是裁剪。

我试图裁剪图像,但它似乎没有裁剪图像,我可以看到完整的图像。我错过了什么?

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

[self.imageView setImage:carImage]; 

告诉图像绘制不改变有关图像的任何事情。它不会“裁剪图像”,这样图像会变小或变大。你只是在告诉它画什么,没有更多。

因此,之后的声明将图像视图的图像设置为整个图像,就好像您没有告诉图像绘制一样,因为告诉它绘制没有区别。

告诉图像绘制的确实是:它告诉图像绘制。只有两个正确地做到这一点:

  1. lockFocusunlockFocus之间的消息到一个视图或图像(或设置当前获取到NSGraphicsContext后)。
  2. 在视图的drawRect:方法中。

在别的地方,你不应该告诉任何可可对象绘制。裁剪图像

一种正确的方法是产生所希望的/调整大小,锁定聚焦在其上的一个新的图像,绘制的原始图像的所要部分进去,和该新图像上解锁焦点。然后您将拥有原始版本和裁剪版本。

另一种正确的方法是创建您自己的自定义图像视图,它具有两个属性:一个拥有要绘制的图像,另一个拥有矩形。当被告知绘制时,这个自定义视图会告诉图像将给定的矩形绘制到视图的边界中。然后,您将始终保持原始图像,只需绘制所需的部分。

+0

非常感谢彼得,你的回答真的很有帮助! – user1046037 2012-01-30 01:26:27