关于iOS 应用 UI 设计方面有哪些书籍推荐

发布网友 发布时间:2022-04-20 08:37

我来回答

2个回答

懂视网 时间:2022-04-21 22:31

前言

有些时候大家可能会遇到制作复杂、具有连贯性UIView动画的需求,这时大家可能会使用在completion闭包中衔接一段一段的动画,使之成为一段连续的动画。

如果我们只是连接2个,或者3个动画,这种方式或许还行得通,但如果有更多的动画片段需要连接的时候,这种方式会带来灾难性的问题,你的代码会非常的冗余,不断的在completion闭包中嵌套代码,使代码维护起来相当的困难。所以今天向大家介绍能更好地实现这个需求的方法,Keyframe动画。

Keyframe动画可以让我们有效的拆分由若干段动画连接而成的复杂动画,可以较为精准的定义每段动画的起始点及持续时间,并且在代码组织方面也非常清晰。先看看今天要带大家实现的动画Demo:

          

使用场景

我们先来认识一下,在什么样的场景下需要使用Keyframe动画。如图下所示,这是一个由四段动画组成的一个复杂动画,让UIView沿着长方形的轨迹运动:

我们来看看用代码如何实现:

[cpp] view plaincopy

  1. UIView.animateWithDuration(1, animations: {

  2. view.center.x += 200.0

  3. }, completion: { _ in

  4. UIView.animateWithDuration(1, animations: {

  5. view.center.y += 100.0

  6. }, completion: { _ in

  7. UIView.animateWithDuration(1, animations: {

  8. view.center.x -= 200.0

  9. }, completion: { _ in

  10. UIView.animateWithDuration(1, animations: {

  11. view.center.y -= 100.0

  12. }, completion: nil)

  13. })

  14. })

  15. })

通过上面的伪代码可以看到,我们使用了completion闭包的方式连接每一段的动画,代码看起来尚且算清晰,可读性也马马虎虎。但是大家想象一下,如果我们使UIView按照一个复杂的路线运行,这一段动画可能有十几、几十段动画组成的,那么如果再使用completion闭包这种方式连接,那代码是多么的惨不忍睹。幸好我们有Keyframe动画,下面就让我们来看看如何使用Keyframe动画。

Keyframe动画

首先我们会使用到UIView的另一个动画方法animateKeyframesWithDuration(_: delay: options: animations: completion: ) :

[cpp] view plaincopy

  1. UIView.animateKeyframesWithDuration(2, delay: 0, options: [], animations: {

  2. // add keyframes

  3. }, completion: nil)

这个方法的几个参数与前几个使用过的动画方法参数一样。上面代码片段的意思是整个关键帧动画的持续时间为2秒、无延迟、无动画选项、执行完毕后无后续执行的代码。

注:该方法的动画选项不再是UIViewAnimationOptions,而是UIViewKeyframeAnimationOptions。具体的内容大家可以去查阅Apple的文档。

接下来我们要在animations闭包中添加关键帧了:

[cpp] view plaincopy

  1. UIView.animateKeyframesWithDuration(2, delay: 0, options: [], animations: {

  2. UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.25, animations: {

  3. view.center.x += 200.0

  4. })

  5. }, completion: nil)

