记于二零一五年晚春:距上次发文已有五天。看了众同僚的反馈。我把这段代码又一次搞了搞,以此来避免在执行时加入或删除约束。代替这些像JAVA一样笨重的方法的是我開始动态的改变黄色和蓝色视图约束的优先级。超级简单,超级高效。

在没有autoLayout之前,假设你想移动一个view,frame就会派出他两个小弟origin或者size来对你大喊@"你动我下试试!"。当然,frame、bounds和center都是UIView的属性。所以当你真的动了他们,UIView是不会作罢甘休的。所以你知道为啥用户能看到一系列的动画了吧,UIView想削你呢。

假设你開始用autoLayout了。非常快你就发现你不用亲手去处理frame(或者bounds或者center)了。你能够叫约束去搞他。这篇文章就是通过一个简单的栗子,来告诉你怎么用约束搞点事情出来。额。确切的说是搞出一个简单的动画效果。

挑战

为了简单明了。我们仅仅用两个视图。

一个黄色视图(下面简称黄图)和一个蓝色视图(下面简称蓝图)。在"普通"模式下。我们仅仅看到黄图。

在"五彩缤纷"模式下,我们仅仅看到黄图。

视图…

"喂!

为什么都仅仅看到黄图啊!"

"明明仅仅有两种颜色叫五彩缤纷什么的真的好吗!"

"你倒是留个种子啊!"

啊。不好意思,光注意黄图了。在"五彩缤纷"模式下,我们看到黄图和蓝图两个。这俩视图应该填满整个屏幕。除了设备的边边以及switch占领的框框。

以下这个gif就是我们想去实现的效果。

蓝图应该在右边滑出。然后黄图对应地充斥整个屏幕…

设置基本约束

一開始,我在IB上拖出视图,拉上约束。

这个时候俩视图都是可见的。

黄图有五个约束:左边相对父视图间隔,右边相对蓝图间隔,上边相对switch间隔,下边相对父视图间隔,以及和蓝图宽度相等约束。

蓝图和黄图的约束差点儿相同,除了蓝图是右边相对父视图间隔。

非必需约束优先级

在仅仅有黄图可见的时候(真是不错),我们须要加还有一个约束,也就是它右側相对父视图的间隔约束。

假设在上面我加上这个约束。那么他就和那个"右側相对蓝图约束"冲突了,由于他俩同一时候有优先级1000。

为了避免冲突以及移动蓝图,我们能够改变一下黄蓝图间隔的那个约束的优先级。

必需约束优先级是这个UILayoutPriorityRequired(1000),你不能在执行时改变一个必需约束的优先级。

优先级比UILayoutPriorityRequired小的,就是一个可选或者非必需的约束,类似这样的,仅仅要你别把优先级设置为UILayoutPriorityRequired,你就能够改。

所以首先,我们把蓝图右側相对父视图约束的优先级搞低一点,搞到750.

然后我们在给黄图加一个它右側相对父视图的约束(就像上面提到的)。优先级也搞到750.

把约束拖出来!

为了在执行时改变蓝图右側约束我们得先把这个约束拖到代码中。你也能够像这样拖随意的约束出来。(就像把控件关联到代码中一样,选中约束,按Ctrl拖)

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *blueViewConstraint;

为了确保我们把蓝图推出屏幕,我们也得调整黄图和蓝图中间的间隔约束。所以我们把这个约束也整到代码中。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewSpacingContraint;

更新约束

如今能够非常easy的写一个方法来依据模式开关设置蓝图约束想要的优先级。

- (void)updateConstraintsForMode {
  if (self.modeSwitch.isOn) {
    self.viewSpacingContraint.constant = 8.0;
    self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh+1;
  } else {
    self.viewSpacingContraint.constant = self.view.frame.size.width;
    self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh-1;
  }
}

我们在storyboard中把黄图右側相对父视图的约束也设定了优先级UILayoutPriorityDefaultHigh(750)。

为了使蓝图可见,我们须要把蓝图的右側约束优先级设定的比750高一些,而隐藏起蓝图时我们得把它设定的低一些。

请注意!

看黑板。我们要给黄蓝图的间隔设定一个大点的值(我这里用的屏幕宽度)以确保蓝图推出右側边界。

我们在视图第一次载入时也应该配置下约束。厚此薄彼可不好。

- (void)viewDidLoad {
  // ...
  [self updateConstraintsForMode];
}

动起来!

如今万事俱备仅仅欠东风了。我们如今仅仅须要轻轻的拨动一下模式开关,咦?轻轻的。咦?啊不好意思,忘记把开关的事件代码写上了- -,苹果的Auto
Layout Guide
描写叙述了autoLayout搞动画的基本方法。推荐的代码例如以下:

[containerView layoutIfNeeded];
[UIView animateWithDuration:1.0 animations:^{
  // Make all constraint changes here
  [containerView layoutIfNeeded];
}];

这两个对layoutIfNeeded的调用强迫将要运行的操作完毕,然后在动画块里捕获frame的改变。

