[XTPaster] iOS 贴纸功能 实现

请支持原创, 如需转载, 请注明出处@TEASON

先把代码贴上来,https://github.com/Akateason/XTPaster欢迎follow和star

XTPaster.gif

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

铺垫做到这里, github下载代码, 集成方式如下
1.把Paster文件夹放到你的项目中
2.把UIImage+AddFunction类目放到你的项目中

主要逻辑在这两个类
XTPasterStageViewXTPasterView
1.XTPasterStageView是画布View,用来放需要被加工的图片,是主舞台,用来管理贴纸list,贴纸的新增和删除, 保存退出等
2.XTPasterView是贴纸类. 手势或点击控制旋转,位置,大小等

调用方式

1.new

    _stageView = [[XTPasterStageView alloc] initWithFrame:rectImage] ;
    _stageView.originImage = self.imageWillHandle ; // 需要被贴纸加工的图片
    _stageView.backgroundColor = [UIColor whiteColor] ;
    [self.view addSubview:_stageView] ;

2.add paster

    [_stageView addPasterWithImg:image] ;

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

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

大方向思路
  • pasterID , 用一个自增的id来控制内存里的贴纸唯一
  • XTPasterStageView管理多张贴纸 , XTPasterView中设置delegate在XTPasterStageView中回调控制新增和删除
  • 多张贴纸需要判断哪一张在操作中, 所以贴纸类需要一个bool状态isOnFirst来控制是否正在操作.
@interface XTPasterStageView : UIView

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

- (instancetype)initWithFrame:(CGRect)frame ;
- (void)addPasterWithImg:(UIImage *)imgP ;//加贴纸
- (UIImage *)doneEdit ;//完成保存

@end
#import <UIKit/UIKit.h>
#import "XTPasterStageView.h"

@class XTPasterView ;

@protocol XTPasterViewDelegate <NSObject>
- (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 <XTPasterViewDelegate> delegate ;
- (instancetype)initWithBgView:(XTPasterStageView *)bgView
                      pasterID:(int)pasterID
                           img:(UIImage *)img ;
- (void)remove ;

@end
细节思路

上面给出.h的外部Api只和需求有关, 并把只和自己有关的细节放在.m里面
比如说变形按钮, 删除按钮, 拖动等等, 这些都是控制单张贴纸操作的细节 .
有以下几点需要注意:

  • 变形按钮: 实现缩放和旋转
  • 拖动: 手势 ,控制相对位移
  • 删除按钮: 删除在舞台上正在操作的贴纸
#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

细节的实现见源码吧, 贴过来实在是有点冗长, github源码点这里过去欢迎follow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 先讲一个故事: 老人门口有一片草坪,老人非常喜欢安静的在草地上享受阳光。某一天,一群小孩来草地上踢球,非常吵闹。老...
    产品思维阅读 338评论 0 1
  • 为什么要进行主题阅读呢? 在这个知识时代,我想每个爱成长的人都有过“买书如山倒,读书如抽丝”的经历。听各位大神都在...
    会飞的小蜗牛阅读 445评论 2 3
  • 今天看孩子的托付群,看见一个同学吃完菜后还用馒头沾沾盘子的菜汤,群里对这孩子都给了赞,连代课老师也不自觉沾汤!...
    兆木兆木阅读 127评论 0 1