2012-01-16 111 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