一、功能概览
将 TAVWidgetContentView 通过 TAVPreviewParam.widgetContentView 传入编辑器,即可替换默认的手势层实现:
TAVPreviewParam *param = [[TAVPreviewParam alloc] init];param.videoView = self.previewContainerView;// 传入自定义的挂件手势容器视图param.widgetContentView = myWidgetContentView;[editor setPreview:param];
注意:说明:
注意:不设置时使用 SDK 默认实现。
二、相关接口类
| 接口类名 | 描述 |
| TAVEditor | SDK 操作入口类。 |
| TAVPreviewParam | 预览参数,通过 widgetContentView 注入手势层。 |
| TAVWidgetContentView | SDK 手势操作封装基类(UIView 子类)。 |
| TAVWidgetContentViewDelegate | 挂件是否响应触摸的询问代理。 |
| TAVStickerView | 贴纸视图(挂件编辑视图基类)。 |
| TAVStickerViewDelegate | 贴纸视图手势事件代理。 |
| TAVPipView | 画中画视图(挂件编辑视图基类)。 |
三、主要接口介绍
| 接口名 | 描述 |
| TAVWidgetContentViewDelegate | 决定某个挂件是否响应触摸(shouldTouchSticker: / shouldTouchPipItem:)。 |
| TAVStickerViewDelegate | 贴纸手势事件回调(开始拖动、拖动中、结束拖动、点击、删除等)。 |
四、属性
| 属性 | 类型 | 说明 |
| currentContext | TAVStickerContext *(weak) | 当前贴纸上下文。 |
| editor | TAVEditor *(weak) | 绑定的编辑器。 |
| activeView | TAVEditableView *(weak) | 当前激活的挂件视图。 |
| isNoFocusGestureEnabled | BOOL | 是否无需选中即可手势交互,默认 NO(需先点击选中才能移动缩放)。 |
| outerResponseWidget | BOOL | 区域外是否支持移动/缩放/旋转,响应范围扩大到 superView,默认 NO。 |
五、方法
| 方法 | 说明 |
| removeAllStickers | 移除所有贴纸。 |
| removeAllPips | 移除所有画中画。 |
| shouldTouchSticker: | 查询指定贴纸是否响应触摸。 |
| shouldTouchPip: | 查询指定画中画是否响应触摸。 |
| filterStickerWithPoint: | 按触摸点筛选命中的贴纸。 |
| filterPipItemWithPoint: | 按触摸点筛选命中的画中画。 |
| registerDelegate: / unregisterDelegate: | 注册/注销 TAVWidgetContentViewDelegate。 |
| handlePanRecognizer: | 处理拖动手势(可供外部转发手势事件)。 |
六、自定义挂件手势层
1. 继承 TAVWidgetContentView 并实现自己的逻辑。
@interface MyWidgetContentView : TAVWidgetContentView @end @implementation MyWidgetContentView – (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // 无需选中即可直接拖动挂件 self.isNoFocusGestureEnabled = YES; // 允许在挂件区域外继续响应手势 self.outerResponseWidget = YES; } return self; } @end
2. 在 setPreview: 时通过 TAVPreviewParam 传入。
TAVPreviewParam *param = [[TAVPreviewParam alloc] init]; param.videoView = self.previewContainerView; param.widgetContentView = [[MyWidgetContentView alloc] initWithFrame:self.previewContainerView.bounds]; [editor setPreview:param];
七、控制挂件是否响应触摸
#pragma mark – TAVWidgetContentViewDelegate<!– list-type-break –>- (BOOL)contentView:(TAVWidgetContentView *)contentView shouldTouchSticker:(TAVSticker *)sticker { // 返回 NO 表示该贴纸不响应手势 return YES;}- (BOOL)contentView:(TAVWidgetContentView *)contentView shouldTouchPipItem:(TAVMediaPipItem *)pipItem { return YES;}// 注册[widgetContentView registerDelegate:self];// 注销[widgetContentView unregisterDelegate:self];
八、监听贴纸手势事件
@protocol TAVStickerViewDelegate <NSObject>@optional- (void)stickerViewDidReachToEnd:(TAVStickerView *)stickerView; // 贴纸播放到结尾- (BOOL)stickerView:(TAVStickerView *)stickerView …; // 是否允许某操作- (void)stickerViewStartPanning:(TAVStickerView *)stickerView; // 开始拖动- (void)stickerViewChangePanning:(TAVStickerView *)stickerView; // 拖动中- (void)stickerViewEndPanning:(TAVStickerView *)stickerView; // 拖动结束- (void)stickerViewOnDelete:(TAVStickerView *)stickerView; // 删除- (void)stickerViewOnClicked:(TAVStickerView *)stickerView; // 点击@end
TAVStickerView *stickerView = [stickerManager fetchStickerViewWithItem:stickerItem];stickerView.delegate = self;
九、TAVStickerView 常用能力
| 属性/方法 | 说明 |
| stickerItem / sticker | 关联的贴纸数据模型。 |
| delegate | 手势事件代理。 |
| borderView / contentView / animationView | 边框视图、内容视图、动画视图。 |
| borderColor / borderWidth | 边框颜色与宽度(可自定义编辑框外观)。 |
| mode / switchMode: | 贴纸模式与切换。 |
| disableGestureWhenInactive | 非活跃状态下是否禁止手势,默认 YES。 |
| becomeActive / resignActive | 激活 / 取消激活。 |
| alignmentMode / alignmentEdgeInset | 对齐模式与对齐边距(可实现居中辅助线)。 |
| mirrored | 是否镜像。 |
| repeatCount / shouldRepeat | 动效循环次数与是否循环。 |
| seekToTime: / updateProgress: / play / pause / replay | 动效播放控制。 |
| reloadData / reloadSticker: / updateScaleRect | 刷新数据。 |