UIControl之UISwitch
定义
定义:
A control that offers a binary choice, such as On/Off.
UISwitch就是一个可切换的开关,提供两种状态,开和关。
class UISwitch : UIControl
UIControl
从上图及定义可知,UISwitch继承自UIControl,而UIControll继承自UIView。
掌握UIControll的知识,是我们后续学习UISlider、UIStepper等控件的基础。
The base class for controls, which are visual elements that convey a specific action or intention in response to user interactions.
- 即UIControl是控件的基类,其最主要的特征是可以相应用户的交互,如按钮的点击、按下,开关的状态切换,日期的选择等。
- 通常UIControl类不能直接实例化,通常我们可以继承自UIControl类实现一个自定义控件,也可以继承自现有的UIController子类,并覆写其方法,以追踪用户交互的触摸事件,或检测控件状态的变化。
Target-Action 机制
Target-Action Mechanism 中文可翻译为 “目标-动作” 或 “目标-行为” 机制。
其核心是,不是通过编写代码来追踪触摸事件,而是编写动作方法(action methods)来响应控件特定的事件。
//添加值改变监听器
slider.addTarget(self, action: #selector(sliderChanged(_:)), for: .valueChanged)
@objc
func sliderChanged(_ sender: UISlider) {
print(sender.value)
}
例如,可以编写一个动作方法来响应UISlider滑块值的改变。当滑块滑动时,事件会被发送到控件对象中,然后再由控件对象(UISlider)去触发target (此处是self) 对象上的action行为(sliderChanged方法), 来最终处理滑动的事件。
因此,Target-Action机制由两部分组成:即目标对象和行为Selector。目标对象指定最终处理事件的对象,而行为Selector则是处理事件的动作方法。
主要通用属性
var state: UIControl.State { get }
//是否可用
var isEnabled: Bool { get set }
//是否选中
var isSelected: Bool { get set }
//是否高亮
var isHighlighted: Bool { get set }
UIControl.Event 和UIControl.State
触摸事件的类型和状态。
在之前的UIButton章节中已经有了介绍。
UISwitch简单示例
效果如下:
完整代码如下,可以直接看注释:
class ViewController: UIViewController {
lazy var swith:UISwitch = {
let swith = UISwitch()
// 注意:虽然设置了width 和 height,并不能改变大小
swith.frame = CGRect(x: 20, y: 64, width: 100, height: 40)
swith.tintColor = UIColor.blue
//开关打开时背景颜色
swith.onTintColor = UIColor.green
//小圆圈的颜色
swith.thumbTintColor = UIColor.orange
//监听swift状态改变
swith.addTarget(self,action:#selector(switchChanged(_:)), for: .valueChanged)
//设置默认值
swith.isOn = true
return swith
}()
lazy var lable:UILabel = {
let lable = UILabel()
lable.frame = CGRect(x: 20, y: 124, width: 160, height: 40)
return lable
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(swith)
view.addSubview(lable)
let state = swith.isOn ? "On" : "Off"
lable.text = "当前状态:" + state
}
@objc func switchChanged(_ sender: UISwitch){
print(sender.isOn)
lable.text = "当前状态:\(sender.isOn ? "On" : "Off") "
}
}