从风景iPad启动时,UIViewController在AirPlay屏幕上横向显示

fra*_*cis 4 objective-c ipad ios airplay

我正在尝试UIViewController使用AirPlay在外部显示器上以16:9显示全屏.

此处的目标是使用自定义视图控制器替换AirPlay镜像,该控制器将跨越外部屏幕的整个大小.

当iPad处于纵向模式时,屏幕连接时,一切似乎都很好.当它以横向连接时,在UIViewController外部显示器上侧向显示并且仅填充屏幕的一半.

为此,我将我添加UIViewController到附加的AirPlay中UIScreen.

-(void) screenConnected:(NSNotification * ) notification {

    UIScreen * screen = [notification object]; //this should be the airplay display
    UIWindow * window = [[UIWindow alloc] initWithFrame:screen.bounds];
    [currentWindow setScreen:screen];
    UIViewController * controller = [_delegate createControllerForAirplayDisplay:window];
    [window setHidden:NO];
    [window setRootViewController:controller];

}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,我看到iPad和AirPlay电视全屏显示.

我在哪里看到的问题是当iPad处于横向模式时连接AirPlay显示器.当发生这种情况时,AirPlay显示屏会呈现UIViewController侧面和看起来像肖像模式.

屏幕连接为纵向:

以纵向推出,显示确定

屏幕连接在横向,内容是侧面的,只在一半的显示器上呈现:

在景观中推出,侧面展示

我试图旋转UIWindowUIViewController使用CGAffineTransformMakeRotation,这确实修复了方向,但视图没有在AirPlay显示内部居中.

编辑

提起与此相关的Apple问题,rdar:// 20817189.如果/当我收到回复时,我会更新此信息.

Mar*_*oli 9

我在文档中找到了这个:https: //developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/UsingExternalDisplay/UsingExternalDisplay.html

重要提示:请确保您的应用正确设置状态栏方向.由于外部显示器无法读取主机设备的加速度计以响应方向的变化,因此它依赖于应用程序中设置的状态栏方向.

外部UIWindow采用当前设备的方向,在这种情况下是横向.因此,当您设置rootViewController的框架时,例如(0,0,1270,840),原点位于电视的右上角.

你必须强制UIWindow纵向.我用以下代码解决了这个问题AppDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)_window {
if ([UIScreen mainScreen] == _window.screen || !_window) {
    return UIInterfaceOrientationMaskAll;
}else {
    return UIInterfaceOrientationPortrait;
}
}
Run Code Online (Sandbox Code Playgroud)