美文网首页
ios KVO设置TableView和Collectionvie

ios KVO设置TableView和Collectionvie

作者: ClementGu | 来源:发表于2018-06-21 10:28 被阅读87次

    需求

    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 同理

    相关文章

      网友评论

          本文标题:ios KVO设置TableView和Collectionvie

          本文链接:https://www.haomeiwen.com/subject/ghtfyftx.html