如何在UIView下绘制阴影?

我想在Cocoa Touch里给UIView的底部边缘下绘制一个阴影。我知道我应该使用CGContextSetShadow来绘制,但是Quartz 2D的编程指南有一点含糊:

  1. 保存图表状态
  2. 调用功能CGContextSetShadow,添加适当的值。
  3. 在你想要应用阴影的地方执行所有的绘制
  4. 恢复图表状态

我已经尝试了下面的UIView子类:

- voiddrawRect:CGRectrect { CGContextRef currentContext = UIGraphicsGetCurrentContext; CGContextSaveGStatecurrentContext; CGContextSetShadowcurrentContext, CGSizeMake-15, 20, 5; CGContextRestoreGStatecurrentContext; [super drawRect: rect]; }

但是不起作用,我有点不明白接下来该怎么做。是不是需要对UIView做些什么才能解决这一问题呢?

原问题:How do I draw a shadow under a UIView?

Christian Brunschen
在你当前的代码里,保存当前内容的GState,配置它来绘制一个阴影。然后恢复到你配置阴影之前的状态。接下来,调用drawRect:的超类实现。
绘制阴影应受阴影设置影响,需要如下之后发生:

CGContextSetShadowcurrentContext, CGSizeMake-15, 20, 5;

但是在如下之前:

CGContextRestoreGStatecurrentContext;

所以如果你想让超类的drawRect: 被包裹在一个阴影里,那么把你的代码写成这样怎么样?

- voiddrawRect:CGRectrect { CGContextRef currentContext = UIGraphicsGetCurrentContext; CGContextSaveGStatecurrentContext; CGContextSetShadowcurrentContext, CGSizeMake-15, 20, 5; [super drawRect: rect]; CGContextRestoreGStatecurrentContext;
}

ollie
迄今为止比较简单的一个方法是设置初始化视图的层属性。

self.layer.masksToBounds = NO;
self.layer.cornerRadius = 8; // if you like rounded corners
self.layer.shadowOffset = CGSizeMake-15, 20;
self.layer.shadowRadius = 5;
self.layer.shadowOpacity = 0.5;

Z.Y.

self.layer.masksToBounds = NO;
self.layer.cornerRadius = 8; // if you like rounded corners
self.layer.shadowOffset = CGSizeMake-15, 20;
self.layer.shadowRadius = 5;
self.layer.shadowOpacity = 0.5;

这将会减慢应用程序。只要你的视图是中规中矩的矩形,加上下面这几行代码可以提高性能。

self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;

Srikar Appal
我把这个作为utils的一部分。有了这个我们不仅可以轻松地设置阴影,还可以为任何UIView获得圆角。还可以设置阴影颜色。通常选用黑色,但是当背景不是白色的时候,或许你会想用一些别的颜色。这是我的方法。

in utils.m
+ voidroundedLayer:CALayer *viewLayer radius:floatr shadow:BOOLs
{ [viewLayer setMasksToBounds:YES]; [viewLayer setCornerRadius:r]; [viewLayer setBorderColor:[RGB180, 180, 180 CGColor]]; [viewLayer setBorderWidth:1.0f]; ifs { [viewLayer setShadowColor:[RGB0, 0, 0 CGColor]]; [viewLayer setShadowOffset:CGSizeMake0, 0]; [viewLayer setShadowOpacity:1]; [viewLayer setShadowRadius:2.0]; } return;
}

为了使用这个得调用[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];

发表评论

电子邮件地址不会被公开。 必填项已用*标注