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

时间:2017-03-06 17:42:13

标签: swift3 alpha uicolor xcode8.2 cgcolor

我有两个问题。首先,我想将边框颜色alpha添加为自定义属性,如此图所示。

enter image description here

但我注意到的第一件事是设置边框颜色必须使用CGColor而不是UIColorCGColor.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
    }
}

我确实在用户定义的运行时属性中得到了这个,但它并没有生效。

enter image description here

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

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

修改 这是我对UIView的完整扩展代码,它适用于除边界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
    }
}
}

1 个答案:

答案 0 :(得分:0)

我的第一个想法是,对于borderColorborderAlpha关于的问题可能会有一个根本的不确定因素。没有任何已知或保证的事情。这样,如果发生borderAlpha设置然后borderColor,则borderAlpha将不会被神奇地重新评估。实际上,这里的相互依赖引入了一种不确定性,这可能解释了我们经验的差异。因此,将alpha设置为颜色的一部分可能会更好。

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

enter image description here

我们可以猜测,因为它不适合你,这种差异仅仅是机会;我很幸运,我的borderAlpha显然已在borderColor之后进行了评估,但我们可能不会指望这一点。

顺便说一下,我的阴影属性也可以正常工作:

enter image description here

你一定注意到他们没有工作,当然?那是因为这一行:

clipsToBounds = newValue > 0

同样,这可以随时出现并将clipsToBounds设置为false,从而切断阴影。 (或者也许他们 为你工作,而这只是关于评估事物的顺序的运气问题;这里的相互依赖是clipsToBounds在{ {1}}但会影响阴影。

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