使用 UIBezierPath 将半径设置为某些角并向自定义 UIButton 添加阴影
Posted
技术标签:
【中文标题】使用 UIBezierPath 将半径设置为某些角并向自定义 UIButton 添加阴影【英文标题】:using UIBezierPath for setting radius to some corners and adding shadow to Custom UIButton 【发布时间】:2016-02-10 10:20:52 【问题描述】:我有一个自定义 UIButton。 我想将半径添加到某些角落(不是所有角落) 我正在使用 UIBezierPath 进行设置。 但是因为我正在掩盖图层,所以我无法添加阴影。
它适用于所有角落:
func setupView()
layer.cornerRadius = 10
addShadow(UIColor.blackColor(), opacity: 0.8, radius: 5, offset: CGSizeMake(1, 1))
func addShadow(color: UIColor, opacity: Float, radius: CGFloat, offset: CGSize)
layer.shadowColor = color.CGColor
layer.shadowOpacity = opacity
layer.shadowRadius = radius
layer.shadowOffset = offset
对于使用 UIBezierPath 的某些角,我只得到圆角但没有阴影
func setupView()
addCornerRadiusToCurners(false, leftTop: true, rightBottom: false, leftBottom: false, radius: 10)
addShadow(UIColor.blackColor(), opacity: 0.8, radius: 5, offset: CGSizeMake(1, 1))
func addCornerRadiusToCurners(rightTop: Bool = true, leftTop: Bool = true, rightBottom: Bool = true, leftBottom: Bool = true, radius: CGFloat)
var corners: UIRectCorner = []
if rightTop corners.insert(.TopRight)
if leftTop corners.insert(.TopLeft)
if rightBottom corners.insert(.BottomRight)
if leftBottom corners.insert(.BottomLeft)
let cornerPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSizeMake(radius, radius))
let cornerMaskLayer = CAShapeLayer()
cornerMaskLayer.path = cornerPath.CGPath
layer.mask = cornerMaskLayer
【问题讨论】:
【参考方案1】:使用这个更新的 CustomButton 类:
自定义按钮类:UIButton
var cornerMaskLayer : CAShapeLayer!
var corners: UIRectCorner = []
var cornerRadius : CGFloat = 0
override func awakeFromNib()
addCornerRadiusToCurners(radius: 10)
addShadow(UIColor.blackColor(), opacity: 0.5, radius: 2.0, offset: CGSizeMake(2, 5))
func addShadow(color: UIColor, opacity: Float, radius: CGFloat, offset: CGSize)
layer.shadowColor = color.CGColor
layer.shadowOpacity = opacity
layer.shadowRadius = radius
layer.shadowOffset = offset
func setupView()
addCornerRadiusToCurners(false, leftTop: true, rightBottom: false, leftBottom: false, radius: 10)
addShadow(UIColor.blackColor(), opacity: 0.8, radius: 5, offset: CGSizeMake(1, 1))
override func layoutSubviews()
super.layoutSubviews()
let cornerPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSizeMake(cornerRadius, cornerRadius))
cornerMaskLayer.path = cornerPath.CGPath
func addCornerRadiusToCurners(rightTop: Bool = true, leftTop: Bool = true, rightBottom: Bool = true, leftBottom: Bool = true, radius: CGFloat)
if rightTop corners.insert(.TopRight)
if leftTop corners.insert(.TopLeft)
if rightBottom corners.insert(.BottomRight)
if leftBottom corners.insert(.BottomLeft)
cornerRadius = radius
let cornerPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSizeMake(radius, radius))
cornerMaskLayer = CAShapeLayer()
cornerMaskLayer.path = cornerPath.CGPath
cornerMaskLayer.fillColor = self.backgroundColor?.CGColor
self.backgroundColor = UIColor.clearColor()
layer.addSublayer(cornerMaskLayer);
结果是
【讨论】:
这对我不起作用。它使全屏成为按钮的颜色 这是因为不同设备的按钮大小不同,更新代码。 请分享您的示例应用以上是关于使用 UIBezierPath 将半径设置为某些角并向自定义 UIButton 添加阴影的主要内容,如果未能解决你的问题,请参考以下文章
像在绘图应用程序中一样指定具有角半径的 UIBezierPath 点(例如 Sketch)