前言
在项目中用 xib或 Storyboard 布局 完成后,因为 动态适配等各种原因经常会遇到,修改布局的限制等,索性就记录一下,供大家参考。
xib view 创建
- 创建一个继承自UIView的类,命名为XXXView.
2.创建xib文件,名字为XXXView,和 创建的XXXView 保持一致.(其实也可以不一致,只要 xib 关联的 class 一致就可以了,为了整体一致而已)。
加载就可以使用下面这个万能的加载方法。
QCBaseView *baseView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] firstObject];
修改frame
第一种
当在controller的viewdidload中使用的时候,因为xib开启了auto layout,设置frame不生效,这是因为viewdidload加载在autolayout之前,导致设置的frame被覆盖了,这时候设置frame可以放在- (void)viewDidLayoutSubviews这个方法中。
这种情况比较常见,容易忽略的一点,加载顺序先后的问题 ,了解了可以解决一些疑难问题(昨天就遇到了,纠结了挺久的)。
第二种:
直接去掉auto layout,相当于固定死的布局。
第三种
可以通过设置xib的size为freeform或none。
简单粗暴的方式
直接选中 xib或 Storyboard 中要修改的约束像拖控件一样,拖入 .h 或 .m 中,然后修改相应的值即可。
如:
修改:
在 ScrollView 中添加多个 自定义的 xib View
在 xib 中 的ScrollView 或代码创建的 ScrollView 中添加多个 自定义的 xib View,可能出现 View 视图错位或不显示的问题,因为在 ScrollView 的内容区域大小是内部视图撑起来的,而 用 Xib 创建的 View 被添加到 ScrollView 中时,如果不设置 frame 的话,默认是以 Xib 中的 View 大小来渲染的。
前两天遇到的一个问题,就是用 Xib 创建的 View 被添加到 ScrollView 中,一直错位,无论在代码中怎么设置,结果还是无济于事,细细的查看一番,找到了最终的原因,没有在 Xib 中创建 底图的View, 类似下面这个,拖入一个父视图即可,解决错位的问题,约束的问题。
在 ScrollView 中用代码添加多个自定义的 xib View , 每次都必须计算要添加的 View 的位置大小,尤其是在需要不停的添加子视图到 ScrollView 中更需要计算好每次添加的 View 的位置大小等,并适配。
小结
xibView 的创建其实也很简单,本质就是将一个 Xib 和创建的一个 继承于UIView 的子类关联。
*注意:在使用时如果需要修改 xib frame 参考上面的几种方式,尤其关注加载顺序的先后问题。