我想将阴影添加到具有图像层的UIImageView。
我尝试过self.layer.shadowOffset / shadowOpacity路线,但速度太慢..
当我想添加阴影时,我调用addShadowLayerWithOffset方法,我希望调用drawRect并添加阴影..
但是drawRect没有被调用。
我在这里缺少什么?
- (void)drawRect:(CGRect)rect
{
SYSLOG(LOG_DEBUG, "in drawRect, isShadowed: %d", isShadowed);
if (isShadowed == true)
{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(100, 100), 3);
[super drawRect: rect];
CGContextRestoreGState(currentContext);
}
else
[super drawRect: rect];
}
- (void) addShadowLayerWithOffset: (int)offset
{
// self.layer.shadowOffset = CGSizeMake(offset,offset);
// self.layer.shadowOpacity = 0.7f;
// self.layer.shadowRadius = 5.0;
isShadowed = true;
[self setNeedsDisplay];
}
但阴影没有被绘制,事实上图像(原始图层)本身也没有显示 我应该改变什么?
- (void) drawLayer: (CALayer*) layer inContext: (CGContextRef)context
{
SYSLOG(LOG_DEBUG, "in drawLayer, isShadowed: %d", isShadowed);
if(isShadowed == true)
{
CGContextSaveGState(context);
CGContextSetShadow(context, CGSizeMake(10, 10), 3);
[super drawLayer: layer inContext: context];
CGContextRestoreGState(context);
}
else
[super drawLayer: layer inContext: context];
}
答案 0 :(得分:2)
尝试调用此方法:
由UIViewController调用:
[self addShadowedLayer:self.view inRect:( CGRectMake(30, 30, 128, 192))];
- (void)addShadowedLayer:(UIView *)aUIView inRect:(CGRect)aRect {
CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;
sublayer.shadowOffset = CGSizeMake(0, 3);
sublayer.shadowRadius = 5.0;
sublayer.shadowColor = [UIColor blackColor].CGColor;
sublayer.shadowOpacity = 0.8;
sublayer.frame = aRect;
sublayer.cornerRadius = 26.0;
[aUIView.layer addSublayer:sublayer];
}
它只是添加一个白色的圆形矩形,但你需要的只是它的影子...
答案 1 :(得分:1)
[super drawRect: rect];
但苹果说:
您不应该直接自己调用此方法。要使视图的一部分无效,从而导致重绘该部分,请调用setNeedsDisplay或setNeedsDisplayInRect:方法。
而不是drawRect,曾经尝试过drawLayer?
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
答案 2 :(得分:1)
我认为你正在咆哮错误的树。你说直接在图像层上指定阴影太慢了。这是正确的,因为操作系统使用alpha通道来确定绘制阴影的位置。
在iOS 3.2及更高版本中,您可以采取的措施是指定阴影路径。首先创建一个CGPathRef并将其设置为图层的阴影路径。
这样可以大大改善渲染效果,而无需为阴影引入另一层。