Developers Rock 'n' Roll High School

C#、.NET MAUI、Xamarin、などの技術の備忘録 Azureとかも書く予定

Xamarin.iOSのUIを作るうえであると便利な拡張メソッド

iOSのUIなので、本家Swiftの技術ブログなんかにはいくらでも情報があります。 が、C#の情報は比較的少ないです。
まあ、SwiftをC#に置き換えればいいだけなのですが、 本家iOSの開発やったことなくて、C#とXamarin.iOSを同時にやり始める人(私みたいな)なんかにはこの手のC#で書いた小技情報が貴重です。

※思いついたら追加していきます。

UIColorをUIImageに変換する

public static UIImage ToImage(this UIColor color)
{
    var rect = new CGRect(0, 0, 1, 1);
    UIGraphics.BeginImageContextWithOptions(rect.Size, false, 0f);

    var context = UIGraphics.GetCurrentContext();
    context.SetFillColor(color.CGColor);
    context.FillRect(rect);

    var image = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
    return image;
}

これを書いておくと何がうれしいかというと、UIButtonなんかの色を設定する時に便利になります。 UIButtonは、通常時や押された時の見た目をSetImageメソッドで指定できますが、メソッド名が示す通りUIImageしか登録できません。 「ちょっと色変えたいだけなのにUIImageが必要なの!!?」となります。 そういうときはこのメソッドを書いておけば、

button.SetImage(UIColor.Blue.ToImage(), UIControllState.Highlighted);

という感じに使えます。 UIGraphicsは、ちょっと見た目をこだわろうとすると使う機会が多いですね。

UIViewをUIImageに変換する。

public static UIImage ToImage(this UIView view)
{
    UIGraphics.BeginImageContextWithOptions(view.Bounds.Size, false, 0f);
    view.Layer.RenderInContext(UIGraphics.GetCurrentContext());
    var image = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();

    return image;
}

これはボタンとかアイコンとかをUIViewのDrawで作って部品化したいときに使います。 iOSのコントロールをそのまま使えれば一番楽なのですが、そうはいかないことが多々あります。 そういったものはUIViewのDrawで頑張って作ったものを、そのままでは使い勝手が悪いのでUIImageに変換します。

UIImageをリサイズする。

public static UIImage Size(this UIImage image, float width, float height)
{
    var size = new CGSize(width, height);
     UIGraphics.BeginImageContextWithOptions(size, false, 0f);

    image.Draw(new RectangleF(0, 0, width, height));
    var resultImage = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
    return resultImage;
}

UIImageのサイズを変えたいときに。