iOS8 - 在 UINavigationController 上推送 UIViewController 并旋转设备后,以前的视图控制器中的大小错误

Posted

技术标签:

【中文标题】iOS8 - 在 UINavigationController 上推送 UIViewController 并旋转设备后,以前的视图控制器中的大小错误【英文标题】:iOS8 - After pushing a UIViewController on a UINavigationController and rotating the device, the size is wrong in previous view controller 【发布时间】:2014-11-12 15:12:18 【问题描述】:

我有一个UINavigationController,其根为UIViewController(“root”)。

根视图控制器推送另一个UIViewController“child”。当“孩子”UIViewController 在屏幕上时,我旋转设备并期望“根”视图控制器相应地调整大小,但这并没有发生。在根视图控制器中放置断点后:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

我发现尺寸不对,并且根视图控制器没有正确适应变化。

有没有人经历过这种行为?

代码是这样的:

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];




-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
/// The size is wrong if this view controller is off screen
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

这是旋转设备后大小的 NSLog 的打印屏幕 - 这是来自模拟器,但在设备上的行为是相同的。

【问题讨论】:

你的日志大小是多少,你期望什么? 我将添加一个打印屏幕 - 在我旋转设备几次之后。请注意,大小始终相同。 是的,它总是一样大小,看起来根视图控制器根本不旋转。 是的。好像是个bug @AvnerBarr 你是如何解决这个问题的?我将一些代码从以前的 will/didRotate 移植到新的 viewWillTransitionToSize。我正在使用 UINavigationController 进行向下钻取导航,当设备旋转时,我需要在所有堆叠的控制器中做一些事情。 【参考方案1】:

我的项目也有同样的问题。 似乎 UINavigationController 和 UITabBarController(可能都是 viewController?)在您调用时给那里的孩子提供了错误的大小:

'[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];'

我通过覆盖 tabBarController 和导航栏控制器子类中的“viewWillTransitionToSize:withTransitionCoordinator:”解决了这个问题(两者中的代码相同)。

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

    for (UIViewController* aViewController in self.viewControllers)
    
        [aViewController viewWillTransitionToSize:size
                        withTransitionCoordinator:coordinator];
    

    if ([self presentedViewController])
    
        [[self presentedViewController] viewWillTransitionToSize:size
                                       withTransitionCoordinator:coordinator];
    

我不确定这是不是最好的方法,如果你找到更好的方法,请告诉我。

【讨论】:

【参考方案2】:

可能只有窗口旋转。如果你这样打印,我测试过它总是正确的。

[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
 

  completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
 
     UIWindow *screen = [[[UIApplication sharedApplication] delegate] window];
     CGSize mainWindowSize = screen.bounds.size;
     NSLog(@"Main window size is %@",NSStringFromCGSize(mainWindowSize));

 ];

【讨论】:

这是一个黑客。我不想把它放在 20 个视图控制器中 所有这一切都将当前大小转储到日志中。这段代码中还没有任何影响。 @NormanH,这段代码对我有用,它放在以前的视图控制器中,哪个视图不在屏幕上,如果你旋转当前视图,日志是正确的。

以上是关于iOS8 - 在 UINavigationController 上推送 UIViewController 并旋转设备后,以前的视图控制器中的大小错误的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 Spritekit 滞后

iOS8开发之iOS8的UIAlertController

iOS8 扩展 - 在 iOS 5/6/7 上会发生啥?

NSDecimalNumber integerValue 在 iOS8 中表现异常

CLGeocoder 在 iOS8 上强制使用特定语言

Popover 演示在 iOS8 中不会使 tintColor 变暗