设备旋转iphone

时间:2010-09-22 09:11:25

标签: iphone cocoa-touch rotation

我的所有宽度,高度,位置和所有内容都是相对于视图设置的,所以如果iphone旋转它应该“扩展到适合”。 :)

我如何告诉iphone处于“横向模式”,即:刷新,但现在所有宽度都是高度,所有高度都是宽度?

由于 汤姆

修改 这是我目前的代码......它仍然不起作用 - 我似乎无法弄清楚如何使它工作

在我的视图控制器(不是根视图控制器)中,我有这个方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

(我也尝试将此方法放入我的 root 视图控制器,但这也不起作用)

然后在我的viewDidLoad方法中我有这个:

[self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[self.view setAutoresizesSubviews:YES];

这不起作用。 :(至少不在模拟器中。

3 个答案:

答案 0 :(得分:2)

根据您的期望设置视图的AutoresizingMask

或实施layoutSubViews方法。

另外,不要忘记实现viewControllers的shouldAutorotateToInterfaceOrientation方法。流程如下。

  • 设备旋转
  • root ViewController收到shouldAutoRotateToInterfaceOrientation事件
  • 如果viewController响应YES,则willRotateToInterfaceOrientation事件将发送给控制器
  • 控制器根据其autoresizingMask
  • 调整其视图大小
  • 如果视图的autoresizesSubviews属性为true,则该过程会向下钻取到子视图
  • didRotateToInterfaceOrientation事件将发送给控制器。

这是一个示例viewController代码

- (void)loadView {
    UIView* theView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    theView.backgroundColor = [UIColor blueColor];

    UIView* redRectangle = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 100.0f, 100.0f)];
    redRectangle.tag = 1;
    redRectangle.backgroundColor = [UIColor redColor];
    [theView addSubview:redRectangle];
    [redRectangle release];

    UIView* greenRectangle = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 120.0f, 100.0f, 100.0f)];
    greenRectangle.tag = 2;
    greenRectangle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    greenRectangle.backgroundColor = [UIColor greenColor];
    [theView addSubview:greenRectangle];
    [greenRectangle release];

    UIView* yellowRectangle = [[UIView alloc] initWithFrame:CGRectMake(theView.bounds.size.width-110.0f, theView.bounds.size.height-110.0f, 100.0f, 100.0f)];
    yellowRectangle.tag = 3;
    yellowRectangle.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin;
    yellowRectangle.backgroundColor = [UIColor yellowColor];
    [theView addSubview:yellowRectangle];
    [yellowRectangle release];

    self.view = theView;
    [theView release];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

答案 1 :(得分:0)

您可以通过设置自动调整视图大小:

[ tmpView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ];

所以当你旋转它会自己调整大小。

但我认为它不会做你需要的。 所以也许你应该添加一个在设备旋转时调用的函数(在控制器中):

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    [ self refreshLayouts ];

}

然后在refreshLayouts中,您可以根据需要自行更改宽度/高度。

祝你好运!

答案 2 :(得分:0)

首先检查您的视图控制器是否正在调用旋转事件的回调方法:

-willRotateToInterfaceOrientation:duration:
-didRotateFromInterfaceOrientation:

如果没有调用它们,那么进一步没有意义,因为你的viewController根本没有旋转!

这让我感兴趣 - “在我的视图控制器中(不是根视图控制器)”。如何将视图控制器添加到窗口层次结构中?您是在呈现它,还是仅将其视图作为子视图添加到根视图控制器中?