2012-12-27 12 views
9

Desidero presentare un controller di visualizzazione modale personalizzato con animazione dal basso. Posso realizzare questa animazione con ModalPresentationStyle a FormSheet, ma it forces me to use the default size which is 540x620 e la mia vista non si adatta.Come presentare un controller di visualizzazione modale con dimensioni personalizzate al centro?

Come si esegue una transizione simile a una vista di dimensioni arbitrarie (controller) posizionata al centro dello schermo?

risposta

4

non ho trovato un modo per farlo dal controller modale in sé così ho creato una classe e un metodo di estensione:

public class ModalViewController : UIViewController 
{ 
    public SizeF OriginalViewSize { get; private set; } 

    void Initialize() 
    { 
     ModalPresentationStyle = UIModalPresentationStyle.FormSheet; 
    } 

    public override void ViewDidLoad() 
    { 
     OriginalViewSize = View.Bounds.Size; 
     base.ViewDidLoad(); 
    } 

    public ModalViewController (IntPtr handle) : base (handle) 
    { 
     Initialize(); 
    } 

    public ModalViewController (string nibName, NSBundle bundle) : base (nibName, bundle) 
    { 
     Initialize(); 
    } 

    public ModalViewController() : base() 
    { 
     Initialize(); 
    } 
} 

public static class ModalViewControllerExtensions 
{ 
    public static void PresentModalViewController (this UIViewController parent, ModalViewController target) 
    { 
     parent.PresentViewController (target, true, null); 

     target.View.Superview.AutoresizingMask = UIViewAutoresizing.FlexibleMargins; 
     target.View.Superview.Frame = new RectangleF (PointF.Empty, target.OriginalViewSize); 
     target.View.Superview.Center = UIScreen.MainScreen.Bounds.Center().Rotate(); 
    } 
} 

Questo è più o meno come lo uso:

this.PresentModalViewController (
    new PublishModalViewController (Item, HandlePublishAction) 
); 

È utile che non sia necessario specificare la dimensione in modo esplicito perché utilizza i limiti della vista radice dal generatore di interfacce. Non sono sicuro di come reagisce ad autorotazione, potrebbe essere necessario un po 'di messa a punto. Sto anche utilizzando due metodi di estensione qui:

public static PointF Rotate (this PointF pt) 
{ 
    return new PointF (pt.Y, pt.X); 
} 

public static PointF Center (this RectangleF rect) 
{ 
    return new PointF (
     (rect.Right - rect.Left)/2.0f, 
     (rect.Bottom - rect.Top)/2.0f 
     ); 
} 

E questo è tutto.

+0

Silenzioso brillante ... –

+0

Non sembra un codice iOS che abbia mai visto. Potete per favore mostrarlo più in dettaglio/esempio reale? – iOSProgrammingIsFun

+1

@iOSProgrammingIsFun Questa domanda ha il tag MonoTouch (ora marchiato come [Xamarin.iOS] (http://xamarin.com/ios)). È una piattaforma per scrivere in C# contro le API di Apple. –

3

Un modo più semplice è la seguente

Presente il controller di vista modale come un foglio di forma e nella visualizzazione del controller modale aggiuntivo:

public override void ViewWillLayoutSubviews() 
{ 
    base.ViewWillLayoutSubviews(); 
    this.View.Superview.Bounds = new RectangleF (0, 0, 900, 700); 
} 

E 'importante per impostare la larghezza e l'altezza desiderate, se si non voglio che ios assegni la dimensione del foglio del modulo predefinito

Aggiornamento: In ios 8 almeno ci sono alcune situazioni in cui la soluzione sopra attiva un loop infinito. Sembra che in alcune situazioni (come quando si dispone di una webview incorporata nella vista modale e si tocchi un testo di input html) la modifica dei limiti di superview attiva il layout sulla vista modale risultante in un ciclo infinito e blocco dell'applicazione. Ma in iOS 8 puoi semplicemente impostare la proprietà PrefferedSize per ottenere lo stesso effetto.