【问题标题】:How to present a modal view controller with custom size in center?如何在中心呈现具有自定义大小的模态视图控制器?
【发布时间】:2012-12-12 11:12:23
【问题描述】:

我想展示一个自定义大小的模态视图控制器,底部有动画。我可以用ModalPresentationStyleFormSheet 实现这个动画,但是it forces me to use the default size which is 540x620 和我的视图不适合。

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

【问题讨论】:

    标签: ios ios6 xamarin.ios uikit uimodalpresentationstyle


    【解决方案1】:

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

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

    就是这样。

    【讨论】:

    • 这看起来不像我见过的任何 iOS 代码。你能更详细地展示一下这个/实际的例子吗?
    • @iOSProgrammingIsFun 这个问题有 MonoTouch 标签(现在标记为Xamarin.iOS)。这是一个针对 Apple API 用 C# 编写的平台。
    【解决方案2】:

    更简单的方法如下

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

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

    如果您不希望 ios 分配默认表单大小,请务必设置所需的宽度和高度

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多