【发布时间】:2017-07-26 17:01:45
【问题描述】:
我有一个两部分的问题。首先,我想添加边框颜色 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
}
}
我确实在用户定义的运行时属性中得到了这个,但它不会生效。
我的猜测是因为所有用户定义的运行时属性都是在使用的实际函数之后调用的,而我的不是真正的函数,更多的是自定义函数来获得我想要的。 我也知道您可以使用颜色选择器选择 alpha,但对于我正在做的事情,如果它们是分开的会很好。
最后,作为第二个问题,在增加或减少值的箭头上,它会跳 1,但在 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
}
}
}
【问题讨论】:
-
您的密钥路径都不起作用,因为您忘记在密钥路径中包含
layer。类似地,视图没有圆角半径、边框颜色、边框宽度或边框 alpha;要将这些中的任何一个编写为可检查的,您需要为 它们中的每一个设置一个设置器,以便与视图的layer交谈。 -
哦,我实际上已经完成了所有这些工作。抱歉,我现在将包含完整代码。
标签: swift3 alpha uicolor xcode8.2 cgcolor