iOS实现图片裁剪功能,基于TKImageView完善与讲解
1、功能需求:
需要实现图片区域裁剪功能。
2、效果图:

3、实现原理:
本来想自己实现的,刚好看到一个比较好的库:TKImageView,下载好研究了下,发现基本都能满足我的需求,而且封装的也比较好。
于是自己就顺便仔细研读了下源码,并且稍微修改了下代码,增加了一些必要的注释(原文真的一清二白的注释啊),同时增加了一个内部裁剪按钮功能。
先放一张大概解释图:

其中:
区域1、表示边框拖动范围
区域2、表示边角拖动范围
区域3、表示裁剪框移动手势范围+捏合手势操作范围
区域4、内部裁剪按钮范围(当然这个是可以根据裁剪框位置变动的)
4、属性介绍
控制属性
@interface TKImageView : UIView
//需要裁剪的背景图
@property (strong, nonatomic) UIImage *toCropImage;
/* -----------------自定义属性--------------------------- */
//是否允许手指捏合,默认NO (如果需要,必须使用时设置yes)
@property (assign, nonatomic) BOOL needScaleCrop;
//是否允许拖动边框,默认yes
@property (assign, nonatomic) BOOL showMidLines;
//裁剪框的border宽度是否计算在裁剪框长宽里面,默认no,一般默认值即可。
@property (assign, nonatomic) BOOL cornerBorderInImage;
//是否显示内部的裁剪按钮,默认no (设置yes,会在裁剪框旁边显示裁剪和取消按钮)
//一般在ipone横屏或pad上使用时,放开这个比较好,不然iphone竖屏,屏幕太小,更适合外部设置裁剪按钮
@property (nonatomic,assign) BOOL  showInsideCropButton;
//裁剪框 宽高比(比如设置0.5,就是一个竖直的长方形),默认0(任意形状)
//注意:设置了这个,showMidLines就无效了=不能拖动边,只能拖角进行缩放
@property (assign, nonatomic) CGFloat cropAspectRatio;
//裁剪框最小间距,默认10
//注意:这里的最小要排除掉边角点击区域view的宽度,所以真实的最小裁剪框边长 = 2*cropAreaCornerWidth+minSpace)
@property (assign, nonatomic) CGFloat minSpace;
//初始裁剪框大小比例(用占比图片长宽比得出宽高),默认0.5
@property (assign, nonatomic) CGFloat initialScaleFactor;
//遮罩层透明度,默认0.6
@property (assign, nonatomic) CGFloat maskAlpha;
颜色宽度等基本属性
/* -----------------颜色、宽度属性--------------------------- */
//裁剪边框颜色
@property (strong, nonatomic) UIColor *cropAreaBorderLineColor;
//裁剪边框宽度
@property (assign, nonatomic) CGFloat cropAreaBorderLineWidth;
//4个边角线颜色 (这个外贴着边角显示两条边)
@property (strong, nonatomic) UIColor *cropAreaCornerLineColor;
//4个边角线宽度
@property (assign, nonatomic) CGFloat cropAreaCornerLineWidth;
//4个边角点击区域宽度
@property (assign, nonatomic) CGFloat cropAreaCornerWidth;
//4个边角点击区域高度
@property (assign, nonatomic) CGFloat cropAreaCornerHeight;
//4条边中间显示的线宽(这个线外贴着边框线中间显示)
@property (assign, nonatomic) CGFloat cropAreaMidLineWidth;
//4条边中间显示的线高
@property (assign, nonatomic) CGFloat cropAreaMidLineHeight;
//4条边中间显示的线颜色
@property (strong, nonatomic) UIColor *cropAreaMidLineColor;
//裁剪按钮的宽高,默认:边角点击区域高宽(只有设置showInsideCropButton = yes 才有效)
@property (nonatomic, assign) CGFloat  btnCropWH;
获取最终裁剪图片方法
/* -----------------获取截取图片--------------------------- */
//最终截取的图片
- (UIImage *)currentCroppedImage;
此外,我添加了内部裁剪按钮,适用于全屏图片或大屏区域操作(横屏或pad等)
/**
 裁剪按钮代理事件
 */
@protocol TKImageViewDelegate <NSObject>
- (void)TKImageViewFinish:(UIImage *)cropImage; //完成裁剪
- (void)TKImageViewCancel;      //取消裁剪
@end
5、如何使用
使用比较简单,可基于view或控制器上添加此试图即可。
- (void)setUpTKImageView {
    self.tkImageView = [[TKImageView alloc] initWithFrame:self.view.bounds];
    _tkImageView.toCropImage = _image;          //设置底图(必须属性!)
    _tkImageView.needScaleCrop = YES;           //允许手指捏和缩放裁剪框
    _tkImageView.showInsideCropButton = YES;    //允许内部裁剪按钮
    _tkImageView.btnCropWH = 30;                //内部裁剪按钮宽高,有默认值,不设也没事
    _tkImageView.delegate = self;               //需要实现内部裁剪代理事件
    [self.view addSubview:_tkImageView];
}
6、一些注意点
- 使用时,toCropImage属性必须设置,其他都是可选属性
 - 捏合手势默认关闭,若需要,必须设置yes开启
 - 内部裁剪按钮默认关闭,若需要,必须开启并设置好代理
 - 其他属性,上文都有详细注释,基本能明白每个属性含义
 
