3行代码搞定iOS图片分享:TZImagePickerController实战指南
你是否还在为iOS应用中的图片多选、预览和分享功能头疼?集成系统UIImagePickerController时是否遇到过功能单一、定制困难的问题?本文将带你3步实现微信级别的图片分享体验,从0到1掌握TZImagePickerController的高效集成方案。读完本文你将获得:
- 3分钟快速集成多图选择功能
- 完整的图片预览与原图发送实现
- 自定义相册UI样式的核心技巧
- 解决iOS18兼容性问题的最佳实践
一、认识TZImagePickerController
TZImagePickerController是一个功能完备的图片选择框架(Picker控制器),支持多选、原图、视频选择,同时包含预览、裁剪功能,最低支持iOS10+系统。相比系统原生的UIImagePickerController,它提供了更丰富的交互体验和自定义选项。
项目核心文件结构:
- 主控制器:TZImagePickerController/TZImagePickerController/TZImagePickerController.h
- 模型定义:TZImagePickerController/TZImagePickerController/TZAssetModel.h
- 图片管理:TZImagePickerController/TZImagePickerController/TZImageManager.h
该框架已适配最新iOS18系统,解决了openURL失效问题,并通过隐私清单文件满足App Store审核要求。实际运行效果如下:
二、3步集成图片选择功能
1. 安装框架
推荐使用CocoaPods集成,在Podfile中添加:
pod 'TZImagePickerController' # 完整版本
# 或仅集成基础功能(无定位代码)
# pod 'TZImagePickerController/Basic'
执行pod install完成安装,如需手动集成,将TZImagePickerController目录拖拽到项目中,并导入头文件:#import "TZImagePickerController.h"
2. 配置权限
在Info.plist中添加必要的权限声明:
<key>Privacy - Photo Library Usage Description</key>
<string>需要访问您的相册以选择图片</string>
<key>Privacy - Camera Usage Description</key>
<string>需要访问相机以拍摄照片</string>
<key>Privacy - Microphone Usage Description</key>
<string>需要访问麦克风以录制视频</string>
3. 实现核心代码
在需要调用图片选择器的ViewController中,添加以下代码:
// 导入头文件
#import "TZImagePickerController.h"
// 实现代理
@interface YourViewController () <TZImagePickerControllerDelegate>
@end
@implementation YourViewController
// 触发选择图片的按钮点击事件
- (IBAction)selectPhotosButtonClicked:(id)sender {
// 创建图片选择器,最多选择9张图片
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:9 delegate:self];
// 设置可选类型
imagePickerVc.allowPickingVideo = YES; // 允许选择视频
imagePickerVc.allowPickingOriginalPhoto = YES; // 允许选择原图
// 设置回调(也可通过代理方法实现)
[imagePickerVc setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) {
// 处理选择的图片
[self handleSelectedPhotos:photos isOriginal:isSelectOriginalPhoto];
}];
// present选择器
[self presentViewController:imagePickerVc animated:YES completion:nil];
}
// 处理选择的图片
- (void)handleSelectedPhotos:(NSArray<UIImage *> *)photos isOriginal:(BOOL)isOriginal {
// 1. 显示选中图片
// 2. 准备分享数据
// 3. 调用分享接口
}
@end
以上代码实现了基础的图片选择功能,如需更复杂的业务逻辑,可实现TZImagePickerControllerDelegate代理方法。
三、高级功能定制
1. 自定义选择行为
通过设置TZImagePickerController的属性,可定制选择行为:
// 设置最大视频拍摄时间(默认10分钟)
imagePickerVc.videoMaximumDuration = 60; // 1分钟
// 设置图片排序方式(默认按修改时间升序)
imagePickerVc.sortAscendingByModificationDate = NO; // 最新的在前
// 设置最小可选图片尺寸
imagePickerVc.minPhotoWidthSelectable = 800;
imagePickerVc.minPhotoHeightSelectable = 600;
// 单选模式下启用裁剪
imagePickerVc.allowCrop = YES;
imagePickerVc.cropRect = CGRectMake(0, 100, self.view.width, self.view.width); // 正方形裁剪框
2. 定制UI样式
通过UI配置block自定义界面元素:
// 自定义照片选择页底部工具栏
imagePickerVc.photoPickerPageUIConfigBlock = ^(UICollectionView *collectionView, UIView *bottomToolBar, UIButton *previewButton, UIButton *originalPhotoButton, UILabel *originalPhotoLabel, UIButton *doneButton, UIImageView *numberImageView, UILabel *numberLabel, UIView *divideLine) {
// 修改完成按钮颜色
doneButton.backgroundColor = [UIColor systemBlueColor];
doneButton.layer.cornerRadius = 22;
// 修改选中数字颜色
numberLabel.textColor = [UIColor whiteColor];
};
// 设置导航栏样式
imagePickerVc.naviBgColor = [UIColor whiteColor];
imagePickerVc.naviTitleColor = [UIColor blackColor];
imagePickerVc.barItemTextColor = [UIColor systemBlueColor];
3. 多语言支持
框架内置多语言支持,可通过以下方式设置:
// 设置首选语言(支持zh-Hans、zh-Hant、en、vi等)
imagePickerVc.preferredLanguage = @"zh-Hans";
// 或使用系统语言
// imagePickerVc.preferredLanguage = nil;
语言资源文件位于TZImagePickerController/TZImagePickerController/TZImagePickerController.bundle,包含阿拉伯语、德语、英语等多种语言。
四、常见问题解决方案
1. iOS14+权限适配
iOS14引入Limited Photos Access权限模式,用户可能只授权部分照片访问权限。框架会自动显示提示视图,引导用户授权完整访问权限,相关实现见TZImagePickerController/TZImagePickerController/TZAuthLimitedFooterTipView.h。
2. 导航栏样式冲突
如项目中使用GKNavigationBarViewController等导航栏框架,可能导致导航栏消失,需升级到2.0.4+版本。如使用WRNavigationBar,需将TZImagePickerController加入黑名单:
[WRNavigationBarManager wr_setBlackList:@[@"TZImagePickerController", @"TZPhotoPreviewController"]];
3. 视频导出问题
部分安卓设备拍摄的视频可能导出失败,可通过设置禁用视频转向修正:
imagePickerVc.needFixComposition = NO; // 默认NO,不修正视频转向
五、源码仓库与资源
完整项目地址:https://gitcode.com/gh_mirrors/tz/TZImagePickerController
框架包含的核心模块:
- 图片选择器:TZImagePickerController
- GIF播放支持:FLAnimatedImage
- 定位服务:TZLocationManager
- 自定义布局:LxGridViewFlowLayout
官方文档:README.md
通过本文介绍的方法,你可以快速在iOS应用中集成专业级的图片选择与分享功能。该框架已在众多商业项目中验证,稳定性和兼容性均有保障,建议根据实际需求合理配置参数,以获得最佳用户体验。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00