ios KVO设置TableView和Collectionview的高度与内容一致

需求

tableView或collectionview为界面一个控件,并且在无数据的时候不显示,在有数据的时候按照数据多少显示高度和内容相等。

思路

利用KVO原理。因为tableView和Collectionview都继承于UIScrollview,所以根据其contentSize来实时检测其contentsize大小并且根据其内容来动态设置其高度。

代码

  • 添加kvo 这边界面是masonry做的,可换成frame
//声明tableview
@property (nonatomic,strong) UITableView *showTBV;

//初始化
_showTBV = [UITableView new];
    _showTBV.delegate = self;
    _showTBV.dataSource = self;
    [_showTBV registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    _showTBV.separatorStyle = UITableViewCellSeparatorStyleNone;
    /** 添加监听 */
    [_showTBV addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
    [self addSubview:_showTBV];

//约束 这边table再自定义view中
-(void)layoutSubviews
{
    [super layoutSubviews];
    [_showTBV mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self);
    }];

}

//移除监听
-(void)dealloc
{
    [_showTBV removeObserver:self forKeyPath:@"contentSize"];
}

  • 界面更新
/** 监听自适应高度 */
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"contentSize"]) {
        CGFloat ht = _showTBV.contentSize.height;
        [_showTBV mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.mas_equalTo(ht);
        }];
    }
}
  • 完成
    注:设置约束或者frame的时候可以暂时不设置高度约束或者0,然后通过实时更新contentsize来动态改变界面变化

Collectionview 同理

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容