自定制按鈕

自定制按鈕

第一種:視頻清晰度切換器

  • 目的就是做一個(gè)能根據(jù)獲得的清晰度個(gè)數(shù)封裝的一個(gè)切換按鈕.

講解:

第一點(diǎn):定義一個(gè)items數(shù)組,通過(guò)外部傳入的視頻個(gè)數(shù),創(chuàng)建對(duì)應(yīng)的按鈕,給每一個(gè)按鈕添加對(duì)應(yīng)的時(shí)間,每個(gè)按鈕都有tag值,每個(gè)按鈕的方法需要對(duì)應(yīng)的按鈕參數(shù).用來(lái)實(shí)現(xiàn)按鈕選中狀態(tài)的切換

var items:[String]? = nil {
        didSet {
            for i in 0...items!.count-1 {
                let button = UIButton()
                button.frame = CGRectMake(0, CGFloat(i)*segementHeaderHeight, self.frame.width-10, self.segementHeaderHeight)
                self.bottomView.addSubview(button)
                button.setTitle(items![i], forState: .Normal)
                button.addTarget(self, action: "buttonAction:", forControlEvents: .TouchDown)
                button.titleLabel?.font = UIFont.systemFontOfSize(14)
                button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
                //設(shè)置tag值
                button.backgroundColor = UIColor.RGBColor(40, G: 45, B: 45, A: 0.8)
                button.tag = i+100
                if i == 0 {
                    button.setTitleColor(backYellowColor, forState: .Normal)
                    selectedIndex = button.tag
                }
            }
        }
    }

第二點(diǎn):通過(guò)協(xié)議通知外部按鈕狀態(tài)的改變,協(xié)議我這里只傳出了一個(gè)參數(shù),那就是哪一個(gè)按鈕被選中了.外部的控制器通過(guò)這個(gè)值做出對(duì)應(yīng)的改變

protocol changePlayViewDelegate {
    func changePlay(selectedIndex:Int)
}
// 按鈕的點(diǎn)擊方法
func buttonAction(button:UIButton) {
//        print(button.tag)
//        print("點(diǎn)擊")
        let tButton = self.bottomView.viewWithTag(selectedIndex) as! UIButton
        tButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        button.setTitleColor(backYellowColor, forState: .Normal)
        self.selectedIndex = button.tag
        apper = true
        let title = button.titleLabel?.text
        self.topButton.setTitle(title, forState: .Normal)
        // 傳出不同的按鈕值
        self.delegate?.changePlay(self.selectedIndex-99)
    }
    // 外部通過(guò)不同的值做出對(duì)應(yīng)的改變

圖片展示

屏幕快照 2016-11-07 下午7.19.11.png

詳細(xì)代碼

import UIKit

protocol changePlayViewDelegate {
    func changePlay(selectedIndex:Int)
}

class ChangButton: UIView {
    var delegate:changePlayViewDelegate? = nil
    
    var segementHeaderHeight:CGFloat = 25
    
    var selectedIndex = -1
    
    var topLeftView = UIView()
    let imageView = UIImageView.init(image: UIImage.init(named: "rotation"))
    
    var items:[String]? = nil {
        didSet {
            for i in 0...items!.count-1 {
                let button = UIButton()
                button.frame = CGRectMake(0, CGFloat(i)*segementHeaderHeight, self.frame.width-10, self.segementHeaderHeight)
                self.bottomView.addSubview(button)
                button.setTitle(items![i], forState: .Normal)
                button.addTarget(self, action: "buttonAction:", forControlEvents: .TouchDown)
                button.titleLabel?.font = UIFont.systemFontOfSize(14)
                button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
                //設(shè)置tag值
                button.backgroundColor = UIColor.RGBColor(40, G: 45, B: 45, A: 0.8)
                button.tag = i+100
                if i == 0 {
                    button.setTitleColor(backYellowColor, forState: .Normal)
                    selectedIndex = button.tag
                }
            }
        }
    }
    let topButton = UIButton.init()
    let bottomView = UIView()
    
    // 1.出現(xiàn)屬性
    
    var apper = true {
        didSet {
            self.bottomView.hidden = apper
            if apper == false {
                imageView.frame = CGRectMake(0,self.segementHeaderHeight/2-8, 7, 7)
                self.imageView.transform = CGAffineTransformMakeRotation(0)
            }
            else {
                imageView.frame = CGRectMake(0,self.segementHeaderHeight/2, 7, 7)
                self.imageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
            }
        }
    }
    // 2.toptitle
    var topTitle = "高清" 
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        self.addSubview(topLeftView)
        self.topLeftView.backgroundColor = UIColor.RGBColor(40, G: 45, B: 45, A: 0.8)
        self.topLeftView.addSubview(imageView)
        
