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

时间:2012-12-27 01:23:07

标签: ios ios6 xamarin.ios uikit uimodalpresentationstyle

我想从底部呈现带有动画的自定义大小的模态视图控制器。我可以使用ModalPresentationStyleFormSheet来制作此动画,但it forces me to use the default size which is 540x620并且我的视图不合适。

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

2 个答案:

答案 0 :(得分: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 ();
    }
}

这大致是我如何使用它:

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

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

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

就是这样。

答案 1 :(得分:3)

更简单的方法是以下

将模态视图控制器显示为表单,并在模态视图控制器中添加:

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

如果您不希望ios指定默认的表格尺寸,请务必设置所需的宽度和高度

更新:在ios 8中至少有一些情况,当上面的解决方案触发了一个infinte循环。似乎在某些情况下(比如在模态视图中嵌入webview并点击某些html输入文本时)更改超视图边界会触发模态视图上的布局,从而导致应用无限循环和冻结。但是在ios 8中,你只需设置PrefferedSize属性即可达到同样的效果。