【问题标题】:using UIBezierPath for setting radius to some corners and adding shadow to Custom UIButton使用 UIBezierPath 将半径设置为某些角并向自定义 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
}

【问题讨论】:

    标签: ios swift uibezierpath


    【解决方案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);
    }
    

    }

    结果是

    【讨论】:

    • 这对我不起作用。它使全屏成为按钮的颜色
    • 这是因为不同设备的按钮大小不同,更新代码。
    • 请分享您的示例应用
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多