1.描述
1.1.简介
The base class for controls, which are visual elements that convey a specific action or intention in response to user interactions.(一个所有控制器的基类,这类控制器是可以传达用于响应用户交互的行为或者意图的可视元素)
class UIControl : UIView
我们app可能帮助导航,手机用户输入或者操作内容的控制器(Controls)实现元素比如按钮和滑块(sliders).控制器使用Target-Action机制来报告用户的行为给我们的App.
我们不能直接创建UIControl的类实例.UIControl类是一个需要我们扩展来实现自定义控制器的子类化的内容.我们能够子类化已经存在的控制器类来扩展或者修改他们的行为.比如,我们可以覆盖其方法来追踪我们的触摸事件或者决定控制器状态何时变化.
一个控制器的状态决定了它的表现和他能支持的用户交互能力.控制器能够标识很多种状态,这些状态被定义成UIControl.State(normal,highlighted,disabled,selected,foucused,application,reserved)类型.我们能够根据app需要来以代码方式来改变控制器的状态.比如,我们可以使控制器不能响应事件来阻止用户与其交互.用户行为也能够改变控制器的状态.
1.2.Target-Acion机制
控制器使用target-action机制(后简称TA)通过我们写的代码来监听被关注的事件.TA简化我们编写的代码在App中来使用控制器.替代编写代码来追中事件,我们可以编写action方法来响应控制器的指定事件.比如我们可以编写action方法来响应slider的值变化.控制器处理所有工作来追踪即将到来的触摸事件并且决定何时来调用我们的方法.
当添加一个action方法给控制器时,我们指定action方法和一个定义了addTarget(_:action:for:)方法的对象(这些也可以在xib中配置).目标(target)对象可以是任何对象,但是它最典型的还是我们的view controller,一般情况下这个vc的根视图包含了控制器.如果我们指定nil给target对象,控制器就会通过响应者链来搜索定义了指定action方法的目标对象.
action方法的签名(signature)有以下三种:
@IBAction func doSomething()
@IBAction func doSomething(sender:UIButton)
@IBAction func doSomething(sender:UIButton, forEvent event:UIEvent)
sender参数与调用action方法的控制器(control)一致,event参数与控制器相关联事件出触发的UIEvent对象一致.
action方法当用户以特殊方法与control进行交互时被调用.UIControl.Event类型定义了用户能够报告而且这些行为大多数关联了控制器的特殊的触摸事件的控制器进行交互的事件.当配置控制器时候,我们必须指定哪些事件触发了我们的方法调用.比如按钮控制器,我们必须使用touchDown或者touchUpInside事件来触发调用我们的action方法.对于Slider,我们可能只需要关心其值的变化,所以我们只可能只需要绑定action方法到valueChaged事件上即可.
当一个特殊的控制器事件发生,控制器立刻调用任何关联的action方法.action方法通过当前的UIApplication对象进行分发,它可以根据响应者链找到适当的对象来处理消息.
2.代码示例
import UIKit
class CustomControl: UIControl {
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
// Drawing code
}
*/
}
//
// ViewController.swift
// SwiftUIKitUIControlDemo
//
// Created by ZhangYu on 2021/4/27.
// Copyright © 2021 MyZone. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
let myControl : CustomControl = CustomControl()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.addSubview(myControl)
myControl.backgroundColor = UIColor.systemBlue
myControl.translatesAutoresizingMaskIntoConstraints = false
let constraintV = NSLayoutConstraint.constraints(withVisualFormat: "V:|-100-[myControl(50)]", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myControl" : myControl])
let constraintH = NSLayoutConstraint.constraints(withVisualFormat: "H:|-50-[myControl(100)]", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myControl" : myControl])
self.view.addConstraints(constraintV)
self.view.addConstraints(constraintH)
//添加事件
myControl.addTarget(self, action: #selector(testAction), for: UIControl.Event.touchUpInside)
print("myControl.state is \(myControl.state)")
print("myControl.allControlEvents is \(myControl.allControlEvents)")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.myControl.removeTarget(self, action: #selector(self.testAction), for: UIControl.Event.touchUpInside)
print("myControl.allControlEvents is \(self.myControl.allControlEvents)")
}
}
//action事件
@objc func testAction(){
self.myControl.backgroundColor = UIColor.systemRed
print("\(#function) myControl.state is \(myControl.state)")
}
}
- 工程下载地址:
https://github.com/DeveloperZhang/SwiftStudyDemo
3.总结
UIControl是一个最基础常见的视图类,可以参考文档进行深入学习:UIKit->Views and Controls->UIControl