一、介绍
iOS14 iPad 为Pencil新增了随手写功能,此功能可以实现不弹出键盘可以在指定区域去用手写笔去写字。
二、基本类
随手写功能主要有两个类
1. UIScribbleInteraction (可实现在textField、textView、等)
2. UIIndirectScribbleInteraction (可以在任何View上面,但必须要有第一相应者去接收)
1. UIIndirectScribbleInteraction
想要实现撰写功能,则需要实现代理方法(类似UITableViewDelegate)
UIScribbleInteractionDelegate
其代理方法有如下几个方法:
/// 指定那个区域可以使用随手写,并且设置唯一的ID。
- (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction requestElementsInRect:(CGRect)rect completion:(void(^)(NSArray<UIScribbleElementIdentifier> *elements))completion
// 确定可书写的范围
- (CGRect)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction frameForElement:(UIScribbleElementIdentifier)elementIdentifier;
// 聚焦到什么对象
- (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction focusElementIfNeeded:(UIScribbleElementIdentifier)elementIdentifier referencePoint:(CGPoint)focusReferencePoint completion:(void (^)(UIResponder<UITextInput> * _Nullable))completion
// 判断某个特定的元素是否被聚焦
- (BOOL)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction isElementFocused:(UIScribbleElementIdentifier)elementIdentifier
/// 是否延时聚焦
- (BOOL)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction shouldDelayFocusForElement:(UIScribbleElementIdentifier)elementIdentifier
/// 是否有笔迹将要书写
- (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction willBeginWritingInElement:(UIScribbleElementIdentifier)elementIdentifier
/// 是否书写完成
- (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction didFinishWritingInElement:(UIScribbleElementIdentifier)elementIdentifier
三、基本使用
1.声明对象
@property (nonatomic, strong) UIIndirectScribbleInteraction *interaction;
2.创建Interaction对象 签署代理,将当前View添加Interaction(本例中keyboradInputView为UIView)
self.interaction = [[UIIndirectScribbleInteraction alloc] initWithDelegate:self];
[self.keyboradInputView addInteraction:self.interaction];
3.UIIndirectScribbleInteractionDelegate
/// 说明可写的区域
- (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction requestElementsInRect:(CGRect)rect completion:(void (^)(NSArray<UIScribbleElementIdentifier> * _Nonnull))completion API_AVAILABLE(ios(14.0)){
// 提供一个标识符 (类似UITableView的Indentifire, 但这里是唯一的,也不是缓存池那一套)
completion(@[@"keyboradInputView.c_textInputViewIndetiner"]);
}
// 确定可书写的范围
- (CGRect)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction frameForElement:(UIScribbleElementIdentifier)elementIdentifier API_AVAILABLE(ios(14.0)){
return [UIScreen mainScreen].bounds;
}
// 聚焦到当前对象
- (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction focusElementIfNeeded:(UIScribbleElementIdentifier)elementIdentifier referencePoint:(CGPoint)focusReferencePoint completion:(void (^)(UIResponder<UITextInput> * _Nullable))completion API_AVAILABLE(ios(14.0)){
[self.keyboradInputView.c_textInputView becomeFirstResponder];
completion(self.keyboradInputView.c_textInputView);
}
// 标识某个特定的元素是否被聚焦
- (BOOL)indirectScribbleInteraction:(UIIndirectScribbleInteraction *)interaction isElementFocused:(UIScribbleElementIdentifier)elementIdentifier API_AVAILABLE(ios(14.0)){
return self.keyboradInputView.c_textInputView.isFirstResponder;
}
四、UIScribbleInteraction
- 和UIIndirectScribbleInteraction使用方式差不多,只是UIScribbleInteraction只能识别textField、textView 不过多赘述
五、注意
值得注意的是,iOS14 这个随手写功能,是弹不出虚拟键盘的,也收不到弹出虚拟键盘的通知 即:以下通知无效
UIKeyboardWillShowNotification 无效
UIKeyboardWillHideNotification 无效
- 随手写功能目前收不到类似上面的通知。
- 随手写功能目前也获取不到用户是否开启/关闭随手写功能(只能看虚拟键盘是否弹出作为依据)
六、其他
- 此文只给了思路,其实内部还就几个属性和API 感兴趣的朋友可以自己去看一下。目前国内外也没有啥博客可以参照。 看看官方文档,不难