动画是 iOS 中非常重要的一部分,它给用户展现出应用灵气的一面。

在动画块中修改 Frame

在原来使用 frame 布局时,在 UIView 的 animate block 中对 view 的布局进行修改,动画即可生效。

[UIView animte ... {
view.frame = ...
}];
复制代码

AutoLayout 没有 Frame 时如何做动画

在 AutoLayout 中,view 的布局等属性都是由约束 constraint 决定,Apple 也不建议在使用 AutoLayout 直接修改 view 的 frame。

在介绍之前,先看一下 UIView 的 layoutIfNeeded 方法:

/**
Allows you to perform layout before the drawing cycle happens.
-layoutIfNeeded forces layout early
*/
- (void)layoutIfNeeded; /**
Lays out the subviews immediately.
Use this method to force the layout of subviews before drawing.
Using the view that receives the message as the root view,
this method lays out the view subtree starting at the root.
*/
复制代码

换而言之,向 view 发送该方法,将 view 作为 root view,开始向下重新布局(即计算 subView 的 frame)。

可以想象一下,在计算布局的过程中,subView 的 frame 发生了变化。

而我们之前使用动画时,是将这些变化的代码放在 UIView Animation Block 中。
所以,在 AutoLayout 中使用 Animation 的正确姿势可以是:

UIView *animationView = [[UIView alloc] init];
// 给 animationView 设置约束
[self.view addSubview:animationView]; [UIView animateWithDuration:10.0f delay:0 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionRepeat animations:^{
// 修改 animationView 的宽度约束
animationView.widthConstrint.constant = 100.0f;
// 注意这里要调用 animationView 父视图的 layoutIfNeeded 方法
[self.view layoutIfNeeded];
} completion:^(BOOL finished) { }];
复制代码

[self.view layoutIfNeeded]; 这行代码,其实就是让系统帮我们去做 frame 相关的修改。

约束还有约束

现在,我们学会了在 Animation Block 中修改约束来达到动画的目的。
但是这需要我们持有对该 constraint 的引用才行。如果页面中有大量的动画需求,那么就会出现如下例子:

@interface SSAnchorRankView ()
@property (nonatomic, strong) NSLayoutConstraint *labelWidthCons;
@property (nonatomic, strong) NSLayoutConstraint *labelHeightCons;
@property (nonatomic, strong) NSLayoutConstraint *labelTopCons; ... @end
复制代码

也就是说,实现动画时需要改变的约束,都需要在类中增加属性来引用它。

虽然可以将这些属性单独放在一个 category 中,但是仍然避免不了要大量引用约束的尴尬。

复杂的动画会导致什么

复杂的动画,会让你在设计约束时,考虑的内容太多,也容易出现一些约束的 Bug。

优雅的姿势

其实在布局的过程中,是可以将界面的显示部分做一个抽象的划分。例如在编写一个音乐播放器的界面时,将相似或者耦合的元素包装起来,作为一块单独的内容区域:

  • 歌曲专辑图片、歌曲名、歌手名
  • 歌词、歌词控制
  • 播放暂停、下一首、上一首
  • 喜欢歌曲、不喜欢歌曲

这样,将元素分别装在不同的 container view 中,抽象起来,在之后不管是做约束,还是做动画,都会更加方便。

Masonry 呢?

Masonry 的 make 方法会生成约束,其实,它本身是有返回值,类型为 MASConstraint *,所以也是可以持有 Masonry 生成的约束并改变其值。

[label mas_remakeConstraints:^(MASConstraintMaker *make) {
self.labelWidthCons = make.width.equalTo(self.view).offset(200);
}
复制代码

进阶

Constraint 本身可以修改的属性并不多,有时候需要转换一种思路,比如 install 两条约束,在不同的 case 下激活其中一条即可。

Constraint 本身有很多方法还可以继续研究,当然这个就是后话了。

转载于:https://juejin.im/post/5a30f248f265da43310dd008

在 AutoLayout 和 Masonry 中使用动画的更多相关文章

  1. iOS Core Animation具体解释(四)AutoLayout中的动画

    原创blog.转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...

  2. AutoLayout框架Masonry使用心得

    AutoLayout框架Masonry使用心得 字数1769 阅读1481 评论1 喜欢17 我们组分享会上分享了页面布局的一些写法,中途提到了AutoLayout,会后我决定将很久前挖的一个坑给填起 ...

  3. iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

    iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫 ...

  4. 代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

    随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫切和必要.(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhone 6p/6ps ...

  5. iOS — Autolayout之Masonry解读

    前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...

  6. CSS3中的动画效果记录

    今天要记录的是CSS3中的三种属性transform.transition以及animation,这三个属性大大提升了css处理动画的能力. 一.Transform 变形 CSS中transform ...

  7. Android中矢量动画

    Android中矢量动画 Android中用<path> 标签来创建SVG,就好比控制着一支画笔,从一点到一点,动一条线. <path> 标签 支持一下属性 M = (Mx, ...

  8. 初识android中的动画

    动画效果可以大大提高界面的交互效果,因此,动画在移动开发中的应用场景较为普遍.掌握基本的动画效果在成熟的软件开发中不可或缺.除此之外,用户对于动画的接受程度远高于文字和图片,利用动画效果可以加深用户对 ...

  9. CSS3中的动画功能(一)

    css3中的动画功能分为transitions功能和animations功能,这两种功能都可以通过改变css属性值来产生动画效果.今天带大家一起来看看css3动画功能中的transitions的用法. ...

随机推荐

  1. php zip打包

    zip中加入文件 <?php $zip = new ZipArchive; if ($zip->open('test.zip', ZipArchive::OVERWRITE) === TR ...

  2. 原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么

    开心一刻 女孩睡醒玩手机,收到男孩发来一条信息:我要去跟我喜欢的人表白了! 女孩的心猛的一痛,回了条信息:去吧,祝你好运! 男孩回了句:但是我没有勇气说不来,怕被打! 女孩:没事的,我相信你!此时女孩 ...

  3. Java中如何通过try优雅地释放资源?

    时间紧迫,长话短说,今天,小明给大家同步一个知识点,使用try-with-resources来优雅地关闭资源. 1. 背景 其实,在JDK 7就已经引入了对try-with-resources的支持, ...

  4. 震撼!全网第一张源码分析全景图揭秘Nginx

    不管是C/C++技术栈,还是PHP,Java技术栈,从事后端开发的朋友对nginx一定不会陌生. 想要深入学习nginx,阅读源码一定是非常重要的一环,但nginx源码量毕竟还是不算少,一不小心就容易 ...

  5. git中常用命令的总结

    一.git stash  1.git  stash 保存当前工作进度,会把暂存区和工作区的改动保存起来.执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动. ...

  6. 空间小姐姐生活照,我用python破解加密压缩包,无忧查看

    事情的经过是这样的: 又是奶茶,行吧行吧. 快点开工,争取李大伟回来之前搞定. 李大伟说是6位数字密码 那么我们可以利用python生成全部的六位数字密码 #生成从000000到99999的密码表f ...

  7. 告诉你那里最受欢迎,python爬取全国13个城市旅游数据

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  8. How Many Answers Are Wrong HDU - 3038 (经典带权并查集)

    题目大意:有一个区间,长度为n,然后跟着m个子区间,每个字区间的格式为x,y,z表示[x,y]的和为z.如果当前区间和与前面的区间和发生冲突,当前区间和会被判错,问:有多少个区间和会被判错. 题解:x ...

  9. 1324E - Sleeping Schedule

    题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡 ...

  10. E. 数字串

    给你一个长度为 n 的数字串,找出其中位数不超过15位的不包含前导0和后导0的数 x ,使得 x+f(x) 是一个回文数,其中 f(x) 表示将 x 反转过来的数. 输入格式 多组输入,处理到文件结束 ...