美文网首页iOS新手学习
iOS estimate高度自适应layoutSubviews失

iOS estimate高度自适应layoutSubviews失

作者: Singularity_Lee | 来源:发表于2019-03-15 11:24 被阅读0次

    项目中纯代码配置控件frame后使用tableView的estimateHeight计算失效,发生了高度错乱问题

    控制器中预设高度自适应核心代码

    tableView
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return UITableViewAutomaticDimension;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return 290;
    }
    

    iOS8 系统中 rowHeight 的默认值已经设置成了 UITableViewAutomaticDimension,self.tableView.rowHeight = UITableViewAutomaticDimension;可以省略

    collectionView
    if (@available(iOS 10.0, *)) {
        layout.estimatedItemSize=UICollectionViewFlowLayoutAutomaticSize;
    } else {
        layout.estimatedItemSize=CGSizeMake(kScreenWidth, 26);
    }
    
    
    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
        //宽度或者高度一定要  大于 0 ,否则会出现丢失错误等不可预料问题
        return CGSizeMake(kScreenWidth, 26);
    }
    

    在cell的layoutSubviews中写的masonry高度约束,垂直方向约束从上到下全都饱满 top bottom 都满足条件情况下出现问题。 上下滑动tableView后cell高度恢复正常。

    1552621194972.jpg
    同样的布局约束写在 initWihStyle函数中 addSubviews之后就是正常。
    另外自定义xib进行拖线Autolayout约束也是正常的,只要约束是正确的,垂直方向约束从上到下的top bottom 都满足,那么系统去根据约束计算的时候就不会出现混乱。否则基本都是约束条件不满足造成的问题。
    1552621501703.jpg

    代码追踪后猜想的结果是estimate是在所有垂直条件都满足的情况下才能计算出高度,否则用预设高度。并且计算高度的时机是要快于layoutSunview方法的触发的,也就是说在layoutSubview去写约束的话会导致约束滞后,系统计算超前。而且用layoutSubViews方法时需要注意时机:每次label进行赋值的时候或者tableView滑动的时候都会触发layoutSubViews方法。

    布局机制踩坑

    相关文章

      网友评论

        本文标题:iOS estimate高度自适应layoutSubviews失

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