CropViewController 2.7.4

CropViewController 2.7.4

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2024年5月
SPM支持 SPM

Tim Oliver 维护。



  • 作者:
  • Tim Oliver

TOCropViewController

CI Version Carthage compatible GitHub license Platform

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
  1. 在您的Cartfile中添加以下内容
github "TimOliver/TOCropViewController"
  1. 运行carthage update

  2. Carthage/Build文件夹中,将其中一个框架导入到您的Xcode项目中。对于Objective-C项目,仅导入TOCropViewController.framework;对于Swift项目,则导入CropViewController.framework。每个框架都是独立的,您不需要导入两个框架。

  3. 遵循使用Carthage入门中的剩余步骤,以完成框架的集成。

手动安装

TOCropViewController的所有必需源文件和资源文件都位于Objective-C/TOCropViewController中,而所有必需的Swift文件都位于Swift/CropViewController中。

对于Objective-C项目,只需将TOCropViewController目录复制到您的Xcode项目中。对于Swift项目,复制TOCropViewControllerCropViewController到您的项目中。

示例

使用 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文件。