Auto Layout和动画一起使用出现的问题

本文详细介绍了在使用AutoLayout时,当父视图尺寸变化导致子视图尺寸瞬间变为0时,如何通过调整布局刷新策略和使用transform动画来避免图像闪烁的问题,并提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知Auto Layout是随着他约束的控件的位置改变而改变

1.在一个UIView里面添加一个UIImageView,然后给UIImageView添加约束

2.修改PopMenuframe,让其边移动遍缩小 self.frame = CGRectMake(44, 44, 0, 0); 

3.这时候会出现UIImageView中的Image也就是小女孩图片会直接变白如图


4.为什么会出现这个问题呢?我们在上面说过Auto Layout是随着他约束的控件的位置改变而改变,在第3步把UIIMageView的相对约束控件也就是说,PopMenu这个View的尺寸设置为self.frame = CGRectMake(44, 44, 0, 0); 只要执行这句代码,UIImageView的尺寸会瞬间变为0

5.那我怎么证明 UIImageView的尺寸会瞬间变为0?具体看图

5.1修改PopMneu的尺寸为 self.frame = CGRectMake(44, 44, 50, 50);

5.2运行起来的效果

也就是说白色为他的父控件的颜色其实不是uiImageView变白色的

6.那这个问题怎么解决呢?

//修改父控件的尺寸
self.frame = CGRectMake(44, 44, 0, 0);
//当父控件的尺寸修改了,需要重绘一次,ImageView就不会瞬间变成白色的了
// 应要记住把这句代码放在下面,如果把这句代码放在self.frame = CGRectMake(44, 44, 0, 0);上面是没有意义的,就相当于下面的代码没有写<span style="font-family: Arial, Helvetica, sans-serif;">[self layoutIfNeeded];</span>


7. 以上是一种解决办法,其实还有一种解决办法就是用transform动画效果

//利用transform动画就可以让子控件随着父控件的缩小而缩小,也就是说可以把Layout去掉
// 这里一定要搞一个最小点,缩小比例是0最小,1为他的本身,这里不要搞成0,如果搞成0就会瞬间变没有

self.transform = CGAffineTransformMakeScale(0.01, 0.01); 
// 让其移动
self.center = CGPointMake(44, 44);
<span style="color: rgb(69, 69, 69); font-family: 'PingFang SC'; font-size: 14px; font-weight: bold;">//这样就可以把问题解决了</span>
8.但是有的同学想Layout 和transform一起用那就又会出现瞬间变白的效果

// 不去掉Layout就会瞬间变白因为父控件缩小,layout就会瞬间缩小
self.transform = CGAffineTransformMakeScale(0.01, 0.01); 
// 让其移动
self.center = CGPointMake(44, 44);
// 那怎么解决呢?
<span style="color:#ff6600;">
// 解决办法
<span style="color: rgb(69, 69, 69); font-family: Arial, Helvetica, sans-serif;">// 先移动 当代码执行到这一行的时候,UIImageView的Layout判断他没有缩小尺寸,只是移动了位置,他就只是更改位置他就会调整自己,其图片尺寸并不会缩小</span>
self.center = CGPointMake(44, 44);


self.transform = CGAffineTransformMakeScale(0.01, 0.01); 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值