iOS 7后导航控制器导致ScrollView和TableView偏移

设置有导航控制器后,ScrollView和TableView的ContentInset默认偏移64,如果不希望系统自动偏移,可以通过以下三种方式取消

  1. 在导航控制器下将Translucent穿透/透明效果取消
self.navigationBar.translucent = NO;
  1. 当前控制器下将Adjusts Scroll View Inset设置为No
self.automaticallyAdjustsScrollViewInsets = NO;
  1. 直接修改ScrollView或TableView的ContentInset属性
self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
模拟
@interface ViewController () 
@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的距离

iOS 7后导航控制器导致ScrollView和TableView偏移_第1张图片
OffSet.png

但是一滚动TableView松手时,TableView的偏移量会归零

iOS 7后导航控制器导致ScrollView和TableView偏移_第2张图片
OffSet-1.png

这时如果存在导航条,TableView就会被遮挡

所以给TableView设置一个上方的内边距,就可以解决滚动松手后被遮挡的问题

之所以会这样,大致是因为,当我们添加一个控件,Original为(0,0)时,同时使用了导航栏,这样默认就会遮挡控件的正常显示,因此在iOS 7后,苹果为我们默认进行了处理(控制器会检查firstObject是否属于UIScrollView,如果是,就会进行调整,否则不进行处理),而当我们将导航条隐藏后,系统就不会进行干预了,若开发中不需要系统干预,就可以通过上述三种方式来解决这个问题

你可能感兴趣的:(iOS 7后导航控制器导致ScrollView和TableView偏移)