        self.addSubview(topButton)
        self.topButton.titleLabel?.font = UIFont.systemFontOfSize(14)
        self.topButton.backgroundColor = UIColor.RGBColor(40, G: 45, B: 45, A: 0.8)
        topButton.addTarget(self, action: "topAction", forControlEvents: .TouchDown)
        self.topButton.setTitle(topTitle, forState: .Normal)
        self.addSubview(bottomView)
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        let leftX:CGFloat = self.frame.size.width-10
        let leftY:CGFloat = 0
        let leftH:CGFloat = self.segementHeaderHeight
        let leftW:CGFloat = 10
        self.topLeftView.frame = CGRectMake(leftX, leftY, leftW, leftH)
        imageView.frame = CGRectMake(0,leftH/2, 8, 8)
        self.imageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
        
        
        let topX:CGFloat = 0
        let topY:CGFloat = 0
        let topW = self.frame.size.width-10
        let topH = self.segementHeaderHeight
        self.topButton.frame = CGRectMake(topX, topY, topW, topH)
        
        let bmX:CGFloat = 0
        let bmY = topH
        let bmW = self.frame.size.width-10
        self.bottomView.frame = CGRectMake(bmX, bmY, bmW, CGFloat(self.items!.count)*self.segementHeaderHeight)
        self.bottomView.backgroundColor = UIColor.grayColor()
        self.bottomView.hidden = true
       
    }
}

extension ChangButton {
    func buttonAction(button:UIButton) {
//        print(button.tag)
//        print("點(diǎn)擊")
        let tButton = self.bottomView.viewWithTag(selectedIndex) as! UIButton
        tButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        button.setTitleColor(backYellowColor, forState: .Normal)
        self.selectedIndex = button.tag
        apper = true
        let title = button.titleLabel?.text
        self.topButton.setTitle(title, forState: .Normal)
        self.delegate?.changePlay(self.selectedIndex-99)
    }
    func topAction(){
        if apper {
            apper = false
        }
        else {
            apper = true
        }
    }
}

第二種:分段選擇器

講解

第一點(diǎn):定義當(dāng)前被選中按鈕的下標(biāo),外部通過(guò)識(shí)別不同的下標(biāo)來(lái)改變不同的控制器或者View,我在這里采用了willSet來(lái)監(jiān)測(cè)上一個(gè)選中的按鈕,當(dāng)發(fā)生切換時(shí)候,先將原來(lái)的按鈕變成非選中狀態(tài),并別將字體變小,顏色變成需求的顏色.采用didSet將下方滑條做一個(gè)形變.

var selectedSegmentIndex = 0 {
        willSet {
            // 1.先將原來(lái)選中的按鈕變成非選中狀態(tài)
            let btn1 = self.viewWithTag(BtnTag + selectedSegmentIndex) as! UIButton
            btn1.selected = false
            btn1.titleLabel?.font = self.normalFont
            
            let btn2 = self.viewWithTag(BtnTag + newValue) as! UIButton
            btn2.selected = true
            btn2.titleLabel?.font = self.selectedFont
            
        }
        didSet {
            UIView.animateWithDuration(0.2) {
                
                self.slider.frame.origin.x = CGFloat(self.selectedSegmentIndex) * self.slider.frame.size.width
            }
        }
    }


第二點(diǎn):

外部使用的時(shí)候采用的方法,通過(guò)不同的SelectedSegmentIndex來(lái)改變scrollview的便宜量,和通過(guò)ScrollView的偏移量來(lái)改變segment的selectedSegmentIndex,在協(xié)議上我自己做了一個(gè)區(qū)別

 //停止?jié)L動(dòng)
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        if scrollView == self.scrollView {
            self.segment.selectedSegmentIndex = Int(scrollView.contentOffset.x/Screen_W)
        }
        
    }
    //MARK: - segment點(diǎn)擊方法
    func segmentAction(segment:ZHSegmentControl) {
        self.scrollView.contentOffset = CGPointMake(Screen_W * CGFloat(segment.selectedSegmentIndex), 0)
    }

圖片展示

Simulator Screen Shot 2016年11月7日 下午8.55.34.png

Simulator Screen Shot 2016年11月7日 下午8.55.33.png

Simulator Screen Shot 2016年11月7日 下午8.55.32.png

詳情

import UIKit
let BtnTag = 100

class ZHSegmentControl: UIView {

    //MARK: - 屬性
    ///1.當(dāng)前被選中的按鈕的下標(biāo)
    var selectedSegmentIndex = 0 {
        willSet {
            // 1.先將原來(lái)選中的按鈕變成非選中狀態(tài)
            let btn1 = self.viewWithTag(BtnTag + selectedSegmentIndex) as! UIButton
            btn1.selected = false
            btn1.titleLabel?.font = self.normalFont
            
            let btn2 = self.viewWithTag(BtnTag + newValue) as! UIButton
            btn2.selected = true
            btn2.titleLabel?.font = self.selectedFont
            
        }
        didSet {
            UIView.animateWithDuration(0.2) {
                
                self.slider.frame.origin.x = CGFloat(self.selectedSegmentIndex) * self.slider.frame.size.width
            }
        }
    }
    ///2.文字選中的顏色
    var titleSelectedColor = UIColor.blueColor(){
        
        didSet{
            
            //更新滑塊的背景顏色
            self.slider.backgroundColor = self.sliderColor
            
            for item in self.subviews {
                
                if item.tag >= BtnTag {
                    let btn = item as! UIButton
                    //改變按鈕的文字顏色
                    btn.setTitleColor(self.titleSelectedColor, forState: .Selected)
                }
            }
            
        }
    }
    
