iOS17「UIGraphicsBeginImageContextWithOptions」で不具合が起きたら

アプリ開発の中で、特定のビューを画像として保存したい場面に遭遇したことはありませんか?たとえば、カスタム描画したキャンバスや、動的に生成したグラフを画像としてエクスポートしたい場合などです。

以前の方法ではUIGraphicsBeginImageContextWithOptions を使用して画像コンテキストを生成し、ビューをレンダリングしていましたが、iOS17以降では不具合が出る場合があります。今回はこのapiの代替であるUIGraphicsImageRendererを紹介します。

前提条件

・開発言語:Objective-C

・OS:MAC

・開発環境:Xcode16.1

現象

・iOSのバージョンを17に上げたうえで開発したアプリの動作確認をした際、UIGraphicsBeginImageContextWithOptionsを用いる一部機能が完了する前に強制終了してしまった

古い手法:UIGraphicsBeginImageContextWithOptions

以前の方法では、以下のように UIGraphicsBeginImageContextWithOptions を使用して画像コンテキストを生成し、ビューをレンダリングしていました。

// 古い方法
CGSize canvasSize = customCanvas.frame.size;
UIGraphicsBeginImageContextWithOptions(canvasSize, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
[customCanvas.layer renderInContext:context];
UIImage *exportedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

この方法でも十分な機能を果たしますが、いくつかの問題点があります。

  • メモリ効率の課題:大きなサイズの画像を扱う場合、メモリ使用量が増加します。
  • 柔軟性の制限:描画フォーマットやレンダリングオプションの設定が限定的です。

最新の手法:UIGraphicsImageRenderer

よりモダンな方法として UIGraphicsImageRenderer を使用することで、効率的かつ柔軟に画像生成が可能です。以下はその例です。

// 最新の方法
CGSize drawingSize = drawingView.frame.size;
UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:drawingSize];
UIImage *exportedImage = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
    [drawingView.layer renderInContext:rendererContext.CGContext];
}];

UIGraphicsImageRenderer のメリット

パフォーマンスの向上
UIGraphicsImageRenderer は内部でメモリ使用量を最適化しており、大きな画像を扱う場合でもスムーズに動作します。

高い柔軟性
UIGraphicsImageRendererFormat を使用することで、スケールや色空間などの詳細な設定が可能です。たとえば、高解像度画像を生成する際に以下のように設定できます。

UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat defaultFormat];
format.scale = 2.0; // 解像度を2倍に設定
UIGraphicsImageRenderer *highResRenderer = [[UIGraphicsImageRenderer alloc] initWithSize:drawingSize format:format];

簡潔なコード
描画アクションをクロージャーで記述できるため、コードが簡潔で読みやすくなります。

まとめ

UIGraphicsImageRenderer を使用することで、UIView を画像化する処理をより効率的に、そして高品質に実現できます。古いコードをまだ使用している場合は、この機会に最新の手法へ移行してみてはいかがでしょうか?

コスパよくスキルを磨くなら!オンライン学習のすすめ

「新しいスキルを学びたいけど、時間がない…」という方にぴったりなオンライン学習。プログラミング、デザイン、ビジネスなど、豊富な講座が揃う学習プラットフォームで、自分のペースでスキルを習得できます。自分のペースで、コスパよくスキルアップを目指しましょう!

オンライン学習の魅力

  1. 世界中で人気の大規模プラットフォーム
    21万以上の講座が揃い、ITからフィットネス、マーケティングまで幅広いジャンルから選べます。最新トレンドに合わせた講座も多彩!
  2. 買い切り型で視聴期限なし
    一度購入すればいつでも視聴可能。価格は1万円前後で、講師に質問できる機能もあり、対面に近い学習体験を提供します。
  3. 無料講座も豊富
    有料中心ですが、質の高い無料講座も多数。初回割引やセールもあるので、お得に学べるチャンスです。