2013-07-19 2 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

Этот код выйдет из строя где-либо вне 'drawRect', потому что' UIGraphicsGetCurrentContext() 'вернет' nil'. Посмотрите на 'UIGraphicsBeginImageContextWithOptions' – borrrden

+0

OK Я обновил код, все еще не отображая ничего:/ –

+1

Вам действительно нужно лучше понять, как все это работает. Я сказал «заглядывать» в это, а не «просто вставлять туда». Это будет рисовать буфер изображения (но вам все равно нужно что-то с ним делать). Однако я вижу, что вы хотите, чтобы он отображался на экране. Если вы хотите врисовать в самом навигационном контроллере, вам нужно будет подклассифицировать его и переопределить его метод 'drawRect'. * Только внутри этого метода будет 'UIGraphicsGetImageContext()' return non-'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 (окольный один)

Если вы действительно хотите сделать это так, как вы уже делаете, изменить notificationView к UIImageView, а затем установить рамку зрения, чтобы быть размер черного закругленного прямоугольника. Затем добавьте это после того, как вы заполните путь:

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

Вам не нужно звонить setNeedsDisplay больше.

Надеюсь, один из этих звуков вам подходит!

+0

Через несколько часов я вернулся к своему коду и понял, что действительно должен был подклассифицировать его, но вариант 2 звучит потрясающе, поэтому я возьму его: D спасибо! –

Смежные вопросы