TOCropViewController
TOCropViewController
是一个开源的 UIViewController
子类,用于裁剪 UIImage
对象的部分,以及执行基本的旋转操作。它非常适合编辑头像、在线分享照片等操作。它是以 iOS 照片应用编辑器为参考设计的,因此其行为对 iOS 用户来说应该已经很熟悉了。
对于 Swift 开发者来说,CropViewController
是一个 Swift 封装器,它完全封装了 TOCropViewController
并提供了一个更加原生、Swifter 的接口。
自豪地为以下应用程序提供支持
是否在寻找更多功能?如果 TOCropViewController
无法满足您的要求,请考虑使用带有视频编辑和照片滤镜功能的 IMG.LY!(免责声明:合作伙伴链接)
功能
- 通过拖动网格覆盖层的边缘裁剪图像。
- 可选地,裁剪图像的圆形副本。
- 以90度为单位旋转图像。
- 将裁剪框锁定到特定宽高比。
- 一个重置按钮,可以完全撤销所有更改。
- 实现iOS 7/8透明效果,使裁剪区域更易于查看。
- 选择控制器将裁剪后的图像返回给代理,或立即传递给
UIActivityViewController
。 - 设备旋转到横屏模式时的自定义动画和布局。
- 自定义的“打开”和“关闭”动画。
- 支持28种语言本地化。
系统要求
iOS 8.0或更高版本
安装
CocoaPods
Objective-C
在您的Podfile中添加以下内容
pod 'TOCropViewController'
Swift
在您的Podfile中添加以下内容
pod 'CropViewController'
Swift包管理器
在您的Package.swift
中添加以下内容
dependencies: [
// ...
.package(url: "https://github.com/TimOliver/TOCropViewController.git"),
],
Carthage
- 在您的Cartfile中添加以下内容
github "TimOliver/TOCropViewController"
-
运行
carthage update
-
从
Carthage/Build
文件夹中,将其中一个框架导入到您的Xcode项目中。对于Objective-C项目,仅导入TOCropViewController.framework
;对于Swift项目,则导入CropViewController.framework
。每个框架都是独立的,您不需要导入两个框架。 -
遵循使用Carthage入门中的剩余步骤,以完成框架的集成。
手动安装
TOCropViewController
的所有必需源文件和资源文件都位于Objective-C/TOCropViewController
中,而所有必需的Swift文件都位于Swift/CropViewController
中。
对于Objective-C项目,只需将TOCropViewController
目录复制到您的Xcode项目中。对于Swift项目,复制TOCropViewController
和CropViewController
到您的项目中。
示例
使用 TOCropViewController
非常简单。只需创建一个新的实例,传入你希望裁剪的 UIImage
对象,然后将其模态地显示在屏幕上。
虽然 TOCropViewController
倾向于模态显示,但也可以将其推送到 UINavigationController
栈中。
要查看完整的示例,请参阅此仓库中包含的示例应用程序。
基本实现
Swift
func presentCropViewController() {
let image: UIImage = ... //Load an image
let cropViewController = CropViewController(image: image)
cropViewController.delegate = self
present(cropViewController, animated: true, completion: nil)
}
func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
// 'image' is the newly cropped version of the original image
}
Objective-C
- (void)presentCropViewController
{
UIImage *image = ...; // Load an image
TOCropViewController *cropViewController = [[TOCropViewController alloc] initWithImage:image];
cropViewController.delegate = self;
[self presentViewController:cropViewController animated:YES completion:nil];
}
- (void)cropViewController:(TOCropViewController *)cropViewController didCropToImage:(UIImage *)image withRect:(CGRect)cropRect angle:(NSInteger)angle
{
// 'image' is the newly cropped version of the original image
}
类似于许多 UIKit
UIViewController
子类,例如 MFMailComposeViewController
,负责显示视图控制器的类还应负责在取消时将其关闭。要关闭 TOCropViewController
,请实现 cropViewController:didFinishCancelled:
代理方法,并从那里调用 dismissViewController:animated:
。
创建圆形裁剪图像
Swift
func presentCropViewController() {
var image: UIImage? // Load an image
let cropViewController = CropViewController(croppingStyle: .circular, image: image)
cropViewController.delegate = self
self.present(cropViewController, animated: true, completion: nil)
}
func cropViewController(_ cropViewController: TOCropViewController?, didCropToCircularImage image: UIImage?, with cropRect: CGRect, angle: Int) {
// 'image' is the newly cropped, circular version of the original image
}
Objective-C
- (void)presentCropViewController
{
UIImage *image = ...; // Load an image
TOCropViewController *cropViewController = [[TOCropViewController alloc] initWithCroppingStyle:TOCropViewCroppingStyleCircular image:image];
cropViewController.delegate = self;
[self presentViewController:cropViewController animated:YES completion:nil];
}
- (void)cropViewController:(TOCropViewController *)cropViewController didCropToCircularImage:(UIImage *)image withRect:(CGRect)cropRect angle:(NSInteger)angle
{
// 'image' is the newly cropped, circular version of the original image
}
通过共享表单共享裁剪的图像
Swift
func presentCropViewController() {
var image: UIImage? // Load an image
let cropViewController = CropViewController(image: image)
cropViewController.showActivitySheetOnDone = true
self.present(cropViewController, animated: true, completion: nil)
}
Objective-C
- (void)presentCropViewController
{
UIImage *image = ...; // Load an image
TOCropViewController *cropViewController = [[TOCropViewController alloc] initWithImage:image];
cropViewController.showActivitySheetOnDone = YES;
[self presentViewController:cropViewController animated:YES completion:nil];
}
使用自定义动画进行演示
可选地,TOCropViewController
还支持自定义演示动画,其中一个已显示的图像副本会放大以填满屏幕。
Swift
func presentCropViewController() {
var image: UIImage? // Load an image
var imageView = UIImageView(image: image)
var frame: CGRect = view.convert(imageView.frame, to: view)
let cropViewController = CropViewController(image: image)
cropViewController.delegate = self
self.present(cropViewController, animated: true, completion: nil)
cropViewController.presentAnimated(fromParentViewController: self, fromFrame: frame, completion: nil)
}
Objective-C
- (void)presentCropViewController
{
UIImage *image = ...;
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect frame = [self.view convertRect:imageView.frame toView:self.view];
TOCropViewController *cropViewController = [[TOCropViewController alloc] initWithImage:image];
cropViewController.delegate = self;
[self presentViewController:cropViewController animated:YES completion:nil];
[cropViewController presentAnimatedFromParentViewController:self fromFrame:frame completion:nil];
}
TOCropViewController
的架构
与传统裁剪UI实现通常只会有一个中间挖空的暗色视图不同,TOCropViewController
的实施方式略有不同。
因为有两组视图叠加在图像上(一个暗色视图和一个半透明视图),同时在这两个视图上挖洞会比较复杂。因此,在背景中放置一个图像视图,然后在容器视图中放置一个图像副本ını,该容器视图裁剪到指定的裁剪大小中。然后调整前景图像的大小和位置使其匹配背景视图,这样就产生了暗色视图中存在洞的错觉,并且减少了屏幕上的视图数量。
致谢
TOCropViewController
最初由Tim Oliver创建,作为iComics(一款iOS漫画阅读应用)组件。
感谢众多贡献者对TOCropViewController
的发展作出的贡献!
截图中的iOS设备设计图由Pixeden制作。
许可证
TOCropViewController遵循MIT许可证,请参阅LICENSE文件。