9

下からアニメーションを使ったカスタムサイズのモーダルビューコントローラーを紹介したいと思います。このアニメーションはModalPresentationStyletoFormSheetで実現できますが、デフォルトのサイズである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)
);

インターフェイスビルダーからのルートビューの境界を使用するため、サイズを明示的に指定する必要がないので便利です。これが自動回転にどのように反応するかはわかりません。調整が必要な場合があります。ここでも2つの拡張メソッドを使用しています。

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では、少なくとも上記のソリューションが無限ループをトリガーする状況がいくつかあります。状況によっては(モーダルビューに埋め込みWebビューがあり、HTML入力テキストをタップする場合など)、スーパービューの境界を変更すると、モーダルビューのレイアウトがトリガーされ、アプリが無限ループになってフリーズするようです。ただし、iOS 8では、PrefferedSizeプロパティを設定するだけで、同じ効果が得られます。

于 2014-01-29T09:56:34.030 に答える