当以编程方式加载Root ViewController的视图框架

问题描述:

Im在启动时以横向模式加载根视图控制器(不使用接口构建器)。 在viewDidLoad中,我加入子视图根视图控制器视图,像这样当以编程方式加载Root ViewController的视图框架

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

     // self.view. 

    UIView *toolBar=[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)]; 
    toolBar.backgroundColor=[UIColor darkGrayColor]; 

    [self.view addSubview:toolBar]; 
//code contiues... 
} 

但肖像模式,而不是风景self.view.frame.size.width返回宽度。

在此先感谢

编辑: image for reference

贯彻-loadView方法:

- (void)loadView 
{ 
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
} 

而且通常父视图控制器负责设置它的儿童的帧大小视图控制器观点。在根视图控制器的情况下,我相信它需要它所附的UIWindow的大小(所以如果你在你的应用程序委托中设置窗口大小,你可以使用[[UIView alloc] init],然后在-loadView方法中设置自动识别掩码) 。 根据您自己的代码,您可能需要在上述代码中考虑状态栏。

可能是,纵向模式是先在你的项目文件(点击在Xcode中,在目标信息选项卡项目,单位支持的接口方向)?如果是这样,你的应用程序可以纵向启动,然后发送viewDidLoad并旋转到横向。

+0

我已经在info.plist文件中设置了支持的方向来左右横向和初始界面orientatio到landcape。我的应用程序在横向模式下启动时没有问题self.frame正在返回纵向帧大小而不是横向帧大小。 – 2012-07-12 05:13:03

当您不使用Interface Builder/xib文件,也不在loadview内手动创建视图时,系统会创建一个具有最大尺寸的视图。这在loadview方法文档中所述:

如果视图控制器不具有相关联的笔尖文件,此 方法创建一个普通的UIView对象来代替。

该系统产生的UIView对象都有一个变换属性,是不是identiy改造,因此你不能依靠从框架属性值规定在这里:

http://developer.apple.com/library/ios/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/transform

警告:如果此属性不是标识转换,则框架属性的值为 未定义,因此应予以忽略。

那么,你应该改为什么呢?我想最好的解决方案是使用你的UIView的bounds属性。这包含已经旋转的坐标。