2010-04-10 23 views
0

我已經創建了一個自定義視圖類,現在只是想繪製縮放圖像以適應視圖,給定一個UIImage。我試圖繪製UIImage.CGImage,但是正如其他人在本站點(和文檔中)證明的那樣,會使圖像呈現顛倒。試圖在自定義視圖中繪製縮放UIImage,但沒有任何渲染

所以,在我發現另一個問題的答案的建議,我試圖直接繪製它,但沒有任何渲染視圖,我不知道爲什麼。這裏是我的繪製代碼:

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    [super drawRect:rect]; 

    if (self.originalImage) { 
     [self drawImage]; 
    } 
} 

- (void) drawImage { 
    if (CGSizeEqualToSize(originalImage.size, self.frame.size) == NO) { 
     CGFloat scaleFactor = 1.0; 
     CGFloat scaledWidth = 0.0; 
     CGFloat scaledHeight = 0.0; 
     CGPoint thumbPoint = CGPointMake(0.0, 0.0); 

     CGFloat widthFactor = self.frame.size.width/originalImage.size.width; 
     CGFloat heightFactor = self.frame.size.height/originalImage.size.height; 

     if (widthFactor < heightFactor) { 
      scaleFactor = widthFactor; 
     } else { 
      scaleFactor = heightFactor; 
     } 

     scaledWidth = originalImage.size.width * scaleFactor; 
     scaledHeight = originalImage.size.height * scaleFactor; 

     if (widthFactor < heightFactor) { 
      thumbPoint.y = (self.frame.size.height - scaledHeight) * 0.5; 
     } else if (widthFactor > heightFactor) { 
      thumbPoint.x = (self.frame.size.width - scaledWidth) * 0.5; 
     } 

     UIGraphicsBeginImageContext(self.frame.size); 
     CGRect thumbRect = CGRectZero; 
     thumbRect.origin = thumbPoint; 
     thumbRect.size.width = scaledWidth; 
     thumbRect.size.height = scaledHeight; 

     [originalImage drawInRect:thumbRect]; 
     self.scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } else { 
     self.scaledImage = originalImage; 
    } 
} 

我的理解(這種學習後位)是該UIGraphicsBeginImageContext函數創建一個屏幕外爲我畫成,所以現在我怎麼呈現在原始的頂部這方面一?

+0

好吧,好的。一個老笑話才浮現在腦海中:男人去看醫生,並說「當我這樣做的時候會感到痛苦」。醫生說:「那就不要那樣做。」 我推薦調用'GraphicsBegin'和'GraphicsEnd'以及圖像渲染 - 但我讀過的很多東西都表明應該以這種方式創建圖形上下文。它可能在沒有它的情況下工作,但這是否是錯誤的方式? – 2010-04-10 16:38:39

回答

1

我讚揚了呼叫GraphicsBeginGraphicsEnd和圖像渲染 - 但是,我讀表示,應該以這種方式創建一個圖形上下文很多東西。

如果這些是名字,那麼在繪圖前後需要調用它們是有意義的。

但這些不是名稱。功能的全名,因爲你使用他們在你的代碼,分別是:

  • UIGraphicsBeginImageContext
  • UIGraphicsEndImageContext

這些名字暗示,這些功能對於一種特定類型的圖紙,而the documentation備份:

您可以使用此功能來配置繪製到位圖的繪圖環境。 ...

雖然此函數創建的上下文是當前上下文,但您可以調用the UIGraphicsGetImageFromCurrentImageContext function根據上下文的當前內容檢索圖像對象。

這就是這些功能的用途:通過捕獲一些圖形來製作新圖像。

您的情況有所不同:您已經有了一張圖片,而且您是一個已被調用來繪製的視圖。這意味着you already have a current context,你只需要繪製它。

所以,不要創建一個上下文 - 只需繪製。

0

如果要繪製UIImage,請使用UIImageView。它被寫爲爲你做到這一點。

+0

我打算做一些自定義繪圖,並且文檔指出,因爲UIImageView的子類不能接收drawRect消息,所以自定義繪圖應該在UIView的子類中完成。 – 2010-04-10 16:47:56

+0

有些情況下您應該直接繪製圖像。但是你可以使用UIImageView作爲自定義視圖的子視圖。 – 2010-04-10 17:01:27

0

您命名爲drawImage的函數應該命名爲createScaledImage,因爲它所做的只是創建scaledImage。要繪製scaledImage,嘗試

[scaledImage drawAtPoint:self.frame.origin]; 

你會通過與設置爲UIViewContentModeScaleAspectFit的contentMode一個UIImageView堅持originalImage或scaledImage得到更好的服務。 UIImageView基本上會完成你在那裏編寫的內容,但它可以訪問任何緩存和快速繪製Apple在幕後執行的操作。