Ios UIWindow的UIView子视图不';t旋转

Ios UIWindow的UIView子视图不';t旋转,ios,uiview,uiwindow,device-orientation,Ios,Uiview,Uiwindow,Device Orientation,我正在将一个ui视图添加到一个ui窗口,该窗口不是键窗口。我希望ui视图在设备旋转时旋转我需要设置窗口或视图的任何特殊属性?当前视图未旋转 我知道,只有应用程序的keyWindow的第一个子视图被告知设备旋转。作为测试,我将视图添加到keyWindow的第一个子视图中。这会导致视图旋转。但是,作为keyWindow的第一个子视图的子视图,由于各种美学原因,该视图不起作用 另一种方法是观察视图中的设备方向变化,并自己编写旋转代码。但是,如果可能的话,我希望避免编写此代码(我认为增加一个窗口更干净)

我正在将一个
ui视图
添加到一个
ui窗口
,该窗口不是键窗口。我希望
ui视图
在设备旋转时旋转我需要设置窗口或视图的任何特殊属性?当前视图未旋转

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


另一种方法是观察视图中的设备方向变化,并自己编写旋转代码。但是,如果可能的话,我希望避免编写此代码(我认为增加一个窗口更干净)。

您可以将以下代码添加到项目中

[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(didRotate:) 名称:UIDeviceOrientationIDChangeNotification对象:nil]


并创建了处理旋转的函数。

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,或者编写您的逻辑。

我更喜欢“免费”获得旋转,而不是编写
didRotate
我也遇到了类似的问题——UIWindow及其视图似乎不旋转——这个解决方案似乎对我不起作用。我使窗口的rootViewController成为一个成功旋转其子视图的控制器,但窗口的子视图根本不旋转。而且它们不应该旋转,因为它们没有连接到UIViewController,只有UIViewController管理旋转。这是一个很好的答案,谢谢。它使辅助窗口上的旋转“正常工作”。要在以后从屏幕上删除窗口,只需将其rootViewController设置为nil,并将对自身的引用设置为nil,这样ARC就可以取消分配它。