ParagraphStyle — is een set opmaakparameters die de visuele weergave van een tekstparagraaf bepaalt. In mobiele ontwikkeling omvat ParagraphStyle uitlijning (left, center, right, justified), regelafstanden, inspringing van de eerste regel, afstanden tussen paragrafen en tekstrichting. Volgens de Material Design Typography Guidelines (2025) zorgt consistent gebruik van ParagraphStyle op alle schermen van de app voor een uniform typografisch ritme en vermindert het visuele ruis bij het schakelen tussen secties.
Belangrijkste
ParagraphStyle (paragraafstijl) — is een verzameling opmaakregels die worden toegepast op een of meer tekstparagrafen. In tegenstelling tot tekenstijlen (bold, italic, font-size) die op het niveau van afzonderlijke tekens werken, beheert ParagraphStyle macro-eigenschappen: plaatsing van tekst in de container, afstanden tussen regels en paragrafen, schrijfrichting en afbreekregels.
Historisch gezien komt het concept ParagraphStyle uit desktop publishing-systemen (QuarkXPress, PageMaker, InDesign), waar elke paragraaf zijn eigen set parameters had. In mobiele ontwikkeling is deze benadering getransformeerd naar programmatische API's: NSMutableParagraphStyle op iOS, de klassen ParagraphStyle en LineBreakStyle in Android, en parameters zoals textAlign en textHeightBehavior in Flutter. Ze lossen allemaal dezelfde taak op — beheer van paragraafopmaak via code, zonder gebonden te zijn aan een specifieke tekstengine.
Volgens Bringhurst — The Elements of Typographic Style (2024) is het correct configureren van ParagraphStyle de basis van de typografische cultuur van de interface. Als lettertype en grootte verantwoordelijk zijn voor de „stem" van de tekst, dan is de paragraafstijl verantwoordelijk voor de „ademhaling": ritme, pauzes en accenten. In mobiele interfaces, waar ruimte beperkt is, zorgt een juiste ParagraphStyle ervoor dat meer informatie kan worden geplaatst zonder verlies van leesbaarheid.
ParagraphStyle omvat verschillende groepen eigenschappen, die elk verantwoordelijk zijn voor een specifiek aspect van de opmaak. Laten we de belangrijkste parameters bekijken die beschikbaar zijn in mobiele API's. Uitlijning (alignment) — de belangrijkste parameter die de horizontale positie van de tekst bepaalt. Op iOS is NSTextAlignment beschikbaar, op Android — Layout.Alignment, in Flutter — TextAlign.
| Eigenschap | iOS (NSMutableParagraphStyle) | Android (Compose) | Flutter (TextStyle) |
|---|---|---|---|
| Uitlijning | alignment | textAlign | textAlign |
| Linker inspringing | headIndent | textIndent (in Compose) | — |
| Rechter inspringing | tailIndent | — | — |
| Inspringing eerste regel | firstLineHeadIndent | textIndent (firstLine) | — |
| Afstand tussen paragrafen | paragraphSpacing | paragraphStyle (lineHeight) | — |
| Afstand voor paragraaf | paragraphSpacingBefore | — | — |
| Tekstrichting | baseWritingDirection | TextDirection (Compose) | textDirection |
| Regelafbrekingmodus | lineBreakMode | overflow (TextStyle) | overflow (TextStyle) |
Het is belangrijk te begrijpen dat niet alle eigenschappen op alle platforms in dezelfde mate beschikbaar zijn. De inspringing van de eerste regel (firstLineHeadIndent) wordt bijvoorbeeld alleen volledig ondersteund in iOS via NSMutableParagraphStyle. In Android wordt hiervoor SpannableString met LeadingMarginSpan gebruikt, en in Flutter — RichText met aangepaste TextSpan en padding. Bij cross-platform ontwikkeling (Flutter, React Native) moeten sommige eigenschappen van ParagraphStyle worden geëmuleerd via containers of Spacer.
In iOS is het belangrijkste hulpmiddel voor het werken met paragraafstijl de klasse NSMutableParagraphStyle — een subclass van NSParagraphStyle. Het biedt een volledige set eigenschappen voor het beheren van paragraafopmaak en wordt toegepast via NSAttributedString. NSMutableParagraphStyle wordt niet alleen gebruikt in UILabel en UITextView, maar ook in Core Text via CTParagraphStyle.
// iOS: volledige ParagraphStyle-configuratie
let paragraphStyle = NSMutableParagraphStyle()
// Uitlijning
paragraphStyle.alignment = .justified // justified
// Inspringing
paragraphStyle.headIndent = 16 // linker inspringing
paragraphStyle.tailIndent = -16 // rechter inspringing (negatief)
paragraphStyle.firstLineHeadIndent = 32 // inspringing eerste regel
// Paragraafafstand
paragraphStyle.paragraphSpacing = 12 // na paragraaf
paragraphStyle.paragraphSpacingBefore = 8 // voor paragraaf
// Regelhoogte
paragraphStyle.minimumLineHeight = 24
paragraphStyle.maximumLineHeight = 24
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.paragraphStyle: paragraphStyle
]
let label = UILabel()
label.attributedText = NSAttributedString(
string: "This paragraph has a custom ParagraphStyle.\n\nSecond paragraph with 12 pt spacing.",
attributes: attributes
)
In SwiftUI is er geen direct equivalent van NSMutableParagraphStyle — in plaats daarvan wordt een combinatie van modifiers gebruikt: .multilineTextAlignment() voor uitlijning, .lineSpacing() voor regelafstand. Voor inspringing van de eerste regel en afstanden tussen paragrafen in SwiftUI moet Text + padding of AttributedString (beschikbaar vanaf iOS 15+) worden gebruikt.
// SwiftUI: AttributedString met ParagraphStyle (iOS 15+)
var attributed: AttributedString = """
This is the first paragraph with indent.
This is the second paragraph with 12 pt spacing.
"""
let ps = NSMutableParagraphStyle()
ps.paragraphSpacing = 12
ps.firstLineHeadIndent = 20
let container = AttributeContainer()
.paragraphStyle(ps)
attributed.mergeAttributes(container)
Text(attributed)
.font(.body)
Volgens Apple — Text Programming Guide (2025) ondersteunt NSMutableParagraphStyle tot 14 verschillende opmaakparameters. Het is belangrijk te onthouden dat tailIndent wordt ingesteld als een negatieve waarde ten opzichte van de containerbreedte, en headIndent als een positieve. Dit niet voor de hand liggende gedrag leidt vaak tot fouten bij beginnende iOS-ontwikkelaars.
In Android verschilt de benadering van ParagraphStyle tussen het View-systeem en Jetpack Compose. In het klassieke View-systeem worden paragraafparameters ingesteld via XML-attributen van TextView (android:textAlignment, android:lineSpacingExtra) of via SpannableString met implementaties van de ParagraphStyle-interface uit het pakket android.text.style.
// Android View-systeem: ParagraphStyle via SpannableString
val text = "First paragraph with settings.\n\nSecond paragraph."
val spannable = SpannableString(text)
// Gelijkmatige uitlijning
spannable.setSpan(
AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
0, text.length,
Spannable.SPAN_PARAGRAPH
)
// Inspringing eerste regel via LeadingMarginSpan
spannable.setSpan(
LeadingMarginSpan.Standard(0, 20),
0, text.indexOf('\n'),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable
In Jetpack Compose wordt ParagraphStyle beheerd via TextStyle-parameters. Voor uitlijning wordt textAlign gebruikt, voor regelafstand — lineHeight (in sp of em), voor inspringing van de eerste regel — textIndent. Compose ondersteunt ook LineBreak voor fijnmazig beheer van afbrekingen (Simple, Heading, Paragraph), wat vooral handig is voor meertalige tekst.
// Jetpack Compose: ParagraphStyle via TextStyle
Text(
text = "Eerste paragraaf met aangepaste stijl.\n\nTweede paragraaf met inspringing.",
style = TextStyle(
textAlign = TextAlign.Justify,
lineHeight = 24.sp,
textIndent = TextIndent(firstLine = 16.sp),
lineBreak = LineBreak.Paragraph
)
)
Volgens Android Developers — Compose ParagraphStyle (2025) is het bij gebruik van TextIndent in Compose belangrijk om firstLine in sp in te stellen (niet in dp), omdat de inspringing van de eerste regel moet meeschalen met de tekst. Als de inspringing in dp wordt ingesteld, wordt bij het vergroten van het lettertype de inspringing visueel kleiner, wat de typografische verhoudingen verstoort.
In Flutter is het paradigma van ParagraphStyle niet in een aparte klasse ondergebracht — in plaats daarvan wordt een combinatie van TextStyle-parameters en extra klassen gebruikt. Uitlijning wordt ingesteld via TextAlign, regelafstanden via height (unitless), en TextHeightBehavior beheert de zichtbare inspringingen van de eerste en laatste regel.
// Flutter: ParagraphStyle via Text-parameters
Text(
'Gestileerde paragraaf in Flutter.\n\nTweede paragraaf met inspringingen.',
style: TextStyle(
fontSize: 16,
height: 1.5,
leadingDistribution: TextLeadingDistribution.proportional,
),
textAlign: TextAlign.justify,
textHeightBehavior: TextHeightBehavior(
applyHeightToFirstAscent: true,
applyHeightToLastDescent: true,
),
)
Voor complexere scenario's biedt Flutter het gebruik van RichText met aangepaste TextSpan en WidgetSpan. Hiermee kan tekst worden gecombineerd met inline widgets (pictogrammen, afbeeldingen) in één paragraaf, met behoud van uniforme opmaakregels. Deze benadering vereist echter handmatig beheer van afbrekingen en ondersteunt geen automatische afbreking.
// Flutter: RichText met aangepaste paragraafopmaak
RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, height: 1.5),
children: [
TextSpan(text: 'First paragraph with icon '),
WidgetSpan(
child: Icon(Icons.star, size: 16),
alignment: PlaceholderAlignment.middle,
),
TextSpan(text: '\n\nSecond paragraph after spacing.'),
],
),
)
Volgens Flutter Documentation — Text Widget (2025) is TextHeightBehavior de belangrijkste parameter voor correcte weergave van ParagraphStyle in Flutter. Als applyHeightToFirstAscent is ingesteld op false, wordt de bovenste inspringing van de eerste regel genegeerd en „plakt" de tekst aan de bovenrand van de container. Dit is handig voor koppen, maar ongewenst voor hoofdtekst.
ParagraphStyle moet rekening houden met de schrijfrichting voor elke lokalisatie. In mobiele apps met ondersteuning voor Arabisch, Hebreeuws of Urdu (schrift van rechts naar links, RTL) moeten inspringingen en uitlijning gespiegeld veranderen. iOS ondersteunt automatisch schakelen via baseWritingDirection = .natural, Android — via TextDirection, Flutter — via textDirection.
Het configureren van uitlijning voor RTL-lokalisaties vereist speciale aandacht. Als in de LTR-modus headIndent de linker inspringing instelt, wordt deze in RTL automatisch rechts. Niet alle implementaties verwerken deze overgang echter correct bij expliciete instelling van uitlijning (NSTextAlignment.left in plaats van NSTextAlignment.natural). Volgens Google Internationalization Guide (2025) moet voor meertalige apps altijd natural alignment worden gebruikt en moeten inspringingen in beide lay-outs worden gecontroleerd.
// Android: RTL-ondersteuning in ParagraphStyle
val textView = TextView(context)
// Automatische RTL-ondersteuning inschakelen
textView.textDirection = View.TEXT_DIRECTION_LOCALE
textView.textAlignment = View.TEXT_ALIGNMENT_TEXT_START
// Spannable met RTL-ondersteuning
val spannable = SpannableString(arabicText)
spannable.setSpan(
AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
0, arabicText.length,
Spannable.SPAN_PARAGRAPH
)
Regionale kenmerken omvatten ook verschillende regels voor inspringing van de eerste regel. In de Europese typografie is de inspringing van de eerste regel (firstLineHeadIndent) de standaard voor paragraafmarkering. In de Japanse en Chinese typografie wordt ook inspringing van de eerste regel gebruikt, maar de grootte kan verschillen (meestal 1 em versus 1.5 em in de Europese traditie). In de Arabische typografie is inspringing van de eerste regel zeldzaam; paragrafen worden vaker gescheiden door verticale ruimte.
De meest voorkomende fout is het gebruik van ParagraphStyle alleen via globale attributen van het tekstveld zonder rekening te houden met verschillende opmaak van afzonderlijke paragrafen. In UILabel of TextView met meerdere paragrafen gescheiden door \n wordt ParagraphStyle gelijkmatig op de hele tekst toegepast, tenzij attributed-text met verschillende stijlen voor elke paragraaf wordt gebruikt.
Volgens UX Collective — Common Typography Bugs in Mobile Apps (2025) vormen problemen met ParagraphStyle 18% van alle typografische bugs in mobiele apps. Het meest kritisch zijn gevallen waarin onjuiste paragraphSpacing leidt tot overlapping van tekst op verschillende regels of wanneer RTL-lokalisaties worden weergegeven met LTR-inspringingen. Het wordt aanbevolen om unittesten te maken voor elke ParagraphStyle-parameter met testreeksen in verschillende talen.
Veelgestelde vragen
NSMutableParagraphStyle beheert paragraafopmaak (uitlijning, inspringingen, regelafstanden), terwijl TextStyle tekenattributen beheert (lettertype, kleur, grootte). Beide worden toegepast via NSAttributedString. ParagraphStyle werkt op paragraafniveau, TextStyle op tekenniveau. Meerdere TextStyle kunnen in één paragraaf voorkomen, maar ParagraphStyle — slechts één per paragraaf.
In Jetpack Compose wordt de inspringing van de eerste regel ingesteld via TextIndent binnen TextStyle: TextStyle(textIndent = TextIndent(firstLine = 16.sp)). De waarde moet in sp zijn om mee te schalen met de tekst. Voor meerregelige tekst wordt de inspringing toegepast op elke regel die een nieuwe paragraaf begint (teken \n). Voor de eerste paragraaf wordt de inspringing altijd toegepast.
In SwiftUI is er geen direct equivalent van paragraphSpacing. Gebruik voor afstand tussen paragrafen AttributedString (iOS 15+) met NSMutableParagraphStyle en de eigenschap paragraphSpacing. Of scheid paragrafen via Text("...\n\n...") en voeg .padding() toe tussen tekstblokken. Gebruik voor complexe typografische scenario's NSAttributedString via UILabelRepresentable.
TextView in Android heeft geen eigenschap paragraphSpacing — deze wordt ingesteld via SpannableString met LeadingMarginSpan of via aangepaste LineBackgroundSpan. Gebruik voor regelafstand setLineSpacing, voor afstand tussen paragrafen — scheid paragrafen met extra \n of gebruik een samengestelde container van meerdere TextView's.
Een juiste ParagraphStyle verbetert de toegankelijkheid: voldoende paragraphSpacing helpt gebruikers met cognitieve beperkingen om paragraafgrenzen beter te onderscheiden. WCAG 2.2 beveelt visuele scheiding van paragrafen aan (inspringing of ruimte). paragraphSpacing mag niet kleiner zijn dan 1.5 × line-height. Controleer voor RTL-lokalisaties of inspringingen gespiegeld worden weergegeven.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook