ios - 为什么 UITabBarController 向 viewWillTransitionToSize 中的隐藏 View 提供错误的大小?

标签 ios uitabbarcontroller

在 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/

相关文章:

iphone - IB中的UITableViewCell和Programmatically,哪个更适合定制?

iphone - iOS 应用程序分区/MVC

ios - 如何在 swift 3 中将 AVPlayer 从 4 秒循环到 8 秒?

ios - UILabel 显示的是最后一个值,但不是我输入的所有值

ios - YALFoldingTabBarController 根据所选的 ViewController 更改 centerButtonImage

ios - performFetchWithCompletionHandler 多久调用一次?

ios - 使用 setSelectedIndex : method in UITabBarController 时遇到问题

ios - 如何从另一个发送事件到 UIViewController

ios - 标签栏 Controller 中多个标签的一个导航 Controller

ios - 如何通过工具栏按钮替换容器 View ?