美文网首页
关于计算父视图高度的两种方式。

关于计算父视图高度的两种方式。

作者: 人话博客 | 来源:发表于2018-06-05 20:34 被阅读0次

    在 App 开发中,很多场景都是一个父视图(普通的 UIView)里横列摆放的子视图。
    (这里不是用 scrollView / collectionView / tableView)

    15282010681596.jpg

    那么父视图的高度基本上都是由子视图的个数决定的。
    所以,根据后台传递过来的数据,需要动态的计算父视图(普通的 view)的高度。


    计算父视图的高度有两种做法。

    这里是非常简单的场景,只是为了说明如何计算的思路。实际情况要比这个复杂的多。


    一、使用 frame 来计算父 view 的高度。

    - (void)frameCalHeight {
        UIView *parentView = [[UIView alloc] init];
        parentView.backgroundColor = [UIColor orangeColor];
        parentView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 0); // 高度不知道给0
        [self.view addSubview:parentView];
        UIView *childView = [UIView new];
        childView.frame = CGRectMake(0, 20, 300, 300);
        childView.backgroundColor = [UIColor redColor];
        [parentView addSubview:childView];
        
        //
        CGFloat parentHeight = CGRectGetMaxY(parentView.subviews.lastObject.frame) + 20; // 最大 Y 加一个底部边距20
        CGRect frame = parentView.frame;
        frame.size.height = parentHeight;
        
        parentView.frame = frame;
    }
    
    

    运行结果:

    使用 frame 的方式计算父视图的 height

    思路总结:

    1. 父视图的高度不清楚,要由子视图的个数决定,所以一开始的 frame.height = 0
    2. 在子视图全部利用 frame 布局完成之后,在根据最后一个子视图的 maxY + 可能存在的下边距计算出父视图的 frame.height

    二、使用 autoLayout

     UIView *parentView = [[UIView alloc] init];
        parentView.backgroundColor = [UIColor orangeColor];
        [self.view addSubview:parentView];
        [parentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.right.offset(0); // 没有设置高度
        }];
        
        UIView *childView1 = [UIView new];
        childView1.backgroundColor = [UIColor purpleColor];
        [parentView addSubview:childView1];
        [childView1 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.offset(10); // top = 10
            make.left.right.offset(0);
            make.height.offset(200); // height = 200
            make.bottom.offset(-10); // bottom = 10
        }];
        
        // 所以,最终计算的 parentView.height = 200 + 10 + 10 = 220;
    
    

    最终运行结果:

    autoLayout 计算父视图的高度

    思路总结:

    1. 父视图,设置约束的时候,由于不知道高度,所有约束只甚至成能计算 x,y,w 的。按道理来说是缺少一个可以计算 h 的约束的。
    2. 子视图,在其设置约束的时候,top 约束 & bottom 约束非常重要,利用它们两个约束 + 子视图自身的高度值,即可计算出父视图的高度了。

    最后总结

    1. 在计算父视图高度或者宽度场景下,用 frame就都用frame。用 autoLayout 就用 autoLayout。两者最好不要混用。
    2. 利用 frame 计算父视图高度的时候,最后的高度还是需要设置到父视图的frame.height 上的。
    3. 利用 autoLayout 计算父视图的高度的时候:好的方面在于:最后高度并没有我们手动的设置,而是 autoLayout 计算引擎,根据各个子视图的约束设置,可以动态计算出来。坏的方便也很明显:在 autoLayout布局出现问题了之后,就很难找到是哪一个约束对象出了问题。

    相关文章

      网友评论

          本文标题:关于计算父视图高度的两种方式。

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