Изменение цвета тени на UIBezierPath

У меня есть метод делегата UIVIew и в методе drawRect я добавляю в UIBezierPath, чтобы показать тень на квадрате.

 //// General Declarations
 CGContextRef context = UIGraphicsGetCurrentContext();

 //// Shadow Declarations
 UIColor* shadow = [UIColor blackColor];
 CGSize shadowOffset = CGSizeMake(0, -0);
 CGFloat shadowBlurRadius = 15;


 //// Rectangle Drawing
 rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(8, 8, 44, 44)];
 CGContextSaveGState(context);
 CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
 [[UIColor whiteColor] setFill];
 [rectanglePath fill];
 CGContextRestoreGState(context);

Затем я хочу изменить цвет тени на основе определенных критериев, поэтому я выбрал метод с именем makeRed.

- (void)makeRed {
  NSLog(@"makeRed");
  CGContextRef context = UIGraphicsGetCurrentContext();
  // Shadow Declarations
  UIColor* shadow = [UIColor redColor];
  CGSize shadowOffset = CGSizeMake(0, -0);
  CGFloat shadowBlurRadius = 15;
  CGContextSaveGState(context);
  CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
  [[UIColor whiteColor] setFill];
  [rectanglePath fill];
  CGContextRestoreGState(context);
}

Но когда я вызываю метод, я получаю сообщение:

: CGContextSaveGState: неверный контекст 0x0

Любые идеи, как я могу либо установить правильный контекст или изменить цвет тени по-другому?

Обратите внимание, что первоначальное рисование тени работает отлично, так как для делегата есть другие атрибуты, например, некоторые причудливые анимации, использующие метод.layer для создания теней, которые не будут работать.

ура

1 ответ

Решение

В документах UIView вы можете увидеть drawRect:

К тому времени, когда этот метод вызывается, UIKit настроил среду рисования соответствующим образом для вашего вида, и вы можете просто вызывать любые методы и функции рисования, которые вам нужны для визуализации вашего контента.

Так что рисунок вы делаете внутри drawRect: правильно, так как контекст рисования настроен правильно и т. д., это не так в вашем makeRed метод.

Я бы предложил иметь ивар shadowColor а затем использовать это внутри вашего drawRect: метод. Ваш makeRed будет выглядеть так

- (void)makeRed;
{
  self.shadowColor = [UIColor redColor];
  [self setNeedsDisplay];
}

а затем изменить строку в drawRect: в

CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, self.shadowColor.CGColor);

setNeedsDisplay используется, чтобы сказать UIKit что вы хотите, чтобы ваш взгляд был перерисован, что затем приводит к drawRect: вызывается снова.

Вам, конечно, придется инициализировать _shadowColor = [UIColor blackColor] в init* метод.

Другие вопросы по тегам