Ios 如何在swift 4中检测某些边的角半径?

Ios 如何在swift 4中检测某些边的角半径?,ios,swift,cornerradius,ibinspectable,Ios,Swift,Cornerradius,Ibinspectable,下面是运行良好的代码 let path = UIBezierPath(roundedRect:viewToRound.bounds, byRoundingCorners:[.topRight, .bottomLeft], cornerRadii: CGSize(width: 20, height: 20)) let maskLayer = CAShapeLayer() maskLayer.path = path

下面是运行良好的代码

let path = UIBezierPath(roundedRect:viewToRound.bounds,
                    byRoundingCorners:[.topRight, .bottomLeft],
                    cornerRadii: CGSize(width: 20, height:  20))

let maskLayer = CAShapeLayer()

maskLayer.path = path.cgPath
viewToRound.layer.mask = maskLayer
但是我需要在我的代码中多次使用它,所以我创建了视图类,并希望在IBInspectable中使用它,每个边都是可选的,可以更改故事板中的角半径,所以我使用了它,但它没有显示在故事板中

@IBInspectable
open var cornerEdges: CGSize {
    get {
        let path = UIBezierPath(roundedRect:self.bounds,
                                byRoundingCorners:[.topRight, .bottomLeft],
                                cornerRadii: CGSize(width: 20, height:  20))

        let maskLayer = CAShapeLayer()

        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
        return maskLayer.path as! CGSize
    }
    set(value) {
        maskLayer.path = value
    }
}
那么,我应该如何在代码中实现这一点呢?

只要将类更改为@IBDesignable,就可以在故事板中看到

你可以在故事板上看到它

如何从storybaord获取角点和半径 下面是一个示例代码

@IBInspectable
open var cornerEdges: CGSize = CGSize(width: 20, height: 20)
@IBInspectable  var topLeft: Bool = true
@IBInspectable  var topRight: Bool = true
@IBInspectable  var bottomLeft: Bool = true
@IBInspectable  var bottomRight: Bool = true

override func awakeFromNib() {

    var options = UIRectCorner()
    if topLeft {
       options =  options.union(.topLeft)
    }
    if topRight {
       options =  options.union(.topRight)
    }
    if bottomLeft {
      options =  options.union(.bottomLeft)
    }
    if bottomRight {
      options =  options.union(.bottomRight)
    }


    let path = UIBezierPath(roundedRect:self.bounds,
                            byRoundingCorners:options,
                            cornerRadii: self.cornerEdges)

    let maskLayer = CAShapeLayer()

    maskLayer.path = path.cgPath
    self.layer.mask = maskLayer
}
只需将类更改为@IBDesignable即可在情节提要中查看

你可以在故事板上看到它

如何从storybaord获取角点和半径 下面是一个示例代码

@IBInspectable
open var cornerEdges: CGSize = CGSize(width: 20, height: 20)
@IBInspectable  var topLeft: Bool = true
@IBInspectable  var topRight: Bool = true
@IBInspectable  var bottomLeft: Bool = true
@IBInspectable  var bottomRight: Bool = true

override func awakeFromNib() {

    var options = UIRectCorner()
    if topLeft {
       options =  options.union(.topLeft)
    }
    if topRight {
       options =  options.union(.topRight)
    }
    if bottomLeft {
      options =  options.union(.bottomLeft)
    }
    if bottomRight {
      options =  options.union(.bottomRight)
    }


    let path = UIBezierPath(roundedRect:self.bounds,
                            byRoundingCorners:options,
                            cornerRadii: self.cornerEdges)

    let maskLayer = CAShapeLayer()

    maskLayer.path = path.cgPath
    self.layer.mask = maskLayer
}

所以,若你们想改变边角的高度和宽度,你们可以使用@PrashantTukadiya-answer,但若你们只想为边角设置一个数字,你们可以使用这个代码

 @IBInspectable
open var cornerEdges : CGFloat = 0
@IBInspectable  var topLeft: Bool = false
@IBInspectable  var topRight: Bool = false
@IBInspectable  var bottomLeft: Bool = false
@IBInspectable  var bottomRight: Bool = false
 override func awakeFromNib() {
    super.awakeFromNib()

    var options = UIRectCorner()
    if topLeft {
        options =  options.union(.topLeft)
    }
    if topRight {
        options =  options.union(.topRight)
    }
    if bottomLeft {
        options =  options.union(.bottomLeft)
    }
    if bottomRight {
        options =  options.union(.bottomRight)
    }


    let path = UIBezierPath(roundedRect:self.bounds,
                            byRoundingCorners:options,
                            cornerRadii: CGSize(width: self.cornerEdges, height: self.cornerEdges))

    let maskLayer = CAShapeLayer()

    maskLayer.path = path.cgPath
    self.layer.mask = maskLayer
}

所以,若你们想改变边角的高度和宽度,你们可以使用@PrashantTukadiya-answer,但若你们只想为边角设置一个数字,你们可以使用这个代码

 @IBInspectable
open var cornerEdges : CGFloat = 0
@IBInspectable  var topLeft: Bool = false
@IBInspectable  var topRight: Bool = false
@IBInspectable  var bottomLeft: Bool = false
@IBInspectable  var bottomRight: Bool = false
 override func awakeFromNib() {
    super.awakeFromNib()

    var options = UIRectCorner()
    if topLeft {
        options =  options.union(.topLeft)
    }
    if topRight {
        options =  options.union(.topRight)
    }
    if bottomLeft {
        options =  options.union(.bottomLeft)
    }
    if bottomRight {
        options =  options.union(.bottomRight)
    }


    let path = UIBezierPath(roundedRect:self.bounds,
                            byRoundingCorners:options,
                            cornerRadii: CGSize(width: self.cornerEdges, height: self.cornerEdges))

    let maskLayer = CAShapeLayer()

    maskLayer.path = path.cgPath
    self.layer.mask = maskLayer
}

使用您的代码使用未解析标识符“maskLayer”@Saeedrahmotolahi后,我会看到此错误,这与您发布的代码相同。@Saeedrahmotalahi我建议您不要在此处使用get-set块,而可以在awakeFromNib方法中应用掩码路径我有一个类,可以执行许多操作,并在我的应用程序中多次使用它,我想要它要在那个类中使用它,我只需要使用我在question@SaeedRahmatolahi好的,运行时需要的动态值是什么?像角半径一样,在使用代码后,我会看到此错误。使用未解析标识符“maskLayer”@Saeedrahmatalahi与您发布的代码相同。@Saeedrahmatalahi我建议您不要在此处使用get-set块,而是可以在awakeFromNib方法中应用掩码路径。我有一个类可以做很多事情,并且可以多次使用它在我的应用程序中,我想在那个类中使用这个,所以我只需要使用我在question@SaeedRahmatolahi好的,运行时需要的动态值是什么?喜欢角半径干得好!!在此感谢您的帮助现在还有一件不重要的事情是如何改变每个边角与其他边角的不同在我的iPhone代码中使用此类后,这里出现了一个问题所有东西都工作正常,但在iPad中右上角不工作@PrashantTukadiyaGood job!!在此感谢您的帮助现在还有一件不重要的事情是如何改变每个边角与其他边角的不同在我的iPhone代码中使用了这个类后,这里出现了一个问题每件事都很好,但在iPad中右上角不起作用@PrashantTukadiya