`

(转)[IOS]iOS 7后导航控制器导致ScrollView和TableView偏移

    博客分类:
  • IOS
阅读更多

转自:https://www.jianshu.com/p/4cdcfb97704f

 

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

  1. 在导航控制器下将Translucent穿透/透明效果取消
self.navigationBar.translucent = NO;
  1. 当前控制器下将Adjusts Scroll View Inset设置为No
self.automaticallyAdjustsScrollViewInsets = NO;
  1. 直接修改ScrollView或TableView的ContentInset属性
self.NaigationScrollerView.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,如果是,就会进行调整,否则不进行处理),而当我们将导航条隐藏后,系统就不会进行干预了,若开发中不需要系统干预,就可以通过上述三种方式来解决这个问题

 

分享到:
评论

相关推荐

    iOS ScrollView嵌套tableView联动滚动的思路与最佳实践

    scrollView 实现一个手势识别的协议,同时响应滚动事件,分别在底层容器和上层业务中实现滚动视图的代理方法 func scrollViewDidScroll(_ scrollView: UIScrollView),分别控制他们的可滚动状态和偏移量则能实现目的...

    ios-scrollView复用及tableView预加载.zip

    本项目“ios-scrollView复用及tableView预加载.zip”着重探讨了如何优化滚动视图的性能,特别是针对题库类应用,通过复用机制和预加载策略来提升用户体验。 一、ScrollView复用机制 1. 复用池:在iOS中,...

    TableView+ScrollView的混合使用

    在iOS开发中,TableView和ScrollView是两种常用的UI组件,它们各自有着特定的使用场景。当需求涉及复杂的滚动交互时,可能会需要将TableView与ScrollView混合使用,以实现更丰富的用户界面和交互体验。本文将深入...

    iOS TableView下拉图片放大

    "iOS TableView下拉图片放大"这一功能通常是为Header View设计的,当用户下拉表格时,位于顶部的图片会按比例放大,给予用户一个视觉反馈,增强交互体验。本文将详细介绍如何实现这个效果。 首先,我们需要了解...

    tableView横向滚动,实现UiscrollView复用的功能

    5. 滚动处理:在 `- (void)scrollViewDidScroll:(UIScrollView *)scrollView` 回调中,根据tableView和内部scrollView的偏移量调整子视图的可见性,实现平滑滚动。 通过以上步骤,我们能够实现在横向滚动时利用...

    scroll嵌套Table+悬停效果.zip

    6. **注意性能**:嵌套ScrollView和TableView可能导致性能问题,尤其是当TableView的数据源较大时。因此,确保正确实现`numberOfRows(inSection:)`和`cellForRowAt:`方法,以及使用dequeueReusableCell以复用cell,...

    iOs tableView指示条进行联动

    这里,我们首先检查哪个视图正在滚动,如果是tableView,我们就更新scrollView的内容偏移量(contentOffset)。通过这种方式,指示条的位置会随着tableView的滚动而改变。 然而,这还不足以完全实现联动效果,因为...

    ios-简单的上拉覆盖导航栏.zip

    它是iOS提供的一个控制器,用于管理一系列通过堆栈方式组织的UIViewController。在这个案例中,可能包含两个UITableView分别代表不同的内容页面,用户可以在这些页面之间通过UINavigationController的push和pop操作...

    ios-记录tableView滚动的位置.zip

    `ios-记录tableView滚动的位置.zip`这个资源可能包含了一个示例项目,演示了如何在用户退出应用或切换页面后,再次打开时恢复UITableView的滚动位置。这个功能提高了用户体验,因为用户不必手动滚动到他们之前查看的...

    iOS tableview头部弹簧效果

    7. **回弹动画**:当用户松开手指后,header view应该有一个回弹的动画,恢复到原始状态。你可以利用Core Animation或者CAKeyframeAnimation来实现这个效果。 8. **优化性能**:注意在处理滚动事件时,避免进行过于...

    ios-tableView悬浮菜单.zip

    在iOS应用开发中,TableView(表格视图)是一种常见的用户界面元素,用于展示有序的数据集合。在这种场景下,“ios-tableView悬浮菜单.zip”很可能是包含一个实现或演示了如何在TableView中创建悬浮菜单的示例代码或...

    ios-导航栏渐变效果的小Demo.zip

    1. **设置代理和滚动监听**:确保你的控制器是`UIScrollViewDelegate`的遵循者,并在初始化时设置滚动视图(如UITableView)的代理为自身。这样,当用户滑动时,`scrollViewDidScroll:`方法会被调用。 ```swift ...

    ios-简单的界面搭建.zip

    在iOS开发中,构建用户...总之,这个示例项目涵盖了ScrollView和TableView的使用,以及视图动画的应用,这些都是iOS开发中不可或缺的基础技能。通过实践和理解这些知识点,开发者能够创建出更加丰富和动态的用户界面。

    iOS-TableView下拉放大效果

    在iOS应用开发中,TableView是一种常用的UI组件,用于展示列表数据。当用户下拉一个TableView时,有时我们希望实现一种头部视图放大效果,以增强交互性和视觉吸引力。本教程将详细讲解如何在Swift中实现这种"iOS-...

    iOS 下拉头部放大以及向上滑动到一定范围后头部固定不动

    在iOS开发中,实现"UITableView下拉的时候头部放大,向上滑动到一定距离后头部固定不动"的效果,通常涉及到自定义UITableViewHeaderFooterView和手势识别技术。这种效果常见于许多应用的启动页面或者主界面,增加了...

    ios实现瀑布流非动态

    6. 设置ScrollView内容偏移:当用户滚动时,ScrollView需要根据当前显示的TableView进行内容偏移调整,以保持视觉连贯性。 7. 处理滚动事件:监听ScrollView的滚动事件,以便在用户滚动到边界时切换到下一个...

    TextField和键盘上移位置

    为了解决这个问题,开发者通常会实现一种机制,使得`TableView`或`ScrollView`能够自动上移到键盘上方,以便用户能清晰看到正在输入的`TextField`。 在iOS中,我们可以利用`UIKeyboardWillShowNotification`和`...

    ios-tableViewHeader.zip

    5. **自定义UIScrollViewDelegate**:如果UITableView嵌套在UIScrollView中,可以直接监听ScrollView的滚动事件,根据滚动偏移量改变header的frame。 在`TabViewHeader`这个项目中,开发者可能已经实现了上述的一种...

    headerView.zip

    这个方法是视图控制器生命周期的一部分,开发者可以利用它来执行一些预处理,例如设置初始状态或者进行布局调整。在`headerView.zip`这个压缩包中,我们可以推测它可能包含了一个关于自定义头部视图(header view)...

Global site tag (gtag.js) - Google Analytics