gpt4 book ai didi

ios - 自定义 UIButton isSelected 背景颜色未按预期工作(IOS/Swift)

转载 作者:搜寻专家 更新时间:2023-11-01 06:13:47 24 4
gpt4 key购买 nike

我有一个自定义的 UIButton 类,但此代码未按预期工作:

    override var isSelected: Bool {
didSet {
backgroundColor = isSelected ? UIColor.blue : UIColor.white
}
}

当我在代码中设置 isSelected 时,背景没有改变...它保持白色。不过,我知道实际的 bool 值 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 的文档后, isHighlightedsetNeedsDisplay()我的理解是,切换突出显示的值后,它会自动调用 UIControl 的更新/重绘过程。对于 isSelected 切换,不能保证所有控件都如此。我认为 UIButton 就是其中之一。

更新的解决方案:我错过的一件事是,每当你点击你的按钮值 isHighlighted 更改为 true 并且当点击结束时更改回 false。因此,在您的情况下,只要点击结束,它就会变回 backgroundcolor = UIColor.white。对于修复,我优先考虑 highLighted bool,然后优先考虑 isSelected bool 以设置背景颜色。请检查下面的代码

override var isHighlighted: Bool {
didSet {
backgroundColor = isHighlighted ? highlightColor : (isSelected ? UIColor.blue : UIColor.white)
}
}

override var isSelected: Bool {
didSet {
backgroundColor = isSelected ? UIColor.blue : UIColor.white
setNeedsDisplay()
}
}

无效:

    override var isSelected: Bool {
didSet {
backgroundColor = isSelected ? UIColor.blue : UIColor.white
setNeedsDisplay()
}
}

关于ios - 自定义 UIButton isSelected 背景颜色未按预期工作(IOS/Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com