有I'm这个问题与iOS 6 SDK:I'm具有应该被允许旋转的一些看法(如videoview),以及一些鸵鸟政策。 现在我明白我要检查在app's Info.plist中所有的方位,然后在每个视图控制器进行梳理,会发生什么。 但它doesn't工作! 该应用始终旋转的方向,这是在给定的Info.plist。
Info.plist的:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
该shouldn't被允许旋转的任何视图控制器:
//deprecated
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
观察:应用旋转到横向和纵向。 任何想法,为什么还是什么I'm做错了什么?
干杯,马克
编辑:我的最新的研究结果还表明,如果你想在你的应用某些点有旋转,你必须激活您的项目设置或Info.plist的所有四个方向旋转。 这另一种方法是重写
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
在你的AppDelegate,其覆盖的Info.plist。 它isn't可能再通过重写shouldAutorotateToInterfaceOrientation或supportedInterfaceOrientations设置只在您的Info.plist人像,然后具有旋转部分的ViewController。
Answer 1:
如果您的视图控制器是一个UINavigationController或的UITabBarController的孩子,那是你的问题的父母。 您可能需要子类化父视图控制器,只是重写那些InterfaceOrientation方法,你已经在你的问题出
编辑:
例如人像只TabBarController
@interface MyTabBarController : UITabBarController
{
}
@end
@implementation MyTabBarController
// put your shouldAutorotateToInterfaceOrientation and other overrides here
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
@end
Answer 2:
添加到上述CSmith:它的答案,在一个UINavigationController子类下面的代码允许代表团中,我预计这摆在首位的工作方式的顶视图控制器:
- (BOOL)shouldAutorotate;
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
if ([[self topViewController] respondsToSelector:@selector(supportedInterfaceOrientations)])
return [[self topViewController] supportedInterfaceOrientations];
else
return [super supportedInterfaceOrientations];
}
Answer 3:
这里的另一个替代CSmith:它的做法。
如果你要复制的预iOS 6的行为,其中在导航堆栈/标签栏的所有意见必须在允许的组取向的同意,把这个在你的子类UITabBarController
或UINavigationController
:
- (NSUInteger)supportedInterfaceOrientations
{
NSUInteger orientations = [super supportedInterfaceOrientations];
for (UIViewController *controller in self.viewControllers)
orientations = orientations & [controller supportedInterfaceOrientations];
return orientations;
}
Answer 4:
尝试添加此类别:
@interface UINavigationController(InterfaceOrientation)
@end
@implementation UINavigationController(InterfaceOrientation)
- (NSUInteger) supportedInterfaceOrientations {
if (self.viewControllers.count > 0)
return [[self.viewControllers objectAtIndex:0] supportedInterfaceOrientations];
else
return UIInterfaceOrientationMaskAll;
}
@end
Answer 5:
对于使用的UINavigationController和斯威夫特的人,你可以将此扩展添加到您的项目。 在此之后,导航控制器委托控制他们的孩子控制器。
extension UINavigationController {
override public func supportedInterfaceOrientations()
-> UIInterfaceOrientationMask {
if let ctrl = topViewController {
return ctrl.supportedInterfaceOrientations()
}
return super.supportedInterfaceOrientations()
}
override public func shouldAutorotate() -> Bool {
if let ctrl = topViewController {
return ctrl.shouldAutorotate()
}
return super.shouldAutorotate()
}
}
Answer 6:
另外除了@CSmith和@EvanSchoenberg。
如果你有一个旋转的一些看法,以及一些看法是不这样做,你必须创建一个自定义实例UITabBarController
,但仍然让每个UIViewController
决定。
- (BOOL)shouldAutorotate;
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
UIViewController * top;
UIViewController * tab = self.selectedViewController;
if([tab isKindOfClass:
([UINavigationController class])]) {
top = [((UINavigationController *)tab)
topViewController];
}
if ([top respondsToSelector:@selector(supportedInterfaceOrientations)])
return [top supportedInterfaceOrientations];
else
return [super supportedInterfaceOrientations];
}
Answer 7:
@ Alvivi的回答更新的雨燕4。
extension UINavigationController {
// Look for the supportedInterfaceOrientations of the topViewController
// Otherwise, viewController will rotate irrespective of the value returned by the ViewController
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if let ctrl = self.topViewController {
return ctrl.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
// Look for the shouldAutorotate of the topViewController
// Otherwise, viewController will rotate irrespective of the value returned by the ViewController
override open var shouldAutorotate: Bool {
if let ctrl = self.topViewController {
return ctrl.shouldAutorotate
}
return super.shouldAutorotate
}
}
Answer 8:
@Shimanski阿尔乔姆的答案是好的,但我想用最顶层(当前可见)控制器是更好的解决方案:
@interface UINavigationController(InterfaceOrientation)
@end
@implementation UINavigationController(InterfaceOrientation)
- (NSUInteger) supportedInterfaceOrientations {
if (self.viewControllers.count > 0){
return [[self.viewControllers objectAtIndex:[self.viewControllers count] - 1] supportedInterfaceOrientations];
}
return UIInterfaceOrientationMaskAll;
}
@end
Answer 9:
作为替代方法,如果你想在你的应用程序以保持预iOS6的旋转功能:
这里的代码在GitHub是碎冰鸡尾酒的方法需要iOS6的,这样旋转如同它做了iOS4的/ iOS4的一个有益位。 这真的帮了我,因为我支持真正的微管理其旋转的遗留应用程序。 这本来是一个大量的工作,以实现对iOS6的所需要的变化。 荣誉给谁张贴的用户。
https://gist.github.com/3725118
文章来源: iOS 6 rotations: supportedInterfaceOrientations doesn´t work?