2017-05-24 263 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