Főbb pontok
Dynamic Type — az Apple technológiája, amely lehetővé teszi az alkalmazás betűtípusainak automatikus skálázását a rendszer szövegméretének változásakor. A felhasználó a Settings → Accessibility → Display & Text Size menüpontban állítja be a kívánt méretet, és az összes Dynamic Type-ot támogató alkalmazás újraindítás nélkül igazítja a betűméretet.
A rendszer 11 skálázási szintet kínál: XS (14pt alap) és XXXL (23pt alap) között, valamint 5 további akadálymentesítési méretet (AX1–AX5) a súlyos látássérült felhasználók számára. Méretváltozáskor az iOS létrehozza az UIContentSizeCategory.didChangeNotification értesítést, és az alkalmazásnak újra be kell töltenie a betűtípusokat az UIFontMetrics segítségével. Az Apple Human Interface Guidelines szerint a Dynamic Type nem változtatja meg a sorközt és a betűarányokat — csak a betűméretet, ami megőrzi az olvashatóságot minden méreten.
A Dynamic Type kötelező az akadálymentesített (accessibility) státuszra pályázó alkalmazások számára. A WWDC 2024-en az Apple bejelentette, hogy a dinamikus típust nem támogató alkalmazások elutasítás kockázatának vannak kitéve a felülvizsgálat során, ha fő funkciójuk szövegolvasáshoz kapcsolódik. Az IT Sectr projektjeiben az első verziótól kezdve implementáljuk a Dynamic Type-ot — ez akár 20%-os időmegtakarítást jelent a későbbi akadálymentesítési adaptáció során.
Az Apple 11 előre meghatározott szövegstílust biztosít, amelyek mindegyike az UIFontDescriptor.UIAttributes-ben jelenik meg az SF Pro rendszerbetűtípushoz. A fejlesztő nem pixelméretet ad meg — szemantikai stílust választ, az iOS pedig a felhasználó beállításaitól függően alkalmazza a megfelelő betűméretet.
| Stílus | Méret (alapértelmezett) | Méret (AX5) | Rendeltetés |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Első szintű képernyőcímek |
| .title1 | 28pt | 50pt | Másodlagos címek |
| .title2 | 22pt | 40pt | Szekciócímek |
| .title3 | 20pt | 36pt | Alcímek |
| .headline | 17pt semibold | 31pt | Kiemelt szöveg listákban |
| .body | 17pt | 31pt | Fő szöveg |
| .callout | 16pt | 29pt | Kiemelések és kiegészítő szöveg |
| .subheadline | 15pt | 27pt | Elemleírások |
| .footnote | 13pt | 23pt | Lábjegyzetek és kis szöveg |
| .caption1 | 12pt | 21pt | Képleírások |
| .caption2 | 11pt | 19pt | Címkék és kis leírások |
Minden stílus az SF Pro rendszerbetűtípust használja rögzített alakkal (Regular a body-hoz, Bold a headline-hoz). Az egyedi betűtípusok az UIFontMetrics segítségével csatlakoztathatók — ez az egyetlen helyes módja a harmadik féltől származó betűtípus dinamikus típushoz való igazításának.
UIFontMetrics — az iOS 11-ben bevezetett osztály, amely bármely UIFont-ot arányosan skálázza a kiválasztott szövegstílushoz. Az iOS 11 előtt a fejlesztők közvetlenül a preferredFontForTextStyle hívást használták, amely csak az SF Pro rendszerbetűtípust adja vissza. Az UIFontMetrics megoldja ezt a problémát: bármilyen betűtípust elfogad, és visszaadja annak skálázott változatát, megtartva az alakot és az arányokat.
A scaledFont(for:) metódus kiszámítja a skálázási tényezőt a felhasználó aktuális szövegmérete alapján: ha a „Nagy" (Large) méret van kiválasztva, a tényező 1.0; ha „Nagyon nagy" (AX1) — körülbelül 1.3; a „Maximális" (AX5) esetén — 1.8-ig. A tényező az egyedi betűtípus alapméretére vonatkozik, nem a rendszerbetűtípusra — ez garantálja, hogy a tervezői szándék minden méreten megmaradjon.
Az UIFontMetrics használata ajánlott az alkalmazás összes egyedi betűtípusához. A WWDC 2024-en az Apple bemutatta az Accessibility Inspector eszközt, amely ellenőrzi a Dynamic Type támogatást, és kiemeli azokat az elemeket, amelyek rögzített méretet használnak az UIFontMetrics helyett. Az IT Sectr-nél 2018 óta minden projektben bevezettük az UIFontMetrics-t — ez 35%-kal csökkentette az átfedő szöveggel kapcsolatos hibák számát.
A legegyszerűbb módja a dinamikus betűtípus elérésének egy címke számára. A kód megmutatja, hogyan állítsunk be egy UILabel-t .body stílussal, amely automatikusan reagál a rendszer szövegméretének változására.
import UIKit
class GreetingViewController: UIViewController {
private let label: UILabel = {
let l = UILabel()
l.text = "Hello, Dynamic Type!"
l.font = UIFont.preferredFont(forTextStyle: .body)
l.adjustsFontForContentSizeCategory = true
l.translatesAutoresizingMaskIntoConstraints = false
return l
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
}
Az adjustsFontForContentSizeCategory = true jelző automatikusan frissíti a betűtípust a rendszer szövegméretének változásakor — e jelző nélkül a Dynamic Type nem működik a meglévő címkénél. Méretváltozáskor az iOS meghívja a layoutIfNeeded-et, és a label kézi beavatkozás nélkül frissíti a betűtípust.
Egyedi betűtípus (pl. Montserrat) használatakor a preferredFontForTextStyle hívás SF Pro-t ad vissza, nem a saját betűtípusát. Az UIFontMetrics pontosan az egyedi betűtípust skálázza, megőrizve annak dizájnját.
import UIKit
extension UIFont {
static func customDynamicFont(name: String,
size: CGFloat,
style: UIFont.TextStyle) -> UIFont {
guard let baseFont = UIFont(name: name, size: size) else {
return .preferredFont(forTextStyle: style)
}
return UIFontMetrics(forTextStyle: style).scaledFont(for: baseFont)
}
}
let titleFont = UIFont.customDynamicFont(
name: "Montserrat-Bold",
size: 20,
style: .title3
)
A scaledFont(for:) metódus elfogad egy alap UIFont-ot, és visszaad egy, a .title3 stílushoz arányosan skálázott verziót. AX5 akadálymentesítési méretnél a Montserrat-Bold 20pt betűtípus ~36pt-ra változik — pontosan annyival nő, mint amennyivel a rendszerbetűtípus nőne ennél a stílusnál. Az IT Sectr-nél 2018 óta ezt a mintát használjuk minden egyedi betűtípust tartalmazó projektben, ami teljesen megszüntette a kis szöveggel kapcsolatos panaszokat a látássérült felhasználóktól.
Ha manuálisan frissíti a betűtípust (adjustsFontForContentSizeCategory nélkül), iratkozzon fel az UIContentSizeCategory.didChangeNotification értesítésre. Ez szükséges az olyan egyedi UI-elemeknél, amelyek nem öröklik az automatikus betűtípus-frissítést.
import UIKit
class DynamicLabel: UILabel {
private var customFont: UIFont?
private var textStyle: UIFont.TextStyle = .body
func configure(font: UIFont, style: UIFont.TextStyle) {
customFont = font
textStyle = style
NotificationCenter.default.addObserver(
self,
selector: #selector(updateFont),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
updateFont()
}
@objc private func updateFont() {
guard let base = customFont else { return }
self.font = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: base)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
A didChangeNotification-ra való feliratkozás garantálja, hogy az egyedi elem frissíti a betűtípust a rendszerbeállítások bármilyen változásakor, az alkalmazás újraindítása nélkül. Az iOS 15-től kezdve az értesítés akkor is érkezik, ha a szöveg méretét a Control Centeren keresztül változtatják meg a Live Text Size-t támogató alkalmazásokban.
Gyakran ismételt kérdések
A Dynamic Type iOS 7 és újabb verziókon érhető el. Az UIFontMetrics az iOS 11-ben jelent meg — előtte közvetlenül a preferredFontForTextStyle metódust használták. Az iOS 15+-on a dinamikus típus további akadálymentesítési méreteket (AX1–AX5) támogat a nagy betűtípusokhoz. Az iOS 10-et és régebbit támogató alkalmazások UIFontMetrics nélkül használják a preferredFontForTextStyle-t, ami a támogatást csak az SF Pro rendszerbetűtípusra korlátozza.
Az Xcode 15+-ban nyissa meg a szimulátort, és válassza a Settings → Accessibility → Display & Text Size → Larger Text menüpontot. Húzza el a csúszkát a méret megváltoztatásához. Magában az Xcode-ban található a Debug → Accessibility Inspector, amely kiemeli a rögzített betűtípusú elemeket. Az automatizáláshoz használjon egy tesztet, amely a beállítások UISliderét módosítja XCUITesten keresztül — ez garantálja, hogy az összes képernyő helyesen épül újjá.
Igen, a dinamikus típusú Auto Layout megköveteli az intrinsicContentSize használatát az UILabel és UIButton esetében. Akadálymentesítési méreteknél a szöveg túlléphet a superview határain — adjon hozzá UIScrollView-t, vagy növelje a leading/trailing korlátozásokat. Használja az UIFontMetrics.scaledValue-t a kitöltésekhez (padding), hogy a betűk közötti távolság is arányosan skálázódjon a betűtípushoz.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is