在 iOS 8 中,我正在移动我的代码以依赖 viewWillTransitionToSize
调整我在 UITabBarController 下的 viewControllers。但是,当当前未显示 View 时,传递给它的尺寸不正确。
我写了一个小程序来隔离问题。它只是简单地创建两个 VC,给它们贴上标签,把它们放在 TabBarController 中,然后将交付的大小报告给 viewWillTransitionToSize。如果要重新创建它,可以用以下代码替换虚拟项目 AppDelegate.m。
输出在程序下方。我做错了什么,还是有解决方法来获得正确的即将到来的尺寸?
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
@interface MyViewController : UIViewController
@property (strong, nonatomic) NSString * detailItem;
@end
@implementation MyViewController
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
NSLog(@"%@ will transition from %@ to %@",self.detailItem, NSStringFromCGSize(self.view.frame.size), NSStringFromCGSize(size));
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
MyViewController * firstVC = [[MyViewController alloc] initWithNibName:nil bundle:nil];
firstVC.detailItem = @"Bookmark controller";
firstVC.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem: UITabBarSystemItemBookmarks tag:0];
MyViewController *secondVC = [[MyViewController alloc] initWithNibName:nil bundle:nil];
secondVC.detailItem = @"History controller";
secondVC.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem: UITabBarSystemItemHistory tag:1];
UITabBarController * tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil];
[tabBarController setViewControllers: @[firstVC, secondVC]];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
@end
输出如下:
<<starting in Bookmark VC in Portrait; transition to Landscape>>
Bookmark controller will transition from {375, 667} to {667, 375} <<Correct>>
History controller will transition from {375, 667} to {0, 0} <<Very wrong>>
<<transition back to Portrait>>
Bookmark controller will transition from {667, 375} to {375, 667} <<Correct>>
History controller will transition from {375, 667} to {667, 375} <<Wrong>>
<<switch to History tab; transition to Landscape>>
Bookmark controller will transition from {375, 667} to {375, 667} <<Wrong>>
History controller will transition from {375, 667} to {667, 375} <<Correct; note prev wrong size is now correct without notification>>
<<transition back to Portrait>>
Bookmark controller will transition from {375, 667} to {375, 667} <<Correct but still wrong current size>>
History controller will transition from {667, 375} to {375, 667} <<Correct>>
最佳答案
我尝试使用下面的代码解决此问题。我不确定这是否 100% 正确,所以如果有人有好的解决方案,请告诉我们。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
for viewController in viewControllers! {
viewController.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
}
关于ios - 为什么 UITabBarController 向 viewWillTransitionToSize 中的隐藏 View 提供错误的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029760/