这可能吗?我怎么能做到这一点?
2 回答
根据 Apple Docs 不可能。所有 UIViewControllers 都必须支持相同的方向才能旋转。
请参阅本文档(向下滚动到标题为“标签栏控制器和旋转”的部分:http: //developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/TabBarControllers.html#//apple_ref /doc/uid/TP40011313-CH3-SW1
根据 Apple Docs 不可能。
可能这个词可能需要一个星号。看起来 Apple 并没有设想(或想要)你这样做。但是,根据您的要求,可能会有一种解决方法。
免责声明:这是一种黑客行为。我并不是说这是一个好的 UI,只是想向 Eli 展示什么是可能的。
我构建了一个示例,从用于构建选项卡式应用程序的 Xcode 模板开始。它有两个视图控制器:FirstViewController
和SecondViewController
. 我决定只制作FirstViewController
风景视图。在 Interface Builder(Xcode UI 设计模式)中,我将 FirstViewController 视图的方向设置为横向,并将其大小设置为 480 宽 x 251 高(我在这里假设 iPhone/iPod)。
解决方案
现在,似乎有必要让所有标签栏的视图控制器声称支持自动旋转到纵向和横向。例如:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
所以,我的两个视图控制器都有相同的代码。但是,我所做的FirstViewController
是也覆盖willAnimateToInterfaceOrientation:duration:
并从根本上撤消基础设施所做的事情UIViewController
,仅针对这个仅限横向的视图控制器。
FirstViewController.m:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration];
CGAffineTransform viewRotation;
CGRect frame;
if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
viewRotation = CGAffineTransformIdentity;
// TODO: change to dynamically account for status bar and tab bar height
frame = CGRectMake(0, 0, 480, 320 - 20 - 49);
} else {
viewRotation = CGAffineTransformMakeRotation(M_PI_2);
// TODO: change to dynamically account for status bar and tab bar height
frame = CGRectMake(0, 0, 320, 480 - 20 - 49);
}
// undo the rotation that UIViewController wants to do, for this view heirarchy
[UIView beginAnimations:@"unrotation" context: NULL];
[UIView setAnimationDuration: duration];
self.view.transform = viewRotation;
self.view.frame = frame;
[UIView commitAnimations];
}
你得到的是标签栏将始终随设备旋转。这可能是一个要求,让您的双方向视图(例如SecondViewController
)进行自动旋转。但是,FirstViewController
现在的实际视图内容不会旋转。无论用户如何转动设备,它都会保持横向。那么,也许这对你来说已经足够了?
另外值得注意的是:
1)我更改了应用程序的信息 plist 文件以将初始方向设置为横向(因为我FirstViewController
是横向的):
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
2)在 FirstViewController.xib 中,我将 main/parent 设置UIView
为不 Autoresize Subviews。根据您的视图层次结构,您可能也希望在其他子视图中更改此属性。您可以尝试该设置。
现在,随着状态栏和标签栏的旋转,横向视图的可用大小确实会发生一些变化。因此,您可能需要稍微调整布局。但是,基本上,无论用户如何握住他们的设备,您仍然可以看到显示横向内容的广阔视野。