一个漂亮、简单、声明式、方便、跨平台(iOS、macOS & tvOS)和经过单元测试的Apple PhotoKit
的封装API
我不喜欢PhotoKit
的地方在于它不是声明式的,而且开发者必须考虑太多的细节。这就是我创建这个Swift包的原因,它将极大地提高你的PhotoKit
代码的可读性。
使用Albums.all
、album.photos
或 Photos.live
等轻松从照片库获取媒体。
此外,您可以以非常简单和健壮的方式对照片库执行许多操作,例如
查看下面的 API 部分了解更多。
请随时贡献。任何形式的贡献都非常欢迎!我可以保证,即使有良好的单元测试覆盖率,仍然有bug隐藏在某个地方🐛。
只需将此Swift包作为依赖项添加到您的Package.swift
中
.package(url: "https://github.com/crelies/Media.git", from: "0.1.0"),
这个Swift包通过许多常见的PhotoKit
媒体类型的封装类型提供其功能
许多类型实现了静态工厂方法,以便开发者可以轻松访问和管理照片库。
除此之外,这个Swift包还包含一些简单且即用型的 SwiftUI视图,用于与照片库交互,例如 Camera
视图或 LivePhoto
、Photo
和 Video
的实例视图。
核心功能通过 import MediaCore
提供。如果您想使用包含的 SwiftUI 视图,也需要 import MediaSwiftUI
。
这就是您需要知道的一切。现在让我们看看 API。
查看 Example
目录中的示例项目,以探索这个Swift包的强大功能。
本节概述了当前可用的功能。以下大多数内容应该是显而易见的。尽管如此,每个公共类型、函数和属性都已记录在案。如果Xcode自动完成有效,您应该在使用此Swift包提供的API时获得您需要的信息🚀。
Media.requestPermission { result in }
请求用户允许访问他的照片库
Media.requestCameraPermission { result in }
请求用户允许访问相机
Media.isAccessAllowed
检查是否允许访问照片库
Media.currentPermission
获取当前权限
Media.currentCameraPermission
获取当前相机权限
仅限SwiftUI: Media.browser(selectionLimit:) { result in }
(some View)
创建一个即用型的媒体浏览器 SwiftUI 视图 (UIImagePickerController),用于照片和视频
如果您只想按需获取相册,请使用 LazyAlbums
封装器(通过 LazyAlbums
类型上提供的 subscript
请求相册)。
Albums.all
获取照片库中的所有相册
Albums.user
获取与用户相关的所有相册
Albums.smart
获取所有智能相册,如屏幕截图、自拍照等。
Albums.cloud
获取所有云相册,如照片流或iCloud共享相册
album.metadata
获取相册的本地可用元数据,如估计的资产数量或相册中所有资产的最早创建日期
album.audios
获取相册中的所有音频
album.livePhotos
访问相册中的所有实况照片
album.photos
获取相册中的所有照片
album.videos
获取相册中的所有视频
album.allMedia
获取相册中的所有媒体项目(音频,(实况)照片和视频)
Album.create(title:) { result in }
创建一个具有给定标题的相册
Album.with(identifier:) -> Album?
获取具有给定标识符的相册
Album.with(localizedTitle:) -> Album?
获取具有给定本地化标题的相册
album.add(audio|livePhoto|photo|video) { result in }
将给定的媒体项目(音频,(实况)照片或视频)添加到相册
album.delete(audio|livePhoto|photo|video) { result in }
从相册中删除给定的媒体项目(音频,(实况)照片或视频)
album.delete { result in }
删除相册
如果您只想按需获取音频,请使用 LazyAudios
封装器(通过 LazyAudios
类型上提供的 subscript
请求音频)。
Audios.all
获取照片库中的所有音频
Audio.with(identifier:) - > Audio? (检查是否存在)
获取具有给定标识符的音频
audio.metadata
获取音频的本地可用元数据
audio.delete { result in }
删除音频
仅限SwiftUI: Camera.view { result in }
(some View)
创建一个即用型的相机 SwiftUI 视图 (UIImagePickerController),用于拍摄照片和视频
如果您只想按需获取实况照片,请使用 LazyLivePhotos
封装器(通过 LazyLivePhotos
类型上提供的 subscript
请求实况照片)。
LivePhotos.all
获取照片库中的所有实况照片
livePhoto.metadata
获取实况照片的本地可用元数据
livePhoto.displayRepresentation(targetSize:contentMode) { result in }
获取实况照片的 PHLivePhoto 表示
LivePhoto.save(data:) { result in }
从给定的数据对象(LivePhotoData:包含图像和视频部分)在库中创建一个新的实况照片
LivePhoto.with(identifier:) -> LivePhoto? (检查是否存在)
获取具有给定标识符的实况照片
livePhoto.delete { result in }
删除接收到的实况照片
livePhoto.favorite(true|false) { result in }
更新接收到的实况照片的收藏状态
仅限SwiftUI: LivePhoto.camera { result in }
(some View)
创建一个即用型的 SwiftUI 相机视图,用于拍摄实况照片(这不是 UIImagePickerController)
仅限SwiftUI: LivePhoto.browser(selectionLimit:) { result in }
(some View)
创建一个即用型的 SwiftUI 视图,用于浏览库中的实况照片 (UIImagePickerController)
仅限SwiftUI: livePhoto.view(size:)
(some View)
获取一个即用型的 SwiftUI 视图,用于在您的UI中显示接收到的实况照片
如果您只想按需获取照片,请使用 Media.LazyPhotos
封装器(通过 Media.LazyPhotos
类型上提供的 subscript
请求照片)。
Media.Photos.all (包括实况照片)
获取库中的所有照片,包括实况照片
Media.Photos.live
获取库中的所有实况照片
Media.Photos.panorama
获取库中的所有全景照片
Media.Photos.hdr
获取所有HDR照片
Media.Photos.screenshot
获取库中的所有屏幕截图
Media.Photos.depthEffect
获取库中的所有景深效果照片
photo.metadata
获取照片的所有本地可用元数据
photo.subtypes
获取照片的所有子类型,如HDR或全景
photo.properties { result in }
获取照片的所有属性(元数据),包括EXIF,GPS和TIFF数据
photo.data { result in }
获取照片的数据表示
photo.uiImage(targetSize:contentMode:) { result in }
获取照片的UIImage表示
Photo.save(Media.URL<Photo>) { result in }
使用给定的照片url创建一个新的照片
Photo.save(UIImage) { result in }
从给定的UIImage实例创建一个新的照片
Photo.with(identifier:) -> Photo?
获取具有给定标识符的照片
photo.delete { result in }
删除接收到的照片
photo.favorite(true|false) { result in }
更新接收到的照片的收藏状态
仅限SwiftUI: Photo.camera { result in }
(some View)
创建一个即用型的相机 SwiftUI 视图,用于拍摄照片 (UIImagePickerController)
仅限SwiftUI: Photo.browser(selectionLimit:) { result in }
(some View)
创建一个即用型的 SwiftUI 视图,用于浏览库中的照片 (UIImagePickerController)
仅限SwiftUI: photo.view(targetSize:contentMode:) { image in image.resizable().aspectRatio(contentMode: .fit) }
(some View)
获取一个即用型的 SwiftUI 视图,用于在您的UI中显示照片
如果您只想按需获取视频,请使用 LazyVideos
封装器(通过 LazyVideos
类型上提供的 subscript
请求视频)。
Videos.all
获取库中的所有视频
Videos.streams
获取库中的所有视频流
Videos.highFrameRates
获取库中的所有高帧率视频
Videos.timelapses
获取库中的所有延时视频
video.subtypes
获取接收到的视频的子类型,如高帧率
video.metadata
获取所有本地可用的元数据
video.properties { result in }
获取视频的所有属性(元数据),包括位置和模型数据
video.playerItem(deliveryMode:) { result in }
获取接收到的视频的AVPlayerItem表示
video.avAsset(deliveryMode:) { result in }
获取视频的AVAsset表示
video.previewImage(at:) { result in }
为接收到的视频生成预览图像
video.export(options, progress: { progress in }) { result in }
使用给定的选项导出接收到的视频
Video.save(Media.URL<Video>) { result in }
使用给定的url创建一个新的视频
Video.with(identifier:) -> Video?
获取具有给定标识符的视频
video.favorite(true|false) { result in }
更新接收到的视频的收藏状态
video.delete { result in }
删除视频
仅限SwiftUI: Video.camera { result in }
(some View)
创建一个即用型的视频相机 SwiftUI 视图,用于拍摄视频 (UIImagePickerController)
仅限SwiftUI: Video.browser(selectionLimit:) { result in }
(some View)
创建一个即用型的 SwiftUI 视图,用于浏览库中的视频
仅限SwiftUI: video.view
(some View)
获取一个即用型的 SwiftUI 视图,用于在您的UI中显示视频
PHPicker: PHPickerViewController
的SwiftUI移植
在您的SwiftUI
应用程序中使用PHPickerViewController
PhotosUILivePhotoView: PHLivePhotoView
的SwiftUI移植
在您的SwiftUI
应用程序中使用PHLivePhotoView
Media
包还包括一些通用的属性包装器,您可以使用它们与照片库进行交互。
@FetchAllAssets(sort:fetchLimit:includeAllBurstAssets:includeHiddenAssets) var assets: [AnyMedia]
@FetchAssets(filter:sort:fetchLimit:includeAllBurstAssets:includeHiddenAssets) var assets: [ <Audio | LivePhoto | Photo | Video> ]
获取符合给定过滤器并按给定排序排序的音频、实况照片、照片或视频
@FetchAsset(filter:) var asset: <Audio | LivePhoto | Photo | Video>?
从库中获取符合给定过滤器的单个音频、实况照片、照片或视频
@FetchAlbums(ofType:filter:sort:fetchLimit) var albums: [Album]
获取符合给定过滤器条件的指定类型的专辑,匹配的专辑会按照给定的排序方式进行排序。
@FetchAlbum(filter:) var album: Album?
获取单个符合给定过滤器条件的专辑。
这是我在空闲时间创建的另一个开源项目。即使身兼全职工作和家庭,我也非常积极地为社区创建软件。我相信社区会推动事物向前发展。所以欢迎以任何方式做出贡献。修复错误、添加更多文档或添加全新的功能。只需在完成后创建一个 pull request,我会查看它。请注意,我会提供反馈以确保尽可能高的质量 🙂