[XTPaster] iOS 貼紙功能 實(shí)現(xiàn)

請(qǐng)支持原創(chuàng), 如需轉(zhuǎn)載, 請(qǐng)注明出處@TEASON

先把代碼貼上來(lái),https://github.com/Akateason/XTPaster歡迎follow和star

XTPaster.gif

貼紙功能出現(xiàn)在很多圖片社交中, 就是圖片上面貼圖片, 對(duì)貼紙而言就是需要控制貼紙的位置,旋轉(zhuǎn),大小, 說(shuō)到底是處理gesture,transform,frame, 如果需要多張貼紙, 需要考慮增加刪除和正在操作的對(duì)象 , 你的腦海中需要對(duì)這些東西有個(gè)了解.

鋪墊做到這里, github下載代碼, 集成方式如下
1.把Paster文件夾放到你的項(xiàng)目中
2.把UIImage+AddFunction類目放到你的項(xiàng)目中

主要邏輯在這兩個(gè)類
XTPasterStageViewXTPasterView
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 先講一個(gè)故事: 老人門口有一片草坪,老人非常喜歡安靜的在草地上享受陽(yáng)光。某一天,一群小孩來(lái)草地上踢球,非常吵鬧。老...
    產(chǎn)品思維閱讀 387評(píng)論 0 1
  • 為什么要進(jìn)行主題閱讀呢? 在這個(gè)知識(shí)時(shí)代,我想每個(gè)愛(ài)成長(zhǎng)的人都有過(guò)“買書如山倒,讀書如抽絲”的經(jīng)歷。聽(tīng)各位大神都在...
    會(huì)飛的小蝸牛閱讀 542評(píng)論 2 3
  • 今天看孩子的托付群,看見(jiàn)一個(gè)同學(xué)吃完菜后還用饅頭沾沾盤子的菜湯,群里對(duì)這孩子都給了贊,連代課老師也不自覺(jué)沾湯!...
    兆木兆木閱讀 144評(píng)論 0 1

友情鏈接更多精彩內(nèi)容