涂图

  • 首页
  • 解决方案
    • 拍照和图片编辑
    • 视频录制和后期编辑
    • 模板视频
    • 人像美颜
    • 人脸特效
    • 滤镜特效
    • 贴纸特效
  • API服务
    • 人像服务
    • 视频融合
    • 人脸云
    • 在线滤镜
  • 客户案例
  • 下载
  • 文档
  • 关于我们
  • 控制台
  • 一、新手上路
  • 控制台操作说明
    • 控制台使用说明
    • 自定义资源上传说明
  • 二、SDK 文档
  • 图像 SDK
    • 产品说明
      • 产品指南
      • 性能测试报告
    • iOS 文档
      • 快速开始
      • 安装与更新
      • 集成向导
      • 相机组件的使用
      • 相册组件的使用
      • 照片美化组件的使用
      • 主题包基础使用
      • 自定义滤镜
      • 自定义贴纸
      • 自定义界面
      • 自定义 ProgressHUD 提示框(2.0.0~3.2.7)
      • 自定义 ProgressHUD 提示框
      • API 文档
      • 致谢
    • Android 文档
      • 快速开始
      • 安装与更新
      • 集成向导
      • 相机组件的使用
      • 照片美化组件的使用
      • 头像设置组件的使用
      • 多选相册组件的使用
      • 主题包基础使用
      • 自定义贴纸
      • 自定义滤镜
      • 自定义界面
      • 自定义进度信息提示框
      • 自定义 Activity 打开相机
      • API 文档
      • 致谢
    • iOS 技术问题
      • 「Incorrenct app key」
      • 更换滤镜效果图
      • 导航栏与状态栏
      • 组件中使用部分滤镜
      • Cocoapods 相关问题
      • 图片尺寸变化
      • Photos.framework 相关错误
      • 多包名发布
      • GPUImage 的相关错误
      • TuSDKTSALAsset 转换系统对象
      • 滤镜无法显示名称
      • 获取相机的点击事件
    • Android 技术问题
      • Incorrenct app key
      • 重复引用包
      • Recyclerview 库缺失
      • 方法数超出 65536 限制
      • 传入图片路径
      • 指定裁剪比例
      • 指定相册每行列数
      • 禁用相册自动跳转
      • 如何使用部分滤镜?
      • 代码混淆
      • TuSDK 使用的依赖库
      • 多渠道打包
      • 设置相机输出尺寸
      • 相机横屏设置
      • 自定义照片美化组件各功能模块效果默认参数值
    • 拼图设计
      • 拼图模板导出
    • 版本更新日志
      • iOS 版本更新日志
      • Android 更新日志
  • 视频剪辑 SDK
    • 产品说明
      • 产品指南
    • iOS文档
      • TuSDK Video Editor iOS 接入文档
    • Android文档
      • TuSDK Video Editor Android 接入文档
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 流处理(特效相机) SDK
    • 产品说明
      • 产品指南
    • iOS 文档
      • TuSDK特效相机接入文档-iOS
      • TuSDK直播特效接入说明-iOS
    • Android 文档
      • TuSDK特效相机接入文档-Android
      • TuSDK直播特效接入说明-Android
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 视频融合 SDK
    • 产品说明
      • 产品指南
      • 模板管理
    • iOS 文档
      • 快速开始
      • 安装与更新
      • TuSDK EVA 接入说明 2.0
      • API文档
    • Android 文档
      • 快速开始
      • 安装与更新
      • TuSDK EVA 接入说明 (2.0.0+)
      • API 文档
    • 模板设计
      • (新)标准模板设计规范
      • (旧)标准模板设计规范
      • 支持的 AE 功能和属性
      • 动态模板设计规范
    • 模板导出
      • (新)模板导出插件安装
      • (新)模板导出插件使用
      • (旧)模板导出插件安装
      • (旧)模板导出插件使用
      • (旧)模板效果查看器
      • (旧)模板打包规范
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
      • 导出插件版本更新日志
      • 效果查看器更新日志
  • 短视频 SDK
    • 产品说明
      • 产品指南
      • 性能测试报告
    • iOS 文档
      • 快速开始
      • 集成向导
      • 录制相机的使用
      • 视频编辑器的使用
      • 功能 API 的使用
      • API 文档
    • Android 文档
      • 快速开始
      • 集成向导
      • 录制相机的使用
      • 视频编辑器的使用
      • 功能 API 的使用
      • API 文档
    • iOS 技术问题
      • 常见问题
    • Android 技术问题
      • 常见问题
    • 版本更新日志
      • iOS 版本更新日志
      • Android 版本更新日志
  • 三、云服务文档
  • 人像服务
    • 使用文档
      • 快速入门
      • 核心功能
    • API概述
      • API 概述
      • API 文档
    • 常见问题
      • 常见问题
  • 视频融合(云渲染)
    • 使用文档
      • 快速入门
      • 模板管理
    • API概述
      • API概述
      • API 文档
    • 模板设计
      • (新)标准模板设计规范
      • (旧)标准模板设计规范
      • 支持的 AE 功能和属性
      • 动态模板设计规范
    • 模板导出
      • (新)模板导出插件安装
      • (新)模板导出插件使用
      • (旧)模板导出插件安装
      • (旧)模板导出插件使用
      • (旧)模板效果查看器
      • (旧)模板打包规范
    • 常见问题
    • 版本更新日志
      • 导出插件版本更新日志
      • 效果查看器更新日志
  • 人脸云
    • 使用文档
      • 快速入门
      • 核心功能
    • API 概述
      • API 概述
    • 常见问题
      • 常见问题
  • 在线滤镜
    • 使用文档
      • 快速入门
      • 核心功能
      • FILTER API
      • API 错误码表
    • API概述
      • API 概述
    • 常见问题
      • 常见问题
  • 四、综合
  • 涂图隐私协议
  • 用户退出机制
  • 动态贴纸设计规范
  • 美妆贴纸设计规范
  • 云服务账单说明
  • 应用包名与密钥
  • 基础服务开发者升级流程
  • 五、常见问题
  • 常见问题
  • 遇到问题,怎么办?
  • 如何使用贴纸管理、滤镜管理?

自定义界面

界面修改

  • 详细阅读示例项目源码和在线的 API 文档,理解 TuSDK 的代码架构。
  • 在需要更改某组件界面时,可阅读组件的 Options 文件,也可以按照 XXXXXX.Options.Clazz 类似格式键入,Xcode 会自动补全当前组件中包含 clazz 关键字的接口选项,方便用户知道自定义需要继承哪些文件。
  • 在 option 中开放了视图的接口,例如 _photoEditMultipleComponent.options.editMultipleOptions.viewClazz 对应的是视图的接口,即继承 TuSDKPFEditMultipleView 为父类,修改对应界面布局的方法。
  • 在 option 中开放了控制器的接口,例如 _photoEditMultipleComponent.options.editMultipleOptions.componentClazz 对应的是控制器的接口,即继承 TuSDKPFEditMultipleController 为父类,修改对应的逻辑的方法。
  • 自定义视图或者逻辑时需要知道具体的文件名, Options.viewClazz 对应的是视图, Options.componentClazz 对应的是控制器,SDK 会自动提示此时的控件所在的具体的文件名称,方便用户进行自定义。
  • TuSDK 2.5.0 添加扩展方法增加前缀,避免重名,例如 initView 方法修改为 lsqInitView 方法。完成升级后请注意相关方法名的变更。

更改界面图标

  • 更换 TuSDK.bundle/ui_default 目录内的图标。

更改显示文字

  • Cocoapod 集成请更换 Resources/Base.lproj/Localizable.strings 文件中的字段,手动集成请更换 TuSDK.strings文件中的字段。可改变 SDK 内的文字显示。
  • SDK 本身提供了简体中文,英文和繁体中文的语言支持。如果需要更多语言支持,请仿照已提供的 TuSDK.strings 进行制作对应的语言文件。
  • 制作好了语言文件后需要在工程中进行语言的相关设置,具体位置在工程 PROJECT 选项里的 Info 中的 localizations 中添加对应语言项。

保持原有界面布局,对控件修改

以裁剪组件自定义界面为例,对原有界面进行修改需要继承 TuSDKPFEditTurnAndCutView 类,添加了新的控件,需要进行重新声明

@interface ExtendEditTurnAndCutView : TuSDKPFEditTurnAndCutView
/**
 *  向右旋转按钮
 */
@property (nonatomic, readonly) UIButton *trunRightButton;
@end

在裁切组件进行启动的时候对子类视图进行指定

TuSDKPFEditTurnAndCutOptions *opt = [TuSDKPFEditTurnAndCutOptions build];
opt.viewClazz = [ExtendEditTurnAndCutView class];

在子类中重写 lsqInitView 方法重写新的需求,更改界面及对应功能

/**
 *  每个视图都会执行lsqInitView,自定义视图在这里开始
 */
-(void)lsqInitView;
{
    // !!!!!!!!!!!
    // 初始化父类的方法,这里很重要
    [super lsqInitView];

    // 可以更改界面的相关属性
    // 修改底部工具栏背景
    self.bottomBar.backgroundColor = lsqRGB(255,123,44);

    // 改变底部镜像按钮为向右旋转按钮
    // 隐藏镜像按钮
    self.bottomBar.mirrorButton.hidden = YES;
    // 创建向右旋转按钮
    _trunRightButton = [UIButton buttonWithFrame:self.bottomBar.mirrorButton.frame
                             imageLSQBundleNamed:@"style_default_edit_button_trun_right"];
    // 绑定动作
    [_trunRightButton addTouchUpInsideTarget:self action:@selector(onImageTurnRightAction)];
    // 添加到视图
    [self.bottomBar addSubview:_trunRightButton];
}

更改了底部动作栏的布局,添加了新的功能按钮,并处理相应的点击事件

/**
 *  向右旋转图片按钮的点击事件处理
 */
- (void)onImageTurnRightAction;
{
    [self.editImageView changeImage:lsqImageChangeTurnRight];
}

提醒:使用裁切组件,要遵守代理 TuSDKPFEditTurnAndCutDelegate,执行代理方法

- (void)onTuSDKPFEditTurnAndCut:(TuSDKPFEditTurnAndCutViewController *)controller result:(TuSDKResult *)result;

自定义底部动作栏上子视图时,需另外继承自TuSDKPFEditTurnAndCutBottomView,同时对子类视图进行指定

    opt.bottomBarViewClazz = [ExtendTuSDKPFEditTurnAndCutBottomView class];

在子类中重写 lsqInitView 方法,自定义界面

@interface ExtendEditTurnAndCutBottomView : TuSDKPFEditTurnAndCutBottomView

@end

@implementation changeEditTurnAndCutBottomView

-(void)lsqInitView;
{
    [super lsqInitView];
    // 修改完成按钮背景颜色,具体的颜色只需要替换lsqRGB字段内的参数就好,具体颜色显示需要自己处理
    [_completeButton setStateNormalBackgroundImageColor:lsqRGB(123, 145, 255)];
}

更改界面布局,对原有控件修改

以相机组件界面自定义为例,对原有界面进行修改,需要对相应的界面的类进行继承

/**
 *  相机组件范例 - 相机视图控制器
 */
@interface ExtendCameraBaseController : TuSDKPFCameraViewController
@end

/**
 *  相机组件范例视图自定义
 */
@interface ExtendCameraBaseView : TuSDKPFCameraView
@end

/**
 *  相机组件范例视图 滤镜行视图
 */
@interface ExtendCameraBaseFilterItemCell : TuSDKCPGroupFilterItemCell
@end

在相机组件进行启动的时候对子类视图进行指定

TuSDKPFCameraOptions *opt = [TuSDKPFCameraOptions build];
opt.componentClazz = [ExtendCameraBaseController class];
opt.viewClazz = [ExtendCameraBaseView class];
opt.filterBarTableCellClazz = [ExtendCameraBaseFilterItemCell class];

在子类 ExtendCameraBaseView 中重写 lsqInitView 方法,在方法内重写新的需求

-(void)lsqInitView;
{
    // !!!!!!!!!!!
    // 初始化父类的方法,这里很重要
    [super lsqInitView];

    // 更开默认相机控制栏视图的属性
    [_configBar setSizeHeight:44];
    //关闭按钮隐藏,并在 controller 的方法中进行了重写
    _configBar.closeButton.hidden = YES;
    [_configBar.flashButton setOriginX:10];

    // 更改闪光灯视图的属性
    [_flashView setFlashFrame:_configBar.flashButton.frame];
}

在子类 ExtendCameraBaseFilterItemCell 中重写 lsqInitView 方法,在方法内重写新的需求

-(void)lsqInitView;
{
    // !!!!!!!!!!!
    // 初始化父类的方法,这里很重要
    [super lsqInitView];

    // 标题视图
    _titleView.hidden = YES;
}

-(id)setSize:(CGSize)size;
{
    [super setSize:size];

    // 图片视图
    _thumbView.frame = _wrapView.bounds;
    // 标题视图
    _titleView.hidden = YES;
    return self;
}

在子类 ExtendCameraBaseController 中重写 - (void)configDefaultStyleView:(TuSDKPFCameraView *)view; 方法,在方法内重写新的需求

/**
 *  配置默认样式视图
 *
 *  @param view 默认样式视图 (如需创建自定义视图,请覆盖该方法,并配置自己的视图类)
 */
- (void)configDefaultStyleView:(TuSDKPFCameraView *)view;
{
    if (!view) return;
    [super configDefaultStyleView:view];

    UIButton *closeButton = [UIButton buttonWithFrame:CGRectMake(20, [view.bottomBar getCenterY:60] + 8, 60, 60)
                                                title:LSQString(@"lsq_cancel", @"取消") font:lsqFontSize(16)
                                                color:[UIColor whiteColor]];
    // 关闭摄像头按钮
    [closeButton addTouchUpInsideTarget:self action:@selector(cancelAction)];
    [view.bottomBar addSubview:closeButton];
}

提醒:使用滤镜,要遵守代理 TuSDKPFNormalFilterGroupDelegate,执行代理方法

/**
 *  选中一个滤镜
 *
 *  @param view 裁剪与缩放控制器滤镜视图
 *  @param item 滤镜分组元素
 *
 *  @return 是否允许继续执行
 */
- (BOOL)onTuSDKPFNormalFilterGroup:(TuSDKPFNormalFilterGroupView *)view
                         selectedItem:(TuSDKCPGroupFilterItem *)item;
{
    if (item.type == lsqGroupFilterItemFilter) {
        return [self onSelectedFilterCode:[item filterCode]];
    }
    return YES;
}

自定义照片美化组件界面

下面以照片美化组件界面为例,裁切 + 滤镜 + 贴纸组件与此相似

修改照片美化组件界面视图

修改界面视图,需要继承 TuSDKPFEditMultipleView 类

@interface SimpleEditMultipleView : TuSDKPFEditMultipleView
@end

在照片美化组件进行启动的时候对子类视图进行指定

_photoEditMultipleComponent.options.editMultipleOptions.viewClazz = [SimpleEditMultipleView class];

在子类中重写 lsqInitView 方法重写新的需求,更改界面视图的相关属性,代码只是举例并未一一列举

