如何使用@IBInspectable在Swift 3中分别控制UIView的圆角?

5

这是我当前的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    let rect = Draw(frame: CGRect(
        origin: CGPoint(x: 50, y: 50),
        size: CGSize(width: 100, height: 100)))
    self.view.addSubview(rect)
}

你需要单独处理每个角落吗? - Reinier Melian
我想要单独处理每一个角的圆角大小。 - amin sadeghian
2个回答

10

请使用此自定义类,基本上您需要创建一个贝塞尔路径,使用线条和二次曲线,在@IBInspectable属性中处理每个角落的值。

以下是代码

//
//  CornerView.swift
//  UIViewCornerRounded
//
//  Created by Reinier Melian on 21/07/2017.
//  Copyright © 2017 Pruebas. All rights reserved.
//

import UIKit


@IBDesignable
class CornerView: UIView {
    
    @IBInspectable var leftTopRadius : CGFloat = 0{
        didSet{
            self.applyMask()
        }
    }
    @IBInspectable var rightTopRadius : CGFloat = 0{
        didSet{
            self.applyMask()
        }
    }
    @IBInspectable var rightBottomRadius : CGFloat = 0{
        didSet{
            self.applyMask()
        }
    }
    
    @IBInspectable var leftBottomRadius : CGFloat = 0{
        didSet{
            self.applyMask()
        }
    }

    
    override func layoutSubviews() {
        super.layoutSubviews()
        self.applyMask()
    }
    
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    /*override func draw(_ rect: CGRect) {
        super.draw(rect)

    }*/
    
    func applyMask()
    {
        let shapeLayer = CAShapeLayer(layer: self.layer)
        shapeLayer.path = self.pathForCornersRounded(rect:self.bounds).cgPath
        shapeLayer.frame = self.bounds
        shapeLayer.masksToBounds = true
        self.layer.mask = shapeLayer
    }
    
    func pathForCornersRounded(rect:CGRect) ->UIBezierPath
    {
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0 + leftTopRadius , y: 0))
        path.addLine(to: CGPoint(x: rect.size.width - rightTopRadius , y: 0))
        path.addQuadCurve(to: CGPoint(x: rect.size.width , y: rightTopRadius), controlPoint: CGPoint(x: rect.size.width, y: 0))
        path.addLine(to: CGPoint(x: rect.size.width , y: rect.size.height - rightBottomRadius))
        path.addQuadCurve(to: CGPoint(x: rect.size.width - rightBottomRadius , y: rect.size.height), controlPoint: CGPoint(x: rect.size.width, y: rect.size.height))
        path.addLine(to: CGPoint(x: leftBottomRadius , y: rect.size.height))
        path.addQuadCurve(to: CGPoint(x: 0 , y: rect.size.height - leftBottomRadius), controlPoint: CGPoint(x: 0, y: rect.size.height))
        path.addLine(to: CGPoint(x: 0 , y: leftTopRadius))
        path.addQuadCurve(to: CGPoint(x: 0 + leftTopRadius , y: 0), controlPoint: CGPoint(x: 0, y: 0))
        path.close()
        
        return path
    }
    
}

这里是结果

输入图像说明

使用这些值

输入图像说明

希望这可以帮助您


1
感谢您提供最准确的答案。 - amin sadeghian
我尝试了很多次,得到了这个消息:感谢您的反馈!低于15声望值的用户投票会被记录,但不会改变公开显示的帖子分数。 - amin sadeghian
1
感谢您解决了一个大问题。 - amin sadeghian

6
尝试使用这段代码。在我的项目中,它能够正常工作。
extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}

我想在XIB中创建一个圆角正方形,每个边缘都被圆角处理,并使用@IBInspectable控制每个角落。 - amin sadeghian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接