Typist 是一个小型、可直接嵌入的 Swift UIKit 键盘管理器,适用于 iOS 应用程序。它可以帮助您管理键盘在屏幕上的显示和行为,而无需使用通知中心和 Objective-C。
声明在什么事件发生时应该执行什么操作,然后 start() 开始监听键盘事件。就这么简单。
let keyboard = Typist.shared // use `Typist()` whenever you can, see note on singleton usage below
func configureKeyboard() {
keyboard
.on(event: .didShow) { (options) in
print("New Keyboard Frame is \(options.endFrame).")
}
.on(event: .didHide) { (options) in
print("It took \(options.animationDuration) seconds to animate keyboard out.")
}
.start()
}
您必须调用 start() 才能触发回调。在实例上调用 stop() 将停止触发回调,但回调本身不会被移除,因此您可以通过再次调用 start() 来恢复事件回调。
要移除所有事件回调,请调用 clear()。
当将 Typist 与 UIScrollView 实例一起使用时,您可以交互式地关闭键盘。
let keyboard = Typist()
func configureKeyboard() {
keyboard
.toolbar(scrollView: tableView) // Enables interactive dismissal
.on(event: .willChangeFrame) { (options) in
// You are responsible animating inputAccessoryView
}
.on(event: .willHide) { (options) in
// Triggered when keyboard is dismissed non-interactively.
}
.start()
}
.on(event: .willChangeFrame, do: {...}) 将会随着 UIScrollView 滚动导致的键盘 frame 变化而频繁更新。最佳实践是同时实现 .willHide 部分,因为键盘可能会以非交互方式关闭,例如,使用 resignFirstResponder()。
上面的示例在演示应用程序中实现。
shared 单例的用法被认为是方便访问实例的 OK 方式。但是,强烈建议为每个用法(很可能在 UIViewController 中)实例化专用的 Typist()。当屏幕上同时呈现两个或更多使用 Typist.shared 的对象时,请勿使用单例,因为这会导致其中一个控制器无法接收键盘事件。
每个事件回调都有一个 Typist.KeyboardOptions 类型的参数。它是一个惰性的/不可变的结构体,携带键盘在事件发生时的所有数据
belongsToCurrentApp — Bool 类型,用于标识键盘是否属于当前应用程序。在 iPad 上进行多任务处理时,当键盘出现和消失时,所有可见的应用程序都会收到通知。对于导致键盘出现的应用程序,该值为 true,对于任何其他应用程序,该值为 false。startFrame — CGRect 类型,用于标识键盘在屏幕坐标系中的起始 frame。这些坐标没有考虑由于界面方向更改而应用于视图内容的任何旋转因素。因此,您可能需要在使用前将矩形转换为视图坐标(使用 convert(CGRect, from: UIView?) 方法)。endFrame — CGRect 类型,用于标识键盘在屏幕坐标系中的结束 frame。这些坐标没有考虑由于界面方向更改而应用于视图内容的任何旋转因素。因此,您可能需要在使用前将矩形转换为视图坐标(使用 convert(CGRect, from: UIView?) 方法)。animationCurve — UIView.AnimationCurve 常量,定义键盘动画到屏幕上或屏幕外的动画方式。animationDuration — Double 类型,用于标识动画的持续时间,以秒为单位。animationOptions — UIView.AnimationOptions 辅助属性,将 animationCurve 映射到其各自的 UIView.AnimationOptions 值。在使用 UIView.animate(... 执行视图动画时非常有用。支持以下键盘事件
willShow (即将显示)didShow (已显示)willHide (即将隐藏)didHide (已隐藏)willChangeFrame (即将更改 Frame)didChangeFrame – 例如,当键盘从滚动视图交互中动态关闭时。如果您在同一事件上声明两个闭包,则只会执行后一个闭包。
您可以使用 CocoaPods 安装 Typist,方法是将其添加到您的 Podfile
platform :ios, '8.0'
use_frameworks!
pod 'Typist'
在您计划监听键盘事件的任何位置导入 Typist。通常在您的 UIViewController 子类中。
import UIKit
import Typist
创建一个列出框架的 Cartfile 并运行 carthage update。按照说明将 $(SRCROOT)/Carthage/Build/iOS/Typist.framework 添加到 iOS 项目。
github "totocaster/Typist"
使用 init 命令使用 Accio 初始化您的项目。
将以下内容添加到您的 Package.swift
.package(url: "https://github.com/totocaster/Typist.git", .upToNextMajor(from: "1.4.2")),
接下来,将 Typist 添加到您的 App targets dependencies,如下所示
.target(
name: "App",
dependencies: [
"Typist",
]
),
然后运行 accio update。
下载并将 Typist.swift 拖放到您的项目中。
感谢 Jake Marsh 在 Little Bites of Cocoa #282: Taming the Keyboard with Typist ⌨️ 中推荐了 Typist。这让我很高兴。
Typist 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。