博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[XTPaster] iOS 贴纸功能实现
阅读量:6082 次
发布时间:2019-06-20

本文共 2308 字,大约阅读时间需要 7 分钟。

hot3.png

1.gif

贴纸功能出现在很多图片社交中, 就是图片上面贴图片, 对贴纸而言就是需要控制贴纸的位置,旋转,大小, 说到底是处理gesture,transform,frame, 如果需要多张贴纸, 需要考虑增加删除和正在操作的对象 , 你的脑海中需要对这些东西有个了解.

铺垫做到这里, github下载代码, 集成方式如下

1.把Paster文件夹放到你的项目中

2.把UIImage+AddFunction类目放到你的项目中

主要逻辑在这两个类

1.XTPasterStageView是画布View,用来放需要被加工的图片,是主舞台,用来管理贴纸list,贴纸的新增和删除, 保存退出等

2.XTPasterView是贴纸类. 手势或点击控制旋转,位置,大小等

调用方式

1.new

1

2

3

4

    _stageView = [[XTPasterStageView alloc] initWithFrame:rectImage] ;

    _stageView.originImage = self.imageWillHandle ; // 需要被贴纸加工的图片

    _stageView.backgroundColor = [UIColor whiteColor] ;

    [self.view addSubview:_stageView] ;

2.add paster

1

    [_stageView addPasterWithImg:image] ;

如果你只想使用的话, 看到上面足矣 .

下面的部分从宏观和细节两个角度大概讲一下我个人实现的思路 .

大方向思路

  • pasterID , 用一个自增的id来控制内存里的贴纸唯一

  • XTPasterStageView管理多张贴纸 , XTPasterView中设置delegate在XTPasterStageView中回调控制新增和删除

  • 多张贴纸需要判断哪一张在操作中, 所以贴纸类需要一个bool状态isOnFirst来控制是否正在操作.

1

2

3

4

5

6

 XTPasterStageView : UIView

 (nonatomic,strong) UIImage *originImage ;//原图

- (instancetype)initWithFrame:(CGRect)frame ;

- (void)addPasterWithImg:(UIImage *)imgP ;//加贴纸

- (UIImage *)doneEdit ;//完成保存

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#import #import "XTPasterStageView.h"

 XTPasterView ;

 XTPasterViewDelegate - (void)makePasterBecomeFirstRespond:(int)pasterID ; //切换控制正在操作哪一张贴纸

- (void)removePaster:(int)pasterID ; //删除某张

@end

@interface XTPasterView : UIView

@property (nonatomic,strong)    UIImage *imagePaster ; //img resource

@property (nonatomic)           int     pasterID ;

@property (nonatomic)           BOOL    isOnFirst ; //是否正在操作

@property (nonatomic,weak)    id  delegate ;

- (instancetype)initWithBgView:(XTPasterStageView *)bgView

                      pasterID:(int)pasterID

                           img:(UIImage *)img ;

- (void)remove ;

@end

细节思路

上面给出.h的外部Api只和需求有关, 并把只和自己有关的细节放在.m里面

比如说变形按钮, 删除按钮, 拖动等等, 这些都是控制单张贴纸操作的细节 .

有以下几点需要注意:

  • 变形按钮: 实现缩放和旋转

  • 拖动: 手势 ,控制相对位移

  • 删除按钮: 删除在舞台上正在操作的贴纸

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#define PASTER_SLIDE        150.0

#define FLEX_SLIDE          15.0

#define BT_SLIDE            30.0

#define BORDER_LINE_WIDTH   1.0

#define SECURITY_LENGTH     75.0

@interface XTPasterView ()

{

    CGFloat minWidth;

    CGFloat minHeight;

    CGFloat deltaAngle;

    CGPoint prevPoint;

    CGPoint touchStart;

    CGRect  bgRect ;

}

@property (nonatomic,strong) UIImageView    *imgContentView ;

@property (nonatomic,strong) UIImageView    *btDelete ; 

@property (nonatomic,strong) UIImageView    *btSizeCtrl ;

@end

细节

转载于:https://my.oschina.net/HeroOneHY/blog/901855

你可能感兴趣的文章
js读书笔记(2)
查看>>
修改表数据
查看>>
Web应用的目录结构
查看>>
jdk安装
查看>>
sendToTarget与sendMessage
查看>>
Datastage里Aggregator的一些注意事项
查看>>
验证String、StringBuffer、StringBuilder区别
查看>>
【中文】Joomla1.7扩展介绍之Modules Anywhere
查看>>
Java知多少(61)线程优先级
查看>>
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
查看>>
Java和H5前端区别
查看>>
hdu6049
查看>>
Java多线程系列目录
查看>>
冷门_可变参数方法
查看>>
powerdesigner 外键生成sql语句设置在创建表里面
查看>>
Android之Monkey全参数(包含隐藏参数)
查看>>
可变参数
查看>>
搭建LoadRunner中的场景(三)场景的执行计划
查看>>
[开源]KJFramework.Message 智能二进制消息框架 -- 对于数组的极致性优化
查看>>
Android SDK与ADT版本不匹配的解决
查看>>