我必须创建一个UIView将具有圆角,边框,阴影的drawRect()自定义,其方法被重写以提供自定义绘图代码,并通过该代码将多条直线绘制到视图中(我在这里需要使用快速,轻便的方法,因为许多这些视图中的一个可以呈现)。
UIView
drawRect()
我当前面临的问题是,一旦drawRect()在视图类中进行覆盖(即使其中没有任何自定义代码),阴影也将不再适用于圆角。请参见附件中的图片:
在视图控制器中,我使用以下代码:
view.layer.cornerRadius = 10; view.layer.masksToBounds = true; view.layer.borderColor = UIColor.grayColor().CGColor; view.layer.borderWidth = 0.5; view.layer.contentsScale = 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.clipsToBounds = false;
在覆盖的情况下,drawContext()我将使用类似:
drawContext()
var context:CGContext = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor); // Draw them with a 2.0 stroke width so they are a bit more visible. CGContextSetLineWidth(context, 2.0); CGContextMoveToPoint(context, 0.0, 0.0); //start at this point CGContextAddLineToPoint(context, 20.0, 20.0); //draw to this point CGContextStrokePath(context);
但是如上所述,即使不添加此代码,也会出现阴影问题。
除了这种与圆角和阴影兼容的方法以外,还有其他/更好的方法可以将轻量级元素绘制到视图上吗?我不想在视图中添加任何不必要的额外视图或图像上下文,因为它们需要轻巧和高性能。
这是一个棘手的问题。UIView的clipsToBounds需要,以获得圆角。但是CALayer的masksToBounds必须是false这样的阴影是可见的。不知何故,如果drawRect不被覆盖,一切都会起作用,但实际上不应该被覆盖。
clipsToBounds
CALayer
masksToBounds
false
drawRect
解决方案是创建一个超级视图以提供阴影(在下面的演示中是shadowView)。您可以在Playground中测试以下内容:
shadowView
class MyView : UIView { override func drawRect(rect: CGRect) { let c = UIGraphicsGetCurrentContext() CGContextAddRect(c, CGRectMake(10, 10, 80, 80)) CGContextSetStrokeColorWithColor(c , UIColor.redColor().CGColor) CGContextStrokePath(c) } } let superview = UIView(frame: CGRectMake(0, 0, 200, 200)) let shadowView = UIView(frame: 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(frame: shadowView.bounds) view.backgroundColor = UIColor.whiteColor() view.layer.cornerRadius = 10.0 view.layer.borderColor = UIColor.grayColor().CGColor view.layer.borderWidth = 0.5 view.clipsToBounds = true shadowView.addSubview(view) superview.addSubview(shadowView)
结果: