bug I meeted: use self.addShadow(.black, sRadius: 2, sOpacity: 0.2, offset: (-1, -1)) not works, addShadow is below

1
2
3
4
5
6
7
8
9
10
func addShadow(_ sColor: UIColor, sRadius: CGFloat, sOpacity: Float, offset: (CGFloat, CGFloat), for changedRect: CGRect = .zero) {
let rect = changedRect == .zero ? self.bounds : changedRect
self.layer.shadowColor = sColor.cgColor
self.layer.shadowRadius = sRadius
self.layer.shadowOpacity = sOpacity
// 设置 shadowOffset 会产生离屏渲染
// self.layer.shadowOffset = CGSize(width: 5, height: 5)
let path = UIBezierPath(rect: rect.offsetBy(dx: offset.0, dy: offset.1))
self.layer.shadowPath = path.cgPath
}

however, I added it after snp constrains wrote, but when I break at this line, I found that it’s frame is equal to .zero. After about a hr struggling with articles, I knowed that it’s frame changes after layoutSubviews is called

so I wrote like this

1
2
3
4
override func layoutSubviews() {
super.layoutSubviews()
self.addShadow(.black, sRadius: 2, sOpacity: 0.2, offset: (-1, -1))
}

which works perfectly.