设置有导航控制器后,ScrollView和TableView的ContentInset默认偏移64,如果不希望系统自动偏移,可以通过以下三种方式取消
- 在导航控制器下将Translucent穿透/透明效果取消
self.navigationBar.translucent = NO;
- 当前控制器下将Adjusts Scroll View Inset设置为No
self.automaticallyAdjustsScrollViewInsets = NO;
- 直接修改ScrollView或TableView的ContentInset属性
self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
模拟
@interface ViewController () <UITableViewDataSource,UITableViewDelegate>
@property (nonatomic,weak) UITableView *tableView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UITableView *tableview = [[UITableView alloc]init];
[self.view addSubview:tableview];
tableview.frame = [UIScreen mainScreen].bounds;
self.view.backgroundColor = [UIColor redColor];
self.tableView = tableview;
[tableview registerClass:[UITableViewCell class] forCellReuseIdentifier:@"id"];
tableview.rowHeight = 100;
tableview.dataSource = self;
tableview.delegate = self;
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// [self.tableView setContentOffset:CGPointMake(0, -64) animated:YES];
self.tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 5;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"id"];
cell.backgroundColor = [self randomColour];
return cell;
}
- (UIColor *)randomColour{
CGFloat red = arc4random() % 256 / 255.0;
CGFloat green = arc4random() % 256 / 255.0;
CGFloat blue = arc4random() % 256 / 255.0;
return [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"%f",scrollView.contentOffset.y);
}
@end
如果只是设置了TableView的ContentOffSet偏移 - 64,那么首次显示TableView的时候,可以看到TableView向下偏移了64的距离
但是一滚动TableView松手时,TableView的偏移量会归零
这时如果存在导航条,TableView就会被遮挡
所以给TableView设置一个上方的内边距,就可以解决滚动松手后被遮挡的问题
之所以会这样,大致是因为,当我们添加一个控件,Original为(0,0)时,同时使用了导航栏,这样默认就会遮挡控件的正常显示,因此在iOS 7后,苹果为我们默认进行了处理(控制器会检查firstObject是否属于UIScrollView,如果是,就会进行调整,否则不进行处理),而当我们将导航条隐藏后,系统就不会进行干预了,若开发中不需要系统干预,就可以通过上述三种方式来解决这个问题