2015-08-22 15 views
6

Sto utilizzando Xamarin.Forms per creare un'applicazione multipiattaforma, tutti i miei ContentPages si trovano all'interno dello PCL.Come impostare l'orientamento di ContentPage in Xamarin.Forms

Sto cercando un modo per impostare e bloccare il orientation di un singolo ContentPage-Landscape, preferibilmente senza dover creare un'altra attività in ciascuno dei progetti specifici di piattaforma.

Dal momento che il mio ContentPage.Content è impostata su un ScrollView, ho provato a fissare il ScrollOrientation-Horizontal, tuttavia questo non ha funzionato.

Ho anche provato a utilizzare un RelativeLayout, ma non riesco a vedere una proprietà Orientation su questo.

public class PlanningBoardView : ContentPage //Container Class. 
    { 
     public PlanningBoardView() 
     { 
      scroller = new ScrollView(); 

      Board = new PlanningBoard(); 

      scroller.Orientation = ScrollOrientation.Horizontal; 
      scroller.WidthRequest = Board.BoardWidth; 
      scroller.Content = Board; 

      Content = scroller; 
     } 
    } 

L'ultima cosa che ho provato è stato utilizzando la versione di Xamarin Studio di Intellisense e la Xamarin Forms API Doc's di guardare attraverso i diversi layout disponibili a me, nessuno dei quali aveva una proprietà Orientation.

Temo che l'unico modo per farlo è creare una seconda piattaforma specifica Activity solo per questo ContentPage e impostare l'orientamento su orizzontale.

Sebbene questo metodo funzioni, rende la navigazione tra gli schermi molto più complessa.

Questo è attualmente in fase di test in Android.

risposta

12

Odio dire questo, ma questo può essere fatto solo utilizzando custom renderers o un-specifica piattaforma codice

in Android, è possibile impostare la proprietà RequestedOrientation del MainActivity a ScreenOrientation.Landscape.

In iOS, è possibile escludere GetSupportedInterfaceOrientations nella classe AppDelegate per restituire uno dei valori UIInterfaceOrientationMask quando Xamarin.Forms.Application.Current.MainPage è la ContentPage che intereted dentro.



Android

[assembly: Xamarin.Forms.ExportRenderer(typeof(MyCustomContentPage), typeof(CustomContentPageRenderer))] 

public class CustomContentPageRenderer : Xamarin.Forms.Platform.Android.PageRenderer 
{ 
    private ScreenOrientation _previousOrientation = ScreenOrientation.Unspecified; 

    protected override void OnWindowVisibilityChanged(ViewStates visibility) 
    { 
     base.OnWindowVisibilityChanged(visibility); 

     var activity = (Activity)Context; 

     if (visibility == ViewStates.Gone) 
     { 
      // Revert to previous orientation 
      activity.RequestedOrientation = _previousOrientation == ScreenOrientation.Unspecified ? ScreenOrientation.Portrait : _previousOrientation; 
     } 
     else if (visibility == ViewStates.Visible) 
     { 
      if (_previousOrientation == ScreenOrientation.Unspecified) 
      { 
       _previousOrientation = activity.RequestedOrientation; 
      } 

      activity.RequestedOrientation = ScreenOrientation.Landscape; 
     } 
    } 
} 

iOS

public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 
{ 
    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, UIWindow forWindow) 
    { 
     if (Xamarin.Forms.Application.Current == null || Xamarin.Forms.Application.Current.MainPage == null) 
     { 
      return UIInterfaceOrientationMask.Portrait; 
     } 

     var mainPage = Xamarin.Forms.Application.Current.MainPage; 

     if (mainPage is MyCustomContentPage || 
      (mainPage is NavigationPage && ((NavigationPage)mainPage).CurrentPage is MyCustomContentPage) || 
      (mainPage.Navigation != null && mainPage.Navigation.ModalStack.LastOrDefault() is MyCustomContentPage)) 
     { 
      return UIInterfaceOrientationMask.Landscape; 
     } 

     return UIInterfaceOrientationMask.Portrait; 
    } 
} 
+0

Ogni possibilità di un esempio? (Android lo farà.) – KidCode

+0

Certo. Ho modificato la mia risposta. L'esempio costringerà la modalità orizzontale ma è possibile modificarla in base alle proprie esigenze. – Dealdiane

+0

Ho implementato la versione iOS ma non ruota automaticamente ... è possibile? – GBreen12

0

codice di Dealdiane funziona bene per me con piccola modifica:

protected override void OnWindowVisibilityChanged(ViewStates visibility) { 
    base.OnWindowVisibilityChanged(visibility); 

    IRotationLock page = Element as IRotationLock; 
    if (page == null) 
     return; 

    var activity = (Activity) Context; 

    if (visibility == ViewStates.Gone) { 
     // Revert to previous orientation 
     activity.RequestedOrientation = _previousOrientation; 
    } else if (visibility == ViewStates.Visible) { 
     if (_previousOrientation == ScreenOrientation.Unspecified) { 
      _previousOrientation = activity.RequestedOrientation; 
     } 

     switch (page.AllowRotation()) { 
      case RotationLock.Landscape: 
       activity.RequestedOrientation = ScreenOrientation.SensorLandscape; 
       break; 
      case RotationLock.Portrait: 
       activity.RequestedOrientation = ScreenOrientation.SensorPortrait; 
       break; 
     } 
    } 
} 
1

Questo può essere fatto anche con l'invio del messaggio dal progetto di modulo per ospitare progetto utilizzando la classe MessagingCenter.senza utilizzare il renderer personalizzato o servizio di dipendenza come segue,

public partial class ThirdPage : ContentPage 
    { 
     protected override void OnAppearing() 
     { 
      base.OnAppearing(); 
     MessagingCenter.Send(this, "allowLandScapePortrait"); 
     } 
     //during page close setting back to portrait 
     protected override void OnDisappearing() 
     { 
      base.OnDisappearing(); 
      MessagingCenter.Send(this, "preventLandScape"); 
     } 
    } 

Variazione mainactivity di ricevere il messaggio e impostare RequestedOrientation

[Activity(Label = "Main", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,ScreenOrientation = ScreenOrientation.Portrait)] 
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 
    {   
    //allowing the device to change the screen orientation based on the rotation 
    MessagingCenter.Subscribe<ThirdPage>(this, "allowLandScapePortrait", sender => 
    { 
    RequestedOrientation = ScreenOrientation.Unspecified; 
    }); 
//during page close setting back to portrait 
MessagingCenter.Subscribe<ThirdPage>(this, "preventLandScape", sender => 
    { 
    RequestedOrientation = ScreenOrientation.Portrait; 
    }); 
} 

Verificare la presenza di più nel mio post sul blog: http://www.appliedcodelog.com/2017/05/force-landscape-or-portrait-for-single.html

Problemi correlati