横屏下UIWindow添加多个view自动旋转的解决方案

来源:互联网 发布:android ios js 统一 编辑:程序博客网 时间:2024/05/18 02:07

在横屏应用中,使用keyWindow添加一个视图,切换设备横屏方向,发现添加的视图不会随着变化方向。

并且只有Window的RootViewController可以监听到屏幕旋转变化。

[[UIApplicationsharedApplication].keyWindow addSubview:view];

解决方法如下:

定义RotateWindow继承UIWindow,并重写addSubview方法。AppDelegate中的window使用RotateWindow。

复制代码
#define degreesToRadian(x) (M_PI * (x) / 180.0)- (void)addSubview:(UIView *)view {    if ([self.subviews count] >= 1) {        float angle = ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft)?90:-90;        view.transform = CGAffineTransformMakeRotation(degreesToRadian(angle));        view.frame = CGRectOffset(self.frame, 0, 0);    }    [super addSubview:view];}
复制代码

定义RotateViewController作为window的RootViewController,并重写以下方法

复制代码
// 仅允许横屏- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {    // Return YES for supported orientations.    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);}// 设备旋转时修改添加视图方向- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {    UIWindow *window = [UIApplication sharedApplication].keyWindow;    int i = 0;    for (UIView *view in window.subviews) {        if (i != 0) {            CGAffineTransform transform = view.transform;            transform = CGAffineTransformRotate(transform,  degreesToRadian(180));            view.transform = transform;        }        i++;    }}
0 0