YPImagePicker
YPImagePicker 是一个用纯 Swift 编写的类似 Instagram 的 iOS 照片/视频选择器。它功能丰富且高度可定制,以满足您应用程序的需求。
快速尝试:
pod repo update
然后 pod try YPImagePicker
只需几行代码就可以使用这些功能!
主要特性
🌅 图库
📷 照片
🎥 视频
✂️ 裁剪
⚡️ 闪光灯
🖼 滤镜
📁 相册
🔢 多选
📏 视频剪辑和封面选择
📐 输出图像尺寸
以及更多...
安装
使用 CocoaPods
首先确保运行 pod repo update
以获取最新可用版本。
将 pod 'YPImagePicker'
添加到您的 Podfile
并运行 pod install
。同时在 Podfile
中添加 use_frameworks!
。
target 'MyApp'
pod 'YPImagePicker'
use_frameworks!
使用 Swift Package Manager
通过 File > Swift Pakcages > Add Package Dependency...
打开 SPM 依赖管理器。
并插入存储库 URL:
https://github.com/Yummypets/YPImagePicker.git
要在自己的包中添加依赖项,只需在 Package.swift
的依赖项中指定一个包:
.package(
name: "YPImagePicker",
url: "https://github.com/Yummypets/YPImagePicker.git",
.upToNextMajor(from: "5.0.0")
)
注意:这需要最低目标 iOS 版本为 12.0
。
Plist 条目
为了让您的应用访问相机和照片库,
您需要添加这些 plist 条目
:
- Privacy - Camera Usage Description(照片/视频)
- Privacy - Photo Library Usage Description(图库)
- Privacy - Microphone Usage Description(视频)
<key>NSCameraUsageDescription</key>
<string>您的描述</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>您的描述</string>
<key>NSMicrophoneUsageDescription</key>
<string>您的描述</string>
配置
所有配置端点都在 YPImagePickerConfiguration 结构体中。 以下是默认值供参考,请随意尝试 :)
var config = YPImagePickerConfiguration()
// [在这里编辑配置...]
// 用您的配置构建选择器
let picker = YPImagePicker(configuration: config)
常规
config.isScrollToChangeModesEnabled = true
config.onlySquareImagesFromCamera = true
config.usesFrontCamera = false
config.showsPhotoFilters = true
config.showsVideoTrimmer = true
config.shouldSaveNewPicturesToAlbum = true
config.albumName = "DefaultYPImagePickerAlbumName"
config.startOnScreen = YPPickerScreen.photo
config.screens = [.library, .photo]
config.showsCrop = .none
config.targetImageSize = YPImageSize.original
config.overlayView = UIView()
config.hidesStatusBar = true
config.hidesBottomBar = false
config.hidesCancelButton = false
config.preferredStatusBarStyle = UIStatusBarStyle.default
config.bottomMenuItemSelectedColour = UIColor(r: 38, g: 38, b: 38)
config.bottomMenuItemUnSelectedColour = UIColor(r: 153, g: 153, b: 153)
config.filters = [DefaultYPFilters...]
config.maxCameraZoomFactor = 1.0
config.fonts..
库
config.library.options = nil
config.library.onlySquare = false
config.library.isSquareByDefault = true
config.library.minWidthForItem = nil
config.library.mediaType = YPlibraryMediaType.photo
config.library.defaultMultipleSelection = false
config.library.maxNumberOfItems = 1
config.library.minNumberOfItems = 1
config.library.numberOfItemsInRow = 4
config.library.spacingBetweenItems = 1.0
config.library.skipSelectionsGallery = false
config.library.preselectedItems = nil
config.library.preSelectItemOnMultipleSelection = true
视频
config.video.compression = AVAssetExportPresetHighestQuality
config.video.fileType = .mov
config.video.recordingTimeLimit = 60.0
config.video.libraryTimeLimit = 60.0
config.video.minimumTimeLimit = 3.0
config.video.trimmerMaxDuration = 60.0
config.video.trimmerMinDuration = 3.0
画廊
config.gallery.hidesRemoveButton = false
默认配置
// 为所有选择器设置默认配置
YPImagePickerConfiguration.shared = config
// 然后像这样使用默认配置:
let picker = YPImagePicker()
在iPad上显示选择器时,选择器只支持一种尺寸,你应该在显示之前设置它:
let preferredContentSize = CGSize(width: 500, height: 600);
YPImagePickerConfiguration.widthOniPad = preferredContentSize.width;
// 现在你可以在对话框、弹出窗口等中以首选尺寸显示选择器
使用方法
首先要导入 import YPImagePicker
。
选择器只有一个回调 didFinishPicking
,使你能够处理所有情况。让我们看一些典型的使用案例 🤓
单张照片
let picker = YPImagePicker()
picker.didFinishPicking { [unowned picker] items, _ in
if let photo = items.singlePhoto {
print(photo.fromCamera) // 图像来源(相机或图库)
print(photo.image) // 用户最终选择的图像
print(photo.originalImage) // 用户选择的原始图像,未经过滤
print(photo.modifiedImage) // 转换后的图像,可能为nil
print(photo.exifMeta) // 打印原始图像的exif元数据
}
picker.dismiss(animated: true, completion: nil)
}
present(picker, animated: true, completion: nil)
单个视频
// 在这里我们配置选择器只显示视频,不显示照片
var config = YPImagePickerConfiguration()
config.screens = [.library, .video]
config.library.mediaType = .video
let picker = YPImagePicker(configuration: config)
picker.didFinishPicking { [unowned picker] items, _ in
if let video = items.singleVideo {
print(video.fromCamera)
print(video.thumbnail)
print(video.url)
}
picker.dismiss(animated: true, completion: nil)
}
present(picker, animated: true, completion: nil)
如你所见,singlePhoto
和 singleVideo
辅助方法可以帮助你处理单一媒体,这在很多情况下都很常见,同时使用相同的回调来处理所有用例 \o/
多选
要启用多选,请确保在配置中设置 library.maxNumberOfItems
,如下所示:
var config = YPImagePickerConfiguration()
config.library.maxNumberOfItems = 3
let picker = YPImagePicker(configuration: config)
然后你可以在同一个回调中处理多选:
picker.didFinishPicking { [unowned picker] items, cancelled in
for item in items {
switch item {
case .photo(let photo):
print(photo)
case .video(let video):
print(video)
}
}
picker.dismiss(animated: true, completion: nil)
}
处理取消事件(如果需要)
picker.didFinishPicking { [unowned picker] items, cancelled in
if cancelled {
print("选择器被取消")
}
picker.dismiss(animated: true, completion: nil)
}
就是这样!
语言
🇺🇸 英语, 🇪🇸 西班牙语, 🇫🇷 法语 🇷🇺 俄语, 🇵🇱 波兰语, 🇳🇱 荷兰语, 🇧🇷 巴西葡萄牙语, 🇹🇷 土耳其语, 🇸🇾 阿拉伯语, 🇩🇪 德语, 🇮🇹 意大利语, 🇯🇵 日语, 🇨🇳 中文, 🇮🇩 印度尼西亚语, 🇰🇷 韩语, 🇹🇼 繁体中文(台湾), 🇻🇳 越南语, 🇹🇭 泰语, 🇨🇿 捷克语, 🇮🇷 波斯语。
如果你的语言不受支持,你仍然可以通过 configuration.wordings
API 自定义文字:
config.wordings.libraryTitle = "图库"
config.wordings.cameraTitle = "相机"
config.wordings.next = "确定"
更好的是,你可以提交一个问题或拉取请求,附上你的 Localizable.strings
文件来添加新语言!
UI 自定义
我们尽量保持原生风格,所以这主要通过原生API实现。
导航栏颜色
let coloredImage = UIImage(color: .red)
UINavigationBar.appearance().setBackgroundImage(coloredImage, for: UIBarMetrics.default)
// UIImage+color 辅助方法 https://stackoverflow.com/questions/26542035/create-uiimage-with-solid-color-in-swift
导航栏字体
let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 30, weight: .bold) ]
UINavigationBar.appearance().titleTextAttributes = attributes // 标题字体
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, for: .normal) // 导航栏按钮字体
导航栏文字颜色
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.yellow ] // 标题颜色
UINavigationBar.appearance().tintColor = .red // 左侧导航栏按钮
config.colors.tintColor = .green // 右侧导航栏按钮(操作)
原始项目与作者
这个项目最初受到 Fusuma 的启发 考虑到大量的代码、设计变更以及随时间添加的所有额外功能,这个项目从一个分支演变成了一个独立的单独仓库,也是为了便于发现。 原始 Fusuma 作者是 ytakz
核心团队
## 贡献者 🙏 [ezisazis](https://github.com/ezisazis)、 [hanikeddah](https://github.com/hanikeddah)、 [tahaburak](https://github.com/tahaburak)、 [ajkolean](https://github.com/ajkolean)、 [Anarchoschnitzel](https://github.com/Anarchoschnitzel)、 [Emil](https://github.com/heitara)、 [Rafael Damasceno](https://github.com/DamascenoRafael)、 [cenkingunlugu](https://github.com/https://github.com/cenkingunlugu)、 [heitara](https://github.com/heitara)、 [portellaa](https://github.com/portellaa)、 [Romixery](https://github.com/romixery)、 [shotat](https://github.com/shotat)、 [shalamowww](https://github.com/shalamowww)特别感谢 ihtiht 设计的酷炫logo!
以各种方式帮助我们的人 👏
userdar、 Evgeniy、 MehdiMahdloo、 om-ha、 userdar、 ChintanWeapp、 eddieespinal、 viktorgardart、 gdelarosa、 cwestMobile、 Tinyik、 Vivekthakur647、 tomasbykowski、 artemsmikh、 theolof、 dongdong3344、 MHX792、 CIronfounderson、 Guerrix、 Zedd0202、 mohammadZ74、 SalmanGhumsani、 wegweiser6、 BilalAkram、 KazimAhmad、 JustinBeBoy、 SashaMeyer、 GShushanik、 Cez95、 Palando、 sebastienboulogne、 JigneshParekh7165、 Deepakepaisa、 AndreiBoariu、 nathankonrad1、 wawilliams003、 pngo-hypewell、 PawanManjani、 devender54321、 Didar1994、 relaxsus、 restoflash
依赖
YPImagePicker 依赖 prynt/PryntTrimmerView 来提供视频裁剪和封面功能。非常感谢 @HHK1 将其开源 :)
Objective-C 支持
我们不支持 Objective-C,这也不在我们的计划之内。 Swift 是未来,放弃 Objective-C 是保持这个库开发速度的必要代价 :)
许可证
YPImagePicker 基于 MIT 许可发布。 详情请查看 LICENSE。