2016-11-11 4 views
1

Я хочу расширить приложение с помощью удобного для планшета интерфейса. Поскольку пользовательский интерфейс телефона работает намного лучше в портретной ориентации, существующее приложение заблокировано в портрет; версия для планшета не имеет такого ограничения.Ориентация устройства на идиом в форматах Xamarin на iOS

Это хорошо работает на Android; основное действие принимает решение о запуске, разрешать ли все ориентации устройств (на планшетах) или блокировать приложение в портрете (на телефонах). Проблема заключается в реализации логики ориентации на iOS.

Я знаю, что Xamarin.Forms имеет bug, который предотвращает управление ориентацией устройства с кода на устройствах iOS. Мы придумали возможное решение: все цели сборки дублируются (с одним экземпляром для телефонов, а другой для планшетов), а сборки для телефонов и планшетов загружаются в App Store отдельно.

Действительно ли это самый элегантный способ достижения ориентации устройства на идиомы или есть способ обойти эту ошибку Xamarin.Forms без особых хлопот?

ответ

0

Вот магия:

AppDelegate.cs

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, UIWindow forWindow) 
    { 
     //Tablet orientation adjustment 
     if (Device.Idiom == TargetIdiom.Tablet) 
      return UIInterfaceOrientationMask.Landscape; 
     else 
      return UIInterfaceOrientationMask.Portrait; 
    } 

Затем создайте CustomRenderer для ContentPage и переопределить OnElementChangedMethod:

protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 
     if (e.NewElement != null) 
     { 
      Page _page = Element as Page; 
      _page.Appearing += (s, ea) => 
      { 
       UIInterfaceOrientation orientain = Device.Idiom == TargetIdiom.Phone ? UIInterfaceOrientation.Portrait : UIInterfaceOrientation.LandscapeLeft; 

       NSNumber number = NSNumber.FromInt32((int)orientain); 
       UIDevice.CurrentDevice.SetValueForKey(number, new NSString("orientation")); 
       UIViewController.AttemptRotationToDeviceOrientation(); 
      }; 
     } 

    }