阴影在“兄弟”视图之上不可见

时间:2018-06-13 20:26:56

标签: ios swift uiview shadow cashapelayer

我正试图在视图的顶部创建一个阴影。
这是我的层次结构:
查看
------ TablewView
------ BottomView

TableView和BottomView具有相同的父级:查看。
我希望BottomView在TableView顶部有一个阴影,如左边的图片,但结果是右边的那个:

enter image description here

如果我尝试删除TableView,我会看到阴影。 BottomView有圆角。 这是BottomView类:

class BottomView: UIView {
    private var shadowLayer: CAShapeLayer!

    override func layoutSubviews() {
        super.layoutSubviews()

        if shadowLayer == nil {
            let shadowLayer = CAShapeLayer()
            shadowLayer.masksToBounds = false
            //rect is an ex.
            shadowLayer.path =  UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 200, height: 80), cornerRadius: 9).cgPath
            shadowLayer.fillColor = UIColor.red.cgColor

            shadowLayer.shadowColor = UIColor.black.cgColor
            shadowLayer.shadowPath = shadowLayer.path
            shadowLayer.shadowOffset = CGSize(width: 5, height: -5)
            shadowLayer.shadowOpacity = 1
            shadowLayer.shadowRadius = 3
            shadowLayer.zPosition = 10
            layer.insertSublayer(shadowLayer, at: 0)
            clipsToBounds = false
        }
    }
}

1 个答案:

答案 0 :(得分:2)

第一个问题是变量/对象范围......

class BottomView: UIView {
    private var shadowLayer: CAShapeLayer!

    override func layoutSubviews() {
        super.layoutSubviews()

        if shadowLayer == nil {
            let shadowLayer = CAShapeLayer()
            ...

您说:let shadowLayer = CAShapeLayer(),您刚刚创建了一个 新的本地 shadowLayer对象,当它超出范围时它会消失(在if区块的末尾)。

将该行更改为:

shadowLayer = CAShapeLayer()   // remove the let

你应该看到你的影子。

您可以通过在if区块下方添加以下内容来“自动化”大小调整:

    if shadowLayer != nil {
        shadowLayer.path =  UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height), cornerRadius: 9).cgPath
    }

,只要视图改变大小,它就会重新调整阴影层的大小。