带有阴影,圆角和自定义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.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()我将使用类似:
    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不被覆盖,一切都会起作用,但实际上不应该被覆盖。
解决方案是创建一个超级视图以提供阴影(在下面的演示中是shadowView)。您可以在Playground中测试以下内容:
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)
结果:

以上是 带有阴影,圆角和自定义drawRect的UIView 的全部内容, 来源链接: utcz.com/qa/402752.html




