旋转时导航栏位于顶部

时间:2013-01-24 10:50:07

标签: objective-c cocoa-touch

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

我尝试将此视图添加到AppDelegate

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

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

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

它看起来很好并且自转,但它在旋转时有奇怪的行为。

开始旋转后,导航栏显示在loginVC.view的顶部,旋转结束时会在此视图后面显示,就像屏幕截图所示(我设置红色背景使其更加明显,背景为透明,看看这个观点背后的所有东西):

enter image description here enter image description here enter image description here

我尝试了什么:

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

  • 尝试在旋转前隐藏navigationBar,并在旋转后使其可见,但在这种情况下,navigationBar会在loginVC.view上显示

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

UPD:

截图:

enter image description here

enter image description here

enter image description here

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

2 个答案:

答案 0 :(得分:0)

在uinavigationcontroller中添加你的viewController并推送uinavigationcontroller然后总是可以看到导航栏。

答案 1 :(得分: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

<强> UPD:

无需使用UIWindow的makeKeyAndVisible方法,第二个窗口将始终位于第一个窗口之上。

<强> UPD2:

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

没有makeKeyAndVisible我无法使用UITestField,因此我取消注释该代码并面临另一个问题:

我有UIViewController,在此控制器中创建另一个UIViewController的实例并调用[self presentViewController:...]。在提交UIViewController时,我正在创建loginVC,但是当我致电

[[[AppDelegate sharedDelegate] window] makeKeyAndVisible];

呈现的viewController消失,但第一个视图控制器仍然将此控制器设为presentedViewController,因此我无法呈现其他视图控制器。

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