Corner radius — параметр скруглення кутів UI-елементів, який вимірюється в логічних пікселях (pt на iOS, dp на Android) і визначає радіус кола, вписаного в кут прямокутника. Правильний вибір corner radius впливає на сприйняття інтерфейсу: великі скруглення створюють м'який, дружній тон, малі — суворий і формальний. За даними Material Design Guidelines (Google, 2026), рекомендований radius для карток — 8–16 dp, для кнопок — 4–8 dp. Докладніше про керування зовнішнім виглядом елементів читайте в статті про тіні в UI.
Головне
Corner radius — числове значення, що визначає ступінь скруглення кутів прямокутного елемента. Чим вище значення, тим більш округлим стає кут. При значенні 0 кут залишається прямим (90°), при значенні, що дорівнює половині меншої сторони, елемент перетворюється на коло (для квадрата) або на скруглений прямокутник з прямими сторонами (капсула).
В мобільному дизайні corner radius використовується для: карток і плиток, кнопок, полів введення, модальних вікон, зображень і аватарів, індикаторів прогресу, чіпів і бейджів. Кожен тип елемента має рекомендований діапазон скруглення, заснований на гайдлайнах Material Design та Human Interface Guidelines.
За даними Material Design 3 (Google, 2026), скруглення кутів класифікується на три рівні: малий (4 dp) для кнопок і полів введення, середній (8–12 dp) для карток і листів, великий (16–28 dp) для діалогів і боттом-шитів. HIG Apple (2025) рекомендує єдиний corner radius 10–12 pt для системних елементів (UIButton, UITextField) і 20+ pt для модальних презентацій.
На iOS скруглення кутів реалізується через властивість cornerRadius у CALayer. В UIKit кожен UIView має шар, у якого можна встановити cornerRadius. Для складніших скруглень (різні радіуси для різних кутів) використовується maskedCorners і CACornerMask у комбінації з UIBezierPath.
// UIKit: скруглення через CALayer
import UIKit
let cardView = UIView()
cardView.backgroundColor = .systemBackground
cardView.layer.cornerRadius = 12
cardView.layer.maskedCorners = [
.layerMinXMinYCorner,
.layerMaxXMinYCorner
]
В SwiftUI скруглення задається через модифікатор cornerRadius() або через ClipShape з RoundedRectangle. SwiftUI також підтримує індивідуальне скруглення кутів через UIRectCorner у комбінації з clipped() та overlay().
// SwiftUI: скруглення через RoundedRectangle
import SwiftUI
VStack {
Text("Corner Radius 16")
.padding()
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color.blue)
)
}
// Індивідуальне скруглення кутів
RoundedRectangle(
cornerSize: CGSize(width: 16, height: 16),
style: .continuous
)
Continuous corner radius — стиль скруглення, який використовується Apple в iOS з моменту виходу iOS 7. На відміну від класичного радіуса (circular), continuous radius створює більш плавне скруглення за рахунок використання кривої Без'є третього порядку замість дуги кола. SwiftUI підтримує цей стиль через параметр style: .continuous в RoundedRectangle. Apple рекомендує continuous corner radius для всіх системних елементів як візуально більш природний.
В Android скруглення кутів традиційно реалізується через XML-ресурси shape в папці res/drawable. Shape визначає форму фону з параметрами cornerRadius та solid. Для різних кутів використовується <corners android:bottomLeftRadius="..." />. В Material Design 3 додано MaterialShapeDrawable з підтримкою тем та динамічних форм.
<!-- res/drawable/bg_card.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="12dp" />
</shape>
В Jetpack Compose скруглення задається через параметр shape у Modifier. Compose надає RoundedCornerShape з підтримкою різних радіусів для кожного кута та стилем (CircularShape або CutCornerShape). Compose також підтримує continuous corner radius через RoundedCornerShape у комбінації з графічною обводкою.
// Jetpack Compose: скруглення через RoundedCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
Card(
shape = RoundedCornerShape(
topStart = 16.dp,
topEnd = 16.dp,
bottomStart = 4.dp,
bottomEnd = 4.dp
),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Text(text = "Card з кастомним скругленням")
}
MaterialShapeDrawable в Android View System дозволяє динамічно змінювати corner radius без перестворення drawable. Використовуйте ShapeAppearanceModel для точного налаштування: встановіть cornerFamily (rounded або cut) та cornerSize для кожного кута окремо.
Вибір corner radius залежить від типу елемента, контексту використання та платформи. Універсального правила не існує, але Material Design та HIG Apple дають чіткі рекомендації для стандартних компонентів. Основний принцип: скруглення повинно бути помітним, але не заважати вмісту.
| Тип елемента | Рекомендований radius | Платформа | Примітка |
|---|---|---|---|
| Кнопки | 4–8 dp / 8 pt | iOS, Android | Чим більша кнопка, тим більший radius |
| Картки | 8–16 dp / 10–12 pt | iOS, Android | Material Design: 12 dp за замовчуванням |
| Поля введення | 4–8 dp / 8 pt | iOS, Android | Занадто велике скруглення виглядає неприродно |
| Модальні вікна | 16–28 dp / 20+ pt | iOS, Android | iOS 18: 24 pt за замовчуванням |
| Аватари | 50% від розміру | iOS, Android | Для круглих аватарів radius = половина сторони |
| Чіпи / бейджі | 16–20 dp / 14 pt | Android | Форма капсули при великому скругленні |
Правило контрасту: елементи з різним corner radius в одному інтерфейсі повинні відрізнятися мінімум на 4 dp, щоб візуальна різниця була помітною. Не використовуйте 3 рівні скруглення на одному екрані — це створює візуальний шум. Material Design 3 рекомендує використовувати не більше двох рівнів скруглення на екран: один для контейнерів (картки, діалоги) і один для інтерактивних елементів (кнопки, поля).
У Flutter скруглення кутів реалізується через клас BorderRadius, який приймає значення Radius.circular() або Radius.elliptical(). Flutter підтримує індивідуальне скруглення через BorderRadius.only() та BorderRadius.horizontal()/vertical(). Віджет ClipRRect обрізає дочірній елемент за заданим BorderRadius.
// Flutter: скруглення через ClipRRect і Container
import 'package:flutter/material.dart';
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0),
bottomLeft: Radius.circular(4.0),
bottomRight: Radius.circular(4.0),
),
),
child: Text('Кастомне скруглення кутів'),
)
// ClipRRect з Image
ClipRRect(
borderRadius: BorderRadius.circular(12.0),
child: Image.network(
'https://example.com/image.jpg',
fit: BoxFit.cover,
),
)
ClipRRect у Flutter використовується, коли потрібно обрізати зображення або складний віджет по скругленій границі. Для простих фонових контейнерів достатньо BoxDecoration з borderRadius — це продуктивніше, оскільки не створює окремого обрізаючого шару. Material Flutter 3.22+ підтримує continuous corner radius через ContinuousRectangleBorder.
Часті запитання
dp (density-independent pixels) в Android та pt (points) в iOS — це логічні одиниці, які відповідають фізичному розміру на екрані незалежно від щільності пікселів. 1 dp ≈ 1 pt ≈ 1/160 дюйма. Числові значення corner radius в dp та pt можна використовувати як взаємозамінні при перенесенні дизайну між платформами.
На iOS використовуйте maskedCorners з CACornerMask: layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]. В Android XML — . В Jetpack Compose — RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp). У Flutter — BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)).
Continuous corner radius — стиль скруглення, при якому кут формується не по дузі кола, а по кривій Без'є третього порядку. Apple використовує цей стиль з iOS 7 для всіх системних елементів. Візуально continuous скруглення виглядає більш плавним та природним у порівнянні з класичним circular-стилем.
Рекомендується 10–12 pt на iOS (як системна клавіатура) та 8–12 dp на Android. Клавіші всередині клавіатури можуть мати менший radius (4–6 dp) або бути без скруглення. Для збільшення площі дотику використовуйте padding 4–8 dp між скругленою границею та краєм кнопки.
UITableViewCell не успадковує cornerRadius від contentView автоматично, оскільки фон комірки відмальовується в backgroundView. Для скруглення комірки встановіть cornerRadius у contentView.layer та backgroundView.layer одночасно. В SwiftUI використовуйте .listRowBackground() з RoundedRectangle.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.