ios - 如何向使用路径遮罩的视图添加阴影
问题描述
如何向用路径遮罩的视图添加阴影?
layer
有一个可以像这样设置的掩码属性yourCustomView.layer.mask = somePath
。但是我如何添加一个也被掩盖的阴影layer.mask
?
解决方案
我看到这个问题问了很多,答案到处都是,所以我想我会集中一点。
基本上,当您想为使用路径遮罩的视图添加阴影时,事情会变得很有趣。
这是我构建的一个扩展,可以处理所有这些,并且非常易于使用。该corners
参数是为基本圆角设置设置的,但您可以将其替换为您想要的任何 UIBezierPath。
import UIKit
public extension UIView {
/// You will probably need to call this from viewDidLayoutSubviews()
func roundCorners(corners: UIRectCorner = .bottomRight, radius: CGFloat = 40) {
layoutIfNeeded()
let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
}
/// You will probably need to call this from viewDidLayoutSubviews()
func roundCornersWithShadow(corners: UIRectCorner = .bottomRight, cornerRadius radius: Double = 40, shadowOpacity: Float = 0.5, shadowRadius: Double = 4, shadowOffset: CGSize = CGSize(width: 0, height: 2), shadowColor: UIColor = .black, maskName: String = "mask", shadowName: String = "shadow") {
layoutIfNeeded()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath
let maskLayer = CAShapeLayer()
maskLayer.frame = bounds
maskLayer.path = path
layer.mask = maskLayer
layer.name = maskName
if let subLayers = superview?.layer.sublayers {
for layer in subLayers where layer.name == shadowName { layer.removeFromSuperlayer() }
}
let shadowLayer = CAShapeLayer()
shadowLayer.name = shadowName
shadowLayer.path = path
shadowLayer.frame = frame
shadowLayer.shadowOpacity = shadowOpacity
shadowLayer.shadowRadius = CGFloat(shadowRadius)
shadowLayer.shadowColor = shadowColor.cgColor
shadowLayer.shadowOffset = shadowOffset
superview?.layer.insertSublayer(shadowLayer, below: layer)
}
}
然后使用它:
override func viewDidLayoutSubviews() {
...
yourView.roundCornersWithShadow(corners: [.bottomRight, .bottomLeft, .topRight, .topLeft]) // Use whatever corners you want.
}
推荐阅读
- css - 如何改进此@keyframes 动画并使其更流畅
- mysql - mysql中日期和时间的单独字段
- marklogic - MarkLogic 结合 cts:query 和 search:query
- ews-javascript-api - ews-javascript-api getAttachments throw 对象不支持此操作
- java - ARCore:从虚拟设备加载资产的 Sceneform 演示错误
- asp.net-mvc - 如何将禁用的下拉值从视图传递到控制器
- spring-boot - Spring boot 加载应用程序上下文失败
- laravel - Laravel / Stripe:服务器中止了 SSL
- microsoft-graph-api - 来宾用户 (Azure AD B2B) 能否从共享点页面调用图表(例如使用 spfx webpart)
- python - 使用python按逆标准差缩放训练集