'willRotateToInterfaceOrientation' не работает для моего DetailViewController - PullRequest
1 голос
/ 14 октября 2011

Я разрабатываю это приложение на 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), что является правильным.

То, что я пытался сделать, это разместить этикоды в методе viewWillAppear моего DetailViewController:

- (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 ]

2 голосов
/ 26 декабря 2011

Возможно, вы захотите ввести логику изменения размера в 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 голос
/ 18 октября 2011

Убедитесь, что вы переопределяете

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

Для возврата YES для каждой UIInterfaceOrentation, которую вы хотите поддерживать, в противном случае willRotateToInterfaceOrientation и didRotateToInterfaceOrientation не будут вызваны.

0 голосов
/ 26 декабря 2011

Поскольку detailViewController иногда не знал бы его ориентацию, я решил эту проблему, имея в appDelegate переменную общего доступа, которая сохраняла бы ориентацию устройства в приложении. Вы можете инициализировать его в splitViewController с его ориентацией, чтобы при загрузке detailViewController он мог прочитать его оттуда.

0 голосов
/ 20 октября 2011

Попробуйте позвонить пораньше в вашем приложении.

...