我在Xcode 6中的iPad应用程序遇到了一个非常奇怪的问题。以前(使用Xcode 5/iOS 7 SDK构建时),它可以毫无问题地处理旋转,但现在要求开发人员使用Xcode 6/iOS 8 SDK构建,我的应用程序不再正确处理旋转。
我做了一些研究,并能够使用viewWillTransitionToSize方法来让我的所有子视图正确地旋转和调整大小。然而,当我旋转时,我的屏幕边上有一个白色的大矩形。如果我以纵向启动应用程序并旋转到横向,它会从看起来正常变为右侧有一个大的空白。(如果我从横向开始并旋转到纵向,也会发生同样的情况,但白色空间在底部)。
我的子视图确实调整了它们的大小,但遗憾的是,白色空间掩盖了它们。我检查了UIScreen窗口的边界和边框,这些值似乎有效(横向为1024w x 768h,纵向为768w x 1024h)。以前它是一个空白,但一旦我将行[self.window setFrame:[[UIScreen mainScreen] bounds]];
添加到didFinishLaunchingWithOptions方法中,它就变成了一个空白。以下是我正在使用的viewWillTransitionToSize代码:
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size WithTransitionCoordinator:coordinator];
UIInterfaceOrientation *orientation = [self interfaceFromTransform:[coordinator targetTransform]];
UIInterfaceOrientation *oldOrientation = [[UIApplication sharedApplication] statusBarOrientation];
[self willRotateToInterfaceOrientation:orientation duration:1.0];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> content)
{
[self willAnimateRotationToInterfaceOrientation:orientation duration:1.0];
}
completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
[self didRotateFromInterfaceOrientation:oldOrientation];
}];
CGFloat height = self.view.frame.size.height;
CGFloat width = self.view.frame.size.width;
[self.view setFrame:CGRectMake(0, 0, height, width)];
}
interfaceFromTransform是我创建的一种方法,用于确定转换旋转到哪个接口:
- (UIInterfaceOrientation) interfaceFromTransform: (CGAffineTransform)transform
{
UIInterfaceOrientation old = [[UIApplication sharedApplication] statusBarOrientation];
int rotation = 0;
if (transform.b == -1 && transform.c == 1)
rotation = 90;
if (transform.b == 1 && transform.c == -1)
rotation = -90;
if (transform.a == -1 && transform.d == -1)
rotation = 180;
if (old == UIInterfaceOrientationLandscapeRight)
{
if (rotation == 90)
return UIInterfaceOrientationPortrait;
if (rotation == -90)
return UIInterfaceOrientationPortraitUpsideDown;
if (rotation == 180)
return UIInterfaceOrientationLandscapeLeft;
}
if (old == UIInterfaceOrientationLandscapeLeft)
{
if (rotation == 90)
return UIInterfaceOrientationPortraitUpsideDown;
if (rotation == -90)
return UIInterfaceOrientationPortrait;
if (rotation == 180)
return UIInterfaceOrientationLandscapeRight;
}
if (old == UIInterfaceOrientationPortraitUpsideDown)
{
if (rotation == 90)
return UIInterfaceOrientationLandscapeRight;
if (rotation == -90)
return UIInterfaceOrientationLandscapeLeft;
if (rotation == 180)
return UIInterfaceOrientationPortrait;
}
if (old == UIInterfaceOrientationPortrait)
{
if (rotation == 90)
return UIInterfaceOrientationLandscapeLeft;
if (rotation == -90)
return UIInterfaceOrientationLandscapeRight;
if (rotation == 180)
return UIInterfaceOrientationPortraitUpsideDown;
}
return old;
}
然而,尽管如此,这片空白仍然拒绝消失。当我旋转屏幕时,有没有什么明显的东西会阻止它出现?
事实证明,我在主窗口nib文件中禁用了"自动调整子视图大小"。启用此功能立即解决了问题。