iOS8-在UINavigationController上按下UIViewController并旋转设备后,上一个view controller中的大小错误

iOS8-在UINavigationController上按下UIViewController并旋转设备后,上一个view controller中的大小错误,ios,objective-c,uiviewcontroller,uinavigationcontroller,viewwilltransitiontosize,Ios,Objective C,Uiviewcontroller,Uinavigationcontroller,Viewwilltransitiontosize,我有一个UINavigationController根UIViewController(“根”) 根视图控制器推送另一个UIViewController“子视图”。当“child”UIViewController出现在屏幕上时,我会旋转设备,并期望“root”视图控制器相应地调整大小,但这不会发生。在根视图控制器中放置断点后: -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewC

我有一个
UINavigationController
UIViewController
(“根”)

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

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
-(void)视图将转换大小:(CGSize)带有转换协调器的大小:(id)协调器{
[super ViewWillTransitionSize:size with TransitionCoordinator: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
@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
}
-(void)ViewWillTransitionOnSize:(CGSize)带有TransitionCoordinator:(id)coordinator的大小{
///如果此视图控制器不在屏幕上,则大小错误
[super ViewWillTransitionSize:size with TransitionCoordinator:coordinator];
}
-(无效)未收到记忆警告{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
@结束

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


可能只有窗户旋转。如果你像这样打印,它总是正确的,因为我已经测试过了

[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));

 }];
[coordinator AnimateLongsideTransition:^(id上下文)
{
}完成:^(id上下文)
{
UIWindow*屏幕=[[UIApplication sharedApplication]委托]窗口];
CGSize mainWindowsSize=screen.bounds.size;
NSLog(@“主窗口大小为%@”,NSStringFromCGSize(MainWindowsSize));
}];
我的项目也有同样的问题。 当您调用以下命令时,UINavigationController和uitabarcontroller(可能是所有的viewController?)似乎给了这些孩子错误的大小:

“[super ViewWillTransitionOnSize:size with TransitionCoordinator:coordinator];”

我通过在我的tabBarController和导航栏控制器子类(两者中的代码相同)中重写“ViewWillTransitionOnSize:withTransitionCoordinator:”修复了这个问题

-(void)视图大小:(CGSize)大小
withTransitionCoordinator:(id)协调员
{
用于(UIViewController*aViewController在self.viewControllers中)
{
[aViewController视图将转换大小:大小
带传递协调员:协调员];
}
如果([self-presentedViewController])
{
[[self-presentedViewController]视图将转换为大小:大小
带传递协调员:协调员];
}
}

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

你的尺码记录是多少,你期望什么?我将在旋转设备几次后添加一个打印屏幕。请注意,大小始终相同。是的,大小始终相同,看起来根视图控制器根本不旋转。是的。看起来像一个bug@AvnerBarr您是如何解决此问题的?我正在将以前的will/didRotate中的一些代码移植到新的viewwillTransitionOnSize。我正在使用UINavigationController进行向下搜索导航,当设备旋转时,我需要在所有堆叠的控制器中执行一些操作。这是一种攻击。我不想把它放在20个视图控制器中,所有视图控制器都将当前大小转储到日志中。在这段代码中还没有任何效果。@诺曼,这段代码对我有效,它被放在上一个视图控制器中,该视图在屏幕外,如果你旋转当前视图,日志是正确的。
- (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];
    }
}