当新建一个xib文件view,通过代码加载进来,addSubView进一个之前创建好的xib中时,会发现这个view没有出现
什么情况下会出现这种问题呢?
新建一个User Interface文件,选择了系统提供的View时,系统帮你创建好一个view,加载这个view的时候会出现这种问题,如果把系统提供好的view删掉,重新拖进一个来就不会出现这种问题了
原因是:系统帮改了,父控件发生变化,子控件发生同等变化
它们到底是怎么变化的?
一开始cellForRow方法中从缓存池中取cell,如果没有就从xib中加载,加载进来的cell宽*高 比如是:320 * 398,cell的contentView大约也是和cell同样大小,当把一个从xib创建进来的view244 * 120 add进cell的contentView中后,返回cell,cell要放在屏幕对应的位置上,cell会随着设备屏幕宽高发生变化,比如宽变为375,高度变为自己算好的高度170,宽度从320增加55到375,高度从398减少228到170,子控件view宽度244同样增加55为299,高度一减没了,就不能显示了
cell一开始的尺寸跟最终显示的尺寸是不一样的,最终显示出来是有发生变化的,cell发生变化,它的contentView也发生变化,里面的子控件也要对应变化
分析:
UIView *childView = [[NSBundle mainBundle] loadNibNamed:@"view" owner:nil options:nil].firstObject;
[view addSubView:childView]
childView.autoresizingMask =
默认从xib加载进来的控件有个属性自动伸缩属性autoresizingMask不是0,即UIViewAutoresizingNone,而是UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth,这个属性可用于控制当前的控件的宽度和高度用不用根据父控件的伸缩而伸缩
如果它的属性值是UIViewAutoresizingFlexibleWidth,就代表宽度会根据父控件的伸缩而伸缩
如果它的属性值是UIViewAutoresizingFlexibleHeight,就代表高度会根据父控件的伸缩而伸缩
如果它的属性值是UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth,就代表宽度和高度会根据父控件的伸缩而伸缩
如果它的属性值是UIViewAutoresizingNone,就代表宽度和高度不会根据父控件的伸缩而伸缩
如果还是使用系统提供的view的话,如何解决呢?
代码中childView.autoresizingMask = UIViewAutoresizingNone
还有控制器的view,就算是 alloc init穿件出来的控制器对象,它的view的自动伸缩属性默认也是可伸缩的,这是苹果默认的做法
两种情况是默认可伸缩的:
1.从xib里面创建出来的默认控件
2.控制器的view
如果不希望控件拥有自动伸缩功能,应该设置为None
在哪里设置呢?
在xib对应的自定义类中的.h文件中awakeFromNib中,只设置一次,这样xib中设置的多少宽高,加载出来多少就是多少,不会发生变化