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

2018-06-05  本文已影响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布局出现问题了之后,就很难找到是哪一个约束对象出了问题。
上一篇下一篇

猜你喜欢

热点阅读