slider控件
第一种方法
自定义类 ,让类继承 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) //发送与事件相关的所有动作
// self.setNeedsLayout() //当值发生改变时 让系统自动调用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
}
//触摸点
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
touch(touches)
}
//一段时间
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
touch(touches)
}
//结束
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
//响应第一种方法
sendActionsForControlEvents(.ValueChanged)
}
//当子视图发生变化时 系统会自动调用
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")
}
}
触发事件
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)
第二种方法
闭包 代码同上 关键代码如下
//定义闭包
var data:((currentloaction:CGFloat)->Void)!
//时机
//触摸结束
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
//响应第二种方法
if data != nil{
//调用闭包
data(currentloaction: current)
}
}
//viewDidLoad()闭包赋值
slider.data = {
print($0)
}
第三种方法
自定义类继承uiview 使用协议触发 关键代码如下
第一步 创建delegate
//协议的优点:明确
//协议的缺点:复杂,步骤太多
//如果有optional方法,必须使用@objc
@objc protocol ProtocolSliderDelegate{
optional func didchange(slider:ProtocolSlider)
}
第二步 声明delegate
//用于关联两个对象(控件与需要获取事件的对象)
var delegate: ProtocolSliderDelegate!
第三步 调用delegate的方法
1. 如果使用协议,需要确保delegate是否为空
2. 如果方法为optional,需要确保方法是否实现
if delegate != nil {
if delegate.didChange != nil {
delegate.didChange!(self)
}
}
第四步 继承协议
//要实现协议的类继承协议
class ViewController: UIViewController, ProtocolSliderDelegate
第五步 委托
//关联要实现协议的类
slider.delegate = self
第六步 被委托实现方法
//实现协议的方法
func didChange(sender: ProtocolSlider) {
print(sender.currentValue)
}