(译者补充:想起知乎里一个回答  你在公司项目里面看到过哪些操蛋的代码?)

if (m_doc->isModified() == true)
{
    for (int i = 0; i < 100; i++)
    {
        save(); //Save the document for 100 times to ensure it has been saved successfully.
    }
}

在我们的栗子中用上面的方法,就是这样式的:

- (IBAction)enableMode:(UISwitch *)sender {
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  [defaults setBool:sender.isOn forKey:modeUserDefaultKey];
  [defaults synchronize];
  
  [self.view layoutIfNeeded];
  [UIView animateWithDuration:1.0 animations:^{
    [self updateConstraintsForMode];
    [self.view layoutIfNeeded];
  }];
}

总结

代码在这,点我点我

Autolayout约束动画化-Animating Autolayout Constraints的更多相关文章

  1. 使用代码创建AutoLayout约束

    使用代码创建AutoLayout约束 1.代码创建约束的步骤 2.代码创建约束的常用方法 3.代码创建约束的原则 4.禁用Autoresizing的原因 5. 设置相对状态栏的约束,使用self.to ...

  2. 利用代码添加autolayout约束

    1.概述 通常我们通过storyboard能够完成的,代码也能够完成,所以这里介绍下代码实现约束的添加,通常我们不这么干(在不使用第三方框架的情况下,使用系统自带的类添加约束特别繁琐),所以这里仅仅简 ...

  3. UIScrollView的AutoLayout约束

    首先UIScrollview包含自身的frame和contentSize二个部分.frame决定其展示给用户的可见区域,contentSize决定其整个内容的大小.如果frame的宽高小于conten ...

  4. iOS 遍历AutoLayout约束

    //遍历footerview约束(一般高,宽) NSArray* constrains = self.footerView.constraints; for (NSLayoutConstraint* ...

  5. AutoLayout 约束与frame、bounds的设置

    介绍 关于AutoLayout的介绍可参考: 使用解读: https://segmentfault.com/a/1190000004386278 iOS 屏幕适配,autoResizing autoL ...

  6. (八十九)用AutoLayout实现动画和Label根据内容自动调整

    [AutoLayout动画] 对于storyboard每个约束,都可以像控件那样通过拖线的方式来建立和代码的连接. 约束是一个对象,通过这个对象的constant属性可以修改约束的点数. 在修改之后, ...

  7. iOS-AutoLayout中动画使用的细节 和 iOS layout机制

    在Main.storyboard拖入一个UIView,随便设置一个背景色, 使用autolayout  为紫色的view添加约束 :(0,0,100,100) , 为该view添加动画代码如下: #i ...

  8. 基于Autolayout的动画

    在修改了约束之后,只要执行下面代码,就能做动画效果 [UIView animateWithDuration:1.0 animations:^{ [添加了约束的view的父控件 layoutIfNeed ...

  9. autoLayout约束图解

随机推荐

  1. (6) go 流程控制

    一. if else (1)如果只有一条语句,大括号不能省略 (2)右括号 和 else 在一行 (3)支持 if 时可以定义变量 (4)if 的风格尽量不要加括号,用空格代替 (5)多分支 二.sw ...

  2. 洛谷P2520向量

    题目传送门 看到数据范围其实就可以确定这是一道结论题. 首先分析,给定你的向量的两个坐标a,b有八种组合方式可以用,但实际上整理一下可以得出实际上只有五种,x/y ±2a,x/y ±2b,x+a,y+ ...

  3. python笔记四:面向对象

    1.类 class Student(object): def __init__(self, name, score): self.name = name self.score = score 1)__ ...

  4. 循序渐进PYTHON3(十三) --3-- DJANGO之FORM表单(为自动生成的HTML标签添加样式)

    views.py from django.shortcuts import render,HttpResponse from django import forms import json impor ...

  5. Envious Exponents

    问题 E: Envious Exponents 时间限制: 1 Sec  内存限制: 128 MB提交: 321  解决: 53[提交] [状态] [讨论版] [命题人:] 题目描述 Alice an ...

  6. AC自动机及KMP练习

    好久都没敲过KMP和AC自动机了.以前只会敲个kuangbin牌板子套题.现在重新写了自己的板子加深了印象.并且刷了一些题来增加自己的理解. KMP网上教程很多,但我的建议还是先看AC自动机(Trie ...

  7. BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3022 [题目大意] 给定n个球员,第i个球员年龄为AGEi,水平为SKILLi. 没有 ...

  8. 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

    d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...

  9. 【SAM】POJ1509-Glass Beads

    [题目大意] 求一个循环数列的最小表示法. [思路] 把原创复制一遍放在后面,建立SAM,从s按字典序开始跑长度L即可. 板子来源(作者见连接内):

  10. GCDAsyncSocket类库,IOS下TCP通讯使用心得

    关于在IOS下使用Socket进行通讯的技术文章也许诺很久了,今日又是一个还债的日子,网上虽然很多介绍过AsyncSocket或GCDAsyncSocket的文章,但其实就那么一两篇大部分都是转载,于 ...