MGTileMenu:一个开源iOS控件的诞生

337 查看

导读:Matt Gemmell是欧美知名iOS/Mac开发人员,现居苏格兰爱丁堡。Matt围绕他近期发布的一个开源iOS控件MGTileMenu写了两篇博文。在惊叹国外顶尖开发人员对细节精益求精的专业态度之余,我们是否也应该反思国内从业人员低水平重复的现状与深层次原因?

很高兴宣布我的又一个开源iOS控件MGTileMenu发布了。这个控件基于iOS 5开发,使用了ARC(译者注:Automatic Reference Counting),能提供具有关联性、基于砖形按钮的弹出式菜单,对Retina和非Retian显示屏都有很好的支持,同时还支持VoiceOver。MGTileMenu最初是为iPad应用开发设计的,但把它用在iPhone和iPod Touch应用里也是可以的。

你可以基于署名授权许可证(Attribution License)免费使用MGTileMenu,也可以付点费用而免去署名授权协议的限制。MGTileMenu没有使用其它第三方资源。在Retina分辨率下,看起来是这个样子:

MGTileMenu

弹出菜单每一页会显示最多5个图标,而第六个省略号图标用来引出下一页的按钮,你可以拥有任意数量的页面。这里有一个demo的视频:

注意翻页按钮(…)的位置可以通过设置MGTileMenu的左右手使用习惯属性而改变,同时这个控件还考虑的对用户手指遮挡区域的留白处理。

MGTileMenu提供了委托协议(delegate protocol)以方便开发者对按钮图标、背景(支持图标、渐变色、纯色)的深度定制。

Emoticons menu
这是使用了一套表情图标定制的菜单

 

MGTileMenu同时还抛出了各种通知消息(notifications)以方便开发者调用。当然,为了获得最佳的用户体验,我在开发这个控件的时候大量使用了Core Animation技术。

我本着方便开发者调用的初衷设计了MGTileMenu控件:它的缺省界面和操控表现已经可以满足大部分场合的调用。此外控件的一些智能化处理也将降低调用者的开发量,例如:它会根据开发者告之的屏幕显示位置,结合屏幕边际距离、设备旋转能因素,综合计算后安排菜单最终显示位置,以避免控件显示在屏幕外等尴尬的结果。随控件附带的view controller也是按照方便使用的原则设计了属性、方法及委托协议。总之,你会发现集成MGTileMenu到你的项目中是很容易的一件事儿。

在代码资源里我还放了一个demo程序,用来展示如果配置生成一个例子菜单。运行这个demo后,在屏幕任意位置双击可以唤出MGTileMenu菜单。当然,在你自己的应用开发中,你可以通过单次触碰等更自然的方法唤出MGTileMenu菜单。

 

许可证及捐赠

MGTileMenu是基于署名授权协议(Attribution License)发布的。同我的其它代码一样,我开发并免费发布这个控件是为了给iOS及Mac开发社区提供一点贡献,我本人很自豪成为这个社区里的一员。

为了支持这个控件的不断更新(同时为了支持我的博客),请考虑捐赠或者购买非署名授权许可证。

你可以通过下面的捐赠按钮,或者向我的PayPal账号 (matt.gemmell at Gmail)捐助,我会非常感谢,并通过未来的博客文章以及代码做出回报。

如果你不想在你的应用中提供本控件的授权署名信息,请通过我的在线许可证商店购买非署名授权协议。感谢支持!

 

下载代码

你可以在github上下载MGTileMenu的代码

 

支持,bug及功能请求

我不承诺对这个控件提供任何支持。哥们,遇到问题你只有靠自己了。当然,你可以通过github上的issue tracker提交新功能请求。如果想提交bug报告,也请通过github的issue tracker,请务必同时附上你对bug的分析及修复方案(要源代码哦)。我想,作为使用者,你一定是一个有能力自行分析并修复问题的合格开发者,对不?同时欢迎在github上提交pull请求或者补丁申请。

再啰嗦一次:请不要提交不含分析及推荐修复代码的bug报告!

 

聊聊MGTileMenu的设计

设计MGTileMenu的初衷是为了发掘一种新的UI/UX方式,当用户触摸iPad屏幕后,提供具有关联性的可选项或者工具按钮。我在开发一个应用的时候设计了这个控件,后来我觉得有必要把这个控件单独发布出来。

在此之前,我也做过一些尝试,比如为每一个手指分配工具选项, 但是这次我想做的更加自然,用户体验更加有质感一些。我把最初的想法画在本子上。

Initial sketch
最初的设计草图

 

不难看出,最终的成品和上面的草图差别不大。就这样,凭着一个草图和聊聊几笔注释,我打开Photoshop开始了第一版设计:

First mockup
第一版设计

 

请注意,我把每一个菜单按钮方块的尺寸设计得和iPad屏幕上的应用图标一样大,这样可以给用户提供一个使用习惯上的延续性。但是,最初我在PS里面绘制按钮的时候,只是凭感觉拉了一个尺寸,结果正好是应用图标的大小,这完全是一个美妙的巧合!

看着第一版设计,我总感觉少了点什么:这些散布的按钮应该用什么东西把他们联合起来?很自然的,我想到了在按钮后面叠加一层面板:

