图片预览

中文文档

轻量级 iOS 图片预览组件,支持手势缩放和跨技术栈兼容性 (WebView/Flutter)。凭借其解耦的架构设计,它实现了无缝集成并提供原生级别的过渡动画。

PhotoPreview

功能特性

安装

您可以使用 Swift Package Manager (SPM) 安装 PhotoPreview。为此,请按照以下步骤操作

  1. 打开您的 Xcode 项目。
  2. 转到 File > Add Packages...
  3. 输入仓库 URL https://github.com/xiaoxiaowesley/PhotoPreview.git
  4. 选择您要安装的版本,然后单击 Add Package

用法

使用 PhotoPreviewViewController 主要有两种方式:通过原生 UIImageView 或跨平台使用 (在 WebView 中)。

1. 使用 UIImageView

获取 UIImageView 对象,并为点击的图片创建一个 ImageInfo 对象。然后,使用 ImageInfo 对象创建一个 PhotoPreviewViewController 并将其展示出来。

    guard let image = imageView.image else { return }
    let frameOfImage = imageView.convert(imageView.bounds, to: UIApplication.shared.windows.first)

    // Create ImageInfo for the tapped image
    let imageInfo = ImageInfo(image: PhotoPreviewUIImageImage(image: image),
                                frame: frameOfImage,
                                size: image.size,
                                contentMode: imageView.contentMode)

    // Create PhotoPreviewViewController
    let vc = PhotoPreviewViewController(target: PhotoPreview.Target(targetIndex: index, imageInfos: [imageInfo]))

    vc.modalPresentationStyle = .custom
    vc.transitioningDelegate = vc
    vc.delegate = self
    present(vc, animated: true)

2. 跨平台使用 (在 WebView 中)

获取图片 URL、图片在屏幕坐标中的矩形以及源图片的大小。然后,创建一个 ImageInfo 对象。最后,使用 ImageInfo 对象创建一个 PhotoPreviewViewController 并将其展示出来。

    // Get the image URL
    let url = ...
    // Get the image rect in Screen coordinates
    let rectInScreen = .. 
    // Get the source image size
    let height = .. 
    let width =  ..

    // Create ImageInfo directly for the image
    let imageInfo = ImageInfo(image: url,
                                frame: rectInScreen,
                                size: CGSize(width: width, height: height),
                                contentMode: .scaleAspectFill)

    // Create PhotoPreviewViewController with a single image info
    let vc = PhotoPreviewViewController(target: PhotoPreview.Target(targetIndex: 0, imageInfos: [imageInfo]))

    vc.modalPresentationStyle = .custom
    vc.transitioningDelegate = vc
    vc.delegate = self
    present(vc, animated: true)