uikit-actions
uikit-actions 提供了一组扩展,可以将闭包添加到 UIView
和 UIControl
实例中。还向 UIBarButtonItem
和 UIGestureRecognizer
添加了一些方法,允许使用闭包而不是一对目标/动作。
有了 uikit-actions,您可以轻松地通过以下方式添加动作
/// UIView
let imageView = UIImageView()
imageView.add(gesture: .swipe(.Left)) {
print("Action processing")
}
/// UIControl
let button = UIButton()
button.add(event: .touchUpInside) {
print("Action processing")
}
/// UITextField
let textField = UITextField()
textField.throttle(.editingChanged, interval: 0.5) { (textField: UITextField) in
print("Text changed to: \(textField.text)")
}
// UIGestureRecognizer
let gestureRecognizer = UIRotationGestureRecognizer {
print("Action processing")
}
// UIBarButtonItem
let barButtonItem = UIBarButtonItem(title: "Title") {
print("Action processing")
}
安装
Cocoapods
请将以下内容添加到您的 Podfile
pod 'uikit-actions'
然后运行 pod install
。
最后,在您需要的 uikit-actions 的类中
import UIKitActions
用法
支持的类
UIView
您可以使您的 UIViews
对简单的触摸做出反应。允许的手势是枚举 Gestures
的成员,它们的值是
tap
:单指轻触,接受一个表示所需触摸次数的Int
参数。swipe
:单指滑动,接受一个表示滑动方向的UISwipeGestureRecognizer.Direction
参数。multiTap
:任何数量的手指进行的触摸,接受两个Int
参数,表示所需的手指数和触摸次数。multiSwipe
:任何数量的手指进行的滑动,接受一个表示滑动方向的UISwipeGestureRecognizer.Direction
参数和一个表示所需的手指数和触摸次数的Int
参数。
要将这些手势之一添加到 UIView
,您可以这样做
let view = UIView()
// Not any gesture argument means .tap(1):
view.addAction {
print("view tapped")
}
// You can also make the closure have one argument (the own view):
view.addAction { (view: UIView) in
print("view \(view) tapped")
}
// Add 3 tap gesture
view.add(gesture: .tap(3)) {
print("View tapped 3 times")
}
// Add a multi swipe gesture with the view as closure argument
view.add(gesture: .multiSwipe(direction: .Left, fingers: 2)) { (view: UIView) in
print("View \(view) swipped left with 2 fingers")
}
所有添加操作方法都返回添加到视图的 UIGestureRecognizer,以防您需要。
UIControl
为您的 UIControl
事件分配操作。
您可以添加三种类型的闭包
- 没有任何参数
- 有一个参数,将是控件本身。
- 有两个参数,第一个将是控件本身,第二个将是
UIEvent?
。
添加操作
- 到单个
UIControl.Event
,使用方法add(event: UIControl.Event, action: () -> Void)
- 到多个控件事件:
add(events: [UIControl.Event], action: () -> Void)
这里有一些例子
// Closure without arguments and single event
button.add(event: .touchUpInside) {
print("button tapped")
}
// Closure with one argument and multiple events
textField.add(events: [.editingChanged, .editingDidEnd]) { (textField: UITextField) in
print("Text did change: \(textField.text)")
}
// Closure with two arguments
button.add(event: .touchUpInside) { (sender, event) in
print("Sender: \(sender), Event: \(event)")
}
使用此方法添加的操作可以使用以下方法删除
func removeActions(for events: UIControl.Event)
注意:仅使用
Actions
方法添加的操作将被删除!
Throttle
Actions 允许 UIControl
将操作调度为在特定时间间隔后执行,并防止在该间隔内多次调用。换句话说,如果在时间间隔到期之前再次安排操作,则取消前一个调用(如果有),防止操作被调用两次。
一个典型的例子是 UITextField
,每次用户输入一些文本时都会触发搜索。如果这个搜索涉及到 http 请求,则每次用户输入一个字符就进行请求可能会导致服务器过载。使用 throttle
您可以等待几毫秒以检查用户是否仍在输入,并且仅在用户在一定时间内没有输入任何字符时才发送操作。
您可以这样使用 throttle
textField.throttle(.editingChanged, interval: 0.5) { [unowned self] (textField: UITextField) in
self.performSearch(with: textField.text)
}
除了 UIControl
扩展之外, Throttle
类还可独立使用,以在您的应用程序中添加自定义节流器。
UIGestureRecognizer
使用闭包而不是目标/动作对创建 UIGestureRecognizer
。
// without argument
let recognizer = UIRotationGestureRecognizer {
print("Gesture triggered")
}
// with argument
let recognizer = UIRotationGestureRecognizer { (recognizer: UIRotationGestureRecognizer) in
print("Gesture \(recognizer) triggered")
}
UIBarButtonItem
使用闭包而不是目标/动作对创建 UIBarButtonItem
。您可以通过标题、图像或系统类型创建导航栏按钮项。
let imageTitle = UIBarButtonItem(image: image) {
print("image item pressed")
}
let titleItem = UIBarButtonItem(title: "Title") {
print("title item pressed")
}
let systemItem = UIBarButtonItem(barButtonSystemItem: .action) {
print("system item pressed")
}
所有这些方法都有一些额外可选项。它们还可以与接受 UIBarButtonItem
作为参数的闭包一起使用,例如
let imageTitle = UIBarButtonItem(image: image) { (item: UIBarButtonItem) in
print("image item \(item) pressed")
}
许可协议
uikit-actions 在MIT许可协议下可用。