You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:如何修改UIImagePickerController的编辑器裁剪尺寸

修改UIImagePickerController编辑区域尺寸的方案

嘿,刚好我之前也踩过这个坑!先给你明确个关键点:系统自带的UIImagePickerController编辑界面的裁剪区域尺寸是没法直接修改的——苹果并没有开放对应的API来调整这个区域的大小或比例,当你设置allowsEditing = true时,只能用它默认的裁剪框(一般是正方形,或者适配设备的固定比例)。

不过别担心,有几个靠谱的替代方案可以实现自定义尺寸的图片裁剪:

方案1:关闭系统编辑,使用自定义裁剪控件

这是最常用的方式,放弃系统自带的编辑界面,自己实现或用成熟的第三方库来控制裁剪区域:

  1. 先关闭系统编辑:
imagePicker.allowsEditing = false
  1. 在图片选择完成的回调里(UIImagePickerControllerDelegate的didFinishPickingMediaWithInfo方法)获取原图,然后跳转到自定义的裁剪页面:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true)
    
    // 获取原图
    guard let originalImage = info[.originalImage] as? UIImage else { return }
    
    // 跳转到自定义裁剪VC,这里以第三方库TOCropViewController为例
    let cropVC = TOCropViewController(image: originalImage)
    // 设置你想要的裁剪比例,比如16:9
    cropVC.aspectRatioPreset = .preset16x9
    cropVC.aspectRatioLockEnabled = true
    cropVC.delegate = self
    present(cropVC, animated: true)
}
  1. 实现裁剪后的回调,拿到裁剪好的图片:
func cropViewController(_ cropViewController: TOCropViewController, didCropTo image: UIImage, with cropRect: CGRect, angle: Int) {
    cropViewController.dismiss(animated: true)
    // 把裁剪后的图片赋值给预览ImageView
    preview.image = image
}

方案2:用PHPickerViewController(iOS 14+)替代UIImagePickerController

从iOS14开始,苹果推荐使用PHPickerViewController来替代老旧的UIImagePickerController,它更灵活且权限更友好。同样,它的自带编辑也不能改尺寸,所以还是配合自定义裁剪:

  1. 先导入PhotosUI框架:
import PhotosUI
  1. 实现图片选择逻辑:
@IBAction func selectImage(_ sender: Any) {
    var configuration = PHPickerConfiguration()
    configuration.filter = .images // 只选择图片
    configuration.allowsEditing = false // 关闭系统编辑
    let picker = PHPickerViewController(configuration: configuration)
    picker.delegate = self
    present(picker, animated: true)
}

// PHPickerDelegate回调
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    picker.dismiss(animated: true)
    
    guard let result = results.first, result.itemProvider.canLoadObject(ofClass: UIImage.self) else { return }
    
    result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
        guard let self = self, let originalImage = image as? UIImage else { return }
        
        DispatchQueue.main.async {
            // 同样跳转到自定义裁剪VC处理
            let cropVC = TOCropViewController(image: originalImage)
            cropVC.aspectRatioPreset = .preset4x3 // 设置你需要的比例
            cropVC.delegate = self
            self.present(cropVC, animated: true)
        }
    }
}

方案3:手动实现图片裁剪(无需第三方库)

如果你不想引入第三方库,可以自己手动计算裁剪区域并生成新图片:

// 自定义裁剪方法,传入原图和目标裁剪尺寸
func cropImage(_ image: UIImage, to targetSize: CGSize) -> UIImage? {
    let imageSize = image.size
    let widthRatio = targetSize.width / imageSize.width
    let heightRatio = targetSize.height / imageSize.height
    
    // 取较小的比例,保证裁剪后的图片能覆盖目标尺寸
    let scaleRatio = min(widthRatio, heightRatio)
    let scaledImageSize = CGSize(width: imageSize.width * scaleRatio, height: imageSize.height * scaleRatio)
    
    // 计算裁剪的起始位置,居中裁剪
    let cropX = (imageSize.width - scaledImageSize.width) / 2
    let cropY = (imageSize.height - scaledImageSize.height) / 2
    let cropRect = CGRect(x: cropX, y: cropY, width: scaledImageSize.width, height: scaledImageSize.height)
    
    // 进行裁剪
    UIGraphicsBeginImageContextWithOptions(targetSize, false, image.scale)
    image.draw(at: CGPoint(x: -cropX, y: -cropY))
    let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return croppedImage
}

// 使用示例:比如裁剪成300x300的图片
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true)
    
    guard let originalImage = info[.originalImage] as? UIImage else { return }
    if let croppedImage = cropImage(originalImage, to: CGSize(width: 300, height: 300)) {
        preview.image = croppedImage
    }
}

注意事项

  • 如果你选择第三方库,优先选维护活跃的(比如TOCropViewController是目前比较流行的)
  • 手动裁剪时要注意图片的分辨率和内存占用,避免处理过大的图片导致崩溃
  • 不同设备的屏幕尺寸不同,自定义裁剪界面要做好适配

内容的提问来源于stack exchange,提问作者Dominik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:09:39