Round bezel with struts
圆形的背板及连接线

 

可是,圆形的背板看起来太单薄了,它承托不出前面按钮矩阵的气场;那些辐射状的连接线看起来也很杂乱,使得功能按钮和关闭按钮直接的关系变很令人费解。这些线必须干掉。

 

Encompassing bezel
包裹式的背板

 

接下来我用了一个可以完全包住所有按钮的圆角背板,感觉还不赖,但是少了几分活力,多了几分沉重。我理想中的背板应该更具动感,以迎合之后我通过Core Animation编写的动画效果的气质。

Final design
最终设计

 

所以我把圆角背板的尺寸裁剪了些许,这样既整合了四周的按钮,又为中心的关闭按钮提供的背景支撑。事实上在我看来,悬于背板边缘的按钮布局多了几分活泼和有趣的意味。

在最终设计稿基础上,我通过代码实现了一切。下面是一个运行的实例,呈现的是缺省显示风格:

Tile menu default appearance
缺省状态

 

下面是使用一些定制化背景的效果。

MGTileMenu, page 2
MGTileMenu第二页

 

我个人对最终的效果很满意。我想这是一个灵活、漂亮、吸引人的控件。接下来让我们看看用户交互设计及动画效果。

 

用户交互设计

设计伊始,我十分渴望能在用户手势操作上做出一些亮点。当我把自己的手放在iPad屏幕上,我发现我们会自然的把手向内侧弯曲,这使得我们的手指在屏幕上的滑动路径是斜向的而不是直上直下的。

因此,在这个控件的左下角(针对左撇子用户)或者右下角(针对右撇子用户),我安排了一些的留白,这里不能安排按钮,以避免被用户的手遮挡,事实上为了得到最佳效果,我留出了两个按钮的留白位置。

Configurable Handedness
左右手使用习惯可以配置

 

这样的留白设计同时也减少了在一页中可显示的最大按钮数量,这其实是件好事,我希望以此激发开发者在他们的应用中减少可选操作项,以体现简洁美。

注意,在为左撇子用户布局按钮顺序的时候,我不是简简单单把右撇子的按钮排序镜像反转过去的哦。因为我不认为左撇子的阅读、理解顺序也是反着的。当然通过委托协议你依然可以坚持翻转按钮排序如果你认为有必要的话。

好了,谈了这么多静态的布局和外观,现在我们看看动画效果。基于前面谈到的各种因素,我立刻想到我们需要以下几处动画效果:

1. 菜单的显示和消失。

2. 菜单换页时。菜单的显示消失动画很容易想:出现的时候是一个放大加淡入的效果,消失的时候是一个缩小加淡出的效果。难度在从一页菜单切换到下一页菜单的处理,因为同时要替换页面上所有的按钮。

基于按钮的布局,因为它们看起来都是浮动在背板边缘的,我想到的动画效果是:当用户选择换页的时候,四周的按钮被吸收到中心位置,替换成下一页按钮的图标,在释放回到原位。

 

我的最初实现看起来很傻很天真,我用慢动作回放一下动画效果给你们看一下:

同步的吸放动画效果

 

后来我在每个按钮的动画效果前都安排的一些滞后,这样出来的效果就好多了:

布进式的吸放动画效果

 

而按钮的替换我用了基本的淡入淡出效果,这样的替换看起来不那么唐突。

上面演示的动画是最终版本的效果。实际上,一开始这些按钮的动画效果是按照从左到右、自上而下的顺序逐个激发的:

Tile index order
按钮动画激发顺序

 

可惜这种激发顺序产生的综合效果看起来比较杂乱,尤其是从上一行最右边按钮到下一行最左边按钮的过渡很不协调。后来我尝试了从翻页按钮(…)顺时针激发按钮动画,因为…按钮是用户触发整个切换场景的开端。所以最终的效果就是自翻页按钮(…)上面的那个按钮开始,顺时针绕一圈,逐个按钮吸收、替换、释放。如果配置成左撇子用户,则是反顺序的。

Tile animation order
最终动画激发顺序

 

动画处理上画了我一点时间,但是看着最终的效果还是觉得很值得。

当然,内部代码以及委托协议里面对按钮的排序还是基于从左到右、自上而下的自然逻辑,这里我就不折腾调用控件的程序员了。

 

后记

我个人很享受制作MGTileMenu的过程,同样我希望这个东西对你有所帮助,包括这篇文章 — 无论是设计还是编码,我注入的全是爱与激情。 不厌其烦的再次插播广告,请考虑通过捐赠或者购买非署名许可证的方式支持我的代码和博客。

 

另外,我透过MGTileMenu开发过程的另外一个视角写了另外一篇博客: API Design, and why I designed it the way I did译者注:此篇稍后翻译) 。对于开发者来说,API就是他们的用户界面。在那篇博文里,我以MGTileMenu为例,阐述了自己对iOS及OS X组件开发的一些观点。

预知更多信息,请粉我的推 (@mattgemmell). Enjoy MGTileMenu!

 

英文原文:Matt Gemmell    编译:伯乐在线 – 陈远

【如需转载,请标注并保留原文链接、译文链接和译者等信息,谢谢合作!】