UIWindow的UIView子视图不会旋转

时间:2012-01-05 04:14:08

标签: ios uiview uiwindow device-orientation

我正在向UIView添加UIWindow,而不是keyWindow。我希望UIView在设备旋转时旋转。 窗口上的任何特殊属性或我需要设置的视图?目前视图不会旋转。

我知道只有应用程序keyWindow的第一个子视图被告知设备轮换。作为测试,我将视图添加到keyWindow的第一个子视图中。这会导致视图旋转。然而,作为keyWindow第一个子视图的子视图的视图不会因各种美学原因而起作用。

另一种方法是观察视图中的设备方向变化并自己编写旋转代码。但是,如果可能的话,我想避免编写此代码(在我看来,有一个额外的窗口更清晰)。

2 个答案:

答案 0 :(得分:7)

UIView不处理旋转,UIViewController确实如此。 所以,你只需要创建一个UIViewController,它实现了shouldAutorotateToInterfaceOrientation并将这个控制器设置为你的UIWindow的rootViewController

类似的东西:

    UIViewController * vc = [[[MyViewController alloc] init] autorelease];

    vc.view.frame = [[UIScreen mainScreen] bounds];
    vc.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4];

    //you vc.view initialization here

    UIWindow * window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.windowLevel = UIWindowLevelStatusBar;
    window.backgroundColor = [UIColor clearColor];
    [window setRootViewController:vc];
    [window makeKeyAndVisible];

我使用了这个MyViewController,因为我希望它能反映主应用程序的变化

    @interface MyViewController : UIViewController

    @end

    @implementation MyViewController

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
    {
        UIWindow *window = ((UIWindow *)[[UIApplication sharedApplication].windows objectAtIndex:0]);
        UIViewController *controller = window.rootViewController;

        if (!controller) {
            NSLog(@"%@", @"I would like to get rootViewController of main window");
            return YES;
        }
        return [controller shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }
    @end

但是如果你愿意,你可以随时为任何方向返回YES或写下你的逻辑。

答案 1 :(得分:2)

您可以在项目中添加以下代码

  

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate :)                                                    name:UIDeviceOrientationDidChangeNotification object:nil];

并创建了处理它的函数。