zoukankan      html  css  js  c++  java
  • navigationcontroller剖析

    概述:

    系统原生的navigationcontroller非常强大, 几乎所有的程序都基于系统的导航控制器做开发

    它的navigationbar的有2种形态

    navigationbar的frame其实是CGRectMake(0, 20, 设备宽度, 44)

    self.navigationBar.layer.masksToBounds = YES; 

    ,-setMasksToBounds:方法告诉layer将位于它之下的layer都遮盖住。这是必须的,这样会使圆角不被遮,但是这样会导致阴影效果没有,很多网上都给出资料,再添加一个SubLayer,添加阴影。(意思也就是讲mask作为bound的边界,对原来的frame进行裁剪??)

    navigationbar的frame就会变成是CGRectMake(0, 20, 设备宽度, 44)

    1.translucent = YES

    2.1.translucent = NO

    一. translucent = YES的情况

    scrollview会自动设置insets,

    并且导航是半透明的,

    self.view的起点是(0, 0)

    设置一张透明图片, 并且设置UIBarMetricsCompact参数, 就可以让导航看起来是透明的

     [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"bigShadow.png"] forBarMetrics:UIBarMetricsCompact];

    一. translucent = NO的情况

    scrollview不会做任何适配

    并且导航是不透明的,

    self.view的起点是(64, 0)

    二.导航控制器的层次剖析

    2.1. NavigationBar

    包含子视图

    _UINavigationBarBackground

    _UINavigationBarBackIndicatorView

    2.2.UINavigationTransitionView

    包含子视图

    UIViewControllerWrapperView

     

    三.导航对控制器的处理

    3.1.如果导航控制器的translucent=NO, 并且viewcontroller里一个子控制器

    如果设置在viewdidload方法或之前的方法里

    设置了 childviewcontroller.view.frame = cgrectmake(0, 0, self.view.width-64, self.view.height);

    那么你的childviewcontroller.view的高度就会比预计少64px,( 因为导航控制器的translucent=no的情况下, 会把当前所有的控制器的view的height全部减去64)

  • 相关阅读:
    Android -- 保存文件
    Android -- AsyncTask
    Java 集合
    Android -- ViewPager放入多个XML监听每个的控件
    Android -- 自定义标题栏,背景颜色填充满
    PowerShell正则表达式(一) 定义模式
    PowerShell 简单模式识别 1
    Powershell 设置数值格式 1
    PowerShell String对象方法 1
    PowerShell 字符串操作符
  • 原文地址:https://www.cnblogs.com/apem/p/4969571.html
Copyright © 2011-2022 走看看