导读: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分辨率下,看起来是这个样子:
弹出菜单每一页会显示最多5个图标,而第六个省略号图标用来引出下一页的按钮,你可以拥有任意数量的页面。这里有一个demo的视频:
注意翻页按钮(…)的位置可以通过设置MGTileMenu的左右手使用习惯属性而改变,同时这个控件还考虑的对用户手指遮挡区域的留白处理。
MGTileMenu提供了委托协议(delegate protocol)以方便开发者对按钮图标、背景(支持图标、渐变色、纯色)的深度定制。
MGTileMenu同时还抛出了各种通知消息(notifications)以方便开发者调用。当然,为了获得最佳的用户体验,我在开发这个控件的时候大量使用了Core Animation技术。
我本着方便开发者调用的初衷设计了MGTileMenu控件:它的缺省界面和操控表现已经可以满足大部分场合的调用。此外控件的一些智能化处理也将降低调用者的开发量,例如:它会根据开发者告之的屏幕显示位置,结合屏幕边际距离、设备旋转能因素,综合计算后安排菜单最终显示位置,以避免控件显示在屏幕外等尴尬的结果。随控件附带的view controller也是按照方便使用的原则设计了属性、方法及委托协议。总之,你会发现集成MGTileMenu到你的项目中是很容易的一件事儿。
在代码资源里我还放了一个demo程序,用来展示如果配置生成一个例子菜单。运行这个demo后,在屏幕任意位置双击可以唤出MGTileMenu菜单。当然,在你自己的应用开发中,你可以通过单次触碰等更自然的方法唤出MGTileMenu菜单。
许可证及捐赠
MGTileMenu是基于署名授权协议(Attribution License)发布的。同我的其它代码一样,我开发并免费发布这个控件是为了给iOS及Mac开发社区提供一点贡献,我本人很自豪成为这个社区里的一员。
为了支持这个控件的不断更新(同时为了支持我的博客),请考虑捐赠或者购买非署名授权许可证。
你可以通过下面的捐赠按钮,或者向我的PayPal账号 (matt.gemmell
at Gmail)捐助,我会非常感谢,并通过未来的博客文章以及代码做出回报。
如果你不想在你的应用中提供本控件的授权署名信息,请通过我的在线许可证商店购买非署名授权协议。感谢支持!
下载代码
支持,bug及功能请求
我不承诺对这个控件提供任何支持。哥们,遇到问题你只有靠自己了。当然,你可以通过github上的issue tracker提交新功能请求。如果想提交bug报告,也请通过GitHub的issue tracker,请务必同时附上你对bug的分析及修复方案(要源代码哦)。我想,作为使用者,你一定是一个有能力自行分析并修复问题的合格开发者,对不?同时欢迎在github上提交pull请求或者补丁申请。
再啰嗦一次:请不要提交不含分析及推荐修复代码的bug报告!
聊聊MGTileMenu的设计
设计MGTileMenu的初衷是为了发掘一种新的UI/UX方式,当用户触摸iPad屏幕后,提供具有关联性的可选项或者工具按钮。我在开发一个应用的时候设计了这个控件,后来我觉得有必要把这个控件单独发布出来。
在此之前,我也做过一些尝试,比如为每一个手指分配工具选项, 但是这次我想做的更加自然,用户体验更加有质感一些。我把最初的想法画在本子上。
不难看出,最终的成品和上面的草图差别不大。就这样,凭着一个草图和聊聊几笔注释,我打开Photoshop开始了第一版设计:
请注意,我把每一个菜单按钮方块的尺寸设计得和iPad屏幕上的应用图标一样大,这样可以给用户提供一个使用习惯上的延续性。但是,最初我在PS里面绘制按钮的时候,只是凭感觉拉了一个尺寸,结果正好是应用图标的大小,这完全是一个美妙的巧合!
看着第一版设计,我总感觉少了点什么:这些散布的按钮应该用什么东西把他们联合起来?很自然的,我想到了在按钮后面叠加一层面板:
可是,圆形的背板看起来太单薄了,它承托不出前面按钮矩阵的气场;那些辐射状的连接线看起来也很杂乱,使得功能按钮和关闭按钮直接的关系变很令人费解。这些线必须干掉。
接下来我用了一个可以完全包住所有按钮的圆角背板,感觉还不赖,但是少了几分活力,多了几分沉重。我理想中的背板应该更具动感,以迎合之后我通过Core Animation编写的动画效果的气质。
所以我把圆角背板的尺寸裁剪了些许,这样既整合了四周的按钮,又为中心的关闭按钮提供的背景支撑。事实上在我看来,悬于背板边缘的按钮布局多了几分活泼和有趣的意味。
在最终设计稿基础上,我通过代码实现了一切。下面是一个运行的实例,呈现的是缺省显示风格:
下面是使用一些定制化背景的效果。
我个人对最终的效果很满意。我想这是一个灵活、漂亮、吸引人的控件。接下来让我们看看用户交互设计及动画效果。
用户交互设计
设计伊始,我十分渴望能在用户手势操作上做出一些亮点。当我把自己的手放在iPad屏幕上,我发现我们会自然的把手向内侧弯曲,这使得我们的手指在屏幕上的滑动路径是斜向的而不是直上直下的。
因此,在这个控件的左下角(针对左撇子用户)或者右下角(针对右撇子用户),我安排了一些的留白,这里不能安排按钮,以避免被用户的手遮挡,事实上为了得到最佳效果,我留出了两个按钮的留白位置。
这样的留白设计同时也减少了在一页中可显示的最大按钮数量,这其实是件好事,我希望以此激发开发者在他们的应用中减少可选操作项,以体现简洁美。
注意,在为左撇子用户布局按钮顺序的时候,我不是简简单单把右撇子的按钮排序镜像反转过去的哦。因为我不认为左撇子的阅读、理解顺序也是反着的。当然通过委托协议你依然可以坚持翻转按钮排序如果你认为有必要的话。
好了,谈了这么多静态的布局和外观,现在我们看看动画效果。基于前面谈到的各种因素,我立刻想到我们需要以下几处动画效果:
1. 菜单的显示和消失。
2. 菜单换页时。菜单的显示消失动画很容易想:出现的时候是一个放大加淡入的效果,消失的时候是一个缩小加淡出的效果。难度在从一页菜单切换到下一页菜单的处理,因为同时要替换页面上所有的按钮。
基于按钮的布局,因为它们看起来都是浮动在背板边缘的,我想到的动画效果是:当用户选择换页的时候,四周的按钮被吸收到中心位置,替换成下一页按钮的图标,在释放回到原位。
我的最初实现看起来很傻很天真,我用慢动作回放一下动画效果给你们看一下:
同步的吸放动画效果
后来我在每个按钮的动画效果前都安排的一些滞后,这样出来的效果就好多了:
布进式的吸放动画效果
而按钮的替换我用了基本的淡入淡出效果,这样的替换看起来不那么唐突。
上面演示的动画是最终版本的效果。实际上,一开始这些按钮的动画效果是按照从左到右、自上而下的顺序逐个激发的:
可惜这种激发顺序产生的综合效果看起来比较杂乱,尤其是从上一行最右边按钮到下一行最左边按钮的过渡很不协调。后来我尝试了从翻页按钮(…)顺时针激发按钮动画,因为…按钮是用户触发整个切换场景的开端。所以最终的效果就是自翻页按钮(…)上面的那个按钮开始,顺时针绕一圈,逐个按钮吸收、替换、释放。如果配置成左撇子用户,则是反顺序的。