下からアニメーションを使ったカスタムサイズのモーダルビューコントローラーを紹介したいと思います。このアニメーションはModalPresentationStyle
toFormSheet
で実現できますが、デフォルトのサイズである540x620を使用する必要があり、ビューが適合しません。
画面の中央に配置された任意のサイズのビュー(コントローラー)に同様の遷移を実行するにはどうすればよいですか?
下からアニメーションを使ったカスタムサイズのモーダルビューコントローラーを紹介したいと思います。このアニメーションはModalPresentationStyle
toFormSheet
で実現できますが、デフォルトのサイズである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)
);
インターフェイスビルダーからのルートビューの境界を使用するため、サイズを明示的に指定する必要がないので便利です。これが自動回転にどのように反応するかはわかりません。調整が必要な場合があります。ここでも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
);
}
そして、これはそれです。
より簡単な方法は次のとおりです
モーダルビューコントローラーをフォームシートとして提示し、モーダルビューコントローラーに次を追加します。
public override void ViewWillLayoutSubviews ()
{
base.ViewWillLayoutSubviews ();
this.View.Superview.Bounds = new RectangleF (0, 0, 900, 700);
}
iOSにデフォルトのフォームシートサイズを割り当てたくない場合は、目的の幅と高さを設定することが重要です。
更新:iOS 8では、少なくとも上記のソリューションが無限ループをトリガーする状況がいくつかあります。状況によっては(モーダルビューに埋め込みWebビューがあり、HTML入力テキストをタップする場合など)、スーパービューの境界を変更すると、モーダルビューのレイアウトがトリガーされ、アプリが無限ループになってフリーズするようです。ただし、iOS 8では、PrefferedSizeプロパティを設定するだけで、同じ効果が得られます。