'willRotateToInterfaceOrientation'不能用于我的DetailViewController

时间:2011-10-14 01:11:00

标签: objective-c ios xcode ipad uiinterfaceorientation

我正在iPad上开发这个应用程序。我的MainWindow包含一个Split View Controller,它可以加载RootViewController和DetailViewController 我有这个图像放在DetailViewController的右下角。 我的应用程序允许不同的方向,因此我希望图像出现在不同位置的不同位置。

这是我在DetailViewController中的代码:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
  if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
  {
      myImage.frame = CGRectMake(183.0f, 257.0f, 548.0f, 447.0f); 
  }
  else if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
  {
      myImage.frame = CGRectMake(244.0f, 518.0f, 548.0f, 447.0f);
  }
}

当我启动我的应用程序并且我的iPad处于纵向时,图像将被正确放置在右下角的(X:244,Y:518)。 但是当我启动我的应用程序并且我的iPad处于横向时,图像将不会显示,我怀疑它仍处于纵向定位的位置。只有当我将iPad旋转到纵向然后再回到横向时,图像才会出现在(X:183,Y:257),这是正确的。

我试图将这些代码放在我的DetailViewController的'viewWillAppear'方法中:

- (void)viewWillAppear:(BOOL)animated 
{ 
  [super viewWillAppear:animated];
  if(self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
  {
      myImage.frame = CGRectMake(183.0f, 257.0f, 548.0f, 447.0f); 
  }
  else if(self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
  {
      myImage.frame = CGRectMake(244.0f, 518.0f, 548.0f, 447.0f);
  }
}

但是当我启动我的应用程序时,它仍然存在同样的问题。

我能做什么,当我第一次以横向方式启动我的应用程序时,它将被正确放置在(X:244,Y:518)?

4 个答案:

答案 0 :(得分:2)

您可能希望尝试将调整大小逻辑放在didRotateFromInterfaceOrientation而不是willRotateToInterfaceOrientation中。

我的自定义布局代码只有在轮换完成后才调用它,而不是之前。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
  NSLog(@"didRotateFromInterfaceOrientation");

  float width;
  float height;

  if ((fromInterfaceOrientation == UIInterfaceOrientationLandscapeRight) || 
      (fromInterfaceOrientation == UIInterfaceOrientationLandscapeLeft))
  {
    width = [[UIScreen mainScreen] applicationFrame].size.width;
    height = [[UIScreen mainScreen] applicationFrame].size.height;
    NSLog(@"Changing to portrait: %f x %f", width, height);
  }
  else
  {
    width = [[UIScreen mainScreen] applicationFrame].size.height;
    height = [[UIScreen mainScreen] applicationFrame].size.width;
    NSLog(@"Changing to landscape: %f x %f", width, height);
  }

  NSLog(@"Changed orientation: %f x %f", width, height);

  // Call my custom layout function to setFrame on all my UI controls
  [self doLayout:width height:height];

  [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}

如果您的应用显示状态栏,则可能需要拨打self.view.frame.size.width,而不是从applicationFrame获取尺寸。

答案 1 :(得分:1)

确保你重写

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; // Override to allow rotation. Default returns YES only for UIInterfaceOrientationPortrait

要为每个要支持的UIInterfaceOrentation返回YES,否则将不会调用willRotateToInterfaceOrientation和didRotateToInterfaceOrientation。

答案 2 :(得分:0)

尝试在您的applicationDidFinishLauching:

中尽早调用它
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

答案 3 :(得分:0)

由于detailViewController有时不知道其方向,我通过在appDelegate中设置一个共享变量来解决此问题,该变量会在整个应用中存储设备方向。您可以在splitViewController中按其方向对其进行初始化,以便detailViewController加载时可以从那里读取它。