我有一个两部分的问题。首先,我想添加边框颜色 alpha 作为自定义属性,如图所示。
但我注意到的第一件事是,要设置边框颜色CGColor
,必须使用 a 而不是 anUIColor
并且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
}
}
我确实在用户定义的运行时属性中得到了这个,但它不会生效。
我的猜测是因为所有用户定义的运行时属性都是在使用的实际函数之后调用的,而我的不是真正的函数,更多的是自定义函数来获得我想要的。我也知道您可以使用颜色选择器选择 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
}
}
}