2014-01-31 70 views
0

在我的項目中,我需要使用AsyncImageView加載圖像。我也希望這些圖像是圓形的。圖像大多出現在桌面視圖中,所以我無法使用AsyncImageView's圖層上的粗糙角落,因爲這對應用的性能有非常非常負面的影響。drawRect未在AsyncImageView的子類中調用

所以我決定做的是創造AsyncImageView一個子類(因爲我需要在我的項目的其他意見的原非圓形AsyncImageView),稱爲RoundedAsyncImageView,其中我只實現了drawRect方法是這樣的:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 
    CGPathRef clippath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:17].CGPath; 
    CGContextAddPath(ctx, clippath); 
    CGContextClip(ctx); 
    [self.image drawInRect:rect]; 
    CGContextRestoreGState(ctx); 
} 

我有這個圓形圖像應該出現的單元格的xib,用IB創建。所以我只是將UIImageView元素的自定義類別更改爲RoundedAsyncImageView,將圖像視圖的IBOutlet更改爲RoundedAsyncImageView。現在的問題是drawRect沒有被調用。任何想法爲什麼?

編輯: 我讀了UIImageView子類不調用drawRect,並且我應該簡單地在常規UIView子類中繪製圖像。問題是,我實際上做不到這一點,因爲我需要AsyncImageView的功能來異步加載圖像。有沒有辦法做到這一點?上UIImageView

回答

1

DrawRect方法比UIView

視圖仍具有的CALayer略有不同,但是該層不分配一個後備存儲。相反,它使用CGImageRef作爲其內容,渲染服務器會將該圖像的位繪製到幀緩衝區中。

在這種情況下,沒有繪圖正在進行。我們只是將位圖數據以圖像的形式傳遞給UIImageView。

參考這篇文章Getting Pixels onto the Screen,正如我的經驗,這就是爲什麼你不能讓你的imageView剪輯方法工作。

這裏是我的解決方案:

  1. 創造AsyncImageView一個子類代替,創建UIView一個子類。
  2. 添加AsyncImageView,這意味着您的子類成爲AsyncImageView的包裝視圖。
  3. 在drawRect中實現clip方法,並讓asyncImageView處理它的內容更改。
+0

就像我說的,我不想使用cornerRadius,因爲它對錶視圖的性能(即滾動)有不利影響。所以如果我用drawRect使用你的解決方案,我該怎麼做呢?這意味着在UIView子類中,我需要一個drawRect方法來改變AsyncImageView,對吧? – damjandd

+0

drawRect方法不會更改asyncImageView,它是裁剪imageView的唯一目的。在drawRect中實現剪輯方法,並讓asyncImageView處理它的內容更改。 – johnMa

+0

所以這個UIView將成爲一個封裝的AsyncImageView,對吧? – damjandd