1.view实体类加载XibView 重写 initWithFrame 方法,
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UIView *view = [[[NSBundle mainBundle] loadNibNamed:self.description owner:self options:nil] lastObject];
view.backgroundColor = [UIColor clearColor];
view.frame = self.bounds;
[self addSubview:view];
}
return self;
}
2.如果直接self =[[[NSBundle mainBundle] loadNibNamed:self.description owner:self options:nil] lastObject];只加载展示是没问题的,一旦xibView绑定实体类,当.h文件有暴露属性或者方法给外部调用时,会直接崩掉,所以使用了VIew上添加XibView的方法。
.3.在Xib内部是无法改变Frame的,好像是因为autolayout的关系,如果内部动态布局(自适应高度),可以结合autolayout的方法去加载,也省去了自己计算高度的麻烦,毕竟我们用XIb用的就是用的它的自动高度计算,加载完成后根据需要拿到view的实际高度刷新view的frame,那么问题来了,如何拿到Xibview加载完成后的视图实际高度呢,目前未找到框架内部有提供对应监听XibView加载完成,我是通过.h供给外部调用一个方法,方法走完后延时获取Frame方式实现的,比如xib内部有个自适应高度的文本,可通过此方法将参数传递进来,实现label文本赋值,但是此方法走完,xibVIew高度不是最终的实际高度,所以我用的延时得到Frane的方式,延时时间根据需要调整。
[self performSelector:@selector(frameBlock) withObject:nil afterDelay:0.1];
在frameBlock中重新拿到xiev的frame,并根据需要进行高度最终计算,将XibView的frame赋值给实体类的Frame
UIView *view = [self viewWithTag:1];
CGRect frame = self.frame;
frame.size.height = view.frame.origin.y + view.frame.size.height + 15;
self.frame = frame;
此时如果你展示使用的XibVIew是直接展示的那布局已经刷新。
4.如果你把这个XibView放在tableView.tableHeaderView或者footer你还要通过代理或者Block回调刷新,也就是重新把XIibVIew赋值给tableView.tableHeaderView或者footer,此时页面显示正常,否则tableView.tableHeaderView或者footer布局是不会刷新的。