-(void)lsqInitView;
{
    // !!!!!!!!!!!
    // 初始化父类的方法,这里很重要
    [super lsqInitView];

    // 改变 view 的背景颜色
    self.backgroundColor = [UIColor redColor];

    // 创建导航栏返回按钮
    _cancelButton = [UIButton buttonWithFrame:CGRectMake(0, 0, 100 , 100) backgroundImageLSQBundleNamed:@"style_default_edit_button_cancel_bg"];
    // 设置按钮的属性
    [_cancelButton setBackgroundColor:[UIColor yellowColor]];
    [_cancelButton setTitle:(LSQString(@"修改此处", @"更改按钮")) forState:UIControlStateNormal];
    // 创建导航栏完成按钮    
    _doneButton = [UIButton buttonWithFrame:CGRectMake(self.getSizeWidth-70, 0, 100, 100) backgroundImageLSQBundleNamed:@"style_default_edit_button_confirm_bg"];
    // 设置按钮的属性
    [_doneButton setBackgroundColor:[UIColor yellowColor]];
    [_doneButton setTitle:(LSQString(@"修改此处", @"更改按钮")) forState:UIControlStateNormal];
    // 将按钮添加至视图
    [self addSubview:_cancelButton];
    [self addSubview:_doneButton];

    // 改变 optionBar 的 frame
    self.optionBar.frame = CGRectMake(0, 400, self.frame.size.width, 200);
    // 改变 optionBar 滑动视图的背景颜色
    self.optionBar.wrapView.backgroundColor = [UIColor blackColor];

    // 改变步骤记录视图 stepView 背景颜色
    self.stepView.backgroundColor = [UIColor yellowColor];
    // 改变步骤记录视图 stepView 的 frame
    self.stepView.frame = CGRectMake(0, 200, self.frame.size.width, 100);
    // 改变步骤记录视图 stepView 的 上一步 button 的背景颜色
    self.stepView.prevButton.backgroundColor = [UIColor blackColor];
    // 改变步骤记录视图 stepView 的 下一步 button 的背景颜色
    self.stepView.nextButton.backgroundColor = [UIColor greenColor];

    // 改变图片视图 imageView 的 frame
    self.imageView.frame = CGRectMake(0, 0,  self.frame.size.width, 300);
    // 改变图片视图 imageView 的背景色
    self.imageView.backgroundColor = [UIColor redColor];
}

自定义导航栏按钮

下面以自定义照片美化组件界面为例,其他组件都与此相似

修改导航栏按钮布局

修改导航栏按钮布局,需要继承 TuSDKPFEditMultipleView 类

@interface SimpleEditMultipleView : TuSDKPFEditMultipleView
@end

在照片美化组件进行启动的时候对子类视图进行指定

_photoEditMultipleComponent.options.editMultipleOptions.viewClazz = [SimpleEditMultipleView class];

在子类中重写 lsqInitView 方法重写新的需求,更改导航栏的相关属性

-(void)lsqInitView;
{
    // !!!!!!!!!!!
    // 初始化父类的方法,这里很重要
    [super lsqInitView];

    // 创建导航栏返回按钮
    _cancelButton = [UIButton buttonWithFrame:CGRectMake(0, 0, 100 , 100)
                backgroundImageLSQBundleNamed:@"style_default_edit_button_cancel_bg"];
    // 设置按钮的属性
    [_cancelButton setBackgroundColor:[UIColor yellowColor]];
    [_cancelButton setTitle:(LSQString(@"修改此处", @"更改按钮")) forState:UIControlStateNormal];

    // 创建导航栏完成按钮    
    _doneButton = [UIButton buttonWithFrame:CGRectMake(self.getSizeWidth-70, 0, 100, 100)
              backgroundImageLSQBundleNamed:@"style_default_edit_button_confirm_bg"];
    // 设置按钮的属性
    [_doneButton setBackgroundColor:[UIColor yellowColor]];
    [_doneButton setTitle:(LSQString(@"修改此处", @"更改按钮")) forState:UIControlStateNormal];

    // 将按钮添加至视图
    [self addSubview:_cancelButton];
    [self addSubview:_doneButton];
}

替换两侧按钮点击事件

替换导航栏两侧按钮点击事件,需要继承 TuSDKPFEditMultipleController 类

@interface SimpleEditMultipleController : TuSDKPFEditMultipleController
@end

在照片美化组件进行启动的时候对子类进行指定启动

_photoEditMultipleComponent.options.editMultipleOptions.componentClazz = [SimpleEditMultipleController class];

在子类中重写 loadView 方法重写需求,更改导航栏的相关属性

-(void)loadView;
{
    // !!!!!!!!!!!
    // 初始化父类的方法,这里很重要
    [super loadView];
    //可在此直接对导航栏进行设置,例如导航栏两侧按钮的显示或隐藏
}

替换两侧导航栏按钮点击事件

/**
 *  配置默认样式视图
 *
 *  @param view 默认样式视图 (如需创建自定义视图,请覆盖该方法,并配置自己的视图类)
 */
