Изменение цвета тени на 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*
метод.