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. ansible相关说明

    2.ansible相关说明 2.1.ansible相关命令 ansible:定义并运行简单任务,主要执行ad-hoc命令 ansible-config:查看.编辑.管理ansible配置 ansibl ...

  2. Python3中assert断言

    一般的用法是: assert condition 用来让程序测试这个condition,如果condition为false,那么raise一个AssertionError.逻辑上等于: if not ...

  3. Python 判断是否存在Excel表

    Python 判断是否存在Excel表,无则生成,有则删除重建 import os import xlwt from openpyxl import workbook def sheet_method ...

  4. Ztree勾选节点后取消勾选其父子节点

    前言: Ztree官方给的API可以设置勾选一个节点的同时勾选子节点或者父节点,也可以设置不影响父子节点,即将chkboxType设置为{"Y":"",&quo ...

  5. phpstorm破解激活码

    一.将“0.0.0.0 account.jetbrains.com”添加到hosts文件中 二.浏览器打开 http://idea.lanyus.com,点击页面中的“获得注册码”,然后在注册时切换至 ...

  6. ubuntu 安装python 编程环境

    1. 安装python sudo add-apt-repository ppa:fkrull/deadsnakessudo apt-get updatesudo apt-get install pyt ...

  7. [bzoj1500][NOI2005]维修数列[Treap][可持久化Treap]

    非旋转式Treap1500 :) #include <bits/stdc++.h> #pragma GCC optimize(3) using namespace std; const i ...

  8. string数据类型操作【四】

    keys *    用于查找所有的key值 exists mykey     #判断该键是否存在,存在返回1,否则返回0. del mykey        删除键(存在就删除返回1,不存在返回为0) ...

  9. Git Cheat Sheet 中文版

    Git Cheat Sheet 中文版 索引 配置 配置文件 创建 本地修改 搜索 提交历史 分支与标签 更新与发布 合并与重置 撤销 Git Flow 配置 列出当前配置: $ git config ...

  10. cogs——8. 备用交换机

    8. 备用交换机 ★★   输入文件:gd.in   输出文件:gd.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直 ...