我试图去为这种风格的按钮:按下时反转按钮的颜色?
这是我到目前为止有:
不过,我不确定如何获得按下按钮时正确的颜色,如示例中的中间按钮。我已经设法使图像的颜色变成白色使用:
button.setImage(UIImage("Image_White_Version"), for: .highlighted)
但我不知道如何用颜色填充按钮的其余部分。任何人都可以帮助我吗?
我试图去为这种风格的按钮:按下时反转按钮的颜色?
这是我到目前为止有:
不过,我不确定如何获得按下按钮时正确的颜色,如示例中的中间按钮。我已经设法使图像的颜色变成白色使用:
button.setImage(UIImage("Image_White_Version"), for: .highlighted)
但我不知道如何用颜色填充按钮的其余部分。任何人都可以帮助我吗?
您可以设置一个UIButton的背景图像像这样的特定状态:
let image = UIImage.imageWithColor(someColor, size: CGSize(width: 1.0, height: 1.0))
btn.setBackgroundImage(image, for: .highlighted)
下面是从色生成图像的功能(穿上UIImage的扩展中):
extension UIImage {
class func imageWithColor(_ color: UIColor, size: CGSize) -> UIImage {
let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
UIGraphicsBeginImageContext(rect.size)
let context = UIGraphicsGetCurrentContext()
context!.setFillColor(color.cgColor)
context!.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
尝试使用下一个方法:
这是快速的方式如何实现这一目标。主要想法使用按钮背景颜色和图像色调颜色。但更好的方法是在UIControl基础上准备新的自定义控件。如果它不会被启用,我会为你做好准备。
var BgColorNormalIdentifier = "BackgroundColorNormal"
var BgColorHighlightedIdentifier = "BackgroundColorHighlighted"
var ImgColorNormalIdentifier = "ImageColorNormal"
var ImgColorHighlightedIdentifier = "ImageColorHighlighted"
public extension UIButton
{
public func backgroundColorForStates(normal: UIColor, highlighted: UIColor)
{
backgroundColor = normal
addTarget(self, action:#selector(UIButton.buttonTouchUpInside(_:)), for:.touchUpInside)
addTarget(self, action:#selector(UIButton.buttonTouchUpOutside(_:)), for:.touchUpOutside)
addTarget(self, action:#selector(UIButton.buttonTouchDown(_:)), for:.touchDown)
addTarget(self, action:#selector(UIButton.buttonTouchCancel(_:)), for:.touchCancel)
objc_setAssociatedObject(self, &BgColorNormalIdentifier, normal, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_setAssociatedObject(self, &BgColorHighlightedIdentifier, highlighted, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_setAssociatedObject(self, &ImgColorNormalIdentifier, highlighted, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_setAssociatedObject(self, &ImgColorHighlightedIdentifier, normal, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
public func imageForState (image: UIImage?, for state: UIControlState) {
self.setImage(image?.withRenderingMode(.alwaysTemplate), for: state)
}
public func normalBackgroundColor() -> UIColor?
{
return objc_getAssociatedObject(self, &BgColorNormalIdentifier) as? UIColor
}
public func highlightedBackgroundColor() -> UIColor?
{
return objc_getAssociatedObject(self, &BgColorHighlightedIdentifier) as? UIColor
}
public func normalImageColor() -> UIColor?
{
return objc_getAssociatedObject(self, &ImgColorNormalIdentifier) as? UIColor
}
public func highlightedImageColor() -> UIColor?
{
return objc_getAssociatedObject(self, &ImgColorHighlightedIdentifier) as? UIColor
}
func buttonTouchUpInside(_ sender: UIButton)
{
sender.backgroundColor = normalBackgroundColor()
sender.tintColor = normalImageColor()
}
func buttonTouchUpOutside(_ sender: UIButton)
{
sender.backgroundColor = normalBackgroundColor()
sender.tintColor = normalImageColor()
}
func buttonTouchDown(_ sender: UIButton)
{
sender.backgroundColor = highlightedBackgroundColor()
sender.tintColor = highlightedBackgroundColor()
}
func buttonTouchCancel(_ sender: UIButton)
{
sender.backgroundColor = normalBackgroundColor()
sender.tintColor = normalImageColor()
}
}
你的帖子中有一些代码不在代码格式块 – KaraBenNemsi
是的(试图解决这个问题( – ObranS
那么,你也必须改变''突出''状态的'backgroundImage'。 – Sulthan