DMPhotoPages 0.1.0

DMPhotoPages 0.1.0

Dominic Miller 维护。




  • Eddy Borja 和 Dominic Miller

DMPhotoPages

查看 https://github.com/EddyBorja/EBPhotoPages

“照片库很快就可以成为一个非常复杂的应用组件。DMPhotoPages 项目演示了开发者如何使用 状态模式 来控制具有许多功能的接口的行为。这种模式允许在不修改或不太理解原始源代码的情况下,为 DMPhotoPages 照片库的定制实现创建新行为。目标是设计一个照片库类,该类可以平滑地支持未来可能需要的任何用例。”

Alt text|Alt text Alt text Alt text|Alt text Alt text|Alt text Alt text

这是什么?

DMPhotoPages 是一个用于在滚动视图中显示照片页面和其元数据的照片库库。用户可以缩放照片,创建、编辑或删除评论和标签,分享或删除照片,以及报告不适当的照片。所有照片和内容都是异步加载的。通过代理协议控制照片的用户权限。无需图形文件,因为图标是在代码中绘制的。

该库是使用状态模式设计的,以控制库的行为,这样其他开发者可以轻松地修改或添加新状态,而无需过多了解原始代码。

快速功能列表

  • 照片标记:创建/编辑/删除
  • 照片评论:创建/编辑/删除
  • 照片分享
  • 照片报告
  • 为评论、标记、删除、报告等指定照片的每个用户的权限。
  • 基于页面的滚动
  • 照片在被单次点击时立即提供弹跳反馈,以获得丰富的界面感。
  • 切换标记开/关
  • 使用手势缩放和移动照片。
  • 可滚动的标题,长度可变,支持自动降低背景亮度
  • 使用单次点击手势显示/隐藏 UI 元素
  • 异步加载数据(通过 NSOperationQueue
  • 每张照片的活动指示器。
  • 内容模式自动检测AspectFit/Center(防止小于屏幕的照片放大)
  • 支持全景/横竖屏方向
  • 分辨率无关支持(iPad/iPhone)
  • 触摸并按住评论以复制或删除
  • 扁平化UI设计
  • 评论图标显示已发布的评论数量(如果有)
  • 其他功能

如何使用它?

  1. 将QuartzCore.framework、CoreGraphics.framework和AVFoundation.framework添加到您的项目中。

  2. 将此存储库中的DMPhotoPagesController文件夹添加到您的应用中。

  3. 在您计划用作DMPhotoPagesController实例的数据源和代理的对象中实现对DMPhotoPagesDataSource(必需)和DMPhotoPagesDelegate(可选)协议的实现。

  4. 然后,初始化并呈现photoPagesController

DMPhotoPagesController *photoPagesController = [[DMPhotoPagesController alloc] 
                                               initWithDataSource:aDataSource delegate:aDelegate];

[self presentViewController:photoPagesController animated:YES completion:nil];

如何自定义它?

DMPhotoPagesFactory类旨在成为所有UI对象的终点。此类负责实例化UI元素并将其返回给DMPhotoPagesController。如果您想自定义照片库的实现外观,这是您应该首先检查的地方。一些其他UI元素尚未由此类创建,但计划最终将其移动到其中。

通过扩展此类并重写相关方法,您可以控制在将其发送回DMPhotoPagesController使用之前UI对象的外观。

如果您将要创建自定义DMPhotoPagesFactory子类,您必须使用允许您传递DMPhotoPagesFactory实例的init方法之一初始化DMPhotoPagesController,例如这个

- (id)initWithDataSource:(id<DMPhotoPagesDataSource>)dataSource 
                delegate:(id<DMPhotoPagesDelegate>)aDelegate 
       photoPagesFactory:(DMPhotoPagesFactory *)factory 
            photoAtIndex:(NSInteger)index

状态对象在DMPhotoPages中是如何工作的?

在任何给定时间,照片库都有一个状态对象被分配为当前状态,当接收到用户事件时,照片库的状态对象负责照片库应该如何响应。

按照惯例,状态对象是解耦的。这意味着它们对其他状态对象一无所知,也没有保留自己的数据。您可以自由地创建和销毁它们,无需担心(或内疚……)。

当状态对象决定是时候过渡到新状态时,它只是调用照片库中的一个方法,用下一个状态对象的新实例替换当前状态对象。

为了为您实现的图库创建一个新的自定义状态,您应该做两件事

  1. 创建一个新的状态对象,它是 DMPhotoPagesState 对象的子类,并重写您感兴趣的方法。(例如:DMPhotoPagesCoolNewState)

  2. 创建一个 DMPhotoPages 类的类别,其中包含您自定义转换的方法。转换方法的目的通常是设置 DMPhotoPagesController 的 “currentState” 对象为新的自定义状态实例。(例如:-(void)transitionToCoolNewState;)

  3. 决定用户如何到达这个新的自定义状态。如果在界面上有一个特殊的按钮,当用户点击时可以将其带到这个状态,那么请确保 DMPhotoPages 调用该用户事件的您的新转换方法。如果您在默认状态机流程(DMPhotoPagesController 的正常默认行为)之间注入此自定义状态,那么这可能需要更多重写现有类,以便到达您的新状态而不是原始状态。

  4. 别忘了实现某种方式让用户退出您的自定义状态,回到默认的空闲浏览状态!

关于功能了解更多。

  • 标签:如果您还不知道,标签是照片中某个位置的趣味点(通常是人脸)。标签在照片中的坐标在 0 到 1 之间归一化,因此这个点与实际照片的当前分辨率无关。为了可用性,标签不会坐在被标记的像素上,而是有一定填充,将其定位在下面几像素处,以避免被标签过多遮挡。

  • 评论:如您所想象,评论是伴随着照片的用户提交的文本。评论还包括元数据,例如用户的名称、他们的头像和发布时间。评论出现的顺序是由数据源返回它们的顺序决定的。

  • 零图形文件:令人惊讶的是,DMPhotoPages 库不需要图形文件用于其默认工具栏图标,因为所有内容都是原生代码绘制并转换为 UIImage。但是,如果您想使用实际的图形文件作为自定义图标,您始终可以提供它们,并通过适当的方法直接返回它们。

  • 分享:DMPhotoPages 提供了一个默认的活动表单,用于分享照片。您可以通过从数据源对象返回一个自定义的来自定义显示的表单和服务。

  • 照片报告:当用户遇到不适当的内容时,需要有一种方式让用户报告它。DMPhotoPages 提供了一个报告选项,该选项会通知您的数据源某张照片需要标为不适当。

实现 DMPhotoPages 时需要考虑哪些问题?

  • 缓存:DMPhotoPages 并没有为图片内容实现自己的缓存系统。这个责任转交给了你为 DMPhotoPages 选择的任何数据源。如果你关心速度(通常情况下是这样的),你可能会提前获取内容并保存以加快加载。

  • 用户权限:当用户在照片上进行某些操作,如评论、标记或删除(以及其他操作)时,DMPhotoPages 会询问其代理用户是否有相应的权限。这种做法可以在每张图片的基础上控制用户能做什么和不能做什么,这意味你需要考虑如何在你的端上组织用户权限。

  • 创建/销毁内容:当 DMPhotoPages 通知你的代理用户已发起创建或删除内容动作时,为你的后端准备能力以进行新内容的发布或现有内容的删除。由 DMPhotoPages 直接负责删除数据或直接将数据发布到你的服务器上并不是一个好主意。

我能提供哪些帮助?

虽然这个库有很多功能并且有超过5000行代码,但还有一些挑战需要解决。自由地对库进行改进并提交 pull 请求。特别是以下这些区域需要关注:

  • 更多标题内容:标题块可能是一个很好的地方来显示照片的点赞数,包括作者、发布日期、位置以及照片是否为私密或公开。如果这些都可以点触就更好。

  • 页码指示器:一个页码指示器,显示有多少张照片以及当前在哪个照片上(可能位于左上角)将非常有用。

  • 标签弹出框:赞美标签弹出框,它们尽可能地保持在照片边界内,不会被切割到屏幕之外,但这种行为仍然可以改进。现在的实现有点简单,箭头需要更接近实际标记像素的地方,而不仅仅是推开。还应考虑照片的缩放比例。

  • 删除内容:曾经删除图片是完美的,但在这个过程中有所更新,出了点问题,现在有点不稳定(尽管图片可以从数据源中删除)。主要问题是 UIPageViewController 不会在将旧视图控制器滚动到不存在时丢弃被删除图片的旧视图控制器。

  • 替代工具栏布局:当前的工具栏不错,但总有更好的或不同的处理方法。如果开发者可以仅仅通过设置一个枚举属性的新值来调整工具栏的布局样式,那就太棒了。多样性越多越好。

  • iOS 7 特性:该项目开始得比 iOS 7 早了一些。如果有机会将基于物理特征或视差效果融入相册会很有趣。记得添加一个属性来开关这些选项。

  • 网络:与加载内容相关的代码被设计为异步执行,但还没有在任何类型的消费者规模网络上彻底测试过。经验更丰富的人可能想要从实践经验中提出一些改进意见。

  • 点赞:DMPhotoPages中缺少的一个显著的特性是“点赞”照片的功能。

  • 本地化:所有用于界面的字符串都准备好了使用NSLocalizedString进行本地化。目前,库中没有提供本地化文件,所以只有英语被表示。如果您希望您的语言和您的文化得到代表,您可以考虑为项目添加和共享本地化文件!

  • 评论分页:当照片积累了惊人的数量评论时,一次性进行所有Web请求就显得不切实际。需要一个允许评论分页的系统,因为目前DMPhotoPages不允许通过用户请求加载新评论。另一个选择是实现无限滚动,通过告知数据源用户在评论中滚动到的单元格,以便在需要时下载更多评论。

  • 演示过渡:DMPhotoPages最初的设计意图是从缩略图扩展到完整相册,然后在用户退出相册时缩小到图像缩略图。然而,这一功能从未实现,但是还有其他有趣的过渡变体。

有什么问题或错误吗?

  • 加载指示器有时不会显示。
  • 删除评论的动画不够平滑。
  • (!) 删除照片不会立即从相册中删除,向后滚动会显示旧数据。(但是,照片仍然从数据模型中删除)
  • (!) 删除相册末尾的照片导致崩溃,可能是由于滚动超过索引?
  • 在横向模式下创建标签有点混乱。
  • 目前编辑标签不起作用。
  • 删除标签后,工具栏图标消失,必须点击照片两次才能返回它们。
  • 在长按评论以查看复制和删除选项时,只有相关的评论应该保持高亮。
  • 在长按照片并选择标记照片选项后,应在长按的位置开始新的标签,而不是仅仅是进入标记模式。

您拥有许可吗?

DMPhotoPages采用MIT许可证

版权所有(c)2014 Eddy Borja

在此特此授予任何人,免费用本软件及其相关文档文件(“软件”)的权利,无限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许本人提供本软件的人员进行上述操作,但受以下条件约束

上述版权声明和本许可声明应包含在所有副本或软件的主要部分中。

本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任基于合同、侵权或其他原因,无论这些责任是由于、来自或与软件的使用或其他方式相关。

谁创造了这个程序?

EBPhotoPages及其组件由Eddy Borja创建。

iPhone PSD模板由Mikael Eidenberg提供。

由于其他责任,我目前无法继续从事这个项目,但我总是欢迎pull请求。

贡献者始终可以在这里找到。