如何在中心呈现自定义尺寸的模态视图控制器?

Dan*_*mov 9 uikit xamarin.ios ios uimodalpresentationstyle ios6

我想从底部呈现一个带有动画的自定义大小的模态视图控制器.我可以使用ModalPresentationStyleto 来实现这个动画FormSheet,但它强制我使用默认大小540x620并且我的视图不适合.

如何对位于屏幕中心的任意大小的视图(控制器)执行类似的转换?

Dan*_*mov 4

我没有找到从模态控制器本身做到这一点的方法,所以我创建了一个类和一个扩展方法:

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 ();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的使用方式大致是这样的:

this.PresentModalViewController (
    new PublishModalViewController (Item, HandlePublishAction)
);
Run Code Online (Sandbox Code Playgroud)

我不需要显式指定大小,这很方便,因为它使用界面生成器中的根视图的边界。我不确定这对自动旋转有何反应,可能需要一些调整。我在这里还使用了两种扩展方法:

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
        );
}
Run Code Online (Sandbox Code Playgroud)

就是这样。