    ///3.文字顏色
    var titleColor = UIColor.blackColor(){
        
        //每次從外部給titleColor屬性賦值的時(shí)候,都需要用最新的titleColor的值去更新按鈕的文字顏色
        didSet{
            
            for item in self.subviews {
                if item.tag >= BtnTag {
                    let btn = item as! UIButton
                    //改變按鈕的文字顏色
                    btn.setTitleColor(self.titleColor, forState: .Normal)
                }
            }
            
        }
    }

    ///4.items
    private var items:[String]
    ///5.滑塊
    private var slider = UIView()
    
    ///6.保存target
    private var target: AnyObject? = nil
    ///7.保存action
    private var action: Selector? = nil
    ///8.選中的字體
    var selectedFont = UIFont.boldSystemFontOfSize(14)
    ///9.非選中的字體
    var normalFont = UIFont.systemFontOfSize(13)
    ///10.滑塊的顏色
    var sliderColor = UIColor.whiteColor()
    ///11.滑塊的高度
    var sliderHeight:CGFloat = 2
    ///12.分界線
    let lineView1 = UIView()
    let lineView2 = UIView()
    
    init(items:[String]) {
        self.items = items
        super.init(frame: CGRectZero)
        self.creatSubView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

extension ZHSegmentControl {
    
    func addTarget(target: AnyObject?,action: Selector?) {
        self.target = target
        self.action = action
    }
}

extension ZHSegmentControl {
    func creatSubView() {
        for (i,item) in self.items.enumerate() {
            let btn = UIButton.init()
            btn.setTitle(item, forState: .Normal)
            btn.tag = BtnTag + i
            btn.setTitleColor(self.titleColor, forState: .Normal)
            btn.setTitleColor(self.titleSelectedColor, forState: .Selected)
            if i == 0 {
                btn.selected = true
            }
            btn.addTarget(self, action: "btnAction:", forControlEvents: .TouchDown)
            self.addSubview(btn)
        }
        self.slider.backgroundColor = self.titleSelectedColor
        self.addSubview(self.slider)
        self.addSubview(lineView1)
        self.addSubview(lineView2)
    }
}

extension ZHSegmentControl {
    func btnAction(btn:UIButton) {
        if self.selectedSegmentIndex != btn.tag - BtnTag {
            self.selectedSegmentIndex = btn.tag - BtnTag
            
            if self.target != nil {
                self.target?.performSelector(self.action!, withObject: self)
            }
        }
    }
}

extension ZHSegmentControl {
    override func layoutSubviews() {
        super.layoutSubviews()
        let segementW = self.frame.size.width
        let segementH = self.frame.size.height
        let btnW = segementW/CGFloat(self.items.count)
        let btnH = segementH
        let btnY:CGFloat = 0
        var i:CGFloat = 0
        for item in self.subviews {
            if item.tag >= BtnTag {
                let btn = item as! UIButton
                let btnX = i * btnW
                item.frame = CGRectMake(btnX, btnY, btnW, btnH)
                if btn.selected {
                    btn.titleLabel?.font = self.selectedFont
                }
                else {
                    btn.titleLabel?.font = self.normalFont
                }
                i += 1
            }
        }
        
        let sliderX = CGFloat(self.selectedSegmentIndex) * btnW
        let sliderH:CGFloat = self.sliderHeight
        let sliderY = segementH - sliderH
        let sliderW = btnW
        self.slider.frame = CGRectMake(sliderX, sliderY, sliderW, sliderH)
        self.slider.backgroundColor = self.sliderColor
        
        // 分界線
        self.lineView1.frame = CGRectMake(0, 0, Screen_W, 1)
        self.lineView2.frame = CGRectMake(0, segementH - 1, Screen_W, 1)
        self.lineView1.backgroundColor = UIColor.RGBColor(248, G: 158, B: 49, A: 0.3)
        self.lineView2.backgroundColor = UIColor.RGBColor(248, G: 158, B: 49, A: 0.3)
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,381評(píng)論 25 708
  • 第七期自控力開(kāi)始已經(jīng)三周了,不管冥想也好,運(yùn)動(dòng)也罷都提出了做一個(gè)小結(jié)的功課,其實(shí)也在鍛煉我們的輸出,寫(xiě)作的能力。 ...
    宇文東林閱讀 261評(píng)論 2 2
  • 關(guān)于汽車的自動(dòng)駕駛,美國(guó)國(guó)家公路交通安全管理局將其分為了5個(gè)級(jí)別,0-4級(jí)。簡(jiǎn)單點(diǎn)理解,即0級(jí)是完全人類自己駕駛;...
    夜半鳴閱讀 147評(píng)論 0 0
  • 基礎(chǔ) 設(shè)置 獲取cookie 刪除cookie eval的使用(可以運(yùn)行字符串內(nèi)容)
    yaya_pangdun閱讀 245評(píng)論 0 0