{"id":15031673,"url":"https://github.com/indulgein/ybimagebrowser","last_synced_at":"2025-05-14T23:02:20.673Z","repository":{"id":37382246,"uuid":"128897892","full_name":"indulgeIn/YBImageBrowser","owner":"indulgeIn","description":"iOS image browser / iOS 图片浏览器 (支持视频) ","archived":false,"fork":false,"pushed_at":"2023-11-24T10:57:58.000Z","size":201027,"stargazers_count":2400,"open_issues_count":96,"forks_count":481,"subscribers_count":30,"default_branch":"master","last_synced_at":"2025-05-14T23:01:51.145Z","etag":null,"topics":["image-browser","image-processing","image-viewer","optimizing-performance","support-video"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/indulgeIn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-04-10T08:14:51.000Z","updated_at":"2025-05-11T00:38:13.000Z","dependencies_parsed_at":"2024-04-13T00:42:45.514Z","dependency_job_id":"b7a51248-9ef0-439c-94ff-ce0ea75dd5ab","html_url":"https://github.com/indulgeIn/YBImageBrowser","commit_stats":{"total_commits":310,"total_committers":3,"mean_commits":"103.33333333333333","dds":0.006451612903225823,"last_synced_commit":"ef2ace7bec42eac5f5e50bd5684dfc67d9a9b294"},"previous_names":[],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indulgeIn%2FYBImageBrowser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indulgeIn%2FYBImageBrowser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indulgeIn%2FYBImageBrowser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indulgeIn%2FYBImageBrowser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/indulgeIn","download_url":"https://codeload.github.com/indulgeIn/YBImageBrowser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254243355,"owners_count":22038045,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["image-browser","image-processing","image-viewer","optimizing-performance","support-video"],"created_at":"2024-09-24T20:16:18.250Z","updated_at":"2025-05-14T23:02:20.580Z","avatar_url":"https://github.com/indulgeIn.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n![](https://github.com/indulgeIn/YBImageBrowser/blob/master/Images/banner.png)\n\n[![CocoaPods](https://img.shields.io/cocoapods/v/YBImageBrowser.svg)](https://cocoapods.org/pods/YBImageBrowser)\u0026nbsp;\n[![CocoaPods](https://img.shields.io/cocoapods/p/YBImageBrowser.svg)](https://github.com/indulgeIn/YBImageBrowser)\u0026nbsp;\n[![License](https://img.shields.io/github/license/indulgeIn/YBImageBrowser.svg)](https://github.com/indulgeIn/YBImageBrowser)\u0026nbsp;\n\n**iOS 图片浏览器，功能强大，易于拓展，性能优化和内存控制让其运行更加的流畅和稳健。**\n\n##### 相关文章：\n##### [YBImageBrowser 重构心得：如何优化架构、性能、内存？](https://www.jianshu.com/p/ef53d0094437)\n##### [避免 iOS 组件依赖冲突的小技巧](https://www.jianshu.com/p/0e3283275300)\n\n\n## 注意事项\n\n#### 关于 3.x 版本 (使用 2.x 版本请切换到 store_2.x 分支)\n\n为了解决 2.x 版本的设计缺陷和代码漏洞，特进行了 3.x 深度重构，所以没办法做到向下兼容，希望社区朋友们能体谅，根据情况进行版本迁移。\n\n#### 提问须知\n\n考虑到笔者的精力问题，遇到问题请先查看 API、效仿 Demo、阅读 README、搜索 Issues。请不要提出与组件无关的问题，比如 CocoaPods 的错误，如果是 BUG 或 Feature 最好是提 Issue。\n\n# 目录\n\n* [预览](#预览)\n* [特性](#特性)\n* [安装](#安装)\n* [用法](#用法)\n* [常见问题](#常见问题)\n\n\n# 预览\n\n![](https://github.com/indulgeIn/YBImageBrowser/blob/master/Images/preview.gif)\n\n\n\n# 特性\n\n- 支持 GIF，APNG，WebP 等本地和网络图片类型（由 YYImage、SDWebImage 提供支持）。\n- 支持系统相册图片和视频。\n- 支持简单的视频播放。\n- 支持高清图浏览。\n- 支持图片预处理（比如添加水印）。\n- 支持根据图片的大小判断是否需要预先解码（精确控制内存）。\n- 支持图片压缩、裁剪的界限设定。\n- 支持修改下载图片的 NSURLRequest。\n- 支持主动旋转或跟随控制器旋转。\n- 支持自定义图标。\n- 支持自定义 Toast/Loading。\n- 支持自定义文案（默认提供中文和英文）。\n- 支持自定义工具视图（比如查看原图功能）。\n- 支持自定义 Cell（比如添加一个广告模块）。\n- 支持添加到其它父视图上使用（比如加到控制器上）。\n- 支持转场动效、图片布局等深度定制。\n- 支持数据重载、局部更新。\n- 支持低粒度的内存控制和性能调优。\n- 极致的性能优化和严格的内存控制让其运行更加的流畅和稳健。\n\n\n# 安装\n\n## CocoaPods\n\n支持分库导入，核心部分就是图片浏览功能，视频播放作为拓展功能按需导入。\n\n1. 在 Podfile 中添加：\n```\npod 'YBImageBrowser'\npod 'YBImageBrowser/Video'  //视频功能需添加\n```\n2. 执行 `pod install` 或 `pod update`。\n3. 导入 `\u003cYBImageBrowser/YBImageBrowser.h\u003e`，视频功能需导入`\u003cYBImageBrowser/YBIBVideoData.h\u003e`。\n4. 注意：如果你需要支持 WebP，可以在 Podfile 中添加 `pod 'YYImage/WebP'`。\n\n若搜索不到库，可执行`pod repo update`，或使用 `rm ~/Library/Caches/CocoaPods/search_index.json` 移除本地索引然后再执行安装，或更新一下 CocoaPods 版本。\n\n#### 去除 SDWebImage 的依赖（版本需 \u003e= 3.0.4）\n\nPodfile 相应的配置变为：\n```\npod 'YBImageBrowser/NOSD'\npod 'YBImageBrowser/VideoNOSD'  //视频功能需添加\n```\n这时你必须定义一个类实现`YBIBWebImageMediator`协议，并赋值给`YBImageBrowser`类的`webImageMediator`属性（可以参考 `YBIBDefaultWebImageMediator`的实现）。\n\n\n## 手动导入\n\n1. 下载 YBImageBrowser 文件夹所有内容并且拖入你的工程中，视频功能还需下载 Video 文件夹所有内容。\n2. 链接以下 frameworks：\n* SDWebImage\n* YYImage\n3. 导入 `YBImageBrowser.h`，视频功能需导入`YBIBVideoData.h`\n4. 注意：如果你需要支持 WebP，可以在 Podfile 中添加 `pod 'YYImage/WebP'`，或者到手动下载 [YYImage 仓库](https://github.com/ibireme/YYImage) 的 webP 支持文件。\n\n\n\n\n# 用法\n\n初始化`YBImageBrowser`并且赋值数据源`id\u003cYBIBDataProtocol\u003e`，默认提供`YBIBImageData` (图片) 和`YBIBVideoData` (视频) 两种数据源。\n\n图片处理是组件的核心，笔者精力有限，视频播放做得很轻量，若有更高的要求最好是自定义 Cell，望体谅。\n\nDemo 中提供了很多示例代码，演示较复杂的拓展方式，所以若需要深度定制最好是下载 Demo 查看。\n\n建议不对`YBImageBrowser`进行复用，目前还存在一些逻辑漏洞。\n\n\n## 基本使用\n\n```\n// 本地图片\nYBIBImageData *data0 = [YBIBImageData new];\ndata0.imageName = ...;\ndata0.projectiveView = ...;\n\n// 网络图片\nYBIBImageData *data1 = [YBIBImageData new];\ndata1.imageURL = ...;\ndata1.projectiveView = ...;\n\n// 视频\nYBIBVideoData *data2 = [YBIBVideoData new];\ndata2.videoURL = ...;\ndata2.projectiveView = ...;\n\nYBImageBrowser *browser = [YBImageBrowser new];\nbrowser.dataSourceArray = @[data0, data1, data2];\nbrowser.currentPage = ...;\n[browser show];\n```\n\n\n## 设置支持的旋转方向\n\n当图片浏览器依托的 UIViewController 仅支持一个方向：\n\n这种情况通过`YBImageBrowser.new.supportedOrientations`设置图片浏览器支持的旋转方向。\n\n否则：\n\n上面的属性将失效，图片浏览器会跟随控制器的旋转而旋转，由于各种原因这种情况的旋转过渡有瑕疵，建议不使用这种方式。\n\n\n## 自定义图标\n\n修改`YBIBIconManager.sharedManager`实例的属性。\n\n\n## 自定义文案\n\n修改`YBIBCopywriter.sharedCopywriter`实例的属性。\n\n\n## 自定义 Toast / Loading\n\n实现`YBIBAuxiliaryViewHandler`协议，并且赋值给`YBImageBrowser.new.auxiliaryViewHandler`属性，可参考和协议同名的默认实现类。\n\n\n## 自定义工具视图（ToolView）\n\n默认实现的`YBImageBrowser.new.defaultToolViewHandler`处理器可以做一些属性配置，当满足不了业务需求时，最好是进行自定义，参考默认实现或 Demo 中“查看原图”功能实现。\n\n定义一个或多个类实现`YBIBToolViewHandler`协议，并且装入`YBImageBrowser.new.toolViewHandlers`数组属性。建议使用一个中介者来实现这个协议，然后所有的工具视图都由这个中介者来管理，当然也可以让每一个自定义的工具 UIView 都实现`YBIBToolViewHandler`协议，请根据具体需求取舍。\n\n\n## 自定义 Cell\n\n当默认提供的`YBIBImageData` (图片) 和`YBIBVideoData` (视频) 满足不了需求时，可自定义拓展 Cell，参考默认实现或 Demo 中的示例代码。\n\n定义一个实现`YBIBCellProtocol`协议的`UICollectionViewCell`类和一个实现`YBIBDataProtocol`协议的数据类，当要求不高时实现必选协议方法就能跑起来了，若对交互有要求就相对比较复杂，最好是参考默认的交互动效实现。\n\n在某些场景下，甚至可以直接继承项目中的 Cell 来做自定义。\n\n\n# 常见问题\n\n## SDWebImage Pods 版本兼容问题\n\nSDWebImage 有两种情况会出现兼容问题：该库对 SDWebImage 采用模糊向上依赖，但将来 SDWebImage 可能没做好向下兼容；当其它库依赖 SDWebImage 更低或更高 API 不兼容版本。对于这种情况，可以尝试以下方式解决：\n- Podfile 中采用去除 SDWebImage 依赖的方式导入，只需要实现一个中介者（见[安装](#安装)部分）。\n- 更改其它库对 SDWebImage 的依赖版本。\n- 手动导入 YBImageBrowser，然后修改`YBIBDefaultWebImageMediator`文件。\n\n为什么不去除依赖 SDWebImage 自己实现？时间成本太高。\n为什么不拖入 SDWebImage 修改类名？会扩大组件的体积，若外部有 SDWebImage 就存在一份多余代码。\n\n## 依赖的 YYImage 与项目依赖的 YYKit 冲突\n\n实际上 YYKit 有把各个组件拆分出来，建议项目中分开导入：\n```\npod 'YYModel'\npod 'YYCache'\npod 'YYImage'\npod 'YYWebImage'\npod 'YYText'\n...\n```\n而且这样更灵活便于取舍。\n\n## 低内存设备 OOM 问题\n\n组件内部会降低在低内存设备上的性能，减小内存占用，但若高清图过多，可能需要手动去控制（以下是硬件消耗很低的状态）：\n\n```\nYBIBImageData *data = YBIBImageData.new;\n// 取消预解码\ndata.shouldPreDecodeAsync = NO;\n// 直接设大触发裁剪比例，绘制更小的裁剪区域压力更小，不过可能会让用户感觉奇怪，放很大才开始裁剪显示高清局部（这个属性很多时候不需要显式设置，内部会动态计算）\ndata.cuttingZoomScale = 10;\n\nYBImageBrowser *browser = YBImageBrowser.new;\n// 调低图片的缓存数量\nbrowser.ybib_imageCache.imageCacheCountLimit = 1;\n// 预加载数量设为 0\nbrowser.preloadCount = 0;\n```\n\n## 视频播放功能简陋\n\n关于大家提的关于视频的需求，有些成本过高，笔者精力有限望体谅。若组件默认的视频播放器满足不了需求，就自定义一个 Cell 吧，把成熟的播放器集成到组件中肯定更加的稳定。\n\n## 关于 Swift 版本\n\n考虑时间成本，目前没有写 Swift 版本的计划。 \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findulgein%2Fybimagebrowser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Findulgein%2Fybimagebrowser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findulgein%2Fybimagebrowser/lists"}