IOS中AutoLayout布局与Transform的冲突问题

原文链接见这里:

http://stackoverflow.com/questions/12943107/how-do-i-adjust-the-anchor-point-of-a-calayer-when-auto-layout-is-being-used/14105757#14105757

下来讨论的是在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];

时间: 2024-10-11 21:46:18

IOS中AutoLayout布局与Transform的冲突问题的相关文章

如何解决IOS 动画中 Autolayout 与View Transforms的冲突

IOS 的动画放大与缩小,并非按照找它的中心点放大和缩小,而是左上角 .我分析了下原来是Autolayout 与View Transforms的冲突造成的. - (void) addSubviewWithZoomInAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option { // first reduce the view to 1/100th of its original dimen

IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)

http://www.raywenderlich.com/zh-hans/22873/ios-6-%E8%87%AA%E5%8A%A8%E5%B8%83%E5%B1%80-%E5%85%A5%E9%97%A8%EF%BC%8D1 来自Ray:恭喜各位!你们已经通过宣传ios feast提前解锁了第一个有关IOS6的教程. 目前这份教程只是我们的新书iOS 6 By Tutorials里面某个章节的精简版.这份教程由同样著作过iOS Apprentice Series 的Matthijs Holl

IOS中AutoLayout的使用

1.基本概念 在 iPad 和 iPhone 5 出现之前,iOS 设备就只有一种尺寸.我们在做屏幕适配时需要考虑的仅仅有设备方向而已.而很多应用并不支持转向,这样的话就完全没有屏幕适配的工作了.随着 iPad 和 iPhone 5,以及接下来的 iPhone 6 的推出,屏幕尺寸也变成了需要考虑的对象.在 iOS 7 之前,为一个应用,特别是 universal 的应用制作 UI 时,我们总会首先想我们的目标设备的长宽各是多少,方向变换以后布局又应该怎么改变,然后进行布局.iOS 6 引入了

iOS中的布局

1.UIView 有三个比较重要的布局属性: frame , bounds 和 center , CALayer 对应地叫做 frame , bounds 和 position .为了能清楚区分,图层用了“position”,视图用了“center”,但是他们都代表同样的值. 2.frame 代表了图层的外部坐标(也就是在父图层上占据的空间), bounds 是内部坐标({0, 0}通常是 图层的左上角), center 和 position 都代表了相对于父图层 anchorPoint 所在的

在UIScrollView中使用Autolayout布局(2)

在UIScrollView中使用Autolayout布局(2) 分类: iPhone开发2014-12-10 14:49 5358人阅读 评论(5) 收藏 举报 在<在UIScrollView中使用Autolayout布局(1)>中,我们介绍了一个简单的例子,在UIScrollView中加入了2个使用Autolayout布局的控件. 现实的情况当然不止有这么简单. 我们使用UIScrollView,通常是需要在上面放超过一个屏幕size的控件. 如果按照(1)的步骤,添加许多Label.Tex

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

用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML可以理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中主要的布置界面的方式有3种:代码,xib,storyboard. 1. 代码 代码布置界面是万能的,但通常很复杂.布置一个简单的界面可能需要很多行代码,因此十分繁琐. 下面为创建一个按钮的代码,最少也要3行: UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd

iOS中UIView之间布局及跳转的几种方式

UIView是iOS开发中所有视图的基类, 表示屏幕上的一块矩形区域, 同时可以处理该区域的绘制和触摸事件. UIViewController是视图控制器的基类, 用来处理屏幕之间的切换等操作, 提供视图管理模型. 一个UIViewController管理一个层级的UIView. 而RootViewController就是iOS应用启动时被载入的第一个视图控制器(可在main.storyboard中指定), 展示APP启动成功后的第一个界面. 因此, iOS中在各个UIViewControlle

Xcode6中autolayout和sizeclass的使用

一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的,不过事实并非如此. 我们知道,一款iOS应用,其主要UI组件是由一个个相对独立的可视单元构成,这些可视单元有的主要负责向用户输出有用的信息,有些则负责信息的输入(交互),交互的过程中往往还伴随有动画的效果,已达到整个信息传递的连贯性以及用户体验的细腻感.可视单元,在实际开发中主要是view.button等,那么这些可视单元的关系由两个基本的关系构成:兄弟关系和父子关系,整

iOS 8 AutoLayOut入门

http://blog.csdn.net/asdfg13697116596/article/details/42562565 iOS 8 AutoLayOut入门自从iOS6带来Auto Layout这个特性以来,用户界面的布局便变得简单起来.iOS8更是做的更好本文主要针对初学者分享一下自己最近学习AutoLayout的心得体会.Let’s Start!首先,什么是AutoLayout?简单来说,就是自动布局,当你旋转屏幕或者缩放你的UI来适应不同大小的屏幕等,程序的视图看起来依然很nice,