請(qǐng)支持原創(chuàng), 如需轉(zhuǎn)載, 請(qǐng)注明出處@TEASON
先把代碼貼上來(lái),https://github.com/Akateason/XTPaster歡迎follow和star

貼紙功能出現(xiàn)在很多圖片社交中, 就是圖片上面貼圖片, 對(duì)貼紙而言就是需要控制貼紙的位置,旋轉(zhuǎn),大小, 說(shuō)到底是處理gesture,transform,frame, 如果需要多張貼紙, 需要考慮增加刪除和正在操作的對(duì)象 , 你的腦海中需要對(duì)這些東西有個(gè)了解.
鋪墊做到這里, github下載代碼, 集成方式如下
1.把Paster文件夾放到你的項(xiàng)目中
2.把UIImage+AddFunction類目放到你的項(xiàng)目中
主要邏輯在這兩個(gè)類
XTPasterStageView和XTPasterView
1.XTPasterStageView是畫布View,用來(lái)放需要被加工的圖片,是主舞臺(tái),用來(lái)管理貼紙list,貼紙的新增和刪除, 保存退出等
2.XTPasterView是貼紙類. 手勢(shì)或點(diǎn)擊控制旋轉(zhuǎn),位置,大小等
調(diào)用方式
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] ;
如果你只想使用的話, 看到上面足矣 .
下面的部分從宏觀和細(xì)節(jié)兩個(gè)角度大概講一下我個(gè)人實(shí)現(xiàn)的思路 .
大方向思路
- pasterID , 用一個(gè)自增的id來(lái)控制內(nèi)存里的貼紙唯一
- XTPasterStageView管理多張貼紙 , XTPasterView中設(shè)置delegate在XTPasterStageView中回調(diào)控制新增和刪除
- 多張貼紙需要判斷哪一張?jiān)诓僮髦? 所以貼紙類需要一個(gè)bool狀態(tài)
isOnFirst來(lái)控制是否正在操作.
@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
細(xì)節(jié)思路
上面給出.h的外部Api只和需求有關(guān), 并把只和自己有關(guān)的細(xì)節(jié)放在.m里面
比如說(shuō)變形按鈕, 刪除按鈕, 拖動(dòng)等等, 這些都是控制單張貼紙操作的細(xì)節(jié) .
有以下幾點(diǎn)需要注意:
- 變形按鈕: 實(shí)現(xiàn)縮放和旋轉(zhuǎn)
- 拖動(dòng): 手勢(shì) ,控制相對(duì)位移
- 刪除按鈕: 刪除在舞臺(tái)上正在操作的貼紙
#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
細(xì)節(jié)的實(shí)現(xiàn)見(jiàn)源碼吧, 貼過(guò)來(lái)實(shí)在是有點(diǎn)冗長(zhǎng), github源碼點(diǎn)這里過(guò)去歡迎follow