以编程方式加载时,Root ViewController的View框架

时间:2012-07-11 15:19:42

标签: objective-c ios5 uiviewcontroller

我在启动时以横向模式加载根视图控制器(不使用接口构建器)。 在viewDidLoad中,我将子视图添加到根视图控制器视图,如此

- (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

3 个答案:

答案 0 :(得分:0)

可能是,纵向方向首先在项目文件中(单击以在xcode中投影,在目标中的信息选项卡,单位支持的界面方向)?如果是这样,您的应用可以纵向启动,然后发送viewDidLoad并在此之后旋转到横向。

答案 1 :(得分:0)

实施-loadView方法:

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

通常,父视图控制器负责设置其子视图控制器视图的帧大小。对于根视图控制器,我认为它需要附加的UIWindow的大小(因此,如果您在app delegate中设置窗口大小,则可以使用[[UIView alloc] init]然后设置-loadView方法中的自动调整大小的掩码。 您可能需要在上面的代码中考虑状态栏,具体取决于您自己的代码。

答案 2 :(得分:0)

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

  

如果视图控制器没有关联的nib文件,请执行此操作   方法创建一个普通的UIView对象。

这个系统生成的UIView对象有一个不是标识转换的转换属性,因此不允许你依赖于frame属性中的值:

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

  

警告:如果此属性不是标识转换,则为   frame属性未定义,因此应该被忽略。

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