¿Cómo presentar un controller de vista modal con tamaño personalizado en el centro?

Quiero presentar un controller de vista modal de tamaño personalizado con animation desde la parte inferior. Puedo lograr esta animation con ModalPresentationStyle a FormSheet , pero me obliga a usar el tamaño pnetworkingeterminado que es 540×620 y mi vista no se ajusta.

¿Cómo hago para realizar una transición similar a una vista (controller) de tamaño arbitrario colocada en el centro de la pantalla?

No encontré una manera de hacerlo desde el controller modal, así que creé una class y un método de extensión:

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

Esto es más o less como lo uso:

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

Es conveniente que no necesite especificar explícitamente el tamaño porque utiliza los límites de la Vista de raíz del creador de la interfaz. No estoy seguro de cómo reactjs esto para autorotate, puede necesitar un poco de ajuste. También estoy usando dos methods de extensión aquí:

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

Y esto es todo.

Una forma más fácil es la siguiente

Presente el controller de vista modal como hoja de formulario y agregue en el controller de vista modal:

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

Es importante establecer el ancho y la altura deseados si no desea que ios asigne el tamaño de hoja de formulario pnetworkingeterminado

Actualización: en ios 8 al less hay alguna situación cuando la solución anterior activa un bucle infinte. Parece que en algunas situaciones (como cuando se tiene una vista web incrustada en la vista modal y se toca algún text de input html) el cambio de los límites de vista de la vista activa el layout en la vista modal, lo que resulta en un bucle infinito y la congelación de la aplicación. Pero en ios 8 puede simplemente establecer la propiedad PreffenetworkingSize para lograr el mismo efecto.