http://m.blog.csdn.net/blog/a345017062/43565279

原文链接见这里:
 
下来讨论的是在AutoLayout布局下,View的Transform被改变时,会触发layout从而引起布局混乱的问题。这些适配问题在IOS8中可能已经不存在,或者至少被弱化了。
 
问题:
AutoLayout中的transform确实存在一些兼容性问题,从而导致动画异常。至于其原因,我的理解是,一旦使用了AutoLayout,那么它的frame就应该交给AutoLayout来处理,就不应该再通过变换transform来修改它的frame。
AutoLayout的原理是在layoutSubviews中应用Constraints来设置View的frame。换句话说,Constraints只是一个在layoutSubviews时执行的任务队列。
当我修改下面这个View的transform上时,理论上的结果应该是View被居中缩小,但当View有不同的Constraints时,我们可能会看到不同的效果:
v.transform = CGAffineTransformMakeScale(0.5,0.5);
另外需要引起注意的是,修改View的transform时,会立即触发layout。
 
解决方案:
一、不使用Constraints。
单纯的干掉所有的Contraints,会让View从屏幕上面消失,我们还需要通过把translatesAutoresizingMaskIntoConstraints设置为YES来使View不受AutoLayout影响。如果觉得这个方案比较极端的,看看下面这个方案。
二、特定场景下使用Constraints
如果第一个方案提到的这个View的size是自身决定的(如固定,或者按内容适配),并且根据View的中心点来确定其位置,那么,第一个方案中的transform显示OK。因为这种情况下,autolayout中的constraints不会影响到View的frame。
三、使用Subview
前面两种方案都限制了AutoLayout的优点,现在讲一下不需要限制AutoLayout优点的方案。使用constraint布局出一个Host View来,然后在Host View中增加我们要布局的真实View。下图是个示例:
 
白色View是Host View,使用任意的constraints给它确定一个位置,并设置为背影透明。把红色View当成它的subview,通过中心对齐确定红色View在其白色Host View中的位置。这样,我们再对红色View做缩放、旋转等变换时,就不会有任何影响了:
 
self.otherView.transform = CGAffineTransformScale(self.otherView.transform, 0.5, 0.5);
self.otherView.transform = CGAffineTransformRotate(self.otherView.transform, M_PI/8.0);
 
四、使用Layer Transforms
使用Layer Transform来替代View Transform,就不会触发layout,也不会与constrants冲突。例如,下面这个“心跳”动画在AutoLayout下可能会中断:
 
[UIView animateWithDuration:0.3 delay:0
options:UIViewAnimationOptionAutoreverse
animations:^{
v.transform = CGAffineTransformMakeScale(1.1, 1.1);
} completion:^(BOOL finished) {
v.transform = CGAffineTransformIdentity;
}];
但如果我们使用Core Animation的话,就不会有问题:
 
CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"transform"];
ba.autoreverses = YES;
ba.duration = 0.3;
ba.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1)];
[v.layer addAnimation:ba forKey:nil];
 

[译]IOS中AutoLayout布局与Transform的冲突问题的更多相关文章

  1. ios中autolayout

    IOS 6 自动布局 入门-1  Matthijs Hollemans on September 29, 2012 Tweet 这篇文章还可以在这里找到 英语, 韩语, 土耳其语 If you're ...

  2. iOS中的布局

    1.UIView 有三个比较重要的布局属性: frame , bounds 和 center , CALayer 对应地叫做 frame , bounds 和 position .为了能清楚区分,图层 ...

  3. IOS自己主动布局中的浮动布局(6)----MyFloatLayout横空出世

    https://github.com/youngsoft/MyLinearLayout 前言 在MyLayout的6大布局中,每种布局都有不同的应用场景. 且每种布局的子视图的约束机制不一样:线性布局 ...

  4. iOS中xib与storyboard原理,与Android界面布局的异同

    用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML能够理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中基本的布置界面的方式有3种:代码.x ...

  5. IOS中的内存不足警告处理(译)

    由于在IOS中虚拟内存系统不会采用页置换的方式来获取请求内存,取而代之的是它通过移除应用程序中的强引用来释放一些内存资源,我们知道强引用在IOS中表示拥有关系,只要有至少一个变量拥有这个对象,那么对象 ...

  6. iOS 8 AutoLayOut入门

    http://blog.csdn.net/asdfg13697116596/article/details/42562565 iOS 8 AutoLayOut入门自从iOS6带来Auto Layout ...

  7. Xcode6中autolayout和sizeclass的使用

    一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的,不过事实并非如此. 我们知道,一款iOS应用,其主要UI组件是由一个个相对 ...

  8. iOS 自己主动布局教程

    springs和struts的问题 你肯定非常熟悉autosizing masks-也被觉得是springs&struts模式.autosizing mask决定了当一个视图的父视图大小改变时 ...

  9. iOS 8 AutoLayout与Size Class自悟(转载)

    iOS 8 AutoLayout与Size Class自悟 Size classiOS 8 AutoLayout 前言 iOS8 和iPhone6发布已经过去蛮久了,广大的果粉终于迎来了大屏iPhon ...

随机推荐

  1. JavaSE-17 泛型

    学习要点 泛型接口 泛型类 泛型方法 多参数泛型类 泛型类的继承 泛型的定义 允许在定义类.接口.方法时使用类型形参,类型形参将会在声明变量.创建对象或者调用方法时候动态指定. 泛型接口 1  定义 ...

  2. php基础查找算法

    1.顺序查找 function line_search($array,$tar) { if(!is_array($array) || count($array) < 1) return fals ...

  3. java实现zip,gzip,7z,zlib格式的压缩打包

    本文主要介绍的是通过使用java的相关类可以实现对文件或文件夹的压缩. zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么). 7z 是一种新的压缩格式,它拥有目前最高 ...

  4. CentOS中一些基本的操作记录

    1)切换到root su root 输入你的密码.我的是123

  5. jQuery中Ajax事件beforesend及各参数含义1

    jQuery中Ajax事件beforesend及各参数含义 转自:http://blog.sina.com.cn/s/blog_609f9fdd0100wprz.html Ajax会触发很多事件. 有 ...

  6. Spring Data Redis整体介绍 (一)

    为什么使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用于操作Redis的客户端. Spring框架是一个全栈Java程序框架,通过DI.AO ...

  7. 初识Typescript及vscode环境配置

    什么是typescript?为什么要用它? typescript简称ts,是js语法的一个超级,由微软团队维护的 js特点(不足) 弱类型:js中的数据变量没有确定的类型,可以存储对象,可以存储数字, ...

  8. Python入门之类(class)

    面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到 ...

  9. Python之基础练习题

    Python之基础练习题 1.执行 Python 脚本的两种方式 2.简述位.字节的关系 解:8位是一个字节 3.简述 ascii.unicode.utf-8.gbk 的关系 4.请写出 “李杰” 分 ...

  10. 【ZOJ - 3780】 Paint the Grid Again (拓扑排序)

    Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or ...