圓角和陰影並存的三種方式
因為最普通的設定圓角的方法中,layer.masksToBounds = true會將陰影也會裁剪到,導致陰影設定失效,所以可以通過以下三種方法來讓圓角和陰影並存:
1.通過新增一個陰影View放在目標View下面
```
func byAddingAnotherView() {
let shadowView = UIView.init()
shadowView.layer.shadowColor = UIColor.darkGray.cgColor
shadowView.layer.shadowOffset = CGSize(width: 0.0, height: 10)
shadowView.layer.shadowOpacity = 1
shadowView.layer.shadowRadius = 15
shadowView.layer.cornerRadius = 25
shadowView.frame = CGRect.init(x: (UIScreen.main.bounds.size.width - 50)/2, y: 100, width: 50, height: 50)
view.addSubview(shadowView)
let button = UIButton.init(type: .custom)
button.frame = shadowView.bounds
button.backgroundColor = UIColor.blue
button.layer.cornerRadius = 25
button.layer.masksToBounds = true
shadowView.addSubview(button)
}
```
2.通過新增一個陰影layer放在目標View的layer下面
```
func byAddingAnotherLayer() {
let button = UIButton.init(type: .custom)
button.frame = CGRect.init(x: (UIScreen.main.bounds.size.width - 50)/2, y: 200, width: 50, height: 50)
button.backgroundColor = UIColor.blue
button.layer.cornerRadius = 25
button.layer.masksToBounds = true
view.addSubview(button)
let subLayer = CALayer.init()
subLayer.frame = button.frame
subLayer.cornerRadius=25
subLayer.backgroundColor = UIColor.blue.cgColor
subLayer.masksToBounds=false
subLayer.shadowColor = UIColor.darkGray.cgColor
subLayer.shadowOffset = CGSize(width: 0.0, height: 10)
subLayer.shadowOpacity = 1;
subLayer.shadowRadius = 15;
view.layer.insertSublayer(subLayer, below: button.layer)
}
```
3.通過設定目標view的layer.shadowPath屬性來設定陰影
```
func byChangeLayer() {
let button = UIButton.init(type: .custom)
button.frame = CGRect.init(x: (UIScreen.main.bounds.size.width - 50)/2, y: 300, width: 50, height: 50)
button.backgroundColor = UIColor.blue
view.addSubview(button)
button.layer.cornerRadius = 25
button.layer.masksToBounds = false
button.layer.shadowColor = UIColor.darkGray.cgColor
button.layer.shadowOffset = CGSize(width: 0.0, height: 10)
button.layer.shadowOpacity = 1
button.layer.shadowRadius = 15
button.layer.shadowPath = UIBezierPath.init(roundedRect: button.layer.bounds, cornerRadius: button.layer.cornerRadius).cgPath
button.layer.shouldRasterize = true
button.layer.rasterizationScale = UIScreen.main.scale
}
```
第一種方式的缺點主要是需要新建立一個View,造成額外的效能開銷
第二種方式需要獲取到view的superView,將陰影layer新增到superView的layer中去,有一定的侷限性
第三種方式效能較好,因為使用shadowPath可以有效避免了offscreen渲染,因為僅需要直接繪製路徑即可,不需要提前讀取影象去渲染。
效果圖:

程式碼在此:
https://github.com/577528249/SwiftDemo/tree/master/CornerAndShadow