我想展示一个自定义大小的模态视图控制器,底部有动画。ModalPresentationStyle
我可以用to来实现这个动画FormSheet
,但它迫使我使用默认大小 540x620并且我的视图不适合。
如何对放置在屏幕中心的任意大小的视图(控制器)执行类似的转换?
我想展示一个自定义大小的模态视图控制器,底部有动画。ModalPresentationStyle
我可以用to来实现这个动画FormSheet
,但它迫使我使用默认大小 540x620并且我的视图不适合。
如何对放置在屏幕中心的任意大小的视图(控制器)执行类似的转换?
我没有从模态控制器本身找到一种方法,所以我创建了一个类和一个扩展方法:
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
);
}
就是这样。
更简单的方法如下
将模态视图控制器呈现为表单,并在模态视图控制器中添加:
public override void ViewWillLayoutSubviews ()
{
base.ViewWillLayoutSubviews ();
this.View.Superview.Bounds = new RectangleF (0, 0, 900, 700);
}
如果您不希望 ios 分配默认表单大小,则设置所需的宽度和高度很重要
更新:在 ios 8 中,至少在某些情况下,上述解决方案会触发无限循环。似乎在某些情况下(例如当在模态视图中嵌入 webview 并在某些 html 输入文本中点击时)更改超级视图边界会触发模态视图上的布局,从而导致无限循环和应用程序冻结。但在 ios 8 中,您可以简单地设置 PrefferedSize 属性来达到相同的效果。