【发布时间】:2018-04-10 04:33:00
【问题描述】:
我有一个自定义的 UIButton 类,其中此代码无法按预期工作:
override var isSelected: Bool {
didSet {
backgroundColor = isSelected ? UIColor.blue : UIColor.white
}
}
当我在代码中设置isSelected 时,背景不会改变......它保持白色。不过,我知道实际的布尔值 isSelected true/false 实际上是正确切换的。
didSet 中的代码正在执行(我已通过打印调试验证),但不知何故没有设置背景。
有趣的是,我还以完全相同的方式覆盖了isHighlighted 方法,效果很好。
这是自定义按钮类的完整代码。 随意将其剪切/粘贴到您的 XCODE 中并使用它:
import UIKit
@IBDesignable
class PlusMinusButton: UIButton {
@IBInspectable
var highlightColor: UIColor = .yellow { didSet { setNeedsDisplay() } }
@IBInspectable
var fillColor: UIColor = .yellow { didSet { setNeedsDisplay() } }
@IBInspectable
var strokeColor: UIColor = .yellow { didSet { setNeedsDisplay() } }
@IBInspectable
var plusOrMinus: Bool = true { didSet { setNeedsDisplay() } }
func getPath() -> UIBezierPath {
let G = bounds.width / 5
let path = UIBezierPath()
switch plusOrMinus {
case true:
let startPoint = CGPoint(x:2*G,y:G)
path.move(to: startPoint)
path.addLine(to: CGPoint(x:2*G,y:2*G))
path.addLine(to: CGPoint(x:G,y:2*G))
path.addLine(to: CGPoint(x:G,y:3*G))
path.addLine(to: CGPoint(x:2*G,y:3*G))
path.addLine(to: CGPoint(x:2*G,y:4*G))
path.addLine(to: CGPoint(x:3*G,y:4*G))
path.addLine(to: CGPoint(x:3*G,y:3*G))
path.addLine(to: CGPoint(x:4*G,y:3*G))
path.addLine(to: CGPoint(x:4*G,y:2*G))
path.addLine(to: CGPoint(x:3*G,y:2*G))
path.addLine(to: CGPoint(x:3*G,y:G))
path.addLine(to: startPoint)
case false:
let startPoint = CGPoint(x:G,y:3*G)
path.move(to: startPoint)
path.addLine(to: CGPoint(x:4*G,y:3*G))
path.addLine(to: CGPoint(x:4*G,y:2*G))
path.addLine(to: CGPoint(x:G,y:2*G))
path.addLine(to: startPoint)
}
path.close()
return path
}
// see how is method is exactly the same as the next? weird, huh?
override var isHighlighted: Bool {
didSet {
backgroundColor = isHighlighted ? highlightColor : UIColor.white
}
}
override var isSelected: Bool {
didSet {
print("This line of code is executed!!")
backgroundColor = isSelected ? UIColor.blue : UIColor.white
}
}
override func draw(_ rect: CGRect) {
let path = getPath()
fillColor.setFill()
path.fill()
strokeColor.setStroke()
path.stroke()
}
}
感谢您的帮助!我敢打赌这真的很愚蠢!默普! :B
【问题讨论】:
-
提供您选择的设置代码。就像在您的视图或控制器中一样
-
感谢您抽出宝贵时间,但这不是必需的,因为“我知道实际的布尔值 .isSelected true/false 实际上是正确切换的。didSet 中的代码正在执行(我已通过打印调试验证),但不知何故没有设置背景。”
-
可以尝试在 willSet 方法中设置背景颜色吗?
标签: ios swift background uibutton