iOS 6中的自动旋转具有奇怪的行为
我有UITabBarController
应用程序播放video,并显示其他UITabBar
选项卡中的其他信息。 在iOS 6 UIView
旋转方法已被弃用,现在我需要使用shouldAutoRotate
和supportedInterfaceOrientations
方法。 对于video播放我使用MPMoviePlayerViewController
。
如何只旋转这个播放器视图? 我只能旋转整个应用程序,但不想这样做。 我介绍MPMoviePlayerViewController
但它不像iOS 5和更早版本那样旋转。
在plist
设置中,我只设置了1个人像界面方向。 如果我设置其他 – 整个应用程序将被旋转。
从Apple的iOS 6 SDK发行说明:
自动旋转在iOS 6中正在改变。在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:方法。 在它的地方,你应该使用supportedInterfaceOrientationsForWindow:和shouldAutorotate方法。
更多的责任是转移到应用程序和应用程序委托。 现在,iOS容器(如UINavigationController)不会咨询他们的孩子,以确定他们是否应该自动旋转。 默认情况下,应用程序和视图控制器支持的界面方向设置为UIInterfaceOrientationMaskAll为iPad成语和UIInterfaceOrientationMaskAllButUpsideDown为iPhone成语。
视图控制器支持的界面方向可以随时间变化 – 即使应用程序支持的界面方向也可以随时间变化。 无论何时设备旋转或每当视图控制器呈现全屏模式呈现样式时,系统都要求最顶级的全屏视图控制器(通常是根视图控制器)支持其支持的接口方向。 此外,只有当这个视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向。 系统将视图控制器支持的方向与应用程序支持的方向(由Info.plist文件或应用程序委托的应用程序:supportedInterfaceOrientationsForWindow:方法确定)相交,以确定是否旋转。
系统通过将应用程序的supportedInterfaceOrientationsForWindow:方法返回的值与最顶级的全屏控制器的supportedInterfaceOrientations方法返回的值相交来确定是否支持方向。 setStatusBarOrientation:animated:方法不被弃用。 现在,只有在最顶级全屏视图控制器的supportedInterfaceOrientations方法返回0时,该方法才有效。这使得调用者负责确保状态栏方向一致。
为了兼容性,仍然实现shouldAutorotateToInterfaceOrientation:方法的视图控制器不会获得新的自动旋转行为。 (换句话说,它们不会退回到使用应用程序,应用程序委托或Info.plist文件来确定支持的方向。)相反,shouldAutorotateToInterfaceOrientation:方法用于合成由supportedInterfaceOrientations方法返回的信息。
如果你想让你的整个应用程序旋转,那么你应该设置你的Info.plist来支持所有的方向。 现在如果你想要一个特定的视图只是肖像,你将不得不做一些子类,并重写自动旋转方法只返回肖像。 我在这里有一个例子:
Ough! 花了一天半,问题解决了! 呵呵。
正如上面的文档所说,这是真的! 核心要点是:
更多的责任是转移到应用程序和应用程序委托 。 现在,iOS容器(如UINavigationController)不会咨询他们的孩子,以确定他们是否应该自动旋转。 默认情况下,应用程序和视图控制器支持的界面方向设置为UIInterfaceOrientationMaskAll为iPad成语和UIInterfaceOrientationMaskAllButUpsideDown为iPhone成语。
所以,随时根控制器改变的时候,系统会询问应用程序委托人“那么,我们是什么?旋转与否?
如果“旋转”:
仅当此视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向
然后系统要求我们的应用程序代表
- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return ...; }
这真的很简单。
如何确定何时应该允许人像或风景等 – 取决于您。 根控制器的testing由于某些点而不适用于我,但是这个工作:
- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return self.fullScreenVideoIsPlaying ? UIInterfaceOrientationMaskAllButUpsideDown : UIInterfaceOrientationMaskPortrait; }
当我需要的时候,属性“fullScreenVideoIsPlaying”由我手动设置。
唯一需要注意的是重要的是枚举。 正如它在文档中所说…(仔细阅读上面的iPad / iPhone的东西)。 所以,你可以随心所欲地玩。
另一个微小的事情是closures播放器控制器后的一些错误的行为。 有一次,它没有改变方向,但发生了一次,以一种奇怪的方式,只有在模拟器(当然只有iOS 6)。 所以我什至不能作出反应,因为它意外地发生,并在点击我的应用程序的其他一些元素后,它旋转到正常的方向。 所以,不知道 – 可能是在模拟器工作或类似的东西(或者,真的是一个bug :))的一些延迟)。
祝你好运!
我与我的应用程序有同样的问题。
iOS 6的轮换是如何工作的。
=>当您在AppDelegate中使用UINavigationCOntroller方法时
- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return }
决定是否旋转。
=>当在Modal呈现样式中呈现视图的方法
- (BOOL)shouldAutorotate
在viewController里面的那个视图会触发appDelegate中的方法。 和第一例appDelegate决定旋转或不旋转。
我的解决scheme
我为莫代尔演讲做了什么。 在应用程序委托中创build了一个标志。
当旗子是YES的时候,它会旋转到横向和其他唯一的肖像。
- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window { if(self.shouldRotate ) //shouldRotate is my flag { self.shouldRotate = NO; return (UIInterfaceOrientationMaskAll); } return (UIInterfaceOrientationMaskPortrait); }
并在旋转之间切换
- (BOOL)shouldAutorotate { YourAppDelegate *mainDelegate = (YourAppDelegate*)[[UIApplication sharedApplication]delegate]; mainDelegate.shouldRotate = YES; return YES; }
注意 :这只适用于Modely Presents的视图。 使用标志,不是一个好的编码习惯。
您也可以inheritanceUITabBarController,使其向子代询问shouldAutorotate和supportedInterfaceOrientation,如下所示:
@implementation MyTabBarController -(BOOL)shouldAutorotate { return [self.selectedViewController shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [self.selectedViewController supportedInterfaceOrientations]; } @end
然后你只需使用你的自定义容器来代替标准的容器就行了! 刚刚testing过。
不幸的是,您需要打开plist中的所有方向,并在所有不想旋转的视图控制器上使用supportedInterfaceOrientations。 (在你的情况下,除video播放器以外的所有内容)
尝试这个,
如果TabBarController是用于窗口的RootViewController,那么创build自定义类inheritanceTabBarController说CustomTabBarController.h
在CustomTabBarController.h中添加下面的方法
-(NSUInteger)supportedInterfaceOrientations // Must return Orientation Mask
最后在AppDelegate.m下面调用
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if( [self.window.rootViewController supportedInterfaceOrientations]!=0) { return [self.window.rootViewController supportedInterfaceOrientations]; } return UIInterfaceOrientationMaskAll; }
我发现设置这个最简单的方法是使用“支持的接口方向”button,你可以看看如果你看目标….摘要选项卡(在iPhone / iPad部署信息下)。
它基本上是一个GUI来设置plist文件
- 如何在一个NSAttributedString中创build一个可点击的链接
- 在swift中将数组转换为JSONstring
- iOS 8删除了“minimal-ui”视口属性,还有其他“软全屏”解决scheme吗?
- 目标C:使用进度条下载文件
- 在terminal上运行React Native App时出错(iOS)
- xcode 6testing版2与导出ipa问题“您的帐户已经有一个有效的iOS分发证书”
- 如何删除UIWebView的所有cookie?
- CLLocationManager startUpdatingLocation不调用locationManager:didUpdateLocations:或locationManager:didFailWithError:
- 给UIView圆angular