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)
}