Swift3 将自定义边框颜色Alpha添加到属性检查器

Swift3 将自定义边框颜色Alpha添加到属性检查器,swift3,alpha,uicolor,xcode8.2,cgcolor,Swift3,Alpha,Uicolor,Xcode8.2,Cgcolor,我有一个由两部分组成的问题。首先,我想添加边框颜色alpha作为自定义属性,如图所示 但我注意到的第一件事是,要设置边框颜色,必须使用CGColor而不是UIColor,并且CGColor.alpha是只读的 所以我试着用这样的东西,但没有真正起作用 @IBInspectable var borderAlpha: CGFloat { set { let borderCGColor = layer.borderColor var color = UICol

我有一个由两部分组成的问题。首先,我想添加边框颜色alpha作为自定义属性,如图所示

但我注意到的第一件事是,要设置边框颜色,必须使用
CGColor
而不是
UIColor
,并且
CGColor.alpha
是只读的

所以我试着用这样的东西,但没有真正起作用

@IBInspectable var borderAlpha: CGFloat {
    set {
        let borderCGColor = layer.borderColor
        var color = UIColor(cgColor: borderCGColor!)

        if (newValue < 0) {
            color = color.withAlphaComponent(0)
            layer.borderColor = color.cgColor
        } else if (newValue > 1) {
            color = color.withAlphaComponent(1)
            layer.borderColor = color.cgColor
        } else {
            color = color.withAlphaComponent(newValue)
            layer.borderColor = color.cgColor
        }
    }
    get {
        return layer.borderColor!.alpha
    }
}
@IBInspectable var borderAlpha:CGFloat{
设置{
让borderCGColor=layer.borderColor
var color=UIColor(cgColor:borderCGColor!)
如果(新值<0){
颜色=颜色。带字母组件(0)
layer.borderColor=color.cgColor
}否则如果(新值>1){
颜色=颜色。带字母组件(1)
layer.borderColor=color.cgColor
}否则{
颜色=颜色。带AlphaComponent(新值)
layer.borderColor=color.cgColor
}
}
得到{
返回图层。边框颜色!.alpha
}
}
我确实在用户定义的运行时属性中得到了这一点,但它不起作用

我猜这是因为所有用户定义的运行时属性都是在正在使用的实际函数之后调用的,而我的不是一个真正的函数,更多的是一个自定义函数来实现我想要的。 我也知道你可以用颜色选择器选择alpha,但是对于我正在做的事情来说,如果它们是分开的,那就更好了


最后,作为第二个问题,在增加或减少值的箭头上,它跳1,但在Xcode的alpha框上,它只跳0.05,不能低于0或高于1。如何将此类功能添加到用户定义的运行时属性中

编辑 以下是我为UIView提供的完整扩展代码,它适用于除border alpha之外的所有内容

import UIKit

@IBDesignable extension UIView {

@IBInspectable var borderColor: UIColor? {
    set {
        layer.borderColor = newValue!.cgColor
    }
    get {
        if let color = self.layer.borderColor {
            return UIColor(cgColor: color)
        } else {
            return nil
        }
    }
}

@IBInspectable var borderAlpha: CGFloat {
    set {
        let borderCGColor = layer.borderColor
        var color = UIColor(cgColor: borderCGColor!)

        if (newValue < 0) {
            color = color.withAlphaComponent(0)
            layer.borderColor = color.cgColor
        } else if (newValue > 1) {
            color = color.withAlphaComponent(1)
            layer.borderColor = color.cgColor
        } else {
            color = color.withAlphaComponent(newValue)
            layer.borderColor = color.cgColor
        }
    }
    get {
        return layer.borderColor!.alpha
    }
}

@IBInspectable var borderWidth: CGFloat {
    set {
        layer.borderWidth = newValue
    }
    get {
        return layer.borderWidth
    }
}

@IBInspectable var cornerRadius: CGFloat {
    set {
        layer.cornerRadius = newValue
        clipsToBounds = newValue > 0
    }
    get {
        return layer.cornerRadius
    }
}

@IBInspectable var shadowColor: UIColor? {
    set {
        layer.shadowColor = newValue!.cgColor
    }
    get {
        if let color = self.layer.shadowColor {
            return UIColor(cgColor: color)
        } else {
            return nil
        }
    }
}

@IBInspectable var shadowOffset: CGSize {
    set {
        layer.shadowOffset = newValue
    }
    get {
        return layer.shadowOffset
    }
}

@IBInspectable var shadowRadius: CGFloat {
    set {
        layer.shadowRadius = newValue
    }
    get {
        return layer.shadowRadius
    }
}

@IBInspectable var shadowOpacity: Float {
    set {
        if (newValue < 0) {
            layer.shadowOpacity = 0
        } else if (newValue > 1) {
            layer.shadowOpacity = 1
        } else {
            layer.shadowOpacity = newValue
        }
    }
    get {
        return layer.shadowOpacity
    }
}
}
导入UIKit
@IBD可设计扩展UIView{
@IBInspectable var borderColor:UIColor{
设置{
layer.borderColor=newValue!.cgColor
}
得到{
如果让颜色=self.layer.borderColor{
返回UIColor(cgColor:color)
}否则{
归零
}
}
}
@IBInspectable var borderAlpha:CGFloat{
设置{
让borderCGColor=layer.borderColor
var color=UIColor(cgColor:borderCGColor!)
如果(新值<0){
颜色=颜色。带字母组件(0)
layer.borderColor=color.cgColor
}否则如果(新值>1){
颜色=颜色。带字母组件(1)
layer.borderColor=color.cgColor
}否则{
颜色=颜色。带AlphaComponent(新值)
layer.borderColor=color.cgColor
}
}
得到{
返回图层。边框颜色!.alpha
}
}
@IBInspectable var borderWidth:CGFloat{
设置{
layer.borderWidth=newValue
}
得到{
返回层。边界宽度
}
}
@i可检测的var角半径:CGFloat{
设置{
layer.cornerRadius=新值
clipsToBounds=newValue>0
}
得到{
返回层半径
}
}
@IBInspectable var shadowColor:UIColor{
设置{
layer.shadowColor=newValue!.cgColor
}
得到{
如果let color=self.layer.shadowColor{
返回UIColor(cgColor:color)
}否则{
归零
}
}
}
@IBInspectable var shadowOffset:CGSize{
设置{
layer.shadowOffset=newValue
}
得到{
返回层阴影偏移
}
}
@IBInspectable var shadowRadius:CGFloat{
设置{
layer.shadowRadius=newValue
}
得到{
返回层阴影半径
}
}
@IBInspectable var shadowOpacity:浮点{
设置{
如果(新值<0){
layer.shadowOpacity=0
}否则如果(新值>1){
layer.shadowOpacity=1
}否则{
layer.shadowOpacity=newValue
}
}
得到{
返回图层阴影不透明度
}
}
}

我的第一个想法是,您的
borderColor
borderAlpha
可能存在一个基本的不确定性,即首先评估哪个。关于这一点没有任何已知或保证,因此如果设置了
borderAlpha
,然后
borderColor
borderAlpha
将不会被神奇地重新计算。实际上,这里的相互依赖引入了一种不确定性,这可能解释了我们经验的差异。因此,将alpha设置为颜色的一部分可能更好

我们可以猜测这可能是对的,因为您的
borderAlpha
对我来说很好:

我们可以猜测,既然它对你不起作用,那么这种差异仅仅是偶然的;我很幸运,我的
borderAlpha
显然是在我的
borderColor
之后进行评估的,但我们大概不能指望这一点

顺便说一句,我让你的阴影属性也起作用了:

你肯定已经注意到他们没有工作了吧?这是因为这一行:

clipsToBounds = newValue > 0
同样,这可以在任何时候出现,并将
clipstobunds
设置为
false
,从而切断阴影。(或者可能他们为您工作,这只是一个幸运的问题,因为事情的评估顺序;这里的相互依赖性是,
clipstobunds
corneradius
中设置,但会影响阴影


简而言之,我认为我们在这里学到的是,需要保持这些属性相互正交(独立).

没有一个关键路径可以工作,因为您忘记在关键路径中包含
。类似地,视图没有角半径、边框颜色、边框宽度或边框alpha;要将其中任何一个作为可检查项写入,您需要为每个关键路径设置一个setter,以便与视图的
对话。哦,我实际上已经获得了所有这些我在工作,对不起,我