存储在属性中时 CALayer 消失

问题描述 投票:0回答:1

我有一个自定义

UIPresentationController
,其中我覆盖了
presentedView
,如下所示:

override var presentedView: UIView? {
        guard let view = super.presentedView else { return nil }
        
        let shadowLayer = CALayer()
        shadowLayer.shadowPath = .init(rect: view.bounds, transform: .none)
        shadowLayer.shadowRadius = 6
        shadowLayer.shadowColor = .init(gray: 0, alpha: 0.15)
        shadowLayer.backgroundColor = view.layer.backgroundColor
        shadowLayer.shadowOpacity = 1
        shadowLayer.shadowOffset = .init(width: 0, height: -10)
        shadowLayer.shouldRasterize = true
        shadowLayer.rasterizationScale = UIApplication.screen?.scale ?? 1.0
        
        view.layer.insertSublayer(shadowLayer, at: 0)
        shadowLayer.position = view.layer.position
        shadowLayer.bounds = view.bounds
        view.layer.masksToBounds = false
        
        return view
    }

然后为了提高效率,我想为什么每次计算

CALayer
时都要创建一个新的
presetedView
并决定将图层作为类的属性并仅更新
shadowPath
。之后,该层不再可见,并且不再位于视图层次结构中。我还尝试通过检查子层中是否存在层来仅插入子层一次,但这没有帮助

有人知道我错过了什么吗?

ios swift core-animation calayer
1个回答
0
投票

您只需添加代码即可将

shadowLayer
定义为实例变量并同时初始化它:

var shadowLayer = CALayer()

(您也可以将其设为惰性属性。)

对上面的代码进行更改,然后只需在代码中引用现有的

shadowLayer
,而不是在函数中定义它(并初始化它)。

© www.soinside.com 2019 - 2024. All rights reserved.