2013-07-19 41 views
0

剛開始與Core Graphics合作,我可能不知道發生了什麼。不正確地做CG圖

在下面的代碼我試圖創建一個小的圓形半透明的黑色方形覆蓋在的UINavigationController的頂部,但至今沒有露面......

UIView *notificationView = [[UIView alloc] initWithFrame:[[[self navigationController] view] frame]]; 

CGRect rect = CGRectMake(self.view.frame.size.width/2 - 50, self.view.frame.size.height/2, 100, 100); 
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); 
[[UIColor colorWithWhite:0 alpha:0.5] setFill]; 

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:10]; 
[path fill]; 

[notificationView setNeedsDisplay]; 

[[[self navigationController] view] addSubview:notificationView]; 
+0

因爲'UIGraphicsGetCurrentContext()'將返回'nil',所以這段代碼在'drawRect'之外的任何地方都會失敗。看看'UIGraphicsBeginImageContextWithOptions' – borrrden

+0

好吧,我更新了代碼,仍然沒有顯示任何東西:/ –

+1

你真的需要更好地瞭解所有這些東西的工作原理。我說「看看」它,而不是「只是粘貼在那裏」。這將繪製到圖像緩衝區中(但您仍然需要使用它)。不過,我看到你想讓它顯示到屏幕上。如果你想繪製到導航控制器本身,你需要繼承它並覆蓋它的'drawRect'方法。 *只有在該方法內部* UIGraphicsGetImageContext()返回非''nil'(並且你不需要在那裏開始一個圖像上下文)。 – borrrden

回答

0

選項1(最具設計友好的一個)

UIView s並不是真的意味着其他物體可以吸入它們。它使UIView的子類更具設計感,並讓它在drawRect中執行自己的繪圖。這樣,每次使用通知視圖時,都不必粘貼太多的代碼。

選項2(最簡單的一個,可能是最好的)

如果你只是想要一個黑色半透明圓角矩形(我假設的負載指示),您可以更輕鬆地創建辦呢在你想要的大小UIView和居中在視圖中。將其背景色設置爲半透明顏色,[UIColor colorWithWhite:0.0 alpha:0.5]。最後,添加行

notificationView.layer.cornerRadius = 10.0; 

您可能還需要投入#import <QuartzCore/QuartzCore.h>在你的頭文件,因爲這是一個CALayer伎倆。

選項3(環島之一)

如果你真的想這樣做,你已經做的方式,改變notificationViewUIImageView,然後設置視圖的框架是大小的黑色圓形矩形。然後在填充路徑後添加以下內容:

UIImage *indicatorImage = UIGraphicsGetImageFromCurrentImageContext(); 
notificationView.image = indicatorImage; 

您不需要再撥打setNeedsDisplay

希望其中的一個聽起來不錯!

+0

幾小時後我回到了我的代碼,並意識到我真的應該繼承它,但選項2聽起來也很棒,所以我會採取那一個:D謝謝! –