“照片库很快会变成应用中非常复杂的组件。EBPhotoPages 项目演示了开发者如何使用 状态模式 来控制具有众多功能的接口的行为。这种模式允许为 EBPhotoPages 照片库的自定义实现创建新行为,而无需修改或理解大量原始源代码。目标是设计一个照片库类,它将能够平滑地支持未来可能需要的任何用例。”
EBPhotoPages 是一个用于在滚动视图中显示照片页及其元数据的照片库库。用户可以缩放照片,创建、编辑或删除评论和标签,共享或删除照片,并举报不适当的照片。所有照片和内容都是异步加载的。照片的用户权限通过委托协议进行控制。库不需要图形文件,因为图标是在代码中绘制的。
该库是在使用状态模式以控制相册行为的情况下设计的,这样其他开发者就可以轻松修改或添加新状态,而无需深入了解原始代码。
快速功能列表
0) 将 QuartzCore.framework、CoreGraphics.framework 和 AVFoundation.framework 添加到您的项目中。
1) 将此存储库中的 EBPhotoPagesController 文件夹添加到您的应用程序中。
2) 在你计划用作EBPhotoPagesController实例的数据源和代理的object对象中实现EBPhotoPagesDataSource
(必需)和EBPhotoPagesDelegate
(可选)协议。
3) 然后,初始化并显示PhotoPagesController
EBPhotoPagesController *photoPagesController = [[EBPhotoPagesController alloc]
initWithDataSource:aDataSource delegate:aDelegate];
[self presentViewController:photoPagesController animated:YES completion:nil];
EBPhotoPagesFactory类旨在成为所有UI对象的“一站式”商店。该类负责实例化UI元素并将它们返回给EBPhotoPagesController。如果你希望自定义相册实现的样式,你应该首先检查你想自定义的内容。一些其他UI元素尚未由这个类创建,但计划最终将其移动到其中。
通过继承此类并重写相关方法,您可以在UI对象被发送回EBPhotoPagesController使用之前控制它们的外观。
如果你打算创建一个自定义的EBPhotoPagesFactory子类,你必须使用可以传递EBPhotoPagesFactory实例的初始化方法之一来初始化你的EBPhotoPagesController,如下所示
- (id)initWithDataSource:(id<EBPhotoPagesDataSource>)dataSource
delegate:(id<EBPhotoPagesDelegate>)aDelegate
photoPagesFactory:(EBPhotoPagesFactory *)factory
photoAtIndex:(NSInteger)index
在任何给定时间,相册都有一个分配为其当前状态的状态对象,当收到用户事件时,相册的状态对象负责相册应该如何响应。
按照惯例,状态对象是相互解耦的。这意味着它们对其他状态对象一无所知,并且它们也不保留自己的数据。您可以自由地创建和销毁它们,无需担心(或内疚)。
当状态对象决定是时候过渡到新状态时,它只是调用相册中的一个方法,用下一个状态对象的新实例替换当前状态对象。
为了为你的相册实现创建新的自定义状态,你应该做两件事
1) 创建一个新的状态对象,它是EBPhotoPagesState对象的子类,并重写你感兴趣的方法。(示例:EBPhotoPagesCoolNewState)
2) 创建一个包含你的自定义转换方法的自定义EBPhotoPages类。转换方法的目的通常是设置EBPhotoPagesController的“currentState”对象为你的新自定义状态的新实例。(示例:-(void)transitionToCoolNewState;)
3) 决定用户如何到达这个新的自定义状态。如果界面中有一个特别的按钮,在用户点击时将用户带到这个状态,那么确保EBPhotoPages调用你的新转换方法来处理用户事件。如果你在默认状态机流程(EBPhotoPagesController的常规默认行为)中间注入这个自定义状态,那么可能需要更多地对现有类进行重写,以便达到你的新状态而不是原始状态。
4) 不要忘记实现一种方法,让用户能够从你的自定义状态退出,并返回到默认的空闲浏览状态!
标签:如果你还不了解,标签是照片中某个特定位置的一个兴趣点(通常是人的脸)。标签在照片中的坐标在0到1之间正常化,这样点就独立于照片的实际分辨率。为了用户友好性,标签不会精确地位于被标记的像素上,而是有一个填充,将它下移几个像素排列,这样兴趣点就不会被标签过度遮挡。
注释:正如你可以想象的,一个注释就是伴随一张照片的用户提交的文本。注释还包括元数据,如用户的姓名、头像和发布时间。注释出现的顺序决定了数据源返回它们的顺序。
无图形文件:令人惊讶的是,EBPhotoPages库不需要图形文件来构建默认工具栏图标,因为所有内容都是原生前端绘制并转换为UIImage。但是,如果你希望使用实际的图形文件来创建自定义图标,你可以通过适当的方法直接提供它们。
分享:EBPhotoPages提供默认的活动表单用于分享照片。你可以根据数据源对象返回的自定义表单来定制显示哪种类型和哪些服务。
报告照片:当用户遇到不当内容时,需要有报告它的方式。EBPhotoPages提供了一个报告选项,它会通知数据源照片需要被标记为不当内容。
缓存:EBPhotoPages没有为自己的照片内容实现缓存系统。这个责任转移给了你为EBPhotoPages决定使用的任何数据源。你应该提前预取内容并保存它们,以加快加载速度,如果速度是一个问题的话(通常情况下是这样的)。
用户权限:当用户对一个照片进行操作,例如评论、标记或删除(以及其他操作)时,EBPhotoPages会询问其代理,用户是否有权限执行该操作。这种方法为根据每张照片控制用户能够做什么和不能做什么提供了灵活性。这意味着你应该考虑如何在你的端上组织用户权限。
创建/销毁内容:为当EBPhotoPages通知你的代理用户已经启动了这样的操作时,准备好后端以发布新内容或删除现有内容做好准备。不是由EBPhotoPages本身直接负责在实际从服务器删除或提交数据到服务器中是一个好主意。
尽管这个库具有许多功能并且超过5000行代码,但仍有一些挑战需要解决。请随意改进这个库并提交拉取请求。特别是以下领域需要关注
更多内容描述:内容描述块可能是显示照片已被喜欢次数、作者、发布日期、位置以及照片是私有还是公有的好地方。如果这些是可以点击的,那将更加完美。
页面指示器:一个显示照片总数和当前所在照片位置的页码指示器会很有用(可能在左上角)。
标签弹出菜单:感谢标签弹出菜单,它们尽量保持在照片边界内,以免在屏幕上被切断,但此行为仍需要改进。当前实现有点简单,箭头需要绘制得接近实际标记的像素,而不仅仅是简单地推挤过去。还应考虑照片的缩放等级。
删除内容:曾几何时,删除照片工作得完美无缺,但不知在哪个更新过程中,某处出现了故障,现在它有点儿糟糕(尽管照片确实从数据源中删除了)。主要问题是UIPageViewController不会删除被删除照片的旧视图控制器,直到你将其滚动到不存在为止。
替代工具栏布局:当前的工具栏工作得很好,但总有更好的或不同做事的方式。如果开发者可以通过简单设置一个枚举属性的新值,将工具栏设置为不同的布局样式,那就再好不过了。多样性越多越好。
iOS 7特性:这个项目是在iOS 7推出之前开始开发的。如果能选择包含一些基于物理特性的功能或视差效果进入相册,那将是非常棒的。记得要添加一个开关这些功能的属性。
网络:相关加载内容代码设计为异步执行,但在任意消费级网络应用中都未经过充分测试。有更多经验的人可能想要尝试从实践经验中提出一些改进意见。
点赞:从EBPhotoPages中缺失的更显著特性之一是“点赞”照片的能力。
本地化:用于界面的所有字符串均已准备好使用NSLocalizedString进行本地化。目前,库中没有提供本地化文件,因此仅提供英语。如果您希望自己的语言能够代表您的文化,您应该考虑向项目中添加和共享本地化文件!
评论分页:当照片积累了大量评论时,一次性对所有评论进行网络请求是不切实际的。需要一个允许评论分页的系统,因为目前EBPhotoPages不允许用户请求加载新评论。另一个选择是实现无限滚动,通过告知数据源用户已滚动的评论单元格,以便在需要时下载更多评论。
展示过渡:最初EBPhotoPages的意图是从缩略图扩展到完整相册,然后在用户退出相册时缩小回图像缩略图。然而,这从未得到实现,还有其他令人感兴趣的过渡变化。
EBPhotoPages 使用MIT许可协议。
版权所有(c)2014 Eddy Borja
在此特此授予任何获得本软件及其相关文档(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或销售软件副本,并允许任何获得软件的人这样做,受下述条件约束
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分的副本中。
本软件提供“按原样”的软件,不提供任何形式的担保,包括但不仅限于适销性、适用于特定目的以及未经授权的侵权担保。在任何情况下,作者或版权所有者不应对由于软件、或者在软件的使用中产生的任何索赔、损害或其他责任承担任何责任,无论该责任源于合同行为、侵权或其他行为。
EBPhotoPages 及其组件由 Eddy Borja 创建。
iPhone PSD 模板由 Mikael Eidenberg 提供。
请务必查看这些其他库
MLPSpotlight
UIColor+MLPFlatColors
MLPAccessoryBadge
MLPAutoCompleteTextField