【发布时间】:2015-02-20 09:00:20
【问题描述】:
我知道这看起来是一个巨大的问题,但并不害怕阅读它。主要是我在解释东西是如何工作的。
我的应用中有两个UIWindows。第一个是应用程序默认创建的主窗口。第二个称为modalWindow,也是在应用程序委托中创建的。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.modalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.modalWindow.windowLevel = UIWindowLevelStatusBar;
//Other stuff I need
//....
return YES;
}
我的大部分应用程序都是纵向的,但有一个视图控制器可以让用户切换到横向。我正在通过以下方式监听景观变化:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
这很好用,在orientationChanged 方法中我展示了横向视图控制器。在这一点上一切都很好。如果我旋转回纵向,我会再次触发 orientationChanged,此时我会关闭横向视图控制器。
现在让我们解释第二个窗口是如何发挥作用的。在横向模式下,有一个动作(只需按下按钮)会在第二个窗口(@987654327@)上显示一个新的视图控制器。好的,让我们解释一下。
应用程序委托有两个方法,如下所示:
- (void)presentActivityOnModalWindow:(UIViewController *)viewController
{
self.modalWindow.rootViewController = viewController;
self.modalWindow.hidden = NO;
}
- (void)modalTransitionFinished:(NSNotification *)notif
{
self.modalWindow.hidden = YES;
self.modalWindow.rootViewController = nil;
}
我通过[[[UIApplication sharedApplication] delegate] performSelector....] 拨打presentActivityOnModalWindow。我知道这不是最佳做法,但效果很好。至于解雇,我使用NSNotificationCenter 发布解雇通知。 modalWindow 上显示的视图控制器仅支持纵向模式。它在shouldAutorotate 中返回YES,在supportedInterfaceOrientations 中返回UIInterfaceOrientationMaskPortrait。
好吧,解释了很多,但现在我们解决了问题。当我旋转到横向时,弹出模态窗口,关闭模态窗口并旋转回纵向,我的主窗口仍处于横向模式,一切看起来都是灾难性的。
我尝试向window 和modalWindow 添加观察者,并在frame 和bounds 中记录更改,结果如下:
Did finish launching:
window frame {{0, 0}, {320, 568}}
window bounds {{0, 0}, {320, 568}}
modalWindow frame {{0, 0}, {320, 568}}
modalWindow bounds {{0, 0}, {320, 568}}
Rotate to landscape:
window frame {{0, 0}, {568, 320}}
Open activity in landscape:
modalWindow frame {{0, 0}, {320, 568}}
modalWindow frame {{0, 0}, {320, 568}}
Dismiss activity:
none
Rotate back to portrait:
none
所以当我们回到纵向模式时,我的window 似乎没有回到正常帧。 如何解决这个问题?如果我需要提供更多详细信息,请随时询问。
【问题讨论】:
标签: ios objective-c uiviewcontroller ios8 uiwindow