这两天在学习编写demo的时候,遇到了一些问题,现在记下来。如UINavigationController 的高度问题。因为在模拟器是正常的,到了真机6.0的系统却发现UINavigationController 突然偏移了20个像素。于是查看了这些文章了解一下尺寸和分辨率的问题。我的机器是iphone 5, 4.0英寸
设备的逻辑分辨率是 320x568

iPhone屏幕尺寸、分辨率及适配

我逐步从代理入口开始打印窗口的大小,程序的根视图控制器为ViewController 继承UIViewController.
第一次打印的结果【注:iphone5 真机调试】(0,0,320,568)很容易理解和接受。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    ViewController *viewController = [[ViewController alloc]init];
    CGRect rect = [UIScreen mainScreen].bounds;
    NSLog(@"测试bounds%@",NSStringFromCGRect(rect));
    self.window =[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor  =[UIColor whiteColor];
    self.window.rootViewController = viewController;

    [self.window makeKeyAndVisible];

    return YES;
}

进入ViewController 打印view的框架frame,默认真机调试下(没有配置欢迎页(系统是6.0)

• (void)viewDidLoad { 
 [super viewDidLoad]; 
 // Do any additional setup after loading the view, typically from a nib.
NSLog(@”进入第一次打印大小%@”,NSStringFromCGRect(self.view.frame)); 
 self.view.backgroundColor = [UIColor greenColor]; 
 }

打印结构 和显示的结果是这样子,

ios 打印float ios 打印 不满铺_子视图

配置了LaunchiImage后 ,最低适配ios 6.0

ios 打印float ios 打印 不满铺_真机调试_02

这个时候,打印的结果为,明显view.frame 在y的选项当中,是偏移了20个像素,正好状态栏的高度而高度也变化了。这样解析也很清楚。不过要注意到frame 默认位置不是在(0, 0) 点位置,我一直想当然认为第一个子视图的view 实体是基于0,0 事实上有一些情况并不是这样一回事。所以这里也要注意。设置了LaunchildImage 和没有设置LuanchildImage 的会有一些不同。目前在实验中在

2015-05-08 11:00:13.292 Fenbianlv[37864:907] 进入第一次打印大小{{0, 20}, {320, 548}}

接下来,我加入一个UINavigationController 在第一个视图里面。出现这样结果:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"进入第一次打印大小%@",NSStringFromCGRect(self.view.frame));


    self.view.backgroundColor = [UIColor greenColor];

    UserViewController *user =[[UserViewController alloc]init];

    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:user];
      NSLog(@"UINavigationController打印大小%@",NSStringFromCGRect(nav.view.frame));

    [self.view addSubview:nav.view];
}

ios 打印float ios 打印 不满铺_ios 打印float_03

2015-05-08 11:15:06.051 Fenbianlv[38423:907] 进入第一次打印大小{{0, 20}, {320, 548}}
2015-05-08 11:15:06.058 Fenbianlv[38423:907] UINavigationController打印大小{{0, 0}, {320, 568}}

打印后的结果 很莫名发现 UINavigationController 的view 高度变成了568 和我整个窗口宽高一致。UINavigationController 的导航栏没有贴边,显得有点错乱。

为了解决整个办法,我将view的位置整体上移了20像素,将viewController的view 视图 整体大小和位置都调整为frame =(0,0,320,568)
我在-(void) viewDidAppear:(BOOL)animated 和 -(void) viewWillLayoutSubviews
分别做了两个尝试,在这里将第一个视图的大小都改成和UIWindow
大小一致。这样子,UINavigationController 的导航栏就会向上了移动了。正好解决了这个错乱的办法。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"进入第一次打印大小%@",NSStringFromCGRect(self.view.frame));


    self.view.backgroundColor = [UIColor greenColor];

    UserViewController *user =[[UserViewController alloc]init];

    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:user];

    [self.view addSubview:nav.view];
    NSLog(@"UINavigationController打印大小%@",NSStringFromCGRect(nav.view.frame));
}

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
   // CGRect rect = [UIScreen mainScreen].bounds;
   // self.view.frame =(CGRect) {0,0,rect.size.width,rect.size.height};
}

-(void) viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    //self.view.frame =(CGRect) {0,0,self.view.frame.size.width,self.view.frame.size.height};
    CGRect rect = [UIScreen mainScreen].bounds;
    self.view.frame =(CGRect) {0,0,rect.size.width,rect.size.height};

}

我很大疑问是不知道 要不要将第一个ViewController 的View 视图设置大小一致,因为我整个入口开始UIWindow的视图控制起 并不是UINavigationController ,而是普通的 ViewController 。二个疑问是,我将主 view 视图添加UINavigationController 的子视图view 引入作为我第一个视图。在frame 输出的结构一致的情况下,很突然发生偏移的情况。这是什么原因导致?这种做法是否可行?