2012-12-27 13 views

Odpowiedz

4

nie znaleźć sposób, aby to zrobić od modalnej kontrolera Sam więc stworzyłem klasę i metodę rozszerzenia:

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

To jest mniej więcej jak go używać:

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

Jest wygodne, że nie muszę wyraźnie określać rozmiaru, ponieważ korzysta on z granic widoku użytkownika root z kreatora interfejsu. Nie jestem pewien, jak zareaguje na autorotację, może potrzebować jakiegoś tuningu. Używam również dwóch metod rozszerzenia tutaj:

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

I to jest to.

+0

Ciche, genialne ... –

+0

To nie przypomina żadnego kodu iOS, który widziałem. Czy możesz pokazać to bardziej szczegółowo/na przykładzie? – iOSProgrammingIsFun

+1

@iOSProgrammingIsFun To pytanie zawiera znacznik MonoTouch (obecnie oznaczony jako [Xamarin.iOS] (http://xamarin.com/ios)). Jest to platforma do pisania w C# przeciwko API firmy Apple. –

3

Łatwiejszy sposób jest następujący

Present modalna kontroler widoku jako arkusza formie iw modalnego widok kontrolera dodają:

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

ważne jest, aby ustawić żądaną szerokość i jeśli wysokość nie chcę, aby ios przydzielił domyślny rozmiar arkusza formularza

Aktualizacja: W ios 8 przynajmniej występuje sytuacja, gdy powyższe rozwiązanie uruchamia pętlę infinte. Wygląda na to, że w niektórych sytuacjach (np. Gdy masz wbudowaną przeglądarkę internetową w widoku modalnym i wciskanie jakiegoś tekstu wejściowego html) zmiana granic podglądu wyzwala układ w widoku modalnym, powodując nieskończoną pętlę i zatrzymanie aplikacji. Ale w ios 8 możesz po prostu ustawić właściwość PrefferedSize, aby osiągnąć ten sam efekt.

Powiązane problemy