UIWebview - диалоговое окно «Открыть / Копировать» открывается в неправильной ориентации - PullRequest
1 голос
/ 29 декабря 2011

Я делаю некоторые модные вещи с вращением и возвращаю NO из shouldAutorotateToInterfaceOrientation:.Затем я вручную поворачиваю UIWebView согласно [UIDevice currentDevice].orientationCached.Когда я удерживаю палец на ссылке, меню, которое появляется, всегда в ориентации PortraitLeft, независимо от того, как устройство на самом деле ориентировано, и независимо от того, как ориентировано UIWebView.

Это выглядит для меняподобно тому, как меню ссылок берет свою ориентацию из основного вида контроллера представления, а не из UIWebView, с которым он связан, и что единственный способ заставить его вести себя правильно, это вернуть YES из -shouldAutorotateToInterfaceOrientation:.

Это предположение верно?Есть ли способ контролировать ориентацию всплывающего меню, связанного со ссылками, или заставить его брать ориентацию из UIWebView, который его порождает?

Ответы [ 2 ]

1 голос
/ 04 января 2012

Я бы на самом деле не установил ориентацию вручную, как вы делаете это в UIWebView. Вместо этого форсируйте ориентацию родительского контроллера представления через код.

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

Достаточно объяснения: вот мой соответствующий код, который я использую для этого:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
  //Rotate the view if rotation is actually enabled
  if ([self.prefs boolForKey:@"SHOULD_ROTATE"]) {
      return (UIInterfaceOrientationIsLandscape(toInterfaceOrientation) || UIInterfaceOrientationPortrait == toInterfaceOrientation);
  }

  //Rotate it to portrait only if rotation is disabled
  else if (![self.prefs boolForKey:@"SHOULD_ROTATE"]) {
      return (UIInterfaceOrientationPortrait == toInterfaceOrientation);
  }

  //Otherwise, rotate only to portrait (for all views minus the map views)
  else {
      return (UIInterfaceOrientationPortrait == toInterfaceOrientation);
  }
}

Я на самом деле реализую это в UITabBarController, чтобы оно применялось ко всем представлениям и контроллерам представлений в приложении, но это так же легко реализовать только для родительского контроллера представления UIWebView. Суть в том, что вы возвращаете «да» или «нет» в зависимости от того, соответствует ли ориентация вида желаемой. Для веб-представления вы хотели бы указать только допустимые ориентации поворота, возвращая это:

return (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)

Конечно, я не обсуждал принуждение вида установить вид в альбомной ориентации, только то, что он делает, когда пользователь поворачивает его. Таким образом, лучший способ действий - это просто сделать это вручную после инициализации представления:

[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]

Для начала вам придется установить либо Left, либо Right, но пользователь может поворачиваться между правым и левым, как он пожелает, если вы также реализуете мой предыдущий код.

Это много объяснений, но я думаю, что комбинация этих двух методов для родительского контроллера представления должна позволить вам представить представление именно так, как вы хотите. Дайте мне знать, если у вас есть какие-либо вопросы!

0 голосов
/ 06 января 2012

Под «всплывающим меню» вы подразумеваете Action Sheet с кнопками OpenCopy?

Если это так, то да, Action Sheet всегда представляется в соответствии с контроллером вида сверхуinterfaceOrientation.Поскольку вы поворачиваете представление самостоятельно, а контроллер не обновляет его interfaceOrientation, Action Sheet все еще думает, что это портрет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...