我有一个自定义
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
。之后,该层不再可见,并且不再位于视图层次结构中。我还尝试通过检查子层中是否存在层来仅插入子层一次,但这没有帮助
有人知道我错过了什么吗?
您只需添加代码即可将
shadowLayer
定义为实例变量并同时初始化它:
var shadowLayer = CALayer()
(您也可以将其设为惰性属性。)
对上面的代码进行更改,然后只需在代码中引用现有的
shadowLayer
,而不是在函数中定义它(并初始化它)。