addKeyframeWithRelativeStartTime(_: relativeDuration: animations: )是UIView添加关键帧的方法,该方法有三个参数:

  • startTime:关键帧开始时间,该时间是相对整个关键帧动画持续时间的相对时间,一般值在0到1之间。如果为0,则表明这一关键帧从整个动画的第0秒开始执行,如果设为0.5,则表明从整个动画的中间开始执行。

  • relativeDuration:关键帧持续时间,该时间同样是相对整个关键帧动画持续时间的相对时间,一般值也在0到1之间。如果设为0.25,则表明这一关键帧的持续时间为整个动画持续时间的四分之一。

  • animations:设置视图动画属性的动画闭包。

  • 我们解释一下上面这段代码。整个关键帧动画的持续时间为2秒,第一个关键帧从第0秒开始,运行0.5秒结束。下面我们完成其他三个关键帧:

    [cpp] view plaincopy

    1. UIView.animateKeyframesWithDuration(2, delay: 0, options: [], animations: {

    2. UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.25, animations: {

    3. view.center.x += 200.0

    4. })

    5. UIView.addKeyframeWithRelativeStartTime(0.25, relativeDuration: 0.25, animations: {

    6. view.center.y += 100.0

    7. })

    8. UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.25, animations: {

    9. view.center.x -= 200.0

    10. })

    11. UIView.addKeyframeWithRelativeStartTime(0.75, relativeDuration: 0.25, animations: {

    12. view.center.y -= 100.0

    13. })

    14. }, completion: nil)

    第二个关键帧的开始时间为0.25,也就是从整个动画时间的第0.5时开始执行,同样持续0.5秒。后两个关键帧的参数就不难理解了。

    现在整个代码看起来非常整洁,条理清晰,可读性非常好,而且可以有更精确的控制。即使再多几个关键帧也同样可以从容应对。

    关键帧动画不仅仅用于同一个视图的分段动画,也可使使用于不同视图的组合动画,由于我们还没讲到图层动画,所以,开篇的示例动画中就使用了关键帧动画实现了多个视图的组合动画。

    示例动画

    在这个示例中虽然看起来是一个纸飞机视图的连续动画,但其实是由三个纸飞机视图组合而成的:

    从图中可以看到其实是有三个纸飞机视图,只不过在界面加载之前2号和3号纸飞机视图的透明度都是为零。

    整个动画是由这三个纸飞机视图通过关键帧动画组合而成:

    图中标示出了三个飞机视图的运行轨迹、视图大小、视图透明度的状态,我们来看看代码如何实现:

    [cpp] view plaincopy

    1. let zoomInScaleTransform = CGAffineTransformMakeScale(0.2, 0.2)

    2. UIView.animateKeyframesWithDuration(3, delay: 0, options: [], animations: {

    3. UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.2, animations: {

    4. self.customHeaderView.paperAirplane.center.x += self.view.frame.width

    5. self.customHeaderView.paperAirplane.center.y += -180

    6. self.customHeaderView.paperAirplane.transform = zoomInScaleTransform

    7. })

    8. UIView.addKeyframeWithRelativeStartTime(0.3, relativeDuration: 0.01, animations: {

    9. self.customHeaderView.paperAirplaneOpposite.alpha = 1

    10. self.customHeaderView.paperAirplaneOpposite.transform = zoomInScaleTransform

    11. })

    12. UIView.addKeyframeWithRelativeStartTime(0.3, relativeDuration: 0.5, animations: {

    13. self.customHeaderView.paperAirplaneOpposite.transform = CGAffineTransformIdentity

    14. self.customHeaderView.paperAirplaneOpposite.center.x -= self.view.frame.width

    15. self.customHeaderView.paperAirplaneOpposite.center.y += 90

    16. })

    17. UIView.addKeyframeWithRelativeStartTime(0.9, relativeDuration: 0.01, animations: {

    18. self.customHeaderView.paperAirplaneComeBack.alpha = 1

    19. })

    20. UIView.addKeyframeWithRelativeStartTime(0.9, relativeDuration: 0.2, animations: {

    21. self.customHeaderView.paperAirplaneComeBack.center.x += 33

    22. })

    23. }, completion: { _ in

    24. self.restorePaperAirplaneStatus()

    25. })

    大家看到这大家可能会有疑问了,三段动画怎么会有五个关键帧呢,我们来刨析一下:

  • 第一个关键帧:完成1号纸飞机视图运动到右上角并移出屏幕,视图逐渐变小的动画。该关键帧从整个动画的第0秒开始执行,持续时间为0.6秒。

  • 第二个关键帧:由于2号纸飞机视图的初始透明度为零,所以在第二个关键帧将透明度设为1,并且缩小视图。注意这两个动作需要在瞬间完成,所以relativeDuration设为0.01,一个极短的时间。开始时间为整个动画的第0.9秒开始,较第一个关键帧延迟0.3秒。

  • 第三个关键帧:与第二个关键帧同时开始执行,完成2号纸飞机视图从小变大、并且往左下角运动,一直移出屏幕。持续时间为1.5秒。

  • 第四个关键帧:与第二个关键帧作用相似,改变3号纸飞机视图的透明度,同样是在瞬间完成。

  • 第五个关键帧:与第四个关键帧同时执行, 完成向右移动的动画,持续0.6秒。

  • 关键帧完成之后,在completion闭包中调用restorePaperAirplaneStatus()方法,恢复3个纸飞机视图的状态及位置,以便再次执行动画。

    总结

    大家在使用关键帧动画时,对于关键帧的开始时间和持续时间需要仔细设置,保证每个关键帧在合适的时间开始,执行恰当的持续时间。在必要时候也需要在关键帧里修改视图的一些状态,但要设置极短的持续时间,表示瞬间完成。

    下一篇会向大家介绍在使用Auto Layout的情况下,如何通过约束实现动画,好了今天就先到这里吧。

    热心网友 时间:2022-04-21 19:39

    第一本:《Photoshop智能手机APP界面设计》

    概要:《Photoshop智能手机APP界面设计》讲解三大智能手机(Android、iOS和Windows Phone)APP用户界面(UI)的设计思路和制作过程。全书分为3章,第1章介绍了APP用户界面基础,包括什么是UI设计、手机UI与平面UI的区别和UI设计工具等基本概念和思路;第2章介绍用Photoshop制作各种智能手机UI常用元素,包括常用图形、控件、启动图标以及图片特殊处理等;第3章则是3大类型UI设计的实战练习,同时分析了各手机平台UI的设计思路。
    第二本:《iOS App界面设计创意与实践》
    在移动开发领域,也许每个App的用途都有所不同,不过它们都一定是源自于同一个开始,那就是一个最初的创意。这个创意可以来自于任何人——设计师或者开发者,营销经理或者CEO。《iOS App界面设计创意与实践》的意义就在于向读者介绍如何把创意变成真实的App。 《iOS App界面设计创意与实践》包括iOS入门、iOS用户界面基� ⑸杓苅OS自定义用户界面对象、向UI添加动画、通过手势进行人机交互等5个部分。
    第三本:《移动应用UI设计模式(简易的UI模式参考书)》
    移动应用UI设计模式》是一本移动应用UI设计模式参考书,分10大类介绍了70个移动应用设计模式(包括反模式),用400多个屏幕截图和图解帮助读者理解和利用UI设计模式,以解决常见的设计难题,同时提供了“即学即用”式的技巧和经验。 《移动应用UI设计模式》适合移动应用开发人员、UI设计师阅读。
    第四本:《移动Web实现指南——面向移动设备的网站优化、开发和设计》
    从移动网站项目最早的创意和发现阶段,到最后的可用性分析,《移动Web实现指南——面向移动设备的网站优化、开发和设计》引导读者使用一种非常全局的方法来思考网站的移动化设计。全书介绍了移动化规划、移动化设计和相应的编码技巧,特别适用于那些最初是为桌面电脑展示而设计的网站。书中的建议和实例,也是根据在优化这些网站的过程中所遇到的不同挑战来组织的。更重要地,《移动Web实现指南——面向移动设备的网站优化、开发和设计》还将带领读者思考如何偱序渐进地对网站进行移动化改造。 最后,《移动Web实现指南——面向移动设备的网站优化、开发和设计》还提供一些实例,使读者能够将本书的知识应用于一个现有的网站,以提供更多学习和动手的机会。

    第五本:《触动人心——设计优秀的iPhone应用》
    本书是《Tapworthy: Designing Great iPhone Apps》的中文翻译版。 可能你设计网站产品或软件界面早已得心应手,可是遇到了iPhone,却感觉无从下手。 无论你是产品经理、设计师、创业者还是程序员,本书都能告诉你如何从iPhone的角度来思考应用设计。本书能帮助你理解如何设计iPhone应用,要创建一款触动人心的应用,需要如何去综合思考设计、心理、文化、人体工程和可用性问题。在书中,你会看到大量的真实应用的设计…

    第六本:《认知与设计:理解UI设计准则》
    [美]Jeff Johnson 著  人民邮电出版社《认知与设计:理解UI设计准则》语言清晰明了,将设计准则与其核心的认知学和感知科学高度统一起来,使得设计准则更容易地在具体环境中得到应用。涵盖了交互计算机系统设计的方方面面,为交互系统设计提供了支持工程方法。不仅如此,这也是一本人类行为原理的入门书。 《认知与设计:理解UI设计准则》不仅适合需要应用用户界面和交互设计准则的软件开发人员阅读,也是软件开发管理者的最佳选择。
    第七本:《UI进化论——移动设备人机交互界面设计》
    本书内容涵盖交互设计与界面设计的基本概念、设计规范和工作流程。由于这是一本以实际工作案例和工作经验为主的书,一开始着力介绍目前最新发展的交互手段和使用场所,当然是以移动手持设备为主。作为设计师,一定要关心如何将这些创意产品化。接下来介绍如何正确地将一个设计想法变成产品。产品化的过程中,用户体验设计是相当重要的,由于UCD设计思想的广泛使用,本书重点研究并分析用户体验设计的可行性和方法。
    声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
    E-MAIL:11247931@qq.com