изменение цвета тени на 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 для создания теней, не будут работать.

Ваше здоровье


person Dominic    schedule 27.09.2012    source источник


Ответы (1)


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

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

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

Я бы предложил иметь ivar 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*.

person Paul.s    schedule 27.09.2012
comment
Это работает отлично - большое спасибо (если бы я мог вспомнить свой старый вход в систему, у меня был бы представитель, чтобы проголосовать за это - к сожалению, я повторно присоединился, поэтому не могу проголосовать за него) - person Dominic; 28.09.2012