0

我是 Cocoa 的新手,我对 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];

谢谢

4

1 回答 1

2

更改图像的边界原点似乎没有任何效果。…</p>

//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:方法中。

在其他任何地方,您都不应该告诉任何 Cocoa 对象进行绘制。

裁剪图像的一种正确方法是创建所需/调整大小的新图像,将焦点锁定在其上,将原始图像的所需部分绘制到其中,然后将焦点解锁到新图像上。然后,您将拥有原始版本和裁剪版本。

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

于 2012-01-16T04:49:06.250 回答