将 UIWindow rootViewController 从 UIViewController 重新分配给包含 UINavigationControllers 的 UITabBarController
Reassign UIWindow rootViewController from UIViewController to UITabBarController containing UINavigationControllers
我目前的登录流程有问题。逻辑都在那里,但是从登录视图到主视图的动画很奇怪。
附注:主视图是 UITabBarController
和 5 UINavigationControllers
,登录视图只是 UIViewController
所以首先我在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中确定当前用户是否已经登录(我正在使用 Parse
来处理),如果没有,则设置 UIWindows
rootViewController
成为登录控制器。否则,将 UIWindows
rootViewController
设置为主视图。
这很好用...假设用户在应用程序启动时登录。好的,它显示了主视图。然后我注销,一切都按预期进行。我通过 运行 此方法切换 UIWindows rootViewController:
- (void)showLogin {
self.activity = nil;
self.chat = nil;
self.create = nil;
self.notification = nil;
self.more = nil;
self.loginViewController = nil;
if (!self.loginViewController) { // this check is redundant i feel lol
self.loginViewController = [[PHLoginRegisterViewController alloc] init];
}
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.window.rootViewController = self.loginViewController;
} completion:^(BOOL finished) {
self.activity = [[PHActivityViewController alloc] init];
self.chat = [[PHGlobalChatViewController alloc] init];
self.notification = [[PHNotificationsViewController alloc] init];
self.more = [[PHMoreViewController alloc] init];
[self.tabBarController setViewControllers:@[[[UINavigationController alloc] initWithRootViewController:self.activity],
[[UINavigationController alloc] initWithRootViewController:self.chat],
[[UINavigationController alloc] init],
[[UINavigationController alloc] initWithRootViewController:self.notification],
[[UINavigationController alloc] initWithRootViewController:self.more]]];
[self.tabBarController setSelectedIndex:0];
}];
}
好的,所以登录视图现在显示了一个很好的过渡...然后当我尝试登录时,一切正常,但是当过渡发生时登录->主视图,整个主视图(除了UITabBarController
) 的 UITabBar
的位置基本上暂时设置为 -20px,然后重置为预期位置...这是登录过渡到主视图时的两个屏幕截图,然后当它完成转换时......
我已经在没有 UITabBarController 的情况下测试了这个确切的实现,但它没有这样做。这有点 GLITCH 问题。任何人都可以传递任何想法?
我想知道是否可以在不执行 main 的 viewDidAppear
或 viewWillAppear
方法的情况下执行此登录->main 和 main->login 转换。
例如,在主视图中 viewDidAppear
、
if (user is logged in)
[self presentViewController:login animated:NO]
这会导致在显示登录视图之前先看到主屏幕一小段时间,这是我不希望看到的。
我认为问题是在你的转换完成之前,自动布局过程没有被触发,所以你的视图是它在你的 xib 设计中的位置。
我有一个解决这个问题的想法,每当应用程序启动时,您都将主视图控制器用作根视图控制器,如果您需要登录,则在主视图控制器的 viewDidLoad 中加载登录视图控制器并将它的视图添加为主视图控制器的顶部子视图,这将解决演示文稿的问题。
唯一的缺点是您的登录视图需要不透明的背景。
我目前的登录流程有问题。逻辑都在那里,但是从登录视图到主视图的动画很奇怪。
附注:主视图是 UITabBarController
和 5 UINavigationControllers
,登录视图只是 UIViewController
所以首先我在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中确定当前用户是否已经登录(我正在使用 Parse
来处理),如果没有,则设置 UIWindows
rootViewController
成为登录控制器。否则,将 UIWindows
rootViewController
设置为主视图。
这很好用...假设用户在应用程序启动时登录。好的,它显示了主视图。然后我注销,一切都按预期进行。我通过 运行 此方法切换 UIWindows rootViewController:
- (void)showLogin {
self.activity = nil;
self.chat = nil;
self.create = nil;
self.notification = nil;
self.more = nil;
self.loginViewController = nil;
if (!self.loginViewController) { // this check is redundant i feel lol
self.loginViewController = [[PHLoginRegisterViewController alloc] init];
}
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.window.rootViewController = self.loginViewController;
} completion:^(BOOL finished) {
self.activity = [[PHActivityViewController alloc] init];
self.chat = [[PHGlobalChatViewController alloc] init];
self.notification = [[PHNotificationsViewController alloc] init];
self.more = [[PHMoreViewController alloc] init];
[self.tabBarController setViewControllers:@[[[UINavigationController alloc] initWithRootViewController:self.activity],
[[UINavigationController alloc] initWithRootViewController:self.chat],
[[UINavigationController alloc] init],
[[UINavigationController alloc] initWithRootViewController:self.notification],
[[UINavigationController alloc] initWithRootViewController:self.more]]];
[self.tabBarController setSelectedIndex:0];
}];
}
好的,所以登录视图现在显示了一个很好的过渡...然后当我尝试登录时,一切正常,但是当过渡发生时登录->主视图,整个主视图(除了UITabBarController
) 的 UITabBar
的位置基本上暂时设置为 -20px,然后重置为预期位置...这是登录过渡到主视图时的两个屏幕截图,然后当它完成转换时......
我已经在没有 UITabBarController 的情况下测试了这个确切的实现,但它没有这样做。这有点 GLITCH 问题。任何人都可以传递任何想法?
我想知道是否可以在不执行 main 的 viewDidAppear
或 viewWillAppear
方法的情况下执行此登录->main 和 main->login 转换。
例如,在主视图中 viewDidAppear
、
if (user is logged in)
[self presentViewController:login animated:NO]
这会导致在显示登录视图之前先看到主屏幕一小段时间,这是我不希望看到的。
我认为问题是在你的转换完成之前,自动布局过程没有被触发,所以你的视图是它在你的 xib 设计中的位置。
我有一个解决这个问题的想法,每当应用程序启动时,您都将主视图控制器用作根视图控制器,如果您需要登录,则在主视图控制器的 viewDidLoad 中加载登录视图控制器并将它的视图添加为主视图控制器的顶部子视图,这将解决演示文稿的问题。
唯一的缺点是您的登录视图需要不透明的背景。