設置有導航控制器后,ScrollView和TableView的ContentInset默認偏移64,如果不希望系統(tǒng)自動偏移,可以通過以下三種方式取消
- 在導航控制器下將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設置一個上方的內(nèi)邊距,就可以解決滾動松手后被遮擋的問題
之所以會這樣,大致是因為,當我們添加一個控件,Original為(0,0)時,同時使用了導航欄,這樣默認就會遮擋控件的正常顯示,因此在iOS 7后,蘋果為我們默認進行了處理(控制器會檢查firstObject是否屬于UIScrollView,如果是,就會進行調(diào)整,否則不進行處理),而當我們將導航條隱藏后,系統(tǒng)就不會進行干預了,若開發(fā)中不需要系統(tǒng)干預,就可以通過上述三種方式來解決這個問題