7、源码获取
代码都在我的测试demo

8、最后鸣谢
此文是基于TKImageView库实现的,感谢作者。
iOS实现图片裁剪功能,基于TKImageView完善与讲解的更多相关文章
- 鸿蒙Java开发模式11:鸿蒙图片裁剪功能的实现
		
鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口] 目录: 1. 鸿蒙版图片裁剪功能效果展示 2.Java代码实现 3.裁剪工具类实现 4.<鸿蒙Java开发模式>系 ...
 - Android 系统自带图片裁剪功能(适配7.0、8.0、对了还有小米手机)
		
前段时间写了如何获取相册和拍照之后的照片并且进行显示和上传,这一次是如何进行圆形图像制作,经常看我写的笔记的人会知道,我很懒.那么我就懒的自定义了,目前需求就用原生的就好了,大神的轮子,我会在后面进行 ...
 - iOS圆形图片裁剪,以及原型图片外面加一个圆环
		
废话不多说,直接上代码 #import "ViewController.h" @interface ViewController () @property (nonatomic,s ...
 - iOS圆形图片裁剪,原型图片外面加一个圆环
		
/** * 在圆形外面加一个圆环 */ - (void)yuanHuan{ //0.加载图片 UIImage *image = [UIImage imageNamed:@"AppIcon1 ...
 - iOS常见用户头像的圆形图片裁剪常见的几种方法
		
在开发中,基本上APP的用户头像的处理都需要把用户所上传的方形图片,处理为圆形图片.在这里就总结三种常见的处理圆形图片的方法. 1.使用位图上下文 2.使用UIView的layer进行处理 3.使用r ...
 - jQuery插件ImgAreaSelect 实例讲解一(头像上传预览和裁剪功能)
		
上一节随笔中,我们已经知道了关于jQuery插件ImgAreaSelect基本的知识:那么现在看一下实例: 首先,要知道我们应该实现什么功能? (1)图片能够实现上传预览功能 (2)拖拽裁剪图片,使其 ...
 - 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码
		
 1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...
 - java 图片裁剪
		
图片裁剪功能,我一直以为是前端那边去做,后台不用做过多的考虑,现在我发现,前端去做裁剪好像不是太理想,我在这里简单地介绍一下我们大java的裁剪功能 前端只需要上传,x (x轴),y(y轴) , h( ...
 - [Android] 图片裁剪总结——调用系统裁剪
		
花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下 ...
 
随机推荐
- sql查询count 单独字段不同值
			
1.单表查询 SELECT COUNT(CASE WHEN (字段=值列1) THEN reportstatus END) AS 已上报,COUNT(CASE WHEN (字段=值列0) THEN 字 ...
 - 数据结构之二叉搜索树、AVL自平衡树
			
前言 最近在帮公司校招~~ 所以来整理一些数据结构方面的知识,这些知识呢,光看一遍理解还是很浅的,看过跟动手做过一遍的同学还是很容易分辨的哟~ 一直觉得数据结构跟算法,就好比金庸小说里的<九阳神 ...
 - asp.net core 依赖注入实现全过程粗略剖析(3)
			
接着 前面,前面的过程是普遍常用的依赖注入解析过程,我们正常都是在startup类中注入依赖服务,但是,笔者这周开发的时候遇到个问题,不同服务的生命周期不同,不能调用服务.举个例子,AddDbCont ...
 - class关键字
			
class的数据类型为function,可以看做构造函数的另一种写法.事实上,类的所有方法都定义在类的prototype属性上面.一.声明class class Animal { constructo ...
 - C语言基础一(敲打键盘、寻找资料)
			
事前声明一点:小编的所有材料都是基础,没有什么大的不同,您若觉得不错的话,可以互相探讨下,毕竟本人也是小雏鸟. 大家在学习C语言.C++类似的高端语言时候,往往都是为了学而学,殊不知为什么而学,或许更 ...
 - python正则表达式(三)
			
表示边界 示例1:$ 需求:匹配163.com的邮箱地址 #coding=utf-8 import re # 正确的地址 ret = re.match("[\w]{4,20}@163\.co ...
 - Space Elevator [POJ2392] [DP][优化]
			
题目大意 n件物品,第i件hi高,有ci件,最高的一件不能超过ai的高度.问最高能堆多高 输入: 第一行,一个n 接下来每一行,为hi,ai,ci 输出,最高堆多高 样例输入: 37 40 35 23 ...
 - 编程菜鸟的日记-初学尝试编程-寻找2到n之间的素数并输出
			
//输入一个整数n,输出2到n之间的具体素数值 #include <iostream> #include <algorithm> #include <cmath> ...
 - js计算本地时间
			
获取时间戳: 方法一 var dateTime = new Date();//获取本地时间 var nowTime = dateTime.getTime();//获取本地毫秒,即当前时间 var en ...
 - Java中Iterator(迭代器)实现原理
			
在Java中遍历List时会用到Java提供的Iterator,Iterator十分好用,原因是: 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结 ...