uikit-actions 0.0.2

uikit-actions 0.0.2

incetro 维护。



  • incetro

uikit-actions

uikit-actions 提供了一组扩展,可以将闭包添加到 UIViewUIControl 实例中。还向 UIBarButtonItemUIGestureRecognizer 添加了一些方法,允许使用闭包而不是一对目标/动作。

有了 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许可协议下可用。