123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624 |
- //
- // SLEditImageController.m
- // DarkMode
- //
- // Created by wsl on 2019/10/31.
- // Copyright © 2019 wsl. All rights reserved.
- //
- #import "SLEditImageController.h"
- #import <Photos/Photos.h>
- #import "UIView+SLImage.h"
- #import "SLBlurView.h"
- #import "SLEditMenuView.h"
- #import "SLEditSelectedBox.h"
- #import "SLImage.h"
- #import "SLImageView.h"
- #import "SLDrawView.h"
- #import "SLEditTextView.h"
- #import "SLMosaicView.h"
- #import "UIImage+SLCommon.h"
- #import "SLImageZoomView.h"
- #import "SLImageClipController.h"
- @interface SLEditImageController ()<UIGestureRecognizerDelegate, SLImageZoomViewDelegate>
- @property (nonatomic, strong) SLImageZoomView *zoomView; // 预览视图 展示编辑的图片 可以缩放
- @property (nonatomic, strong) SLBlurView *editBtn; //编辑
- @property (nonatomic, strong) SLBlurView *againShotBtn; // 再拍一次
- @property (nonatomic, strong) UIButton *saveAlbumBtn; //保存到相册
- @property (nonatomic, strong) UIButton *cancleEditBtn; //取消编辑
- @property (nonatomic, strong) UIButton *doneEditBtn; //完成编辑
- @property (nonatomic, strong) SLEditMenuView *editMenuView; //编辑菜单栏
- @property (nonatomic, strong) UIButton *trashTips; //垃圾桶提示 拖拽删除 贴图或文字
- @property (nonatomic, strong) SLDrawView *drawView; // 涂鸦视图
- @property (nonatomic, strong) NSMutableArray *watermarkArray; // 水印层 所有的贴图和文本
- @property (nonatomic, strong) SLEditSelectedBox *selectedBox; //水印选中框
- @property (nonatomic, strong) SLMosaicView *mosaicView; //马赛克画板
- @property (nonatomic, assign) SLEditMenuType editingMenuType; //当前正在编辑的菜单类型
- @end
- @implementation SLEditImageController
- #pragma mark - Override
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self setupUI];
- }
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- }
- - (BOOL)prefersStatusBarHidden {
- return YES;
- }
- - (void)dealloc {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- NSLog(@"图片编辑视图释放了");
- }
- #pragma mark - UI
- - (void)setupUI {
- self.view.backgroundColor = [UIColor blackColor];
- [self.view addSubview:self.zoomView];
- self.zoomView.pinchGestureRecognizer.enabled = NO;
- self.zoomView.image = self.image;
- if (self.image.size.width > 0) {
- self.zoomView.imageView.frame = CGRectMake(0, 0, self.zoomView.sl_width, self.zoomView.sl_width * self.image.size.height/self.image.size.width);
- }
- if (self.zoomView.imageView.sl_height <= self.zoomView.sl_height) {
- self.zoomView.imageView.center = CGPointMake(self.zoomView.sl_width/2.0, self.zoomView.sl_height/2.0);
- }
-
- //添加裁剪完成监听
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageClippingComplete:) name:@"sl_ImageClippingComplete" object:nil];
-
- [self.view addSubview:self.againShotBtn];
- if (!_isCheckBody) {
- [self.view addSubview:self.editBtn];
- }
- [self.view addSubview:self.saveAlbumBtn];
-
- [self.view addSubview:self.cancleEditBtn];
- [self.view addSubview:self.doneEditBtn];
- }
- #pragma mark - HelpMethods
- // 添加拖拽、缩放、旋转、单击、双击手势
- - (void)addRotateAndPinchGestureRecognizer:(UIView *)view {
- //单击手势选中
- UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
- singleTap.numberOfTapsRequired = 1;
- singleTap.numberOfTouchesRequired = 1;
- [view addGestureRecognizer:singleTap];
- if ([view isKindOfClass:[UILabel class]]) {
- UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapAction:)];
- doubleTap.numberOfTapsRequired = 2;
- doubleTap.numberOfTouchesRequired = 1;
- [singleTap requireGestureRecognizerToFail:doubleTap];
- [view addGestureRecognizer:doubleTap];
- }
- //拖拽手势
- UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragAction:)];
- pan.minimumNumberOfTouches = 1;
- [view addGestureRecognizer:pan];
- //缩放手势
- UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self
- action:@selector(pinchAction:)];
- pinchGestureRecognizer.delegate = self;
- [view addGestureRecognizer:pinchGestureRecognizer];
- //旋转手势
- UIRotationGestureRecognizer *rotateRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self
- action:@selector(rotateAction:)];
- [view addGestureRecognizer:rotateRecognizer];
- rotateRecognizer.delegate = self;
- }
- //置顶视图
- - (void)topSelectedView:(UIView *)topView {
- [self.zoomView.imageView bringSubviewToFront:topView];
- [self.watermarkArray removeObject:topView];
- [self.watermarkArray addObject:topView];
- [SLDelayPerform sl_cancelDelayPerform]; //取消延迟执行
- self.selectedBox.frame = topView.bounds;
- [topView addSubview:self.selectedBox];
- }
- // 隐藏预览按钮
- - (void)hiddenPreviewButton:(BOOL)isHidden {
- self.againShotBtn.hidden = isHidden;
- self.editBtn.hidden = isHidden;
- self.saveAlbumBtn.hidden = isHidden;
- }
- // 隐藏编辑时菜单按钮
- - (void)hiddenEditMenus:(BOOL)isHidden {
- self.cancleEditBtn.hidden = isHidden;
- self.doneEditBtn.hidden = isHidden;
- self.editMenuView.hidden = isHidden;
- }
- #pragma mark - Setter
- - (void)setEditingMenuType:(SLEditMenuType)editingMenuType {
- _editingMenuType = editingMenuType;
- switch (_editingMenuType) {
- case SLEditMenuTypeUnknown:
- self.zoomView.scrollEnabled = YES;
- self.zoomView.pinchGestureRecognizer.enabled = YES;
- break;
- case SLEditMenuTypeGraffiti:
- self.zoomView.pinchGestureRecognizer.enabled = YES;
- self.zoomView.scrollEnabled = NO;
- break;
- case SLEditMenuTypeText:
- self.zoomView.scrollEnabled = YES;
- self.zoomView.pinchGestureRecognizer.enabled = NO;
- break;
- case SLEditMenuTypeSticking:
- self.zoomView.scrollEnabled = YES;
- self.zoomView.pinchGestureRecognizer.enabled = NO;
- break;
- case SLEditMenuTypePictureMosaic:
- self.zoomView.scrollEnabled = NO;
- self.zoomView.pinchGestureRecognizer.enabled = YES;
- break;
- case SLEditMenuTypePictureClipping:
- self.zoomView.scrollEnabled = YES;
- self.zoomView.pinchGestureRecognizer.enabled = YES;
- break;
- default:
- break;
- }
- }
- #pragma mark - Getter
- - (SLImageZoomView *)zoomView {
- if (_zoomView == nil) {
- _zoomView = [[SLImageZoomView alloc] initWithFrame:self.view.bounds];
- _zoomView.backgroundColor = [UIColor blackColor];
- _zoomView.userInteractionEnabled = YES;
- _zoomView.maximumZoomScale = 4;
- _zoomView.zoomViewDelegate = self;
- }
- return _zoomView;
- }
- - (SLBlurView *)editBtn {
- if (_editBtn == nil) {
- _editBtn = [[SLBlurView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
- _editBtn.center = CGPointMake(self.view.sl_width/2.0, self.view.sl_height - 80);
- _editBtn.layer.cornerRadius = _editBtn.sl_width/2.0;
- UIButton * btn = [[UIButton alloc] initWithFrame:_editBtn.bounds];
- [btn setImage:[UIImage imageNamed:@"edit"] forState:UIControlStateNormal];
- [btn addTarget:self action:@selector(editBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- [_editBtn addSubview:btn];
- }
- return _editBtn;
- }
- - (SLBlurView *)againShotBtn {
- if (_againShotBtn == nil) {
- _againShotBtn = [[SLBlurView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
- _againShotBtn.center = CGPointMake((self.view.sl_width/2 - 70/2.0)/2.0, self.view.sl_height - 80);
- _againShotBtn.layer.cornerRadius = _againShotBtn.sl_width/2.0;
- UIButton * btn = [[UIButton alloc] initWithFrame:_againShotBtn.bounds];
- [btn setImage:[UIImage imageNamed:@"cancle"] forState:UIControlStateNormal];
- [btn addTarget:self action:@selector(againShotBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- [_againShotBtn addSubview:btn];
- }
- return _againShotBtn;
- }
- - (UIButton *)saveAlbumBtn {
- if (_saveAlbumBtn == nil) {
- _saveAlbumBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
- _saveAlbumBtn.center = CGPointMake(self.view.sl_width/2.0 + 70/2.0+ (self.view.sl_width/2 - 70/2.0)/2.0, self.view.sl_height - 80);
- _saveAlbumBtn.layer.cornerRadius = _saveAlbumBtn.sl_width/2.0;
- _saveAlbumBtn.backgroundColor = [UIColor whiteColor];
- [_saveAlbumBtn setImage:[UIImage imageNamed:@"save"] forState:UIControlStateNormal];
- [_saveAlbumBtn addTarget:self action:@selector(saveAlbumBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- }
- return _saveAlbumBtn;
- }
- - (UIButton *)cancleEditBtn {
- if (_cancleEditBtn == nil) {
- _cancleEditBtn = [[UIButton alloc] initWithFrame:CGRectMake(15, 30, 40, 30)];
- _cancleEditBtn.hidden = YES;
- [_cancleEditBtn setTitle:@"取消" forState:UIControlStateNormal];
- [_cancleEditBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- _cancleEditBtn.titleLabel.font = [UIFont systemFontOfSize:14];
- [_cancleEditBtn addTarget:self action:@selector(cancleEditBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- }
- return _cancleEditBtn;
- }
- - (UIButton *)doneEditBtn {
- if (_doneEditBtn == nil) {
- _doneEditBtn = [[UIButton alloc] initWithFrame:CGRectMake(self.view.sl_width - 50 - 15, 30, 40, 30)];
- _doneEditBtn.hidden = YES;
- _doneEditBtn.backgroundColor = [UIColor colorWithRed:45/255.0 green:175/255.0 blue:45/255.0 alpha:1];
- [_doneEditBtn setTitle:@"完成" forState:UIControlStateNormal];
- [_doneEditBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- _doneEditBtn.titleLabel.font = [UIFont systemFontOfSize:14];
- _doneEditBtn.layer.cornerRadius = 4;
- [_doneEditBtn addTarget:self action:@selector(doneEditBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- }
- return _doneEditBtn;
- }
- - (SLEditMenuView *)editMenuView {
- if (!_editMenuView) {
- _editMenuView = [[SLEditMenuView alloc] initWithFrame:CGRectMake(0, self.view.sl_height - 80 - 60, self.view.sl_width, 80 + 60)];
- _editMenuView.hidden = YES;
- __weak typeof(self) weakSelf = self;
- _editMenuView.editObject = SLEditObjectPicture;
- _editMenuView.selectEditMenu = ^(SLEditMenuType editMenuType, NSDictionary * _Nullable setting) {
- weakSelf.editingMenuType = ![setting[@"hidden"] boolValue] ? editMenuType : SLEditMenuTypeUnknown;
- if (editMenuType == SLEditMenuTypeGraffiti) {
- weakSelf.drawView.userInteractionEnabled = ![setting[@"hidden"] boolValue];
- if ([setting[@"hidden"] boolValue]) weakSelf.editingMenuType = SLEditMenuTypeUnknown;
- [weakSelf.zoomView.imageView insertSubview:weakSelf.drawView atIndex:([weakSelf.zoomView.imageView.subviews containsObject:weakSelf.mosaicView] ? 1: 0)];
- if (setting[@"lineColor"]) {
- weakSelf.drawView.lineColor = setting[@"lineColor"];
- }
- if (setting[@"goBack"]) {
- [weakSelf.drawView goBack];
- }
- }else {
- weakSelf.drawView.userInteractionEnabled = NO;
- }
- if (editMenuType == SLEditMenuTypeSticking) {
- SLImage *image = setting[@"image"];
- if ([setting[@"hidden"] boolValue]) weakSelf.editingMenuType = SLEditMenuTypeUnknown;
- if (image) {
- SLImageView *imageView = [[SLImageView alloc] initWithFrame:CGRectMake(0, 0, image.size.width/[UIScreen mainScreen].scale, image.size.height/[UIScreen mainScreen].scale)];
- imageView.autoPlayAnimatedImage = NO;
- imageView.userInteractionEnabled = YES;
- CGRect imageRect = [weakSelf.zoomView convertRect:weakSelf.zoomView.imageView.frame toView:weakSelf.view];
- CGPoint center = CGPointZero;
- center.x = fabs(imageRect.origin.x)+weakSelf.zoomView.sl_width/2.0;
- center.y = 0;
- if (imageRect.origin.y >= 0 && imageRect.size.height <= weakSelf.zoomView.sl_height) {
- center.y = imageRect.size.height/2.0;
- }else {
- center.y = fabs(imageRect.origin.y) + weakSelf.zoomView.sl_height/2.0;
- }
- imageView.transform = CGAffineTransformMakeScale(1/weakSelf.zoomView.zoomScale, 1/weakSelf.zoomView.zoomScale);
- center = CGPointMake(center.x/weakSelf.zoomView.zoomScale, center.y/weakSelf.zoomView.zoomScale);
- imageView.center = center;
- imageView.image = image;
- [weakSelf.watermarkArray addObject:imageView];
- [weakSelf.zoomView.imageView addSubview:imageView];
- [weakSelf addRotateAndPinchGestureRecognizer:imageView];
- [weakSelf topSelectedView:imageView];
- [SLDelayPerform sl_startDelayPerform:^{
- [weakSelf.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- }
- }
- if (editMenuType == SLEditMenuTypeText) {
- SLEditTextView *editTextView = [[SLEditTextView alloc] initWithFrame:CGRectMake(0, 0, SL_kScreenWidth, SL_kScreenHeight)];
- [weakSelf.view addSubview:editTextView];
- if ([setting[@"hidden"] boolValue]) weakSelf.editingMenuType = SLEditMenuTypeUnknown;
- editTextView.editTextCompleted = ^(UILabel * _Nullable label) {
- if (label.text.length == 0 || label == nil) {
- return;
- }
- CGRect imageRect = [weakSelf.zoomView convertRect:weakSelf.zoomView.imageView.frame toView:weakSelf.view];
- CGPoint center = CGPointZero;
- center.x = fabs(imageRect.origin.x)+weakSelf.zoomView.sl_width/2.0;
- center.y = 0;
- if (imageRect.origin.y >= 0 && imageRect.size.height <= weakSelf.zoomView.sl_height) {
- center.y = imageRect.size.height/2.0;
- }else {
- center.y = fabs(imageRect.origin.y) + weakSelf.zoomView.sl_height/2.0;
- }
- label.transform = CGAffineTransformMakeScale(1/weakSelf.zoomView.zoomScale, 1/weakSelf.zoomView.zoomScale);
- center = CGPointMake(center.x/weakSelf.zoomView.zoomScale, center.y/weakSelf.zoomView.zoomScale);
- label.center = center;
- [weakSelf.zoomView.imageView addSubview:label];
- [weakSelf.watermarkArray addObject:label];
- [weakSelf addRotateAndPinchGestureRecognizer:label];
- [weakSelf topSelectedView:label];
- [SLDelayPerform sl_startDelayPerform:^{
- [weakSelf.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- };
- }
- if(editMenuType == SLEditMenuTypePictureMosaic) {
- if (setting[@"mosaicType"]) {
- weakSelf.mosaicView.userInteractionEnabled = ![setting[@"hidden"] boolValue];
- if ([setting[@"hidden"] boolValue]) weakSelf.editingMenuType = SLEditMenuTypeUnknown;
- weakSelf.mosaicView.mosaicType = [setting[@"mosaicType"] integerValue];
- [weakSelf.zoomView.imageView insertSubview:weakSelf.mosaicView atIndex:0];
- }
- if (setting[@"goBack"]) {
- [weakSelf.mosaicView goBack];
- }
- }else {
- weakSelf.mosaicView.userInteractionEnabled = NO;
- }
- if (editMenuType == SLEditMenuTypePictureClipping) {
- SLImageClipController *imageClipController = [[SLImageClipController alloc] init];
- imageClipController.modalPresentationStyle = UIModalPresentationFullScreen;
- [weakSelf.selectedBox removeFromSuperview];
- UIImage *image = [weakSelf.zoomView.imageView sl_imageByViewInRect:weakSelf.zoomView.imageView.bounds];
- imageClipController.image = image;
- [weakSelf presentViewController:imageClipController animated:NO completion:nil];
- }
- };
- [self.view addSubview:_editMenuView];
- }
- return _editMenuView;
- }
- - (UIButton *)trashTips {
- if (!_trashTips) {
- _trashTips = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
- _trashTips.center = CGPointMake(SL_kScreenWidth/2.0, SL_kScreenHeight - 60);
- [_trashTips setTitle:@"拖动到此处删除" forState:UIControlStateNormal];
- [_trashTips setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- _trashTips.titleLabel.font = [UIFont systemFontOfSize:14];
- }
- return _trashTips;
- }
- - (SLDrawView *)drawView {
- if (!_drawView) {
- _drawView = [[SLDrawView alloc] initWithFrame:self.zoomView.imageView.bounds];
- _drawView.backgroundColor = [UIColor clearColor];
- _drawView.lineWidth = 5.0;
- __weak typeof(self) weakSelf = self;
- _drawView.drawBegan = ^{
- [weakSelf hiddenEditMenus:YES];
- };
- _drawView.drawEnded = ^{
- [weakSelf hiddenEditMenus:NO];
- };
- }
- return _drawView;
- }
- - (NSMutableArray *)watermarkArray {
- if (!_watermarkArray) {
- _watermarkArray = [NSMutableArray array];
- }
- return _watermarkArray;
- }
- - (SLEditSelectedBox *)selectedBox {
- if (!_selectedBox) {
- _selectedBox = [[SLEditSelectedBox alloc] init];
- }
- return _selectedBox;
- }
- - (SLMosaicView *)mosaicView {
- if (!_mosaicView) {
- _mosaicView = [[SLMosaicView alloc] initWithFrame:self.zoomView.imageView.bounds];
- __weak typeof(self) weakSelf = self;
- _mosaicView.squareWidth = 15;
- _mosaicView.paintSize = CGSizeMake(40, 40);
- _mosaicView.brushColor = ^UIColor *(CGPoint point) {
- point.x = point.x/weakSelf.view.frame.size.width*weakSelf.zoomView.image.size.width;
- point.y = point.y/weakSelf.view.frame.size.height*weakSelf.zoomView.image.size.height;
- point.x = point.x/self.zoomView.zoomScale;
- point.y = point.y/self.zoomView.zoomScale;
- return [weakSelf.zoomView.image sl_colorAtPixel:point];
- };
- _mosaicView.brushBegan = ^{
- [weakSelf hiddenEditMenus:YES];
- };
- _mosaicView.brushEnded = ^{
- [weakSelf hiddenEditMenus:NO];
- };
- _mosaicView.userInteractionEnabled = YES;
- }
- return _mosaicView;
- }
- #pragma mark - Events Handle
- //编辑
- - (void)editBtnClicked:(id)sender {
- self.zoomView.pinchGestureRecognizer.enabled = YES;
- [self hiddenEditMenus:NO];
- [self hiddenPreviewButton:YES];
- }
- //再试一次 继续拍摄
- - (void)againShotBtnClicked:(id)sender {
- [self dismissViewControllerAnimated:NO completion:nil];
- }
- //保存到相册
- - (void)saveAlbumBtnClicked:(id)sender {
- if(self.image && self.editPhotoBlock) {
- [self dismissViewControllerAnimated:NO completion:^{
- self.editPhotoBlock(self.image);
- }];
- // UIImageWriteToSavedPhotosAlbum(self.image, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);
- }
- }
- - (void)initEditPhotoBlock:(EditPhotoBlock)block {
- self.editPhotoBlock = block;
- }
- //保存图片完成后调用的方法
- - (void)savedPhotoImage:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo {
- SL_DISPATCH_ON_MAIN_THREAD(^{
- [self againShotBtnClicked:nil];
- });
- if (error) {
- NSLog(@"保存图片出错%@", error.localizedDescription);
- } else {
- NSLog(@"保存图片成功");
- }
- }
- //取消编辑
- - (void)cancleEditBtnClicked:(id)sender {
- [self hiddenPreviewButton:NO];
- [self hiddenEditMenus:YES];
- [self.selectedBox removeFromSuperview];
- [_editMenuView removeFromSuperview];
- _editMenuView = nil;
- [_drawView removeFromSuperview];
- _drawView = nil;
- [_mosaicView removeFromSuperview];
- _mosaicView = nil;
- for (UIView *view in self.watermarkArray) {
- [view removeFromSuperview];
- }
- [self.watermarkArray removeAllObjects];
- self.zoomView.zoomScale = 1;
- self.zoomView.image = self.image;
- self.zoomView.pinchGestureRecognizer.enabled = NO;
- self.zoomView.imageView.frame = CGRectMake(0, 0, self.zoomView.sl_width, self.zoomView.sl_width * self.image.size.height/self.image.size.width);
- if (self.zoomView.imageView.sl_height <= self.zoomView.sl_height) {
- self.zoomView.imageView.center = CGPointMake(self.zoomView.sl_width/2.0, self.zoomView.sl_height/2.0);
- }
- self.zoomView.contentSize = CGSizeMake(self.zoomView.imageView.sl_width, self.zoomView.imageView.sl_height);
- }
- //完成编辑 导出编辑后的对象
- - (void)doneEditBtnClicked:(id)sender {
- [self.selectedBox removeFromSuperview];
- self.image = [self.zoomView.imageView sl_imageByViewInRect:self.zoomView.imageView.bounds];
- [self cancleEditBtnClicked:nil];
- }
- // 点击水印视图
- - (void)singleTapAction:(UITapGestureRecognizer *)singleTap {
- [self topSelectedView:singleTap.view];
- if (singleTap.state == UIGestureRecognizerStateFailed || singleTap.state == UIGestureRecognizerStateEnded) {
- [SLDelayPerform sl_startDelayPerform:^{
- [self.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- }
- }
- //双击 文本水印 开始编辑文本
- - (void)doubleTapAction:(UITapGestureRecognizer *)doubleTap {
- [self topSelectedView:doubleTap.view];
- doubleTap.view.hidden = YES;
- UILabel *tapLabel = (UILabel *)doubleTap.view;
- SLEditTextView *editTextView = [[SLEditTextView alloc] initWithFrame:CGRectMake(0, 0, SL_kScreenWidth, SL_kScreenHeight)];
- editTextView.configureEditParameters(@{@"textColor":tapLabel.textColor, @"backgroundColor":tapLabel.backgroundColor, @"text":tapLabel.text});
- editTextView.editTextCompleted = ^(UILabel * _Nullable label) {
- doubleTap.view.hidden = NO;
- if (label == nil) {
- return;
- }
- label.transform = tapLabel.transform;
- label.center = tapLabel.center;
- [tapLabel removeFromSuperview];
- [self.watermarkArray removeObject:tapLabel];
- [self.watermarkArray addObject:label];
- [self.zoomView.imageView addSubview:label];
- [self addRotateAndPinchGestureRecognizer:label];
- [self topSelectedView:label];
- [SLDelayPerform sl_startDelayPerform:^{
- [self.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- };
- [self.view addSubview:editTextView];
- }
- // 拖拽 水印视图
- - (void)dragAction:(UIPanGestureRecognizer *)pan {
- // 返回的是相对于最原始的手指的偏移量
- CGPoint transP = [pan translationInView:self.zoomView.imageView];
- if (pan.state == UIGestureRecognizerStateBegan) {
- self.zoomView.imageView.clipsToBounds = NO;
- [self hiddenEditMenus:YES];
- [self.view addSubview:self.trashTips];
- [self topSelectedView:pan.view];
- } else if (pan.state == UIGestureRecognizerStateChanged ) {
- pan.view.center = CGPointMake(pan.view.center.x + transP.x, pan.view.center.y + transP.y);
- [pan setTranslation:CGPointZero inView:self.zoomView.imageView];
- //获取拖拽的视图在屏幕上的位置
- CGRect rect = [pan.view convertRect: pan.view.bounds toView:self.view];
- //是否删除 删除视图Y < 视图中心点Y坐标
- if (self.trashTips.center.y < rect.origin.y+rect.size.height/2.0) {
- [self.trashTips setTitle:@"松手即可删除" forState:UIControlStateNormal];
- [self.trashTips setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
- }else {
- [self.trashTips setTitle:@"拖动到此处删除" forState:UIControlStateNormal];
- [self.trashTips setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- }
- } else if (pan.state == UIGestureRecognizerStateFailed || pan.state == UIGestureRecognizerStateEnded) {
- [self hiddenEditMenus:NO];
- self.zoomView.imageView.clipsToBounds = YES;
- //获取拖拽的视图在屏幕上的位置
- CGRect rect = [pan.view convertRect: pan.view.bounds toView:self.view];
- CGRect imageRect = [self.zoomView convertRect:self.zoomView.imageView.frame toView:self.view];
- //删除拖拽的视图
- if (self.trashTips.center.y < rect.origin.y+rect.size.height/2.0) {
- [pan.view removeFromSuperview];
- [self.watermarkArray removeObject:(SLImageView *)pan.view];
- }else if (!CGRectIntersectsRect(imageRect, rect)) {
- //如果出了父视图zoomView的范围,则置于父视图中心
- CGPoint center = CGPointZero;
- center.x = fabs(imageRect.origin.x)+self.zoomView.sl_width/2.0;
- center.y = 0;
- if (imageRect.origin.y >= 0 && imageRect.size.height <= self.zoomView.sl_height) {
- center.y = imageRect.size.height/2.0;
- }else {
- center.y = fabs(imageRect.origin.y) + self.zoomView.sl_height/2.0;
- }
- center = CGPointMake(center.x/self.zoomView.zoomScale, center.y/self.zoomView.zoomScale);
- pan.view.center = center;
- }
- [self.trashTips removeFromSuperview];
- [SLDelayPerform sl_startDelayPerform:^{
- [self.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- }
- }
- //缩放 水印视图
- - (void)pinchAction:(UIPinchGestureRecognizer *)pinch {
- if (pinch.state == UIGestureRecognizerStateBegan) {
- [self topSelectedView:pinch.view];
- self.zoomView.pinchGestureRecognizer.enabled = NO;
- self.zoomView.imageView.clipsToBounds = NO;
- }else if (pinch.state == UIGestureRecognizerStateFailed || pinch.state == UIGestureRecognizerStateEnded){
- [SLDelayPerform sl_startDelayPerform:^{
- [self.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- self.zoomView.pinchGestureRecognizer.enabled = YES;
- self.zoomView.imageView.clipsToBounds = YES;
- }
- pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
- pinch.scale = 1.0;
- }
- //旋转 水印视图 注意:旋转之后的frame会变!!!
- - (void)rotateAction:(UIRotationGestureRecognizer *)rotation {
- if (rotation.state == UIGestureRecognizerStateBegan) {
- [self topSelectedView:rotation.view];
- }else if (rotation.state == UIGestureRecognizerStateFailed || rotation.state == UIGestureRecognizerStateEnded){
- [SLDelayPerform sl_startDelayPerform:^{
- [self.selectedBox removeFromSuperview];
- } afterDelay:1.0];
- }
- rotation.view.transform = CGAffineTransformRotate(rotation.view.transform, rotation.rotation);
- // 将旋转的弧度清零(注意不是将图片旋转的弧度清零, 而是将当前手指旋转的弧度清零)
- rotation.rotation = 0;
- }
- // 图片裁剪完成
- - (void)imageClippingComplete:(NSNotification *)notification {
- UIImage *clipImage = notification.userInfo[@"image"];
- self.zoomView.zoomScale = 1;
- self.zoomView.image = clipImage;
- self.zoomView.imageView.frame = CGRectMake(0, 0, self.zoomView.sl_width, self.zoomView.sl_width * clipImage.size.height/clipImage.size.width);
- if (self.zoomView.imageView.sl_height <= self.zoomView.sl_height) {
- self.zoomView.imageView.center = CGPointMake(self.zoomView.sl_width/2.0, self.zoomView.sl_height/2.0);
- }
- self.zoomView.contentSize = CGSizeMake(self.zoomView.imageView.sl_width, self.zoomView.imageView.sl_height);
-
- _drawView.frame = self.zoomView.imageView.bounds;
- _mosaicView.frame = self.zoomView.imageView.bounds;
- [_drawView clear];
- [_mosaicView clear];
- for (UIView *view in self.watermarkArray) {
- [view removeFromSuperview];
- }
- [self.watermarkArray removeAllObjects];
- }
- #pragma mark - UIGestureRecognizerDelegate
- // 该方法返回的BOOL值决定了view是否能够同时响应多个手势
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
- // NSLog(@"%@ - %@", gestureRecognizer.class, otherGestureRecognizer.class);
- return YES;
- }
- #pragma mark - SLZoomViewDelegate
- - (void)zoomViewDidEndMoveImage:(SLImageZoomView *)zoomView {
- self.drawView.lineWidth = 5.0/self.zoomView.zoomScale;
- self.mosaicView.squareWidth = 15/self.zoomView.zoomScale;
- self.mosaicView.paintSize = CGSizeMake(40/self.zoomView.zoomScale, 40/self.zoomView.zoomScale);
- }
- @end
|