9

我想展示一个自定义大小的模态视图控制器,底部有动画。ModalPresentationStyle我可以用to来实现这个动画FormSheet,但它迫使我使用默认大小 540x620并且我的视图不适合。

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

4

2 回答 2

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

就是这样。

于 2012-12-27T01:23:07.257 回答
3

更简单的方法如下

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

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

如果您不希望 ios 分配默认表单大小,则设置所需的宽度和高度很重要

更新:在 ios 8 中,至少在某些情况下,上述解决方案会触发无限循环。似乎在某些情况下(例如当在模态视图中嵌入 webview 并在某些 html 输入文本中点击时)更改超级视图边界会触发模态视图上的布局,从而导致无限循环和应用程序冻结。但在 ios 8 中,您可以简单地设置 PrefferedSize 属性来达到相同的效果。

于 2014-01-29T09:56:34.030 回答