Responsive Designは、レイアウトがデバイスのサイズ、向き、種類に自動的に適応するインターフェース構築のアプローチです。モバイル開発では、responsive designはiOSのsize classesとAndroidのconfiguration qualifiersを通じて実装されます。この記事では、アダプティブレイアウトの原則、両プラットフォームのツール、コード例を解説します。
重要なポイント
Responsive Designは、レイアウトが画面サイズ、向き、利用可能なスペースに応答し、機能を失うことなく要素を再配置するインターフェース構築の手法です。この用語は2010年にEthan Marcotteがウェブデザインのために提唱しましたが、その原則はネイティブモバイルアプリケーションにも完全に適用できます。
モバイル開発において、responsive designは同じアプリケーションがすべてのデバイスで正しく表示されることを意味します:iPhone SE(375 pt)からiPad Pro(ポートレート1024 pt)、Androidスマートフォン(360 dp)からタブレット(800 dp)まで。主要な要素はフレキシブルグリッド、アダプティブ画像、およびフレームワークレベルのメディアクエリ(size classes、qualifiers)です。
Apple Developer Documentationによると、アプリケーションはユニバーサルであるべきです — 別途iPadビルドなしですべてのデバイスで動作する必要があります。Google PlayはJetpack WindowManagerとcanonical layoutsを通じたアダプティブレイアウトの使用を推奨しています。タブレット対応の欠如は否定的なレビューの一般的な原因です。
Responsiveとadaptiveという用語は、異なるアプローチを説明しているにもかかわらず、しばしば混同されます。Responsive designは画面幅に継続的に調整される柔軟なグリッドを使用します。Adaptive designは事前に定義されたbreakpoints用の固定レイアウトを使用し、アプリケーションはそれらの間を段階的に切り替えます。
| 特性 | Responsive Design | Adaptive Design |
|---|---|---|
| アプローチ | スムーズな流動 | 個別の切り替え |
| グリッド | パーセンテージベース、流動的 | 各breakpointごとに固定 |
| 実装 | Auto Layout、Flexbox、ConstraintLayout | Size Classes、layout-w600dp、個別のstoryboards |
| デザインレイアウト数 | 1つだが柔軟 | 複数(ポートレート、ランドスケープ、タブレット) |
実際には、モバイルアプリは両方のアプローチを組み合わせて使用します。ベースグリッドはレスポンシブに構築され(Auto Layoutとconstraint依存関係)、breakpoint(例:幅 > 600 pt)に達すると、レイアウトは異なる要素配置のアダプティブバージョンに切り替わります。iOSはAuto Layout(responsive)とSize Classes(adaptive)を組み合わせます。AndroidはConstraintLayout(responsive)とqualifierリソース(adaptive)を組み合わせます。
Size Classesは、利用可能な画面スペースを水平と垂直の2軸で分類するiOSのメカニズムです。各軸はCompact(C)またはRegular(R)になります。組み合わせにより4つのレイアウト適応オプションが得られます:CR(標準的なiPhoneポートレート)、RR(iPadポートレート/ランドスケープ)、RC(Plus/Pro MaxのiPhoneランドスケープ)、CC(iPad Split View)。
// SwiftでのSize Classesの定義
import UIKit
class AdaptiveViewController: UIViewController {
override func traitCollectionDidChange(
_ previousTraitCollection: UITraitCollection?
) {
super.traitCollectionDidChange(previousTraitCollection)
adjustLayout(for: traitCollection)
}
private func adjustLayout(for traits: UITraitCollection) {
switch (traits.horizontalSizeClass, traits.verticalSizeClass) {
case (.regular, .regular):
showSplitView() // iPad — master-detailを表示
case (.compact, .regular):
showStackedView() // iPhoneポートレート — スタックレイアウト
case (.compact, .compact):
showCompactView() // iPhone SEランドスケープ — 最小化
default:
showDefaultView()
}
}
private func showSplitView() {
// UISplitViewControllerまたはHStackの使用
}
private func showStackedView() {
// iPhone用の縦スタック
}
private func showCompactView() {
// 副次的な要素を非表示、主要なものを表示
}
}Interface Builderでは、Size Classesは「wAny hAny」パネルを通じて設定されます — 開発者は特定の組み合わせ(wRegular hRegular、wCompact hRegular)を選択し、constraintバリエーションを追加します。SwiftUIはリアクティブ適応のために@Environment(\.horizontalSizeClass)と@Environment(\.verticalSizeClass)を使用します — 向きやウィンドウサイズが変わると、SwiftUIは自動的にビューを再描画します。
// SwiftUIでのSize Classes
import SwiftUI
struct ResponsiveView: View {
@Environment(\.horizontalSizeClass) private var hSizeClass
var body: some View {
if hSizeClass == .regular {
// iPad — サイドバー付き横レイアウト
HStack {
SidebarView()
.frame(width: 300)
ContentView()
}
} else {
// iPhone — 全画面縦スタック
VStack {
ContentView()
}
}
}
}Configuration Qualifiersは、デバイスの特性に基づいて異なるリソース(layout、values、drawables)をロードするAndroidのメカニズムです。修飾子には画面サイズ(small、normal、large、xlarge)、向き(port、land)、最小幅(sw<N>dp)、利用可能な幅(w<N>dp)、高さ(h<N>dp)が含まれます。
// Kotlinでのデバイス設定の検出
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val config = resources.configuration
val screenWidthDp = config.screenWidthDp
val screenHeightDp = config.screenHeightDp
val orientation = config.orientation
when {
screenWidthDp >= 900 -> setContentView(R.layout.activity_main_tablet)
screenWidthDp >= 600 -> setContentView(R.layout.activity_main_sw600)
else -> setContentView(R.layout.activity_main_phone)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, LandscapeFragment())
.commit()
}
}
}さまざまな画面のリソース構造:res/layout/activity_main.xml(電話)、res/layout-sw600dp/activity_main.xml(7インチタブレット)、res/layout-sw720dp/activity_main.xml(10インチタブレット)。AndroidはsmallestWidthに基づいて自動的に正しいレイアウトを選択します — 向きに関係なくdp単位の最小画面幅。sw<N>dp修飾子が最も安定した適応方法です。
// Jetpack Compose — 適応のためのWindowSizeClass
@Composable
fun ResponsiveScreen() {
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
when {
windowSizeClass.windowSizeClass == WindowWidthSizeClass.EXPANDED -> {
TabletLayout() // >= 840 dp
}
windowSizeClass.windowSizeClass == WindowWidthSizeClass.MEDIUM -> {
MediumLayout() // 600–840 dp
}
else -> {
CompactLayout() // < 600 dp
}
}
}Jetpack WindowManager(androidx.windowライブラリ)は、3つの幅カテゴリを持つWindowSizeClassを提供します:COMPACT(0–600 dp)、MEDIUM(600–840 dp)、EXPANDED(>840 dp)。これは古いqualifierフォルダーの最新の代替手段です。折りたたみ可能デバイスやタブレットへの適応のためにGoogleが推奨しています。
アダプティブグリッドはresponsive designの基礎です。固定サイズの代わりに、要素はパーセンテージ比率、柔軟なconstraints、固有コンテンツサイズを使用します。Breakpointsは、レイアウトが状態間で切り替わる画面幅のポイントです。
| Breakpoint | iOS Size Class | Android Qualifier | デバイスタイプ |
|---|---|---|---|
| 0–374 pt / dp | Compact width | — | iPhone SE、古いAndroid |
| 375–599 pt / dp | Compact width | sw320dp | iPhone 14、Galaxy S24 |
| 600–839 pt / dp | Regular width | sw600dp | iPad mini、7インチタブレット |
| 840+ pt / dp | Regular width | sw720dp | iPad Pro、10インチタブレット |
Google Material DesignとApple HIGが推奨するbreakpoints:0–599 dp(電話、1列)、600–839 dp(タブレット、2列、navigation rail)、840+ dp(タブレット、3列、navigation drawer)。Breakpointsの数は4を超えるべきではありません — 過剰な移行ポイントはメンテナンスとテストを複雑にします。
成功するresponsive designには、過去10年間にiOSおよびAndroid開発者コミュニティによって開発された一連のルールに従う必要があります。以下は、Apple HIG、Google Material Design、およびプロダクションプロジェクトの経験に基づく主要な推奨事項です。
アダプティブデザインの主要な原則:コンテンツがレイアウトを定義するのであって、その逆ではありません。iPadがiPhoneと同じカードスタックを単に引き伸ばして表示する場合 — それはresponsive designではありません。Responsive designはレイアウトを再考します:iPhoneでは縦スクロール、iPadではサイドバー付きmaster-detail。
よくある質問
Responsive Designは画面幅にスムーズに調整される柔軟なグリッドを使用します。Adaptive Layoutはbreakpointポイントで固定レイアウト間を切り替えます。実際には、両方のアプローチが組み合わされます:レスポンシブなベースグリッド+大きな変更(電話 vs タブレット)用のアダプティブ切り替え。
iOSは2つの軸を使用します:水平(Compact/Regular)と垂直(Compact/Regular)。ポートレートのiPhone — Compact width、Regular height(CR)。iPad — Regular width、Regular height(RR)。ランドスケープのiPhone Plus/Pro Max — Regular width、Compact height(RC)。開発者は各組み合わせに対してconstraintバリエーションを設定します。
sw600dp(smallestWidth 600 dp)はAndroidリソース修飾子で、デバイスの最小画面幅が少なくとも600 dpであることを意味します。タブレット(7インチ以上)用の代替レイアウトをロードするために使用されます。向きは影響しません — swは画面の小さい方を考慮します。
iOSでは、さまざまなSize ClassesのシミュレータとさまざまなサイズのデバイスでのSwiftUI Previewを使用します。Androidでは — エミュレータのデバイスプロファイル(Pixel 5、Pixel C、Galaxy Tab)とAndroid StudioのLayout Validationを使用します。両プラットフォームで、実際のiPad/Androidタブレットと折りたたみ可能デバイスでテストしてください。
Canonical layoutsはGoogle Material Design 3の既製のアダプティブレイアウトパターンです:list-detail、feed(カードフィード)、supporting pane(メインコンテンツ+アクションパネル)。各パターンには3つのバリアント(compact/medium/expanded)があり、WindowSizeClassに自動的に適応します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。