Jabberwocky Head Tracking Kit for iOS
任何 iOS 应用程序的头部跟踪光标!
功能
- 头部跟踪光标
- 眨眼或暂停点击
- 易于使用设置
- < 10 行配置现有应用
- 与模拟器兼容(不会启用)
- 与 iOS 9.0 及以上部署目标兼容。
- 目前可在 iOS 11.0 及以上版本上启用。
- 与现有 UI 元素交互
UIControl
UICollectionViewCell
UITableViewCell
- 可扩展自
UIView
的子类
- 插件架构(HTFeature)
从源代码构建 JabberwockyHTKit
要从源代码构建并运行 JabberwockyHTKit
,请按照以下步骤操作。《BasicTutorial》是一个示例应用程序目标,它有一个标准的 UIButton
,它会在屏幕上被点击时做出响应。在现有应用程序中配置头部跟踪时,需要执行一些设置步骤。一旦 JabberwockyHTKit
被配置并启用,配置并启用的默认 HTFeature
单例将自动检测 UIControl
、UICollectionViewCell
和 UITableViewCell
元素并与之交互。其他自定义 UIView
元素可以通过实现 HTFocusable
协议来配置,以便与头部跟踪框架一起使用。
第一步:结账
- 从源代码检查出来
git clone [email protected]:swiftablellc/jabberwocky-head-tracking-kit-ios.git && cd jabberwocky-head-tracking-kit-ios.git
第二步:构建框架
- 使用
JabberwockyHTKit.xcodeproj
打开XCode - 选择
JabberwockyHTKit
方案,以及任何设备/模拟器,然后在XCode中运行。
第三步:运行教程
- 选择
BasicTutorial
方案,并在支持FaceID
的设备上运行。
注意事项
*-LocalDev
方案是用于同时开发JabberwockyHTKit
和JabberwockyARKitEngine
的。这不是一个常见的用例,所以可以安全地忽略这些方案。*-PodsOnly
方案从CocoaPods获取所有依赖关系,因此对于局部开发JabberwockyHTKit
不是非常有用,但它是尝试在现有应用程序中查看cocoapods如何工作的好方法。要使用这些方案,您需要执行pod install
并在使用.xcworkspace
文件打开Xcode。
将头部跟踪添加到现有应用程序中
第 1 步:安装 JabberwockyHTKit 框架
- 创建一个
Podfile
并将$YOUR_TARGET
替换为适当的目标
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
platform :ios, '12.0'
target '$YOUR_TARGET' do
pod 'JabberwockyHTKit', '~> 0.8.4'
end
- 使用 CocoaPods 安装依赖。如果您尚未安装 CocoaPods,请先安装 CocoaPods
pod install
- 警告:请务必使用
*.xcworkspace
打开项目,而不是.xcodeproj
,否则会出现找不到 Pods 的错误。
第 2 步:将相机权限添加到 *-Info.plist
- 将
NSCameraUsageDescription
添加到您的$PROJECT-Info.plist
文件中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<key>NSCameraUsageDescription</key>
<string>Uses Camera to provide Head Tracking</string>
...
</dict>
</plist>
第 3 步:在代码中配置 JabberwockyHTKit
- 可以在应用程序完成启动后任何时间配置和启用头部跟踪。
Swift
- 有关示例实现,请参阅 基本教程 AppDelegate
import AVFoundation
import JabberwockyARKitEngine
import JabberwockyHTKit
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AVCaptureDevice.requestAccess(for: .video) { (granted) in
if (granted) {
// Configure the default HTFeatures and enable Head Tracking
DispatchQueue.main.async {
HeadTracking.configure(withEngine: ARKitHTEngine.self)
HeadTracking.shared.enable()
}
} else {
NSLog("Head Tracking requires camera access.")
}
}
return true
}
- 警告:如果您正在构建一个新的 Swift 项目(具有
SceneDelegate
),则需要修改额外的文件!引擎将被正确配置,但头部跟踪光标不会显示,因为未正确分配UIWindowScene
。请按以下方式修改SceneDelegate.swift
import JabberwockyHTKit
...
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
if let windowScene = scene as? UIWindowScene {
HeadTracking.shared.windowScene = windowScene
}
}
SwiftUI
- SwiftUI 仅部分支持(目前在 SwiftUI 中,内省和事件的处理程序触发的编程是难以实现的)。例如,和 iOS 13 以前的 Swift 非常相似的实施方法,可以在 SwiftUI 教程 SceneDelegate 中找到。需要为 Jabberwocky 的
HeadTracking
单例提供UIWindowScene
,以便 Jabberwocky 可以正确管理UIWindow
栈。 - SwiftUI 集成需要更改上述文档中提到的
AppDelegate.swift
和SceneDelegate.swift
。
Objective C
- 请参阅 Objective C 教程 AppDelegate 中的示例实现。
#import <AVFoundation/AVFoundation.h>
#import <JabberwockyARKitEngine/JabberwockyARKitEngine.h>
#import <JabberwockyHTKit/JabberwockyHTKit.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
NSLog(@"Requested Camera Permission");
if(granted){
dispatch_async(dispatch_get_main_queue(), ^{
[HeadTracking configureWithEngine:[ARKitHTEngine class] withFeatures:HeadTracking.DEFAULT_FEATURES withSettingsAppGroup:nil];
[HeadTracking.shared enableWithCompletion: ^(BOOL success) {}];
});
} else {
NSLog(@"Camera Permissions Missing for Head Tracking");
}
}];
return YES;
}
步骤 4:运行
- 如果您在支持 FaceID 的物理设备上运行,您应该得到以下类似的 XCode 输出。
Basic[19446:10081868] Requested Camera Permission
...
Basic[19446:10081868] Head Tracking configured successfully.
Basic[19446:10081868] Metal API Validation Enabled
Basic[19446:10081868] Head Tracking enabled successfully.
- 如果您在模拟器或不支持 FaceID 的设备上运行,您应该得到以下类似的 XCode 输出。由于
JabberwockyARKitEngine.xcframework
二进制文件包含 i386 和 x86_64 架构模块,因此 simulator 运行时不会崩溃。
Basic[2476:18033900] Requested Camera Permission
Basic[2476:18033900] Head Tracking cannot be configured. It is not supported on this device.
Basic[2476:18033900] Head Tracking is not configured. Use HeadTracking.configure() to configure.
发布说明(Swiftable 开发者)
关于
Jabberwocky® Head Tracking Kit (JabberwockyHTKit
) 是一个开源的 iOS 框架,由 Swiftable LLC 开发,为现有 iOS 应用提供了无触摸界面。Jabberwocky 使得用户只需移动头部即可与应用程序进行交互。头部运动可翻译为屏幕上鼠标指针的移动。默认情况下,眨眼会触发一个 .touchUpInside
事件,模拟点击任何 UIControl
子类(事实上,任何 UIView
子类都可以扩展以响应用部手势触发)。
Jabberwocky 最初是为了作为 辅助工具 为像 ALS 或脊髓损伤(SCI)这样的运动障碍用户设计的,以使他们能够有效地与 iOS 设备交互。目前,Jabberwocky 需要 ARKit,并且仅支持同时支持 FaceID 的设备。支持的设备包括
- iPhone X 及以上型号
- 搭载A12X仿生芯片的iPad Pro型号
截至iOS 13,为与Jabberwocky支持的相同设备型号,Head Tracking Accessibility功能已添加到iOS Switch Control。需要注意的是,iOS Head Tracking可以配置为在类似容量下运行,但它在操作系统级别提供。尽管iOS Head Tracking Accessibility在整个设备上工作,但其与Switch Control的紧密耦合、复杂的设置和有限的功能集使其对许多用户来说不适合。Jabberwocky支持对应用程序中的Head Tracking进行自定义并提供自定义事件挂钩。
应用程序
JabberwockyHTKit
目前正在以下应用程序在App Store中使用
- Jabberwocky AAC - 一个免触摸文本到语音应用程序(免费)。
- Jabberwocky 浏览器 - 一个免触摸网络浏览器(免费)。
依赖项
JabberwockyHTKit
除了JabberwockyARKitEngine
之外,不需要其他非Apple框架。虽然JabberwockyHTKit
是开源的,并按照Apache 2.0许可协议授权,但它依赖于JabberwockyARKitEngine
,它是一个封闭源代码,按照Permissive Binary License授权。可以在满足许可协议条件的二进制形式下重新分发,不进行修改。
JabberwockyHTKit
可在Jabberwocky CocoaPods Spec Repo中找到,同时也可在CocoaPods Trunk Repo中找到。
商标
Jabberwocky® 是Swiftable LLC的注册商标。