2012-12-27 16 views
9

Ich möchte eine benutzerdefinierte Größe Modal-Ansicht-Controller mit Animation von unten präsentieren. Ich kann diese Animation mit ModalPresentationStyle bis FormSheet erreichen, aber it forces me to use the default size which is 540x620 und meine Ansicht passt nicht.Wie wird ein Modal View Controller mit benutzerdefinierter Größe in der Mitte angezeigt?

Wie mache ich einen ähnlichen Übergang zu einer beliebig großen Ansicht (Controller) in der Mitte des Bildschirms?

Antwort

4

ich selbst ich eine Klasse und eine Erweiterungsmethode so nicht einen Weg, es zu tun aus dem modalen Controller finden erstellt:

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(); 
    } 
} 

Diese grob ist, wie ich es verwenden:

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

Es ist praktisch, dass ich die Größe nicht explizit angeben muss, da sie die Grenzen von Root View vom Interface Builder verwendet. Ich bin mir nicht sicher, wie das auf Autorotate reagiert. Ich verwende auch zwei Erweiterungsmethoden hier:

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 
     ); 
} 

Und das ist es.

+0

Quiet brilliant ... –

+0

Das sieht nicht wie irgendein iOS-Code aus, den ich gesehen habe. Können Sie dies bitte ausführlicher/tatsächliches Beispiel zeigen? – iOSProgrammingIsFun

+1

@iOSProgrammingIsFun Diese Frage hat einen MonoTouch-Tag (jetzt als [Xamarin.iOS] (http://xamarin.com/ios) gebrandmarkt). Es ist eine Plattform, um in C# gegen Apples APIs zu schreiben. –

3

Eine einfachere Möglichkeit ist der folgende

Präsens des Modal-View-Controller als eine Form Blatt und in den Modal-View-Controller hinzufügen:

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

Es ist wichtig, die gewünschte Breite und Höhe, wenn Sie einstellen will nicht, dass ios die Standardformularblattgröße zuweist

Update: In iOS 8 gibt es zumindest einige Situationen, in denen die obige Lösung eine Endlosschleife auslöst. Es scheint, dass in einigen Situationen (wie wenn eine eingebettete Webansicht in der modalen Ansicht und Tippen in einigen HTML-Eingabe Text) Ändern der Superview Grenzen löst Layout auf der modalen Ansicht in einer Endlosschleife und Einfrieren der App führt. Aber in ios 8 können Sie einfach die PrefferedSize-Eigenschaft festlegen, um den gleichen Effekt zu erzielen.