最近发现了一个比较奇怪的现象:使用xib自定义UITableViewCell时添加了一些子控件进去(并没有为它们添加约束),却发现在代码里面无论如何都没办法修改这些子控件的frame.
如果修改frame的代码是放在cell的layoutSubviews方法中,那么会出现一开始的时候frame没有改变,当cell滚动出屏幕或者在表视图reloadData之后frame才发生改变的情况.
这个问题的解决方法有两个:
-
将AutoLayout的勾选去掉,即禁用掉cell的自动布局.
因为xib文件在被创建的时候会自动将AutoLayout勾选,所以即使没有为子控件添加约束,系统也会默默地将子控件当前的位置和尺寸信息转成约束,导致代码里面无法修改其frame.禁用掉AutoLayout后就没有"约束"这一说法了.
-
将修改frame的语句搬到cell的drawRect:方法里面.
如:
- (void)drawRect:(CGRect)rect {
self.yellowView.frame = CGRectMake(50, 0, 20, 20);
}
drawRect:方法通常在第一次显示到屏幕上的时候调用.
总结:
虽说上面两个方法可以解决出现的问题,但是并不推荐使用
.
因为AutoLayout早已是必然趋势,不使用会遭淘汰.而drawRect:方法的主要作用是绘制,让这个方法承受太多总觉得不妥,也不建议在这个方法里面设置其他的东西.
如果确实有修改某个子控件frame的需要
你可以尝试:
- 为这个子控件添加约束,需要修改位置或者尺寸的时候尝试去修改它的约束
- 如果这个子控件的约束条件以及显示与否都不能确定,那么不要在xib中创建这个子控件,而是选择在代码中动态创建