使用 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)

仅将角半径设置为 UIView/UIButton 的特定侧

iphone:按钮角半径未设置

右上角和左上角半径无法正常工作

设置 `UISegmentedControl` 的角半径等于 `UISearchController`

iOS:图像视图方面适合角半径