1. 程式人生 > >Ios開發Swift自定義UIbutton增加一個能設定高亮狀態下背景顏色的方法

Ios開發Swift自定義UIbutton增加一個能設定高亮狀態下背景顏色的方法

UIButton中沒有setBackgroundColor(color UIColor state:UIControlState)的方法,因此自己寫一個

///
//  <span style="font-family: Arial, Helvetica, sans-serif;">JoopicButton</span><span style="font-family: Arial, Helvetica, sans-serif;">.swift</span>
//  
//
//  Created by lax li on 16/1/12.
//  Copyright © 2016年 . All rights reserved.
//

import Foundation

class JoopicButton:UIButton{
    
    var _colors:NSMutableDictionary = NSMutableDictionary()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.whiteColor()
        _colors.setValue(UIColor.whiteColor(), forKey: self.keyForState(UIControlState.Normal))
    }
    
//    init(){
//        super.init(frame: CGRectZero)
//    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)!
    }

    
    override var highlighted: Bool {
        
        get {
            return super.highlighted
        }
        set {
            super.highlighted = newValue
            let obj = _colors.valueForKey(self.keyForState(UIControlState.Highlighted))
            let highlightedColor:UIColor? = (obj as? UIColor)
            if(newValue && (highlightedColor != nil)){
                super.backgroundColor = highlightedColor
            }else{
                let selectObj = _colors.valueForKey(self.keyForState(UIControlState.Selected))
                if(self.selected && (selectObj != nil)){
                    let selectedColor:UIColor? = selectObj as? UIColor
                    super.backgroundColor = selectedColor
                }else{
                    var normalColor:UIColor? = _colors.valueForKey(self.keyForState(UIControlState.Normal)) as? UIColor
                    if(normalColor == nil){
                        normalColor = UIColor(CGColor: self.layer.backgroundColor!)
                    }
                    super.backgroundColor = normalColor
                }
            }
        }

    }
    
    override var selected: Bool {
        
        get {
            return super.selected
        }
        set {
            super.selected = newValue
            
            let selectedColor:UIColor? = _colors.valueForKey(self.keyForState(UIControlState.Selected)) as? UIColor
            if(newValue && (selectedColor != nil)){
                super.backgroundColor = selectedColor
            }else{
                var normalColor:UIColor? = _colors.valueForKey(self.keyForState(UIControlState.Normal)) as? UIColor
                if(normalColor == nil){
                    normalColor = UIColor(CGColor: self.layer.backgroundColor!)
                }
                super.backgroundColor = normalColor
            }
        }

    }
    
    override var backgroundColor:UIColor? {

        get {
            return super.backgroundColor
        }
        set {
            super.backgroundColor = newValue
            _colors .setValue(newValue, forKey: self.keyForState(UIControlState.Normal))
        }
        
    }
    
    func backgroundColorForState(state: UIControlState) -> UIColor? {
        return _colors.valueForKey(self.keyForState(state)) as? UIColor
    }
    
    func setBackgroundColorForState(color:UIColor,state:UIControlState){
        if(state == UIControlState.Normal){
            super.backgroundColor = color
        }
        _colors .setValue(color, forKey: self.keyForState(state))
    }
    
    func keyForState(state:UIControlState) ->String{
        let str = NSString(string: "state_\(state.rawValue)")
        return str as String
    }
    
    
}


在oc中的使用

        JoopicButton *cancelButton = [[JoopicButton alloc] initWithFrame:CGRectMake(10,CGRectGetHeight(_tableview.frame)+8, ScreenWidth-20, JoopicActionSheetItemHeight)];
        cancelButton.layer.cornerRadius =15;
 
        //cancelButton.layer.backgroundColor = [UIColor greenColor].CGColor;
        
        //cancelButton.backgroundColor = [UIColor greenColor];
        //[cancelButton setBackgroundColorForState:[UIColor greenColor] state:UIControlStateNormal];
        [cancelButton setBackgroundColorForState:[UIColor grayColor] state:UIControlStateHighlighted];