我正在尝试为我的应用的不同子模式实施强制纵向/横向方向。为此,我有一个UINavigationController作为根控制器,每个子模式都有自己的视图控制器,它们是其中之一
@interface iosPortraitViewController : UIViewController
或
@interface iosLandscapeViewController : UIViewController
与
-(BOOL)shouldAutorotate;
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
-(NSUInteger) supportedInterfaceOrientations;
根据每个方向的方向类型重载并正确设置。例如iosLandscapeViewController :: supportedInterfaceOrientations返回UIInterfaceOrientationMaskLandscape。
当应用程序中的子模式发生变化时,相应的视图控制器将使用present / dismissViewController显示在根视图控制器上,这会强制方向重新评估并调用重载的视图控制器类中的函数并相应地定位自身
我的问题是,当我们切换到横向时,子模式视图的框架偏离屏幕的左上角应该是它的位置(它是显示背景图片的全屏视图)。
出于调试目的,如果我将该子模式的视图控制器更改为iosPortraitViewController,则视图信息为:
size = 480.000000 320.000000
bounds = 0.000000 0.000000 480.000000 320.000000
frame = 0.000000 0.000000 480.000000 320.000000
centre = 240.000000 160.000000
user interaction enabled = 1
hidden = 0
transform = 1.000000 0.000000 0.000000 1.000000 : 0.000000 0.000000
当处于横向模式时,视图信息为:
size = 480.000000 320.000000
bounds = 0.000000 0.000000 480.000000 320.000000
frame = 80.000000 -80.000000 320.000000 480.000000
centre = 240.000000 160.000000
user interaction enabled = 1
hidden = 0
transform = 0.000000 -1.000000 1.000000 0.000000 : 0.000000 0.000000
框架的80,-80原点是我遇到的问题 - 它应该是0,0。 (如果有人可以指出它是如何得到80,-80也会被欣赏 - 我可以看到X而不是Y)。
还要注意框架中的w和h是如何交换的,变换是旋转变换 - 从读取开始,我猜测UIWindow(总是处于纵向模式)已将此应用于视图变换根视图控制器?
我该怎么做才能解决这个问题?我需要视图控制器视图的框架在正确的位置(即原点为0,0)。我尝试过对它进行硬编码,但它似乎不起作用,反正它也不是一个很好的解决方案 - 我非常理解发生了什么,以及如何正确地解决它。
谢谢!
: - )
答案 0 :(得分:1)
要支持备用横向界面,您必须执行以下操作:
从苹果指南到Creating an Alternate Landscape Interface
同样来自指南:
@implementation PortraitViewController
- (void)awakeFromNib
{
isShowingLandscapeView = NO;
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
!isShowingLandscapeView)
{
[self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
isShowingLandscapeView = YES;
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
isShowingLandscapeView)
{
[self dismissViewControllerAnimated:YES completion:nil];
isShowingLandscapeView = NO;
}
}