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 并旋转设备后,以前的视图控制器中的大小错误的主要内容,如果未能解决你的问题,请参考以下文章