iOS XibVIew加载的那些坑

iOS XibVIew加载的那些坑,第1张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/996894.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存