欢迎使用 ImageUI!
ImageUI 是一个开源项目,用于以类似 Apple 的 Photos 应用程序的方式显示图片和视频(尚未实现)。如果您想为 ImageUI 做贡献,请查看 贡献。在本版本中,有照片浏览器,可以显示缩略图和全尺寸图片。
特性
- 加载远程、本地和内存中的图片
- 支持横竖屏模式
- 共享、删除和自定义操作
- 大小类自适应布局(iOS、iPadOS)
- 深色模式
- 多种手势(轻触、双击、拖动、滑动、捏合)
- LPLinkMetadata(iOS 13.0+)
- 支持 SwiftUI
要求
- iOS 11.0+
- Xcode 11+
- Swift 5.1+
依赖项
强大的图像加载系统
安装
CocoaPods
CocoaPods是一个用于Cocoa项目的依赖管理器。有关用法和安装说明,请访问他们的网站。要使用CocoaPods将ImageUI集成到您的Xcode项目中,在您的Podfile
中指定它
pod 'ImageUI'
Carthage
Carthage是一个去中心化的依赖管理器,可以构建您的依赖并提供二进制框架。要使用Carthage将ImageUI集成到您的Xcode项目中,在您的Cartfile
中指定它
github "alberto093/ImageUI"
Swift包管理器
Swift Package Manager是集成到Xcode中的依赖管理器。
如果您使用的是Xcode 11或更高版本,请转到文件 / Swift包 / 添加包依赖...,并输入包仓库URL https://github.com/alberto093/ImageUI.git,然后按照说明操作。一旦设置了Swift包,将ImageUI作为依赖项添加就像将其添加到Package.swift
中的dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/alberto093/ImageUI.git")
]
用法
创建数据源
IFImage 表示图像元数据的结构体。您可以通过三种方式实例化一个 IFImage:
let urlImage = IFImage(url: imageURL) // network URL
let fileImage = IFImage(path: filePath) // file URL (path)
let memoryImage = IFImage(image: myUIImage) // in-memory image
为了获得最佳性能,您应同时提供缩略图和全尺寸图像,尤其是如果您正在使用网络 URL。可选地,您可以提供一个标题,该标题代表导航栏标题(以及 iOS 13.0+ 上的共享元数据标题)以及一个加载占位符图像。
let image = IFImage(
title: "First image",
original: .remote(url: imageURL),
thumbnail: .remote(url: thumbnailURL),
placeholder: loadingImage)
理想情况下,缩略图的大小应该小于 300x300(iPad 上的最大尺寸)。
显示浏览器
IFBrowserViewController 代表缩略图和全尺寸图像的容器。它可以直接在 Storyboard 中使用,或通过编程方式使用,并且它不需要 UINavigationController
,但强烈建议使用。
let viewController = IFBrowserViewController(images: images, initialImageIndex: 0)
viewController.configuration.actions = [.share, .delete]
// Navigation controller
navigationController.pushViewController(viewController, animated: true)
// Modal presentation
let navigationController = UINavigationController(rootViewController: browserViewController)
navigationController.modalPresentationStyle = .fullScreen
present(navigationController, animated: true)
自定义展示控制器和自定义动画器
UIViewControllerInteractiveTransitioning
,UIViewControllerAnimatedTransitioning
是在开发中的。
自定义
提供初始索引
您可以通过设置初始显示的图像索引来实现。
// images: [IFImage]
let viewController = IFBrowserViewController(images: images, initialImageIndex: .random(in: images.indices))
IFBrowserViewController
会限制提供的值,以避免意外崩溃。
填充模式图像
IFBrowserViewController
允许您决定是否在高度相似于其容器视图的视口时使用填充模式缩放来显示全尺寸图像。
let viewController = IFBrowserViewController(
images: images,
initialImageIndex: 0)
viewController.configuration.prefersAspectFillZoom = false
let viewController = IFBrowserViewController(
images: images,
initialImageIndex: 0)
viewController.configuration.prefersAspectFillZoom = true
自定义操作
可以创建自定义操作,使用户能够与图像进行交互。
browserViewController.configuration.actions = [.share, .custom(identifier: "cropAction", image: cropImage)]
分享和删除操作已由
IFBrowserViewController
管理。
然后,您可以通过实现 IFBrowserViewControllerDelegate
来与它们交互。
func browserViewController(_ browserViewController: IFBrowserViewController, didSelectActionWith identifier: String, forImageAt index: Int) {
switch identifier {
case "cropAction":
// User tap on crop action
default:
break
}
}
关闭按钮
当以模态形式展示时,浏览器实现了默认的取消条按钮项。您可以通过设置导航项相关属性提供自己的条按钮项。
browserViewController.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(closeButtonDidTap))
建议子类化
IFBrowserViewController
而不是提供另一个目标的按钮。
导航栏标题
可以提供标题或标题视图,以避免在新图像即将显示时自动更新。
browserViewController.navigationItem.titleView = CustomLabel(title: "ImageUI", subtitle: "My album")
更多自定义
您可以采用 IFBrowserViewControllerDelegate
并实现以下方法来根据您的规则更新 UI。
func browserViewController(_ browserViewController: IFBrowserViewController, willDisplayImageAt index: Int) {
// A new image is about to be displayed
}
贡献
ImageUI 的路线图由 Trello 管理,并公开可用。如果您想贡献,请随意创建 PR。
许可协议
ImageUI 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。