2017-05-24 268 views
0

我试图去为这种风格的按钮:按下时反转按钮的颜色?

enter image description here

这是我到目前为止有:

otherbuttons

不过,我不确定如何获得按下按钮时正确的颜色,如示例中的中间按钮。我已经设法使图像的颜色变成白色使用:

button.setImage(UIImage("Image_White_Version"), for: .highlighted) 

但我不知道如何用颜色填充按钮的其余部分。任何人都可以帮助我吗?

+0

那么,你也必须改变''突出''状态的'backgroundImage'。 – Sulthan

回答

1

您可以设置一个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! 
    } 
} 
+0

您也可以使用'UIControl'而不是'UIButton',只需突出显示图像和'backgroundColor'的'tint'。 – Sulthan

+0

'输入'UIImage'没有会员'imageWithColor'' – MarksCode

+0

不,你必须在我的回答中添加我张贴的扩展名。 – bughana

0

尝试使用下一个方法:

这是快速的方式如何实现这一目标。主要想法使用按钮背景颜色和图像色调颜色。但更好的方法是在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() 
     } 
    } 
+0

你的帖子中有一些代码不在代码格式块 – KaraBenNemsi

+0

是的(试图解决这个问题( – ObranS