带阴影、圆角和自定义drawRect的UIView

我必须创建一个自定义的UIView,该视图将具有圆角、边框、阴影,并覆盖其drawRect()方法,以提供自定义绘图代码,在视图中绘制多条直线(这里我需要使用快速、轻量级的方法,因为这些视图中的许多可能会被渲染)

我目前面临的问题是,只要我在视图类中重写drawRect(),阴影就不再应用于圆角(即使其中还没有任何自定义代码)。有关差异,请参见附图:

在视图控制器中,我使用以下代码:

view.layer.cornerRadius=10;
view.layer.masksToBounds=true;
view.layer.borderColor=UIColor.grayColor().CGColor;
view.layer.borderWidth=0.5;
view.layer.contentsCale=UIScreen.mainScreen().scale;
view.layer.shadowColor=UIColor.blackColor().CGColor;
view.layer.shadowOffset=CGSizeZero;
view.layer.shadowRadius=5.0;
view.layer.shadowOpacity=0.5;
view.layer.masksToBounds=false;
view.clipstobunds=false;

在重写的drawContext()中,我将使用如下内容:

变量上下文:CGContext=UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(上下文,UIColor.redColor().CGColor);
//以2.0笔划宽度绘制它们,使它们更为可见。
CGContextSetLineWidth(上下文,2.0);
CGContextMoveToPoint(上下文,0.0,0.0)//从这一点开始
CGContextAddLineToPoint(上下文,20.0,20.0)//到此为止
CGContextStrokePath(上下文);

但是如上所述,即使没有添加此代码,阴影问题也会发生

除了这种与圆角和阴影兼容的方法外,是否还有其他/更好的方法将轻量级元素绘制到视图上?我不想在视图中添加任何不必要的额外视图或图像上下文,因为这些视图或图像上下文需要光线和性能

这是一个棘手的问题UIViewclipsToBounds是获得圆角所必需的。但是CALayermasksToBounds必须是false才能看到阴影。不知何故,如果drawRect没有被覆盖,那么一切都可以工作,但实际上它不应该被覆盖

解决方案是创建一个超级视图来提供阴影(在下面的演示中,这是阴影视图)。您可以在操场上测试以下各项:

类MyView:UIView{
重写func drawRect(rect:CGRect){
设c=UIGraphicsGetCurrentContext()
CGContextAddRect(c,CGRectMake(10,10,80,80))
CGContextSetStrokeColorWithColor(c,UIColor.redColor().CGColor)
CGContextStrokePath(c)
}
}
让superview=UIView(帧:CGRectMake(0,0,200,200))
让shadowView=UIView(帧:CGRectMake(50,50,100,100))
shadowView.layer.shadowColor=UIColor.blackColor().CGColor
shadowView.layer.shadowOffset=CGSizeZero
shadowView.layer.shadowOpacity=0.5
shadowView.layer.shadowRadius=5
let view=MyView(帧:shadowView.bounds)
view.backgroundColor=UIColor.whiteColor()
view.layer.cornerRadius=10.0
view.layer.borderColor=UIColor.grayColor().CGColor
view.layer.borderWidth=0.5
view.clipstobunds=true
shadowView.addSubview(视图)
superview.addSubview(阴影视图)

结果:

发表评论