iOS XibVIew加载的那些坑

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布局是不会刷新的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值