2014-10-27 79 views
0

在我的應用程序中,我在UITableViewCell中有一個UIImageView。圖像需要顯示爲具有矩形源圖像的圓形圖像。我一直在設置imageView的圖層屬性上的角落半徑,但是這會強制屏幕渲染,這會降低滾動性能。將UIImage繪製爲一個不帶屏外渲染的圓形

這就是我目前在對細胞的awakeFromNib方法:

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    self.imageBorderView.backgroundColor = [UIColor colorWithWhite:0.75f alpha:1.f]; 
    self.imageBorderView.layer.cornerRadius = self.imageBorderView.frame.size.width/2; 
} 

真的基本的東西。好的,所以我剛剛觀看了2011年WWDC會議121視頻,瞭解UIKit渲染。通過使用UIBezierPaths將拐角半徑渲染移動到drawRect來解決這個問題,因爲它涉及UILabel。我subclassed UIImageView並將我的cornerRadius繪圖drawRect只發現drawRect不在UIImageView上調用。以下是文檔的相關推理:

UIImageView類經過優化,可以將其圖像繪製到顯示屏上。 UIImageView不調用其子類的drawRect:方法。如果你的子類需要包含自定義繪圖代碼,你應該改爲UIView類的子類。

因此,我將超類更改爲UIView,並使用UIBezierPath和UIImage在drawRect中手動繪製圓。這裏是我的drawRect方法:

- (void)drawRect:(CGRect)rect 
{ 
    UIBezierPath *circularPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height/2.0]; 
    [[UIColor redColor] set]; 
    [circularPath fill]; 

    if (self.image) 
    { 
     [self.image drawInRect:self.bounds]; 
    } 
} 

它不正是我所期望的,這將紅色圓圈(進行仔細的檢查,以確保路徑是正確的),那麼它繪製矩形圖像在圈子如果一個已經設定好了。

我無法弄清楚的是如何在沒有繪製屏幕的情況下將UIImage裁剪爲圓形UIBezierPath。這意味着設置一個對象作爲掩碼不會工作。

有沒有辦法將圖像遮罩到路徑上而不會脫離屏幕?

回答

2

調用-[UIBezierPath addClip]將後續繪圖剪輯到路徑的內部。

- (void)drawRect:(CGRect)rect 
{ 
    UIBezierPath *circularPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height/2.0]; 
    [circularPath addClip]; 
    [self.image drawInRect:self.bounds]; 
} 
+0

完美。圖像遵循貝塞爾路徑並在屏幕上進行渲染。將不得不等到明天才能在設備上進行測試,但根據性能分析,這節省了大量時間。 – skladek 2014-10-27 04:41:23

0

你是過於複雜的事情,幾年前,我有同樣的問題,我解決它是使用編程方式創建的UITableViewCell其中有我在其中使用QuartzCore一個UIView並設置cornerRadius的方式,後來我加了一個UIImageView裏面的(UIView),它總是使它超快速,而沒有進入UIBeziers的細節。

+0

這是我最初的方法,但它不足夠快。這並不可怕,但它不應該像過去那樣流暢。 – skladek 2014-10-27 04:37:18

+0

如果這是你的答案,那麼我需要問/建議你兩件事,首先你的圖片(大小和尺寸)有多大,你使用** Xcode的Instruments **調試你的應用程序,並查看內存和CPU使用率,原因我可能會發生這樣的情況,大多數情況下,由於可重用的單元或CPU處理**大**圖像,內存中的圖像臃腫。 – MrJomp 2014-10-27 04:57:18