- (void)configDefaultStyleView:(TuSDKPFEditMultipleView *)view;
{
    if (!view) return;
    // !!!!!!!!!!!
    // 初始化视图,这里很重要
    [view initView];

    // 绑定功能模块
    [view.optionBar bindModules:self.modules target:self action:@selector(onEditWithAction:)];
    // 是否禁用操作步骤记录
    view.stepView.hidden = self.disableStepsSave;
    // 步骤后退按钮
    [view.stepView.prevButton addTouchUpInsideTarget:self action:@selector(onStepPreviewAction)];
    // 步骤前进按钮
    [view.stepView.nextButton addTouchUpInsideTarget:self action:@selector(onStepNextAction)];


    // 修改这里 !!!!!!!!!!!
    // 更改导航左侧按钮点击事件
    [view.cancelButton addTouchUpInsideTarget:self action:@selector(leftTest)];
    // 更改导航右侧按钮点击事件
    [view.doneButton addTouchUpInsideTarget:self action:@selector(rightText)];
    //     

    [view needUpdateLayout];
    [self.view addSubview:view];
}

// 导航左侧按钮点击事件方法
-(void)leftTest
{
    NSLog(@"测试成功");
}

// 导航右侧按钮点击事件
-(void)rightText
{
    NSLog(@"测试成功");
}

截断原有逻辑,先执行自定义方法

替换导航栏两侧按钮点击事件,需要继承 TuSDKPFEditMultipleController 类

@interface SimpleEditMultipleController : TuSDKPFEditMultipleController
@end

在照片美化组件进行启动的时候对子类进行指定启动

_photoEditMultipleComponent.options.editMultipleOptions.componentClazz = [SimpleEditMultipleController class];

截断两侧导航栏按钮点击事件

@implementation SimpleEditMultipleController
{
    UIButton *newBackButton;
    UIButton *newCompleteButton;
    UIButton *fakeCancelButton;
    UIButton *fakeDoneButton;
}
- (void)configDefaultStyleView:(TuSDKPFEditMultipleView *)view;
{
    // 执行父类方法
    [super configDefaultStyleView:view];
    // 隐藏原有的「取消」和「完成」button
    view.cancelButton.hidden = YES;
    view.doneButton.hidden = YES;
    // 自定义新的「取消」和「完成」button
    newBackButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    [newBackButton setBackgroundColor:[UIColor greenColor]];
    [newBackButton addTouchUpInsideTarget:self action:@selector(newBackAction)];
    [view addSubview:newBackButton];

    newCompleteButton = [[UIButton alloc]initWithFrame:CGRectMake(view.frame.size.width *2/3, 0, 100, 100)];
    [newCompleteButton setBackgroundColor:[UIColor redColor]];
    [newCompleteButton addTouchUpInsideTarget:self action:@selector(newCompleteAction)];
    [view addSubview:newCompleteButton];

    fakeCancelButton = view.cancelButton;
    fakeDoneButton = view.doneButton;

}

// 自定义新的「取消」button 的点击事件的方法
-(void)newBackAction;
{
    // 执行自定义的逻辑
    NSLog(@"执行了自定义的逻辑");
    // 通过传递点击事件的方式,调用 SDK 原有 button 的点击事件
    [fakeCancelButton sendActionsForControlEvents:UIControlEventTouchUpInside];
}

// 自定义新的「完成」button 的点击事件的方法
-(void)newCompleteAction;
{
    // 执行自定义的逻辑
    NSLog(@"我点了完成键");
    // 通过传递点击事件的方式,调用 SDK 原有 button 的点击事件
    [fakeDoneButton sendActionsForControlEvents:UIControlEventTouchUpInside];

}
@end

  • 界面修改
  • 自定义照片美化组件界面
  • 自定义导航栏按钮
  • 在线技术支持
  • 专业售前售后团队
  • 版本定期更新
  • 全方位解决方案

商务合作

  • 177-6716-7529
  • 2969573855
  • sales@tusdk.com
  • 浙江省 杭州市 西湖区 西斗门9号 福地创业园1号楼3楼301室

关注我们

qrcode

©2019-2025 TUTUCLOUD. All Rights Reserved. 杭州元凡视觉智能科技有限公司 | 浙ICP备14040447号-1 | 浙公网安备33010602001649号

  • 177-6716-7529
  • sales@tusdk.com
  • 2969573855