Baseline은 모든 글자 기호가 위치하는 보이지 않는 수평선입니다. 대부분의 문자는 베이스라인 위에 서며, descender는 그 아래로 내려갑니다. 모바일 인터페이스에서 베이스라인은 텍스트를 아이콘, 버튼, 이미지와 같은 다른 요소와 정확하게 정렬하는 데 사용됩니다. Material Design Typography Guidelines(2025)에 따르면, 베이스라인에 따른 일관된 정렬은 인터페이스의 시각적 계층 구조를 개선하고 콘텐츠 스캔 시 인지 부하를 줄입니다.
주요 포인트
Baseline(베이스라인)은 글자 기호가 위치하는 수평 축을 정의하는 타이포그래피의 기본 개념입니다. 디지털 폰트의 각 글리프는 베이스라인에 연결 지점이 있으며 — 텍스트를 렌더링할 때 이 선을 따라 문자가 정렬됩니다. 대부분의 소문자(a, e, o, n, c)는 베이스라인 위에 직접 위치하며, descender 요소(p, y, g, j 등의 문자)는 그 아래로 내려갑니다.
베이스라인이 폰트 메트릭의 유일한 참조점은 아닙니다. 그 외에도 x-height(소문자 높이), cap-height(대문자 높이), ascender-line(위쪽 확장 요소 선), descender-line(아래쪽 확장 요소 선)이 있습니다. 베이스라인과 descender-line 사이의 거리가 아래쪽 descender를 결정하고, 베이스라인과 ascender-line 사이의 거리가 위쪽 ascender를 결정합니다. 이 메트릭이 전체 줄 높이를 구성하고 line-height 계산에 영향을 미칩니다.
Bringhurst — The Elements of Typographic Style(2024)에 따르면, 베이스라인은 같은 서체의 모든 폰트에 대해 일관된 유일한 보편적 메트릭입니다. x-height와 cap-height는 스타일에 따라 변하지만, 베이스라인은 폰트의 좌표 그리드에 대해 일정한 위치를 유지합니다. 이로 인해 베이스라인은 인터페이스에서 요소 간 정렬을 위한 신뢰할 수 있는 참조점이 됩니다.
모바일 인터페이스에서 baseline은 텍스트를 비텍스트 요소와 정렬하기 위한 참조선으로 사용됩니다. 텍스트 옆에 아이콘, 버튼 또는 이미지가 배치될 때 단순히 중앙 정렬하는 것만으로는 충분하지 않습니다 — 베이스라인이 인접한 구성 요소의 중심 또는 베이스라인과 일치하지 않으면 텍스트가 시각적으로 어긋나 보입니다.
일반적인 시나리오는 설정 목록이나 탐색에서 아이콘과 텍스트가 있는 행입니다. 아이콘과 텍스트를 중앙 정렬하면 베이스라인이 컨테이너의 기하학적 중심보다 아래에 있기 때문에 텍스트가 시각적으로 더 높게 보입니다. 해결책은 아이콘을 텍스트 베이스라인에 정렬하는 것입니다. Material Design(2025)은 모바일 애플리케이션에서 모든 혼합 행에 대해 이 접근 방식을 권장합니다.
| 시나리오 | 중앙 정렬 | Baseline 정렬 |
|---|---|---|
| 아이콘 + 텍스트 | 텍스트가 아이콘 위에 보임 | 아이콘과 텍스트 베이스라인 일치 |
| 텍스트 + 텍스트 | 다른 크기가 떨림 유발 | 단일 베이스라인, 명확한 계층 |
| 텍스트 버튼 | 텍스트가 중앙에서 벗어남 | 텍스트가 광학적으로 중앙에 |
| 제목 + 캡션 | 줄의 시각적 단절 | 줄이 리드미컬하고 연결됨 |
베이스라인에 의한 광학적 정렬은 특히 화면 양식에 중요합니다. 입력 필드, 레이블, 오류 메시지는 복잡한 타이포그래픽 그리드를 형성하며, 1~2픽셀의 베이스라인 이동도 인식을 눈에 띄게 손상시킵니다.
iOS 개발에서 베이스라인은 Auto Layout에서 SwiftUI 레이아웃 시스템에 이르기까지 여러 메커니즘을 통해 지원됩니다. UIKit에서는 .firstBaseline 및 .lastBaseline 속성을 가진 NSLayoutConstraint를 사용하여 인접한 요소에 대해 텍스트를 배치합니다. 전자는 한 줄 텍스트에 적합하고, 후자는 마지막 줄이 중요한 여러 줄 텍스트에 적합합니다.
// UIKit: 베이스라인으로 레이블과 아이콘 정렬
let label = UILabel()
label.text = "설정"
let icon = UIImageView(image: UIImage(systemName: "gear"))
let constraint = label.lastBaselineAnchor
.constraint(equalTo: icon.lastBaselineAnchor)
constraint.isActive = true
SwiftUI에서 베이스라인 정렬은 사용자 정의 AlignmentGuide를 통해 구현됩니다. 기본적으로 SwiftUI는 요소를 중앙에 정렬하지만, 아이콘이 있는 텍스트 레이블의 경우 베이스라인이 더 정확한 결과를 제공합니다. SwiftUI는 내장 VerticalAlignment.firstTextBaseline과 .lastTextBaseline을 제공합니다.
// SwiftUI: HStack에서 베이스라인 정렬
HStack(alignment: .firstTextBaseline) {
Image(systemName: "gear")
Text("설정")
.font(.title3)
}
Apple HIG — Typography(2025)에 따르면, SwiftUI에서 firstTextBaseline을 사용하면 중앙 정렬에 비해 수동 패딩 조정이 40% 감소합니다. 이는 특히 사용자의 접근성 설정에 따라 글꼴 크기가 변경되는 동적 유형이 있는 목록에서 두드러집니다.
베이스라인 값은 폰트 API를 통해 얻을 수 있습니다. UIKit에서 UIFont.ascender 속성은 베이스라인에서 줄 위쪽까지의 거리를 반환하고, UIFont.descender는 베이스라인에서 아래쪽까지의 거리(음수 값)를 반환합니다. leading을 고려한 ascender와 descender의 합이 전체 줄 높이를 나타냅니다.
let font = UIFont.systemFont(ofSize: 17)
let baseline = font.ascender // 베이스라인에서 위쪽까지 거리
let descent = font.descender // 음수, 베이스라인 아래
let totalHeight = font.lineHeight // 전체 줄 높이
Android 개발에서 베이스라인은 기존 View 시스템과 Jetpack Compose 모두에서 지원됩니다. View 시스템에서 베이스라인 정렬을 위해 ALIGN_BASELINE 및 ALIGN_TOP 규칙이 있는 RelativeLayout.LayoutParams가 사용됩니다. TextView에는 LinearLayout에서 텍스트 요소의 자동 정렬을 제어하는 android:baselineAligned 속성이 있습니다.
<!-- Android XML: baseline alignment in LinearLayout -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true">
<TextView
android:id="@+id/label"
android:text="Price"
android:textSize="16sp" />
<TextView
android:id="@+id/value"
android:text="$24.99"
android:textSize="20sp"
android:layout_alignBaseline="@id/label" />
</LinearLayout>
Jetpack Compose에서 베이스라인 정렬은 Modifier.alignWithBaseline 또는 사용자 정의 레이아웃의 AlignmentLine을 통해 구현됩니다. Compose는 내장 FirstBaseline과 LastBaseline을 제공하며, Column과 Row에서 다양한 크기의 텍스트 요소를 정렬하는 데 사용할 수 있습니다.
// Jetpack Compose: Modifier를 통한 베이스라인 정렬
Row(
verticalAlignment = Alignment.FirstBaseline
) {
Icon(
imageVector = Icons.Default.Settings,
contentDescription = null
)
Text(
text = "설정",
style = MaterialTheme.typography.titleMedium
)
}
Android Developers — Typography and Alignment(2025)에 따르면, Jetpack Compose에서 베이스라인 정렬은 수동으로 패딩이나 오프셋을 설정하는 것보다 텍스트 위치 부정확성과 관련된 UI 테스트 버그를 30% 줄입니다.
Flutter는 베이스라인 작업을 위한 두 가지 내장 메커니즘을 제공합니다. 타이포그래피 규칙(alphabetic 또는 ideographic)을 선택하기 위한 TextBaseline 열거형과 Row 및 Column에서 정렬을 위한 CrossAxisAlignment.baseline입니다. TextBaseline.alphabetic은 서양 타이포그래피에 해당하고, TextBaseline.ideographic은 동아시아 타이포그래피에 해당합니다.
// Flutter: 베이스라인 정렬
Row(
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
children: [
Icon(Icons.settings),
Text('설정', style: TextStyle(fontSize: 20)),
],
)
정확한 위치 지정을 위해 Flutter는 Baseline 위젯도 제공합니다. 이는 자식 요소의 베이스라인이 컨테이너 상단에서 지정된 거리에 있도록 이동시킵니다. 이는 비표준 정렬로 사용자 정의 텍스트 레이아웃을 만들 때 유용합니다.
// Flutter: Baseline 위젯
Baseline(
baseline: 40.0,
baselineType: TextBaseline.alphabetic,
child: Text(
'정렬된 텍스트',
style: TextStyle(fontSize: 24),
),
)
Flutter Documentation — Layout and Typography(2025)에 따르면, CrossAxisAlignment.baseline은 패딩을 수동으로 계산하지 않고 Flutter에서 다른 글꼴 크기의 텍스트를 정확하게 정렬하는 유일한 방법입니다. 이는 가격과 할인이 있는 제품 카드와 같이 제목과 캡션이 혼합된 행에서 특히 중요합니다.
가장 흔한 실수 중 하나는 아이콘이나 이미지가 있는 행에서 텍스트를 중앙 정렬하는 것입니다. 아이콘과 텍스트가 컨테이너 내에서 중앙 정렬되면 텍스트가 아이콘에 대해 시각적으로 위로 이동합니다. 이는 텍스트의 중심이 베이스라인보다 위에 있고 아이콘의 중심이 기하학적 중심과 일치하기 때문에 발생합니다.
NN Group — Typography in UI Design(2025)에 따르면, 잘못된 베이스라인 정렬은 올바르게 정렬된 인터페이스에 비해 사용자의 목록 스캔 시간을 22% 증가시킵니다. 이는 대부분의 모바일 애플리케이션의 기초를 형성하는 목록과 양식에 중요한 지표입니다.
자주 묻는 질문
Baseline은 문자가 위치하는 수평선이며, line-height는 연속된 두 줄의 베이스라인 사이 거리입니다. Baseline은 수직 공간에서 텍스트 위치를 결정하고, line-height는 줄 간 리듬을 결정합니다. 두 개념은 상호 연관되어 있습니다: line-height는 한 줄의 베이스라인에서 다음 줄의 베이스라인까지 계산됩니다.
UIKit에서 베이스라인 값은 UILabel, UITextView 및 UIButton의 lastBaselineAnchor 또는 firstBaselineAnchor 속성을 통해 얻을 수 있습니다. 폰트 메트릭에 직접 접근하려면 UIFont.ascender(베이스라인에서 위쪽까지 거리)와 UIFont.descender(베이스라인에서 아래쪽까지 거리, 음수 부호)를 사용하세요.
네, SwiftUI는 동적 유형(Dynamic Type)에서 베이스라인 정렬을 지원합니다. .firstTextBaseline과 .lastTextBaseline을 통한 정렬은 글꼴 크기 변경에 자동으로 적응합니다. 이를 통해 수동 패딩 조정 없이 글꼴 크기가 커져도 텍스트의 올바른 위치가 보장됩니다.
Jetpack Compose에서 Row의 verticalAlignment 매개변수에 Alignment.FirstBaseline을 사용하세요: Row(verticalAlignment = Alignment.FirstBaseline). 이 Row에 배치된 Icon과 Text에 대해 Compose가 자동으로 베이스라인을 정렬합니다. 아이콘을 더 정확하게 조정해야 하는 경우 Modifier.alignWithBaseline을 사용하세요.
사용자 정의 폰트에는 자체 메트릭(ascender, descender, x-height)이 있어 시스템 폰트와 다를 수 있습니다. 베이스라인 정렬이 부정확한 결과를 제공하는 경우 플랫폼 API(iOS의 UIFont.descender, Android의 Paint.getFontMetrics())를 통해 폰트 메트릭을 확인하세요. 장식적 폰트는 추가로 1~2픽셀 조정이 필요할 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.