2014-01-19 29 views
0

我使用UICollectionViewCell嘗試打印右上角的數字(從核心數據存儲獲得)以顯示產品更新的數量。核心圖形上下文似乎沒有返回圖像

隨着細胞被再利用的方式,我發現如果使用代碼繪製成UIView層(使用的CALayer)中,當該單元被重複使用,CALayer遺體並且通過錯誤的產品出現。顯然,根據SO上的其他帖子,添加子視圖到單元格不是一個聰明的事情,因爲它們被重用等。

所以,我試圖創建一個圖像使用核心圖形(在一個單獨的方法)和將圖像顯示在容器UIImageView中。在教程之後,我似乎無法獲得圖像返回。

我正在做電話爲:

cell.messageCount.image = [self messageImageInRect:CGRectMake(48.0, 1.0, 21.0, 21.0)]; 

的方法是:

-(UIImage *)messageImageInRect:(CGRect)rect { 

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    NSLog(@"I am inside"); 
    NSLog(@"I have rect as: %@", NSStringFromCGRect(rect)); 
    NSLog(@"I have the size as: %@", NSStringFromCGSize(rect.size)); 
    NSLog(@"I have the context as: %@", context); 

    CGContextSetLineWidth(context, 2.0f); 
    CGContextAddEllipseInRect(context, rect); 
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextFillPath(context); 
    CGContextStrokePath(context); 
    UIImage *testImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return testImage; 

} 

這似乎是很基本的。

NSLog語句有助於試圖弄清楚發生了什麼。但是,根據日誌,它似乎工作,但是,我沒有圖像被返回(或至少顯示)。我不知道爲什麼。

日誌顯示:

2014-01-19 18:06:02.753 XXXXXXXX[62921:70b] I am inside 
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have rect as: {{48, 1}, {21, 21}} 
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have the size as: {21, 21} 
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have the context as: <CGContext 0x10f133640> 
2014-01-19 18:06:02.754 XXXXXXXX[62921:70b] I have test Image size as: {21, 21} 

隨着messageCount被在UICollectionViewCell定義。

正如往常一樣,這一直是約3小時我的時間,看完教程後教程和SO響應後SO響應和編程手冊...

任何幫助,將不勝感激。

回答

1

您正在繪製一個完全在上下文之外的橢圓,所以根本看不到任何東西。

更改此:

CGContextAddEllipseInRect(context, rect); 

CGContextAddEllipseInRect(context, CGMakeRect(0, 0, rect.size.width, rect.size.height)); 

注意,當您創建圖像內容,你提供rect.size,但不rect.origin。因此,上下文無法知道您在rect.origin處繪製的內容應該進入上下文的左上角。這取決於你做到這一點。

這是另一種獲得相同效果的方法。這更容易一些,因爲你只需要調整矩形的原點一次;那麼您可以使用rect儘可能多地繪製您想要的圖像,而無需再次調整。

CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y); 
CGContextAddEllipseInRect(context, rect); 

還有一件事:你會發現你看到的是橢圓的填充,而不是中風。這是因爲CGContextFillPath在繪製後清除上下文的當前路徑。要同時填充和中風路徑:

CGContextDrawPath(context, kCGPathFillStroke); 
+0

您是救命的人!謝謝。 「CGContextDrawPath」令人遺憾的一個新手錯誤 - 我從早期的嘗試中刪除了它。用'rect.origin'的東西,我假設這會把我提供的'rect'的座標移動到我想要繪製的'rect'上? – Darren

+1

對,我想你明白了。 –

相關問題