美文网首页
UIViewController (0,0)起点位置

UIViewController (0,0)起点位置

作者: 我是晶锅 | 来源:发表于2017-10-26 21:03 被阅读0次

    标签: automaticallyAdjustsScrollViewInsets、contentInsetAdjustmentBehavior、translucent

    translucent 的作用:

    • translucent 是 UINavigationBar 的属性。默认值 iOS 6 之前是NO,iOS 7 之后是YES。表示导航栏是否半透明,但是它还会影响UITableView 的内容呈现位置。
    UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
    [self.view addSubview:tableView];
    tableView.backgroundColor = [UIColor redColor];
    self.navigationController.navigationBar.translucent = YES;
    

    上面这段代码中我们可以看到UI呈现为这样:

    • 导航栏半透明
    • tableView的frame没有变化,因为半透明导航栏下面的颜色是红色
    • 变化的是tableView的显示位置,因为我们看到第一行并没有被遮挡的样子,同样我们看到最后一行的内容被遮挡住了,那么说明整个tableView的显示 Height就是我们赋予的:[UIScreen mainScreen].bounds.size.height

    需要特别提醒的是:这里显示的位置变化我们不能查看到是什么属性发生了变化,contentInset,contentOffSet Or contentSize 都不能查看,不论你是断点或者NSLog都是查看不了的。这个其实已经发生了变化的UI,为什么苹果不让我们打印呢?我想或许是害怕我们会不知道有属性发生了变化(不管是contentInset,contentOffSet Or contentSize ),而当我们去重新给已经变化的属性赋值时会掉进这个变化,甚至变化了多少的坑中去。。。

    Simulator Screen Shot - iPhone 8 - 2017-10-26 at 20.23.30.png
    其实操作tableView显示内容位置发生变化的根本原因是UINavigationBar透明度发生了变化。可以去查看官方文档

    automaticallyAdjustsScrollViewInsets 和 contentInsetAdjustmentBehavior

    • automaticallyAdjustsScrollViewInsets 是 UIViewController 的属性,contentInsetAdjustmentBehavior 是 UITableView 的 属性,iOS 11 之后,后者代替了前者。

    他们两很简单,但是很重要,如果你有时候在迷惑有导航的UIViewController (0,0)点到底是状态栏开始还是从导航栏之下开始,那么接下来我将告诉你答案。

    • automaticallyAdjustsScrollViewInsets 默认 YES,contentInsetAdjustmentBehavior 默认 UIScrollViewContentInsetAdjustmentAutomatic,表示自动调整UIScrollView的内容显示,也就是说你的布局就是上面那样的。
    显示的位置起点是导航栏下,但是内容大小也是[UIScreen mainScreen].bounds ,所以就超出了界面,你的Height就需要减去导航的高度!
        UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
        [self.view addSubview:tableView];
        tableView.backgroundColor = [UIColor redColor];
        
        if (@available(iOS 11.0, *)) {
            tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        } else {
            self.automaticallyAdjustsScrollViewInsets = NO;
        }
    
    • 当你关掉自动调整显示内容,也就是像上面这样时,你看到的UI是这样的:
    Simulator Screen Shot - iPhone 8 - 2017-10-26 at 20.51.19.png

    我们发现起点从状态栏开始了。所以你以后再也不用这样写了

        UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, -64, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];
        [self.view addSubview:tableView];
    

    以后关于UIViewController 起点的问题就不用问了吧。。。总之就是这三个属性去改变了,我不建议调整translucent,默认就行(除非你们的产品固执己见!)。通过automaticallyAdjustsScrollViewInsets、contentInsetAdjustmentBehavior可以让你知道UIViewController中的起点。

    (对于UITableView来说,这个位置并不是frame,当然可以通过修改frame达到你想要的位置。)

    相关文章

      网友评论

          本文标题:UIViewController (0,0)起点位置

          本文链接:https://www.haomeiwen.com/subject/lqflpxtx.html