RORK LABEN
PUBLISH — Rork Maxはコード署名やプロビジョニングを肩代わりし、2クリックでApp Storeへ申請できますSIMULATOR — ブラウザ内のストリーミングシミュレータで実機に近い操作感を試せ、QRでTestFlightなしに実機インストールできますMAX — Rork MaxはネイティブSwiftアプリを生成し、Claude Code・Claude Opus 4.6で駆動しますNATIVE — Rork MaxはAR/LiDAR・Metalの3D・ウィジェット・Live Activities・HealthKit・Core MLなどXcode相当の領域まで到達しますFUNDING — Rorkが$15Mを調達し、App Store起業家世代の後押しを掲げていますPRICE — 料金は無料から用意され、有料プランは月$25から、Rork Maxは月$200ですPUBLISH — Rork Maxはコード署名やプロビジョニングを肩代わりし、2クリックでApp Storeへ申請できますSIMULATOR — ブラウザ内のストリーミングシミュレータで実機に近い操作感を試せ、QRでTestFlightなしに実機インストールできますMAX — Rork MaxはネイティブSwiftアプリを生成し、Claude Code・Claude Opus 4.6で駆動しますNATIVE — Rork MaxはAR/LiDAR・Metalの3D・ウィジェット・Live Activities・HealthKit・Core MLなどXcode相当の領域まで到達しますFUNDING — Rorkが$15Mを調達し、App Store起業家世代の後押しを掲げていますPRICE — 料金は無料から用意され、有料プランは月$25から、Rork Maxは月$200です
記事一覧/アプリ開発
アプリ開発/2026-07-07中級

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

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

Rork492Expo132React Native197FlashList4画像レイアウト

プレミアム記事

自分の壁紙アプリの一覧画面を作り直していたときのことです。縦長の写真も、横長のイラストも、正方形のミニマルな図案も、同じ棚に並びます。ところが 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-07-05
ワンタイムコードの入力欄をExpoで作る — SMS自動入力とセグメント表示を両立させる
6桁の確認コードを入れる画面は、見た目こそ単純ですが、SMSの自動入力・貼り付け・1文字ずつの削除まで含めると意外と作り込みが必要です。iOSとAndroidの自動入力を最初に押さえ、単一のTextInputで崩れにくいセグメント表示を組む実装をまとめました。
アプリ開発2026-06-27
「本当に削除しますか?」を出す前に — 取り消せる削除という選択肢
リストの項目を消すたびに確認ダイアログを出すと、ユーザーは反射的にOKを押すようになります。Rork(Expo)アプリで「取り消せる削除」を実装し、確認を出すべき場面と出さない場面を切り分ける設計ノートです。
アプリ開発2026-06-27
画面を離れてもアニメーションが回り続ける — Rork(Expo)アプリのフォーカス連動でバッテリーを守る
Rork が生成した Expo アプリで、別画面に進んだりホームに戻ったあともグラデーションや呼吸アニメーションが裏で回り続け、ジャンクとして表に出ないままバッテリーを静かに削っていく——その原因は Reanimated の withRepeat が UI スレッドで走り続けることと、ナビゲーションスタックが画面をマウントしたまま保持することにあります。useIsFocused と AppState を束ねたライフサイクル設計で、画面外とバックグラウンドのループを確実に止める実装を、動くコードで示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →