iOS14新特性 Apple Pencil中的随手写功能API介绍以及基本使用

3,642 阅读2分钟

一、介绍

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 感兴趣的朋友可以自己去看一下。目前国内外也没有啥博客可以参照。 看看官方文档,不难