Auto Layout 使用心得(六)—— 制造炫酷的下拉刷新动画

Auto Layout 使用心得(六)—— 制造炫酷的下拉刷新动画


原文发表在我的个人网站:Auto Layout 使用心得(六)—— 制造炫酷的下拉刷新动画


此系列文章代码仓库在 https://github.com/johnlui/AutoLayout ,有不明白的地方可以参考我的 Auto Layout 设置哦,下载到本地打开就可以了。

简介

本文中,我们将一起使用 Auto Layout 技术制造一个炫酷的下拉刷新动画。Auto Layout 除了在布局的时候比较繁琐以外,还有一个经常被人吐槽的点:让许多 UIView.animateWithDuration 失效,甚至在界面上出现 “反方向动画” 的视觉效果。本文中我们将主要讲述制造下拉刷新动画的过程,关于 Auto Layout 与动画的详细配合我们以后再一起仔细探究。

实现首页整体下拉回弹效果

建立接受下拉事件的主 View

使用一个跟窗体一样很大的 mainView 把目前首页的五个元素包括,并补全 Auto Layout 布局。层次结构改变会让除尺寸约束之外的所有约束消失。

pic

修改 UI 绑定及动画函数

UI 和代码的绑定修改成如下:

pic

重新给 mainView 绑定上 panGesture,从 mainView 向 panGesture 拖动:

pic

修改存储值的变量名称和初始化代码:

swift...
var mainViewTopSpaceLayoutConstraintValue: CGFloat!
var mainViewOriginY: CGFloat!

...

mainViewTopSpaceLayoutConstraintValue = topLayoutConstraintOfMainView.constant
mainViewOriginY = mainView.frame.origin.y

...

修改手势触发的目标函数(增加冒号):

swiftpanGesture.addTarget(self, action: Selector("pan:"))

改写动画目标函数:

swiftfunc pan(recongnizer: UIPanGestureRecognizer) {
    if panGesture.state == UIGestureRecognizerState.Ended {
        UIView.animateWithDuration(0.4, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
            recongnizer.view?.frame.origin.y = self.mainViewOriginY
            }, completion: { (success) -> Void in
                if success {
                    self.topLayoutConstraintOfMainView.constant = self.mainViewTopSpaceLayoutConstraintValue
                }
        })
        return
    }
    let y = panGesture.translationInView(self.view).y
    topLayoutConstraintOfMainView.constant = mainViewTopSpaceLayoutConstraintValue + y
}

查看新的拖动回弹效果

pic

建立动画视图

建立动画主视图

拖动一个 View 到 mainView 上面,目的是置于 mainView 图层之下。在 Xcode 里,最上面的元素位于 UI 的最底层,这个顺序跟 PS 正好相反。修改其 frame,添加 Auto Layout 约束,如下图:

pic

将 UI 和代码绑定:

pic

动画的时候我们需要该主视图进行一定程度的下移,故将其 “到父视图顶部的距离” 的约束也进行绑定。(此图为后期补充,请自动忽略其子元素)

填充动画元素

将动画主视图改名为 HiddenTopView。为了方便的填充动画元素,需要先将 HiddenTopView 移动到 mainView 之下,以便将图层显示在 mainView 之上,不被其遮挡,无法编辑。我填充了三个图片资源,全部加上约束。具体约束大家可以自由发挥。效果如下:

pic

由于我使用了白云元素,故将最大的 view 的背景色填充为灰色,将 HiddenTopView 背景色设置为透明。

查看布局效果

pic

动画规划

我们计划整个下拉刷新动画分为四个部分。下拉时:

  1. 整个 HiddenTopView 下移
  2. 小云彩从屏幕右侧飞入
  3. 大云彩持续做往复运动
  4. 下拉距离超过一定值时,中间子元素进行一定程度的放大

完善准备工作

分析需要获取的约束

“动画规划”中,1 上面已经准备过,2、3 需要将小云、大云的横向定位参数向代码绑定,4 只需绑定中间元素即可。

绑定三个子元素及其关键约束到代码

pic

Make them move!

由于事先动画效果的代码描述起来过于麻烦,请直接看代码:https://github.com/johnlui/AutoLayout/blob/1420fddee57d22ebd443656fb31…

查看效果

pic

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109474.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu 下 vlc ,smplayer 播放电影时字幕乱码解决方法

    ubuntu 下 vlc ,smplayer 播放电影时字幕乱码解决方法自:http://blog.sina.com.cn/s/blog_70545bad01015ky1.htmlubuntu下vlc,smplayer播放电影时出现乱码,令人头疼的很,不知道该怎么办,网上查了一些方法,但是没有一个能成功的,也许是我的方法不正确,没办法,只能将就看一下英文字幕,或者有时候看不懂的时候干脆切换到win7底下看,但这终究不是解决的方法,从网上查了很多方法,但是

    2022年7月11日
    28
  • clion激活_最新在线免费激活

    (clion激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月29日
    76
  • IDEA打jar包在服务器运行出现Error:Invalid or corrupt jarfile xxx.jar 报错+如何使用IDEA打jar包

    IDEA打jar包在服务器运行出现Error:Invalid or corrupt jarfile xxx.jar 报错+如何使用IDEA打jar包JAR包错误:Error:Invalidorcorruptjarfilexxx.jar错误背景:IDEA打包springboot项目为jar包。打包方法百度了好几种,结果都在运行时报了Error:Invalidorcorruptjarfilexxx.jar错误。…

    2022年8月22日
    7
  • 关于StringUtils的isNotBlank方法

    关于StringUtils的isNotBlank方法当Str为空白或者null时,isNotBlank返回false当Str的length>0时,isNotBlank返回true转载于:https://www.cnblogs.com/xujuntao/p/11027523.html

    2022年8月12日
    7
  • smartsvn 用法

    smartsvn 用法都说SMARTSVN是最全的Mac上的SVN客户端工具,分Pro版和基础版,基础版跟Versions差不多,这里找了Pro版下载并激活成功教程:mac版本smartSVN客户端下载:http://www.s

    2022年8月1日
    33
  • 图解最短路径之弗洛伊德算法(Java实现)「建议收藏」

    图解最短路径之弗洛伊德算法(Java实现)「建议收藏」概述Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法是一种在具有正或负边缘权重(但没有负环)的加权图中找到最短路径的算法,即支持负权值但不支持负权环。弗洛伊德算法采用的是动态规划思想,其状态转移方程如下:其中matrix[i,j]表示i到j的最短距离,k是穷举i到j之间可能经过的中间点,当中间点为k时,……

    2025年6月11日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号