IOS中AutoLayout布局与Transform的冲突问题
2015-02-06 15:47
561 查看
了解老码农个人隐私,请看这里:http://www.koulianbing.com/?page_id=12
原文链接见这里:
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时,我们可能会看到不同的效果:
另外需要引起注意的是,修改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做缩放、旋转等变换时,就不会有任何影响了:
四、使用Layer Transforms
使用Layer Transform来替代View Transform,就不会触发layout,也不会与constrants冲突。例如,下面这个“心跳”动画在AutoLayout下可能会中断:
但如果我们使用Core Animation的话,就不会有问题:
原文链接见这里:
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];
相关文章推荐
- [译]IOS中AutoLayout布局与Transform的冲突问题
- iOS 7 使用CGAffineTransformMakeRotation在autolayout布局下旋转图片变形.
- iOS 6 Auto Layout NSLayoutConstraint 界面布局
- iOS开发技巧(系列十五:autolayout自动布局)
- IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
- IOS 6 自动布局 入门-1 (Auto Layout)
- iOS开发笔记--使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
- IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
- iOS自动布局学习(UIView+AutoLayout)
- iOS 6 Auto Layout NSLayoutConstraint 界面布局
- iOS自动布局(autolayout)下图片编辑器的实现
- iOS开发技巧(系列十五:autolayout自动布局)
- iOS 6编程-自动布局(Auto Layout)简介
- iOS 6 编程 - 自动布局(Auto Layout)系列文章
- iOS 6 编程 - 自动布局(Auto Layout)系列文章
- iOS布局之Auto Layout
- IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
- iOS 6 Auto Layout NSLayoutConstraint 界面布局
- iOS 6 Auto Layout NSLayoutConstraint 界面布局
- iOS疯狂详解之自动布局(autolayout)下图片编辑器的实现