Dynamic Type — isang built-in na function ng iOS na awtomatikong nagbabago ng laki ng font sa application ayon sa mga system setting ng user. Itinatakda ng user ang gustong laki ng teksto sa Settings → Display & Brightness → Text Size, at lahat ng application na sumusuporta sa Dynamic Type ay naaayos nang walang karagdagang aksyon. Ayon sa Apple Human Interface Guidelines, 2024, ang suporta sa Dynamic Type ay isang mandatoryong kinakailangan para sa pag-publish sa App Store, dahil ito ay isang pangunahing elemento ng accessibility sa iOS platform.
Mga Pangunahing Punto
Dynamic Type — teknolohiya ng iOS, lumitaw sa iOS 7, na nagpapahintulot sa teksto sa application na awtomatikong umangkop sa mga system setting ng laki ng font. Maaaring palakihin o paliitin ng user ang font sa lahat ng application nang sabay-sabay — nang hindi kinakailangang baguhin ang mga setting sa bawat application nang magkahiwalay.
Ayon sa Apple WWDC 2023, “Make Your App Visually Accessible”, higit sa 40% ng mga gumagamit ng iOS ang nagbabago ng laki ng font mula sa karaniwan. Para sa pangkat ng edad na 65+, ang bilang na ito ay umaabot sa 70%. Ang Dynamic Type ay isang mandatoryong kinakailangan para sa sertipikasyon ng accessibility ng App Store. Ang kakulangan ng suporta ay dahilan para sa pagtanggi ng application sa pagsusuri.
Prinsipyo ng pagpapatakbo: ginagamit ng application ang UIFont.preferredFont(forTextStyle:) sa halip na UIFont(name:size:). Awtomatikong ibinabalik ng iOS ang font na naka-scale ayon sa kasalukuyang setting ng system. Kapag binago ang laki sa mga setting, bumubuo ang iOS ng notification na UIContentSizeCategory.didChangeNotification — dapat kalkulahin muli ng application ang layout.
Lumitaw ang Dynamic Type sa iOS 7 kasama ng “flat” na disenyo. Sa iOS 10, idinagdag ang suporta para sa mga custom na font sa pamamagitan ng UIFontMetrics. Ipinakilala ng iOS 11 ang mga antas ng accessibility (hanggang AccessibilityXXXL). Nagdagdag ang iOS 15 ng Dynamic Type sa SwiftUI na may awtomatikong suporta. Sa bawat release, pinapahigpit ng Apple ang mga kinakailangan: simula sa iOS 17, ang mga application na walang suporta sa Dynamic Type ay makakatanggap ng babala kapag nag-upload sa App Store Connect.
Nagbibigay ang iOS ng 8 estilo ng teksto, bawat isa ay may paunang natukoy na laki at hitsura para sa karaniwang setting:
| Estilo | Constant | Laki (L) | Gamit |
|---|---|---|---|
| Large Title | .largeTitle | 34px | Pangunahing pamagat ng screen |
| Title 1 | .title1 | 28px | Pamagat ng seksyon |
| Title 2 | .title2 | 22px | Subtitle |
| Title 3 | .title3 | 20px | Pamagat ng card |
| Headline | .headline | 17px (bold) | Makapal para sa diin |
| Body | .body | 17px | Pangunahing teksto |
| Callout | .callout | 16px | Pantulong na teksto |
| Caption 1 | .caption1 | 12px | Caption sa ilalim ng larawan |
| Caption 2 | .caption2 | 11px | Maliit na caption |
| Footnote | .footnote | 13px | Talababa, tala |
Ang paggamit ng tamang estilo ay hindi lamang tungkol sa “itsura”. Ang UIFont.TextStyle.body sa AccessibilityXXXL mode ay maaaring umabot ng 53px. Kung ang application ay gumagamit ng nakapirming font na 17px para sa body, ang teksto ay magiging hindi nababasa para sa mga user na nagpinalaki ng font.
Ang Dynamic Type ay hindi lamang nag-scale — pinapanatili nito ang visual hierarchy. Ang Large Title ay palaging mas malaki kaysa sa Title 1, na mas malaki kaysa sa Body, anuman ang antas ng pag-scale. Ang mga coefficient ng pag-scale ay nagkakaiba: ang mga heading ay mas aktibong nag-scale kaysa sa pangunahing teksto, upang ang hierarchy ay mapanatili kahit sa mga antas ng accessibility.
Sinusuportahan ng iOS ang 11 antas ng pag-scale ng teksto, nahahati sa dalawang kategorya:
Ang pagkakaiba sa pagitan ng XS at AccessibilityXXXL para sa estilo ng body ay mula 14px hanggang 53px — halos 4×. Ang layout na idinisenyo para sa 17px ay ganap na nasisira sa 53px: lumalabas ang teksto sa mga hangganan, nagsasapawan ang mga button, nagkakatabing mga cell.
Suriin ang kasalukuyang kategorya sa code:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// I-activate ang alternatibong layout
}
Ang kategorya ng laki ng teksto ay magagamit sa pamamagitan ng traitCollection.uiContentSizeCategory. Kapag nagbago ang system setting, tinatawag ng iOS ang traitCollectionDidChange sa lahat ng UIView. Sa paraang ito, kailangan i-update ang mga font at muling kalkulahin ang layout. Awtomatikong ginagawa ito ng SwiftUI — ang UIKit ay nangangailangan ng manu-manong subscription.
Para sa UICollectionView, gumamit ng UICollectionViewCompositionalLayout — awtomatiko nitong inaayos ang bilang ng mga column sa lapad ng screen at laki ng teksto. Sa mga antas ng accessibility, lumipat mula sa dalawang-column patungo sa isang-column na layout upang hindi maputol ang teksto at hindi magsapawan ang mga elemento. Gumamit ng conditional na layout: para sa regular width — dalawang column, para sa compact o accessibility — isang column.
Pangunahing pagpapatupad sa UIKit — UIFont.preferredFont(forTextStyle:). Ibinabalik ng paraang ito ang font na naka-scale ayon sa kasalukuyang setting ng system:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
Para sa mga custom na font gumamit ng UIFontMetrics:
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
.scaledFont(for: customFont)
// Pagsubaybay sa mga pagbabago sa laki
NotificationCenter.default.addObserver(
self,
selector: #selector(preferredContentSizeChanged),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
Para sa UILabel sa Interface Builder, sapat na itakda ang font bilang estilo ng teksto (Text Style) at i-on ang “Automatically Adjusts Font”. Para sa mga custom na font, hindi sinusuportahan ng IB ang UIFontMetrics — sa pamamagitan lamang ng code.
Gumagamit ang UIFontMetrics ng parehong scaling curve gaya ng preferredFont. Maaari mong itakda ang fromTextStyle: .body, .headline, atbp. Ang bawat estilo ay may sariling coefficient ng pag-scale. Ang Body ay nag-scale nang katamtaman, ang Large Title — nang agresibo. Kung ang iyong custom na font ay ginagamit para sa pangunahing teksto, gamitin ang .body.
Sa SwiftUI, ang suporta para sa Dynamic Type ay naka-built in bilang default. Lahat ng system modifier (.font(.body), .font(.title)) ay awtomatikong nag-scale. Hindi kailangan ng developer na tawagan ang UIFont.preferredFont.
Halimbawa:
Text("Pangunahing teksto")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
Para sa mga custom na scale gumamit ng DynamicTypeSize:
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("Adaptive na teksto")
.font(.body)
.padding(dynamicTypeSize <= .large ? 8 : 16)
}
Awtomatikong ina-update ng SwiftUI ang view kapag nagbago ang system text size — walang karagdagang subscription sa notification.
Ang modifier na .font(.body) ay gumagana lamang para sa system font. Para sa mga custom na font sa SwiftUI, gumamit ng Font.custom na may UIFontMetrics sa ilalim. Simula sa iOS 16, sinusuportahan ng SwiftUI ang DynamicTypeSize sa @Environment, na nagpapahintulot sa pag-angkop ng mga spacing at layout.
Auto Layout — sapilitang kondisyon para sa suporta sa Dynamic Type. Ang mga nakapirming lapad at taas (>=, <=) ay nasisira sa mga sukat ng accessibility. Gumamit ng intrinsicContentSize para sa UILabel — awtomatiko nitong kinakalkula ang taas batay sa kasalukuyang laki ng font.
Mga panuntunan ng adaptive layout:
Para sa mahabang teksto (hal. mga artikulo, mga tuntunin ng paggamit), itakda ang minimumScaleFactor sa UILabel — pinapaliit nito ang teksto bilang huling paraan kapag hindi mailagay ng Auto Layout ang nilalaman. Ang halagang 0.5 ay nangangahulugang ang font ay maaaring lumiit hanggang 50% ng gustong laki.
Halimbawa ng pag-aangkop ng mga puwang sa kategorya ng laki:
let isAccessibility = traitCollection
.preferredContentSizeCategory.isAccessibilityCategory
stackView.spacing = isAccessibility ? 16 : 8
button.contentEdgeInsets = isAccessibility
? UIEdgeInsets(top: 16, left: 24, bottom: 16, right: 24)
: UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
Pagputol ng teksto — UILabel na may numberOfLines = 1 at nakapirming lapad ay pumuputol ng teksto sa AccessibilityXL. Solusyon: numberOfLines = 0 at trailing constraint. Pagsasapawan ng elemento — mga button na may nakapirming taas ay nagsasapawan. Solusyon: UIStackView na may automatic spacing. Paglabas sa hangganan ng screen — ScrollView ay sapilitan sa mga antas ng accessibility.
Ang Xcode Simulator ay nagpapahintulot na baguhin ang laki ng teksto: sa menu ng simulator Settings → Accessibility → Display & Text Size → Larger Text. Lumipat sa pagitan ng lahat ng 11 antas at suriin kung ang teksto ay hindi pinuputol, ang mga button ay naa-access, at ang layout ay hindi nasisira.
Para sa automated na pagsubok gamitin ang setting ng contentSizeCategory sa XCUIApplication:
func testAccessibilitySizes() {
let app = XCUIApplication()
app.launchArguments += [
"-UIPreferredContentSizeCategoryName",
"UICTContentSizeCategoryAccessibilityXXXL"
]
app.launch()
app.scrollViews.buttons["Ipadala"].tap()
XCTAssertTrue(app.staticTexts["Naipadala ang form"]
.waitForExistence(timeout: 5))
}
Ang XCUITest na may iba't ibang launchArguments ay nagpapahintulot sa pagsuri ng lahat ng antas ng pag-scale sa CI. Huwag kalimutang suriin ang mga kategorya ng accessibility nang hiwalay — sila ang kadalasang sumisira ng layout. Ayon sa Apple, 70% ng mga bug sa Dynamic Type ay natutuklasan mismo sa mga antas ng accessibility, dahil sinusubok lamang ng mga developer ang mga karaniwang sukat.
Ipinapakita ng Xcode Accessibility Inspector kung anong mga font ang ginagamit ng napiling elemento — nakapirma o scalable. Kung ang elemento ay hindi tumutugon sa pagbabago ng laki ng teksto sa simulator, nangangahulugan ito na gumagamit ito ng nakapirming font. Palitan ito ng UIFont.preferredFont o UIFontMetrics.
Mga Madalas Itanong
Ito ay awtomatikong pag-scale ng teksto sa application ayon sa mga system setting ng laki. Binabago ng user ang laki sa Settings — lahat ng sumusuportang application ay umaangkop nang walang interbensyon ng developer.
Hindi. Para sa mga custom na font gamitin ang UIFontMetrics(scaledFont:). Ang paraan ay nag-scale ng anumang font kaugnay ng tinukoy na estilo ng teksto, pinapanatili ang mga proporsyon.
11 antas: 5 na karaniwan (XS, S, M, L, XL) at 6 na antas ng accessibility (mula AccessibilityXL hanggang AccessibilityXXXXXL). Ang laki ng body font ay maaaring mag-iba mula 14px hanggang 53px.
Sa UIKit sa pamamagitan ng UIContentSizeCategory.didChangeNotification. Sa SwiftUI gamitin ang @Environment(\.dynamicTypeSize) — awtomatikong mag-a-update ang view kapag nagbago ang system setting.
Ang mga user na may pinalaking font ay makakakita ng naputol na teksto, nagsasapawang elemento, at hindi gumaganang mga button. Ang application ay maaaring tanggihan sa pagsusuri ng App Store dahil sa paglabag sa mga kinakailangan sa accessibility.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din