iPhone(/ iPad)上的高度和宽度

时间:2010-10-19 19:33:34

标签: iphone objective-c ipad interface uiwindow

这只是一个测试应用程序,只有一个AppDelegate类可以创建我创建的基于Window的应用程序,将支持的方向设置为仅限于info.plist中的格局,然后添加以下代码: / p>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];

// Override point for customization after application launch.
UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"hu" message:@"hui" delegate:nil cancelButtonTitle:@"hi" otherButtonTitles:nil];
[test show];
[window makeKeyAndVisible];
    NSLog(@"win %f - %f", window.bounds.size.width, window.bounds.size.height);
return YES;
}

如果没有设置状态栏方向的第一行,即使界面的其余部分处于横向左侧,警报视图也会以纵向显示。

无论如何,Log仍然给出了这个:

win 768.000000 - 1024.000000

这是错误的回合方式(因此当我在我的真实应用中添加子视图时,帧不正确)

Apple似乎真的搞砸了界面轮换,因为我什么也没有问题,我不记得在iPhone上发生过这种情况,所以请有人告诉我如何解决这个问题。

我会给那些能够至少解释为什么会发生这种情况并希望提供解决方案的人提供500点声誉(这几乎不是我的声誉)。

7 个答案:

答案 0 :(得分:17)

我认为"Launching in Landscape Mode"iOS Application Programming Guide主要解释了您的测试应用程序发生了什么:

  

iOS中的应用程序通常会在   纵向模式以匹配方向   主屏幕。如果你有   以纵向运行的应用程序   和横向模式,您的应用程序   应始终以纵向模式启动   最初然后让它看   控制器将界面旋转为   需要基于设备的   取向。如果您的应用程序运行   但是,在景观模式中,你   必须执行以下步骤   让它在风景中发射   最初的方向:

     
      
  • 在应用程序的Info.plist文件中,   添加UIInterfaceOrientation键和   将其值设置为横向模式。   对于景观方向,你可以   将此键的值设置为   UIInterfaceOrientationLandscapeLeft或   UIInterfaceOrientationLandscapeRight。

  •   
  • 以横向模式布置视图   并确保他们的自动化   选项设置正确。

  •   
  • 覆盖视图控制器   shouldAutorotateToInterfaceOrientation:   方法并仅返回YES   理想的景观定位和NO   用于纵向方向。

  •   
     

重要提示:前面的步骤假定   您的应用使用视图控制器   管理其视图层次结构。视图   控制器提供了重要的   处理基础设施的数量   方向变化以及其他方面   复杂的视图相关事件。如果你的   应用程序未使用视图   控制器 - 可能是这种情况   游戏和其他基于OpenGL ES的   应用程序 - 您负责   旋转绘图表面(或   调整你的绘图命令)   需要提供您的内容   景观模式。

就测试应用而言,关键部分是最后一部分。您没有视图控制器,因此您完全有责任按照您想要的方向设置UI。这就是您必须手动设置状态栏方向的原因。

我读了第一段说iOS应用总是以纵向模式启动,然后根视图控制器旋转其视图以立即匹配设备方向,一旦添加到窗口就没有动画。这意味着UIWindow本身不会旋转,所以它的尺寸将始终是纵向方向(如tadej5553所说)。此外,所有UIWindow子视图的帧也将是纵向方向(因为帧始终在父视图的坐标中定义)。因此,无论您如何旋转设备,根视图控制器的框架始终都是纵向方向。但是,由于视图的bounds属性是根据自己的坐标定义的,因此该高度和宽度应该反映视图的当前方向。

目前尚不清楚您要使用真实应用程序尝试完成什么,但建议的做法是为纵向布局您的视图,然后设置其自动调整属性以处理自动旋转(是否在应用启动后立即发生或以后)。

答案 1 :(得分:10)

UIWindow对旋转一无所知。旋转方法封装在UIViewController中。 (自动轮换等)

UIAlertView使用UIApplication的 statusBarOrientation 属性来选择警报的方向。

// Rotate to a specific orientation.  This only rotates the status bar and updates the statusBarOrientation property.
// This does not change automatically if the device changes orientation.
@property(nonatomic) UIInterfaceOrientation statusBarOrientation;

从SDK标题中可以看出,statusBarOrientation不会自动更改。因此,您或UIViewController(自动旋转)应该更改此属性。

如果您启动纵向(与UIWindow的默认方向一致),并使用 shouldAutorotateToInterfaceOrientation 并让UIViewController处理旋转,它会在每次设备方向更改时更改UIApplication的 statusBarOrientation

但如果您在横向模式下启动,则应手动设置 statusBarOrientation 一次。

希望这会有所帮助。

答案 2 :(得分:6)

使用视图的边界

答案 3 :(得分:4)

窗口将始终显示纵向方向的大小。总是

但是对它的看法会给出正确的测量结果(关于方向),所以一定要使用它们。

答案 4 :(得分:3)

请尝试在info.plist文件中将UISupportedInterfaceOrientations设置为UIInterfaceOrientationLandscapeLeft,而不是手动处理状态栏。然后,应用程序应该全部设置为启动后运行。

手动设置状态栏方向是一种“低级别”。您的视图控制器还需要在UIInterfaceOrientationLandscapeLeft实例方法中返回shouldAutorotateToInterfaceOrientation

答案 5 :(得分:3)

以下是我为此付出的努力:

  • 在Info.plist中,请确保具有以下参数:
    • 初始界面方向=横向(右主页按钮)
    • 支持的界面方向
      • 项目0 =风景(右主页按钮)
      • 第1项=横向(左主页按钮)
  • 添加基于xib的视图控制器,其中包含自动调整大小的视图(消除调整大小问题等)
    • 注意我在这里使用了带有视图控制器的导航控制器,因为它是我方便的,但我认为这也适用于单个VC。

向您的应用代表添加一些代码:

_rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
_navigationController = [[UINavigationController alloc] initWithRootViewController:self.launcherViewController];
[window addSubview:self.navigationController.view]; //I think this is the key.
[window makeKeyAndVisible];

我认为关键是观点,我尝试了没有它,在iPhone上它工作得很好,在iPad上尽管警报出现在肖像模式中,如你所说。当我添加视图时,根据需要添加以横向模式显示的警报。

答案 6 :(得分:0)

除了将我的应用程序硬编码为仅横向模式之外,我什么都没有。很多时候没有视觉问题但是底部20像素的按钮无法选择。我在我的主UIWindow上做了一个clipToBounds并在其图层上添加了一个边框,我可以看到UIWindow位于状态栏下面。我尝试将我的UIWindow的x偏移更改为20(UIWindow仍在Portrait中,其内容为Landscape)但这意味着我的UIControllers向下移动了20个像素(不确定原因)。虽然这是一个与你不同的问题,但我也发现了同样的问题,因为打印时的边界和边框看起来是正确的。

无论如何,我将plist从UIInterfaceOrientationLandscapeLeft更改为UIInterfaceOrientationLandscapeRight,并将我的UIViewController方法更改为:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
  return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

我所有的问题都消失了。很多时候我发誓Apples旋转代码中有一些错误,结果证明这是我实现某些东西的方式,但我认为这个是一个Apple的定义。

如果这可以解决您的问题,请告诉我