RORK LABEN
BUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要ですBUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要です
記事一覧/アプリ開発
アプリ開発/2026-07-07中級

高さの異なる画像を2列で美しく並べる—Rork の Expo アプリで壁紙ギャラリーを段組みにする

縦横比のばらつく画像を numColumns では美しく並べられない理由から、列の高さを見て振り分ける段組みアルゴリズム、FlashList の masonry での仮想化、依存を増やさない実装まで、壁紙ギャラリーを実コードで組みます。

Rork540Expo176React Native227FlashList5画像レイアウト

プレミアム記事

自分の壁紙アプリの一覧画面を作り直していたときのことです。縦長の写真も、横長のイラストも、正方形のミニマルな図案も、同じ棚に並びます。ところが FlatListnumColumns={2} を渡しただけの素朴なグリッドでは、行ごとに背の高い画像へ高さが揃ってしまい、隣の低い画像の下に大きな余白が空きました。指を滑らせるたびに、その余白が目に入ります。

壁紙アプリにとって一覧画面は商品棚そのものです。余白の連なりは、そのまま「雑に並べた」という印象になります。Pinterest のように、高さの違う画像を隙間なく積み上げたい。いわゆる段組み(メイソンリー)レイアウトです。ここでは、私が実際に個人開発で組み直した順序で、つまずいた箇所まで含めて書いていきます。

なぜ numColumns では壁紙ギャラリーが間延びするのか

FlatListnumColumns は、内部的にデータを「行」の単位でまとめて描画します。1行に2枚ずつ並べる場合、その行の高さは背の高いほうの画像に引きずられます。低いほうの画像は上に寄せられ、下に余白が残ります。

これは不具合ではなく、グリッドという仕組みそのものの性質です。すべての画像が同じ縦横比なら問題は起きません。壁紙のように縦・横・正方形が混ざる瞬間に、余白が生まれます。

段組みが必要かどうかの分岐点は、はっきりしています。画像の縦横比が揃っているならグリッドで十分です。縦横比がばらつき、かつ「隙間なく詰めた密度」が体験の質に直結するなら、段組みへ移る価値があります。壁紙・写真・作品ポートフォリオはその典型です。

段組みの考え方は、行で揃えるのをやめて、列ごとに独立して積むことです。2列なら、次の画像を「今いちばん背の低い列」へ置く。これを繰り返すだけで、両列の高さが自然に近づき、下端の凸凹が最小になります。

画像の縦横比を先に持っておく

段組みで最初に必要になるのは、各画像の縦横比です。ここを描画時に画像を読み込んでから測る設計にすると、レイアウトが二段階になり、スクロール中にカクつきます。読み込む前から高さが決まっていないと、列の振り分けができないためです。

対策はひとつで、縦横比をデータ側に最初から持たせることです。私は壁紙のメタデータに widthheight を保存しておき、一覧の API がそれを返すようにしました。CMS や Supabase のテーブルに列を足すだけで済みます。

持たせる場所利点注意点
API/DB のメタデータ描画前に確定・最速登録時に寸法を記録する運用が要る
ファイル名やパスに埋め込むDB 変更が不要命名規約が崩れると破綻する
初回に一度だけ計測してキャッシュ既存データを変えずに済む初回だけレイアウトが揺れる

型としては、次のように最小限を持てば十分です。

type Wallpaper = {
  id: string;
  uri: string;
  width: number;   // 元画像のピクセル幅
  height: number;  // 元画像のピクセル高さ
};

widthheight の実数値そのものは使いません。必要なのは比だけです。ただし比を都度計算するより、元寸を持っておくほうが、後でサムネイル生成やダウンロードサイズの判断にも流用できます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
numColumns が変動高さの画像で余白を作る仕組みと、段組みが必要になる分岐点
列の高さを見て最短の列へ振り分ける、依存ゼロの段組みアルゴリズムの実コード
FlashList の masonry で仮想化を保つ実装と、依存を増やせない場合の現実的な落としどころ
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-08-16
グラフが壊れて見えるのは、データが多いときではなく最初の数日でした
記録アプリの折れ線グラフが、データの少ない最初の数日だけ線が消える。原因はY軸の幅が0になり座標がNaNになることでした。実測した挙動と、描画前に置く小さな正規化層を紹介します。
アプリ開発2026-08-06
壁紙の上の文字が読めるかを、端末ではなく取り込み時に決める — 判定指標を4つ測り比べた記録
壁紙の上に置くステータスバーや見出しが読めるかを、端末での画像解析ではなく取り込み時のメタデータで決める設計です。240枚のコーパスで判定指標を4つ実測し、縮小画像での判定が何と一致するのかまで記録しました。
アプリ開発2026-07-16
壁紙の段組みギャラリーにネイティブ広告を差し込む — 広告セルの寿命をプールで設計する
段組みギャラリーにネイティブ広告を1枚入れたところ、20分のスクロールでメモリが伸び続けました。リスト再利用と広告の寿命が噛み合わない理由から、プール方式の実装、差し込み間隔の決め方まで実測とともに残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →