关于计算父视图高度的两种方式。
2018-06-05 本文已影响0人
人话博客
在 App 开发中,很多场景都是一个父视图(普通的 UIView)里横列摆放的子视图。
(这里不是用 scrollView / collectionView / tableView)
那么父视图的高度基本上都是由子视图的个数决定的。
所以,根据后台传递过来的数据,需要动态的计算父视图(普通的 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思路总结:
- 父视图的高度不清楚,要由子视图的个数决定,所以一开始的
frame.height = 0
。 - 在子视图全部利用 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 计算父视图的高度思路总结:
- 父视图,设置约束的时候,由于不知道高度,所有约束只甚至成能计算 x,y,w 的。按道理来说是缺少一个可以计算 h 的约束的。
- 子视图,在其设置约束的时候,top 约束 & bottom 约束非常重要,利用它们两个约束 + 子视图自身的高度值,即可计算出父视图的高度了。
最后总结
- 在计算父视图高度或者宽度场景下,用 frame就都用frame。用 autoLayout 就用 autoLayout。两者最好不要混用。
- 利用 frame 计算父视图高度的时候,最后的高度还是需要设置到父视图的frame.height 上的。
- 利用 autoLayout 计算父视图的高度的时候:好的方面在于:最后高度并没有我们手动的设置,而是 autoLayout 计算引擎,根据各个子视图的约束设置,可以动态计算出来。坏的方便也很明显:在 autoLayout布局出现问题了之后,就很难找到是哪一个约束对象出了问题。