iOS

iOS-contentInset、safeAreaInsets、

2021-05-20  本文已影响0人  Imkata

contentInset

contentInset:内容的内边距,默认是(0, 0, 0, 0)。比如设置:

//上 左 下 右
self.mineTableView.contentInset = UIEdgeInsetsMake(40, 0, 50, 0);

那么mineTableView的上面会有40的内边距,cell会从40往下排布cell,mineTableView的下面也会有50的内边距,50的内边距上面才是cell。

safeAreaInsets

safeAreaInsets是安全内边距,是UIView的属性,是只读属性,获取方式有如下两种:

// (47, 0, 34, 0)
//当通过UIApplication获取的安全内边距肯定是不包括导航条和tabbar的,所以上是47(状态栏高度),下是34(底部操作条的高度)
 UIEdgeInsets safeAreaInsets1 = [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;
// (91, 0, 83, 0)
// 当在mineTableView里面获取安全高度,并且导航栏和tabbar都有,所以获取的上是91(47+44),其中47是状态栏高度,44是导航条高度。
// 下是83(49+34),其中49是tabbar高度,34是底部操作条的高度。
// 如果把导航栏和tabbar隐藏,那么系统会减去相应的高度,也就是(47, 0, 34, 0)
UIEdgeInsets safeAreaInsets2 = weakSelf.mineTableView.safeAreaInsets;

adjustedContentInset

scrollView在iOS11新增的两个属性:adjustContentInset 和 contentInsetAdjustmentBehavior,后者的枚举值会影响前者的值,adjustedContentInset是只读属性。

adjustContentInset的值和safeAreaInsets、contentInset的值有关

  1. UIScrollViewContentInsetAdjustmentAutomatic(默认值):如果scrollview在一个automaticallyAdjustsScrollViewContentInset = YES的controller上,并且这个Controller包含在一个navigation controller中,这种情况下会设置在top & bottom上 adjustedContentInset = safeAreaInset + contentInset不管是否滚动。其他情况下与UIScrollViewContentInsetAdjustmentScrollableAxes相同

  2. UIScrollViewContentInsetAdjustmentScrollableAxes:在可滚动方向上adjustedContentInset = safeAreaInset + contentInset,在不可滚动方向上adjustedContentInset = contentInset;依赖于scrollEnabled和alwaysBounceHorizontal / vertical = YES,scrollEnabled默认为yes,所以大多数情况下,计算方式还是adjustedContentInset = safeAreaInset + contentInset

  3. UIScrollViewContentInsetAdjustmentNever:adjustedContentInset = contentInset

  4. UIScrollViewContentInsetAdjustmentAlways:adjustedContentInset = safeAreaInset + contentInset

contentOffset

contentOffset是CGSize(x, y)类型的,默认是CGSize(0, 0),表示的是水平、垂直方向上的内容(cell显示的区域)的原点相对于scrollView的frame的原点(origin)的偏移量,其中负值代表往下偏移,正值代表往上偏移,比如:(0, -47)代表垂直方向内容往下偏移了47(状态栏的高度)。

adjustContentInset有什么用呢?

当tableview的frame设置为整个屏幕,如下:

_mineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight) style:UITableViewStylePlain];

系统会根据adjustedContentInset的值自动调整UITableView的内容区域(就是显示cell的区域)。

例如,设置了tableview的frame设置为整个屏幕,其他属性默认,并且有导航条和tabbar,那么显示的内容的区域就是:上面除了状态栏高度(47)+导航条高度(44),下面除了tabbar高度(49)+底部安全区域的高度(34)。这时候tableview的contentOffset就是(0, -91),因为水平方向没偏移,所以x=0,垂直方向向下偏移了状态栏高度(47)+导航条高度(44),所以为-91。

如果设置了tableview.contentInset = UIEdgeInsetsMake(40, 0, 50, 0);那么显示的内容的区域就是:上面除了状态栏高度(47)+导航条高度(44)+40,下面除了tabbar高度(44)+底部安全区域的高度(34)+50。这时候tableview的contentOffset就是(0, -131)。

总结:说来说去,UITableView的内容区域(就是显示cell的区域)就是UITableView的frame除了adjustedContentInset之外的区域

上一篇下一篇

猜你喜欢

热点阅读