自定義控件的三種封裝方法

slider控件

自定義滑動條.png

第一種方法

自定義類 ,讓類繼承 UIControl 繼承 UIControl的類都有addTarget事件

class Slider: UIControl {

    var minvalue:CGFloat = 0
    var maxvalue:CGFloat = 1
    var data:((currentloaction:CGFloat)->Void)!
    private var p :CGFloat = 0
   //做安全控制
    var current:CGFloat {
        set{
            if newValue < 0 {
                p = 0
            }
            else if newValue > 1{
                p = 1
            }
            else{
                p = newValue
            }
         self.setNeedsLayout()
        }
        
        get{
            return p
        }
//        didSet{
            //sendActionsForControlEvents(.ValueChanged) //發(fā)送與事件相關(guān)的所有動作
//        self.setNeedsLayout() //當(dāng)值發(fā)生改變時 讓系統(tǒng)自動調(diào)用layout重新布局
//        }
    }
    
    var travkView = UIView()
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        self.backgroundColor = UIColor.blueColor()
        travkView.backgroundColor = UIColor.brownColor()
        self.addSubview(travkView)
    }
    
    func touch(touches:NSSet){
        
        let touch = touches.anyObject() as! UITouch
        let location = touch.locationInView(travkView)
        current = (location.x/self.frame.width)*(maxvalue - minvalue)+minvalue
    }
    
    //觸摸點(diǎn)
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
           touch(touches)
    }
    
    //一段時間
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        touch(touches)
        
    }
    
    //結(jié)束
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        //響應(yīng)第一種方法
        sendActionsForControlEvents(.ValueChanged)
    }
    
    //當(dāng)子視圖發(fā)生變化時 系統(tǒng)會自動調(diào)用
    override func layoutSubviews() {
        travkView.frame = CGRect(x: 0, y: 0, width: self.frame.width*current/(maxvalue-minvalue), height: self.frame.height)
    }
    
    //用Storyboard時使用
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

觸發(fā)事件

let slider = Slider(frame: CGRect(x: 100, y: 100, width: 200, height: 40))
 self.view.addSubview(slider)

//第一種方法
 slider.addTarget(self, action: #selector(didChange(_:)), forControlEvents: .ValueChanged)

第二種方法

閉包 代碼同上 關(guān)鍵代碼如下

//定義閉包
var data:((currentloaction:CGFloat)->Void)!
//時機(jī)
//觸摸結(jié)束
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {     
        //響應(yīng)第二種方法
        if data != nil{
            //調(diào)用閉包
            data(currentloaction: current)
        }
    }

//viewDidLoad()閉包賦值
        slider.data = {
            print($0)
        }

第三種方法

自定義類繼承uiview 使用協(xié)議觸發(fā) 關(guān)鍵代碼如下

第一步 創(chuàng)建delegate

//協(xié)議的優(yōu)點(diǎn):明確
//協(xié)議的缺點(diǎn):復(fù)雜,步驟太多
//如果有optional方法,必須使用@objc
@objc protocol ProtocolSliderDelegate{
 optional func didchange(slider:ProtocolSlider)
}

第二步 聲明delegate

 //用于關(guān)聯(lián)兩個對象(控件與需要獲取事件的對象)
  var delegate: ProtocolSliderDelegate!

第三步 調(diào)用delegate的方法

 1. 如果使用協(xié)議,需要確保delegate是否為空
 2. 如果方法為optional,需要確保方法是否實現(xiàn)
        if delegate != nil {
            if delegate.didChange != nil {
                delegate.didChange!(self)
            }
        }

第四步 繼承協(xié)議

//要實現(xiàn)協(xié)議的類繼承協(xié)議
class ViewController: UIViewController, ProtocolSliderDelegate

第五步 委托

//關(guān)聯(lián)要實現(xiàn)協(xié)議的類
  slider.delegate = self

第六步 被委托實現(xiàn)方法

//實現(xiàn)協(xié)議的方法
  func didChange(sender: ProtocolSlider) {
        print(sender.currentValue)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,624評論 30 472
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,733評論 1 14
  • 一.UITextField屬性 0.enablesReturnKeyAutomatically 默認(rèn)為No,如果設(shè)...
    奮斗ing0310閱讀 1,772評論 0 2
  • 在開發(fā)過程中,大家或多或少的都會碰到令人頭疼的手勢沖突問題,正好前兩天碰到一個類似的bug,于是借著這個機(jī)會了解了...
    閆仕偉閱讀 5,683評論 2 23
  • 代碼創(chuàng)建UIWindow對象 Xcode7之后使用代碼創(chuàng)建UIWindow對象: //創(chuàng)建UIWindow對象 s...
    云之君兮鵬閱讀 1,495評論 0 2

友情鏈接更多精彩內(nèi)容