2

我有 UIViewController(例如 loginVC),我正在尝试将它的视图添加到所有视图之上。

我试图将此视图添加到AppDelegate

[[AppDelegate sharedDelegate].window addSubview:loginVC.view];

但在这种情况下,自动旋转不起作用,所以我尝试将此视图添加到NavigationController的视图中。NavigationController 是 rootViewController:

[[AppDelegate sharedDelegate].navigationController.view addSubview:loginVC.view];

它看起来不错并且可以自动旋转,但是在旋转时会出现奇怪的行为。

旋转开始后,导航栏显示在 loginVC.view 顶部,旋转结束时显示在此视图后面,就像屏幕截图中显示的一样(我设置了红色背景以使其更明显,背景是透明的,查看此视图​​背后的所有内容):

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我试过的:

  • 我在stackoverflow上的某个地方发现了这个:在旋转之前禁用UIView动画并在旋转后启用它们 - 看起来不太好,因为旋转发生时没有动画(这有点明显)

  • 试图在旋转之前隐藏 navigationBar 并在旋转后使其可见,但在这种情况下,navigationBar 位于 loginVC.view 之上

接下来我要做的事情——在 AppDelegate 的窗口上添加这个视图并手动处理旋转,但也许有更好的方法来做到这一点?

升级版:

截图:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

您可以在第二个屏幕截图中看到问题:导航栏位于顶部

4

2 回答 2

0

我的朋友帮我解决了这个问题

这是解决方案:

在 AppDelegate 我创建了UIWindow属性:

//AppDelegate.h
@property (nonatomic, strong) UIWindow *loginWindow;

应用程序启动时初始化它

//AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
....
    self.loginWindow = [[UIWindow alloc] init];
    self.loginWindow.windowLevel = UIWindowLevelStatusBar;
    self.loginWindow.frame = [[UIScreen mainScreen] bounds];
    self.loginWindow.backgroundColor = [UIColor clearColor];
....
    return YES;    
}

然后,在 loginVC 中:

@interface loginVC ()
@property (nonatomic, weak) UIWindow *loginWindow;
@end

@implementation
....

- (void)show {
// setting up loginVC view 
    if (!self.loginWindow) {
          self.loginWindow = [[AppDelegate sharedDelegate] loginWindow];
    }
    if (![self.loginWindow.rootViewController isEqual:self]) {
          [self.loginWindow setRootViewController:self];
    }
    self.loginWindow.hidden = NO;
//UPD:
    //[self.loginWindow makeKeyAndVisible];
//UPD2:
    [self.loginWindow makeKeyWindow];
}

- (void)hide {
// hiding view and stuff
    [[[AppDelegate sharedDelegate] loginWindow] setHidden:YES];
//UPD:
    //[[[AppDelegate sharedDelegate] window] makeKeyAndVisible];
//UPD2:
    [[[AppDelegate sharedDelegate] window] makeKeyWindow];
}
@end

升级版:

不需要使用makeKeyAndVisibleUIWindow 的方法,第二个窗口总是在第一个窗口之上。

UPD2:

再次更新我的答案,也许它对某人有用。

没有makeKeyAndVisible我就不能使用UITestFields 所以我取消注释该代码并面临另一个问题:

我有UIViewController,在这个控制器内创建另一个实例UIViewController并调用[self presentViewController:...]。在介绍中UIViewController我正在创建loginVC,但是当我打电话时

[[[AppDelegate sharedDelegate] window] makeKeyAndVisible];

呈现的 viewController 消失了,但是第一个视图控制器仍然有这个控制器presentedViewController,所以我不能呈现其他视图控制器。

我的解决方案是更改makeKeyAndVisible.makeKeyWindow

于 2013-01-24T15:53:28.887 回答
0

在 uinavigationcontroller 中添加您的 viewController 并推送 uinavigationcontroller,然后导航栏始终可见。

于 2013-01-24T10:54:02.093 回答