edgesForExtendedLayout:
在IOS7以后 ViewController 开始使用全屏布局,而且是默认的行为通常涉及到布局,就离不开这个属性edgesForExtendedLayout,它是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向,它的默认值很自然的是UIRectEdgeAll,四周边缘均延伸,就是说,如果视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域(坐标原点在屏幕左上角)。因为一般为了不让tableView 不延伸到 navigationBar 下面, 属性设置为 UIRectEdgeNone,这样坐标原点在导航栏下面。
automaticallyAdjustsScrollViewInsets:
系统会根据navigationBar和tabBar的位置,自动调整UIScrollView的内容位置,默认值是YES。如果想自己调整,设为NO。
上代码咱们跑一下:
这是程序的根视图控制器:
#import"ViewController.h"
@interfaceViewController()
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
//self.edgesForExtendedLayout = UIRectEdgeNone;
//self.automaticallyAdjustsScrollViewInsets = NO;
//self.navigationController.navigationBar.translucent = NO;
self.view.backgroundColor= [UIColorgrayColor];
UITableView*tableView = [[UITableViewalloc]initWithFrame:CGRectMake(0,0, [UIScreenmainScreen].bounds.size.width, [UIScreenmainScreen].bounds.size.height-64)style:UITableViewStylePlain];
tableView.backgroundColor= [UIColorredColor];
tableView.delegate=self;
tableView.dataSource=self;
[self.viewaddSubview:tableView];
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
return50;
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return30;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
staticNSString*cellId =@"CellId";
UITableViewCell*cell = [tableViewcellForRowAtIndexPath:indexPath];
if(!cell) {
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellId];
}
cell.textLabel.text= [NSStringstringWithFormat:@"%ld",indexPath.row];
returncell;
}
一、默认跑起来:
可以发现默认原点在屏幕左上角,tableView的内容视图向下偏移了64个像素。
二、将edgesForExtendedLayout 置为 UIRectEdgeNone:
可以看到原点坐标变成了在导航条下面。
这时候将automaticallyAdjustsScrollViewInsets设为NO已经没有任何意义,因为现在tableView的内容视图的位置完全正确。
三、或者 edgesForExtendedLayout设为默认, self.navigationController.navigationBar.translucent=NO:
可以看到效果与edgesForExtendedLayout 置为 UIRectEdgeNone一样。
四、如果将automaticallyAdjustsScrollViewInsets设置为NO,将edgesForExtendedLayout设为默认,我们来看看:
可以看到:默认原点在屏幕左上角,tableView的内容视图也在左上角。
总结:
1.edgesForExtendedLayout默认向四周延展,坐标原点在屏幕左上角。设置为None可以将原点设置在导航条下面。
2.automaticallyAdjustsScrollViewInsets:系统自动适配scrollView的内容视图位置,设为NO,自己去适配
3.self.navigationController.navigationBar.translucent=NO与edgesForExtendedLayout = None的效果一样。后者会使得导航条变灰,如需改变,仍然需要前者的配置,所以可以直接用前者来将原点下调到导航条下面。
4.如何设置这两个属性,需要参照项目的UI图,一般将原点调在导航条下面,这样符合ios7之前的编程习惯。