ParagraphStyle — əsas anlayışlar, xüsusiyyətlər və tətbiq

Müəllif: IT Sectr Dərc olunub: 2026-07-25 Oxuma vaxtı: 10 dəq

ParagraphStyle — mətn abzasının vizual görünüşünü müəyyən edən formatlama parametrləri toplusudur. Mobil inkişafda ParagraphStyle düzləndirmə (left, center, right, justified), sətirarası boşluqlar, ilk sətrin abzası, abzaslar arası boşluqlar və mətn istiqamətini əhatə edir. Material Design Typography Guidelines (2025) məlumatına görə, ParagraphStyle-nin tətbiqin bütün ekranlarında ardıcıl istifadəsi vahid tipoqrafik ritmi təmin edir və bölmələr arasında keçid zamanı vizual səs-küyü azaldır.

Əsas məqamlar

  • ParagraphStyle — abzas formatlama parametrləri obyekti: düzləndirmə, abzaslar, boşluqlar.
  • Platformalar — iOS: NSMutableParagraphStyle, Android: ParagraphStyle (Compose) / Layout (View), Flutter: TextStyle.
  • Düzləndirmə — left əsas mətn üçün, center başlıqlar üçün, justified kitab formatı üçün.
  • Abzaslar — firstLineHeadIndent (abzas xətti), paragraphSpacing (abzaslararası boşluq).
  • Lokallaşdırma — ParagraphStyle müxtəlif dillər üçün mətn istiqamətini (LTR/RTL) nəzərə alır.

Tipoqrafiyada ParagraphStyle nədir

ParagraphStyle (abzas stili) — bir və ya bir neçə mətn abzasına tətbiq edilən formatlama qaydaları məcmusudur. Ayrı-ayrı simvollar səviyyəsində işləyən simvol stillərindən (bold, italic, font-size) fərqli olaraq, ParagraphStyle makro-xüsusiyyətləri idarə edir: mətnin konteynerdə yerləşməsi, sətir və abzaslar arası məsafələr, yazı istiqaməti və köçürmə qaydaları.

Tarixən ParagraphStyle anlayışı masaüstü nəşriyyat sistemlərindən (QuarkXPress, PageMaker, InDesign) gəlir, burada hər abzasın öz parametrlər dəsti var idi. Mobil inkişafda bu yanaşma proqram API-lərinə çevrildi: iOS-da NSMutableParagraphStyle, Android-də ParagraphStyle və LineBreakStyle sinifləri, həmçinin Flutter-da textAlign və textHeightBehavior kimi parametrlər. Hamısı eyni vəzifəni həll edir — abzas formatlamasının idarə edilməsi kod vasitəsilə, konkret mətn mühərrikinə bağlanmadan.

Bringhurst — The Elements of Typographic Style (2024) məlumatına görə, ParagraphStyle-nin düzgün konfiqurasiyası interfeysin tipoqrafik mədəniyyətinin əsasıdır. Əgər şrift və ölçü mətnin „səsinə" cavabdehdirsə, abzas stili onun „nəfəsinə": ritm, pauza və vurğulara cavabdehdir. Məkanın məhdud olduğu mobil interfeyslərdə düzgün ParagraphStyle oxunaqlılığı itirmədən daha çox məlumat yerləşdirməyə imkan verir.

ParagraphStyle-nin əsas xüsusiyyətləri

ParagraphStyle bir neçə xüsusiyyət qrupunu əhatə edir, hər biri formatlamanın müəyyən aspektinə cavabdehdir. Mobil API-lərdə mövcud olan əsas parametrləri nəzərdən keçirək. Düzləndirmə (alignment) — mətnin üfüqi vəziyyətini təyin edən əsas parametrdir. iOS-da NSTextAlignment, Android-də Layout.Alignment, Flutter-da TextAlign mövcuddur.

XüsusiyyətiOS (NSMutableParagraphStyle)Android (Compose)Flutter (TextStyle)
DüzləndirməalignmenttextAligntextAlign
Sol abzasheadIndenttextIndent (Compose-da)
Sağ abzastailIndent
Abzas xəttifirstLineHeadIndenttextIndent (firstLine)
Abzaslar arası boşluqparagraphSpacingparagraphStyle (lineHeight)
Abzasdan əvvəl boşluqparagraphSpacingBefore
Mətn istiqamətibaseWritingDirectionTextDirection (Compose)textDirection
Sətir qırma rejimilineBreakModeoverflow (TextStyle)overflow (TextStyle)

Anlamaq vacibdir ki, bütün xüsusiyyətlər bütün platformalarda eyni həcmdə mövcud deyil. Məsələn, ilk sətrin abzası (firstLineHeadIndent) tam şəkildə yalnız iOS-da NSMutableParagraphStyle vasitəsilə dəstəklənir. Android-də bu məqsədlə LeadingMarginSpan ilə SpannableString, Flutter-da isə xüsusi TextSpan və padding ilə RichText istifadə olunur. Platformalararası inkişafda (Flutter, React Native) ParagraphStyle-nin bəzi xüsusiyyətlərini konteynerlər və ya Spacer vasitəsilə emulyasiya etmək lazım gəlir.

iOS-da ParagraphStyle: NSMutableParagraphStyle

iOS-da abzas stili ilə iş üçün əsas vasitə NSMutableParagraphStyle sinfidir — NSParagraphStyle-dən miras alır. O, abzas formatlamasını idarə etmək üçün tam xüsusiyyətlər dəsti təqdim edir və NSAttributedString vasitəsilə tətbiq olunur. NSMutableParagraphStyle təkcə UILabel və UITextView-də deyil, həm də Core Text-də CTParagraphStyle vasitəsilə istifadə olunur.

swift
// iOS: tam ParagraphStyle konfiqurasiyası
let paragraphStyle = NSMutableParagraphStyle()

// Düzləndirmə
paragraphStyle.alignment = .justified     // justified

// Abzas
paragraphStyle.headIndent = 16          // sol abzas
paragraphStyle.tailIndent = -16         // sağ abzas (mənfi)
paragraphStyle.firstLineHeadIndent = 32 // ilk sətrin abzası

// Abzas boşluğu
paragraphStyle.paragraphSpacing = 12    // abzasdan sonra
paragraphStyle.paragraphSpacingBefore = 8 // abzasdan əvvəl

// Sətir hündürlüyü
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
)

SwiftUI-da NSMutableParagraphStyle-in birbaşa analoqu yoxdur — bunun əvəzinə modifierlərin kombinasiyası istifadə olunur: .multilineTextAlignment() düzləndirmə üçün, .lineSpacing() sətirarası boşluq üçün. SwiftUI-da ilk sətrin abzası və abzaslararası boşluqlar üçün Text + padding və ya AttributedString (iOS 15+ mövcuddur) istifadə etmək lazımdır.

swift
// SwiftUI: AttributedString ilə 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)

Apple — Text Programming Guide (2025) məlumatına görə, NSMutableParagraphStyle 14-ə qədər müxtəlif formatlama parametrini dəstəkləyir. Eyni zamanda yadda saxlamaq vacibdir ki, tailIndent konteynerin eninə nisbətən mənfi qiymətlə, headIndent isə müsbət qiymətlə təyin edilir. Bu qeyri-aşkar davranış tez-tez təcrübəsiz iOS tərtibatçılarında səhvlərə səbəb olur.

Android-da ParagraphStyle: View-sistem və Compose

Android-də ParagraphStyle-ə yanaşma View-sistem və Jetpack Compose arasında fərqlənir. Klassik View-sistemdə abzas parametrləri TextView-in XML atributları (android:textAlignment, android:lineSpacingExtra) və ya android.text.style paketindən ParagraphStyle interfeysinin tətbiqləri ilə SpannableString vasitəsilə təyin edilir.

kotlin
// Android View sistemi: SpannableString ilə ParagraphStyle
val text = "First paragraph with settings.\n\nSecond paragraph."
val spannable = SpannableString(text)

// Justified düzləndirmə
spannable.setSpan(
    AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
    0, text.length,
    Spannable.SPAN_PARAGRAPH
)

// LeadingMarginSpan ilə ilk sətrin abzası
spannable.setSpan(
    LeadingMarginSpan.Standard(0, 20),
    0, text.indexOf('\n'),
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

textView.text = spannable

Jetpack Compose-da ParagraphStyle TextStyle parametrləri vasitəsilə idarə olunur. Düzləndirmə üçün textAlign, sətirarası boşluq üçün lineHeight (sp və ya em ilə), ilk sətrin abzası üçün textIndent istifadə olunur. Compose həmçinin köçürmələrin incə idarə edilməsi üçün LineBreak-i dəstəkləyir (Simple, Heading, Paragraph).

kotlin
// Jetpack Compose: TextStyle ilə ParagraphStyle
Text(
    text = "Xüsusi stillə ilk abzas.\n\nAbzasla ikinci abzas.",
    style = TextStyle(
        textAlign = TextAlign.Justify,
        lineHeight = 24.sp,
        textIndent = TextIndent(firstLine = 16.sp),
        lineBreak = LineBreak.Paragraph
    )
)

Android Developers — Compose ParagraphStyle (2025) məlumatına görə, Compose-da TextIndent istifadə edərkən firstLine-i sp ilə (dp ilə yox) təyin etmək vacibdir, çünki ilk sətrin abzası mətnlə birlikdə miqyaslanmalıdır. Əgər abzas dp ilə təyin edilərsə, şrift ölçüsü artdıqda abzas xətti vizual olaraq kiçiləcək, bu da tipoqrafik nisbətləri pozacaq.

Flutter-da ParagraphStyle: TextHeightBehavior və StrutStyle

Flutter-da ParagraphStyle paradigması ayrıca sinfə ayrılmayıb — bunun əvəzinə TextStyle parametrlərinin və əlavə siniflərin kombinasiyası istifadə olunur. Düzləndirmə TextAlign vasitəsilə, sətirarası boşluqlar height (vahidsiz) vasitəsilə, TextHeightBehavior isə ilk və son sətrin görünən abzaslarını idarə edir.

dart
// Flutter: Text parametrləri ilə ParagraphStyle
Text(
    'Flutter-da stilləşdirilmiş abzas.\n\nAbzaslarla ikinci abzas.',
    style: TextStyle(
        fontSize: 16,
        height: 1.5,
        leadingDistribution: TextLeadingDistribution.proportional,
    ),
    textAlign: TextAlign.justify,
    textHeightBehavior: TextHeightBehavior(
        applyHeightToFirstAscent: true,
        applyHeightToLastDescent: true,
    ),
)

Daha mürəkkəb ssenarilər üçün Flutter RichText-dən xüsusi TextSpan və WidgetSpan ilə istifadə etməyi təklif edir. Bu, bir abzasda mətni inline vidjetlərlə (ikonlar, şəkillər) birləşdirməyə, vahid formatlama qaydalarını qorumağa imkan verir. Lakin bu yanaşma əl ilə köçürmə idarəçiliyi tələb edir və avtomatik köçürmə qoyuluşunu dəstəkləmir.

dart
// Flutter: xüsusi abzas formatlaması ilə RichText
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.'),
        ],
    ),
)

Flutter Documentation — Text Widget (2025) məlumatına görə, TextHeightBehavior Flutter-da ParagraphStyle-in düzgün göstərilməsi üçün əsas parametrdir. Əgər applyHeightToFirstAscent false-ə təyin edilərsə, ilk sətrin yuxarı abzası nəzərə alınmır və mətn konteynerin yuxarı sərhəddinə „yapışır". Bu başlıqlar üçün faydalıdır, lakin əsas mətn üçün arzuolunmazdır.

ParagraphStyle və lokallaşdırma: LTR/RTL və regional xüsusiyyətlər

ParagraphStyle hər bir lokallaşdırma üçün yazı istiqamətini nəzərə almalıdır. Ərəb, ivrit və ya urdu (sağdan sola yazı, RTL) dəstəkləyən mobil tətbiqlərdə abzaslar və düzləndirmə güzgü şəklində dəyişməlidir. iOS baseWritingDirection = .natural vasitəsilə avtomatik keçidi, Android TextDirection vasitəsilə, Flutter textDirection vasitəsilə dəstəkləyir.

RTL lokalları üçün düzləndirmənin konfiqurasiyası xüsusi diqqət tələb edir. Əgər LTR rejimində headIndent sol abzası təyin edirsə, RTL-də avtomatik olaraq sağ abzasa çevrilir. Lakin bütün tətbiqlər düzləndirmənin açıq şəkildə təyin edilməsi zamanı (NSTextAlignment.left əvəzinə NSTextAlignment.natural) bu keçidi düzgün idarə etmir. Google Internationalization Guide (2025) məlumatına görə, çoxdilli tətbiqlər üçün həmişə natural alignment istifadə et və hər iki düzendə abzasları yoxla.

kotlin
// Android: ParagraphStyle-də RTL dəstəyi
val textView = TextView(context)

// Avtomatik RTL dəstəyini aktivləşdir
textView.textDirection = View.TEXT_DIRECTION_LOCALE
textView.textAlignment = View.TEXT_ALIGNMENT_TEXT_START

// RTL dəstəyi ilə Spannable
val spannable = SpannableString(arabicText)
spannable.setSpan(
    AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
    0, arabicText.length,
    Spannable.SPAN_PARAGRAPH
)

Regional xüsusiyyətlər həmçinin ilk sətrin abzası üçün fərqli qaydaları əhatə edir. Avropa tipoqrafikasında abzas xətti (firstLineHeadIndent) abzas vurğulanması üçün standartdır. Yapon və Çin tipoqrafikasında ilk sətrin abzası da istifadə olunur, lakin onun ölçüsü fərqlənə bilər (adətən Avropa ənənəsində 1.5 em-ə qarşı 1 em). Ərəb tipoqrafikasında abzas xətti nadirdir, abzaslar daha çox şaquli boşluqla ayrılır.

ParagraphStyle ilə işdə tipik səhvlər

Ən geniş yayılmış səhv — ParagraphStyle-dən yalnız mətn sahəsinin qlobal atributları vasitəsilə istifadə etmək ayrı-ayrı abzasların müxtəlif formatlamasını nəzərə almadan. \n ilə ayrılmış çoxsaylı abzasları olan UILabel və ya TextView-də ParagraphStyle, hər abzas üçün müxtəlif stillərlə attributed-text istifadə edilməzsə, bütün mətnə eyni şəkildə tətbiq olunur.

  • paragraphSpacingBefore-in nəzərə alınmaması — bir çox tərtibatçı paragraphSpacing təyin edir, lakin paragraphSpacingBefore-u unudur. Blokdakı ilk abzas üçün paragraphSpacingBefore əlavə konteyner yaratmadan yuxarıdan boşluq təyin etməyə imkan verir. Bu, başlıqları olan siyahılar üçün xüsusilə faydalıdır.
  • Natural əvəzinə sərt düzləndirmə (left/right) — tətbiq RTL lokallarını dəstəkləyirsə, natural əvəzinə NSTextAlignment.left və ya TextAlign.Start istifadəsi ərəb və ivrit lokallarında səhv göstərilməyə səbəb olur.
  • Köçürmə yoxlamasının olmaması (line break mode) — dar konteynerlərdə (siyahılar, sidebar) səhv lineBreakMode sözlərin kəsilməsinə səbəb olur. byWordWrapping istifadə et və konkret lokallaşdırma kontekstində uzun sözləri yoxla.
  • Müxtəlif ParagraphStyle ilə Spannable qarışdırılması — SPAN_PARAGRAPH ilə Spannable təyin edərkən abzas sərhədlərini düzgün hesablamaq vacibdir. Başlanğıc/son mövqenin faktiki abzas sərhədləri ilə uyğunsuzluğu stilin nəzərə alınmamasına səbəb olur.
  • Unudulmuş baseline düzləndirməsi — sabit lineHeight (minimumLineHeight) ilə ParagraphStyle istifadə edərkən mətnin baseline-a düzləndirilməsinin aktiv olduğuna əmin ol. iOS-da bunun üçün label.baselineAdjustment = .alignBaselines istifadə olunur.

UX Collective — Common Typography Bugs in Mobile Apps (2025) məlumatına görə, ParagraphStyle ilə bağlı problemlər mobil tətbiqlərdə bütün tipoqrafik səhvlərin 18%-ni təşkil edir. Ən kritik hallar səhv paragraphSpacing-in müxtəlif sətirlərdə mətnin üst-üstə düşməsinə və ya RTL lokallarının LTR abzasları ilə göstərilməsinə səbəb olduqda baş verir. Hər bir ParagraphStyle parametri üçün müxtəlif dillərdə test sətirləri ilə vahid testlər yaratmaq tövsiyə olunur.

Tez-tez verilən suallar

iOS-da ParagraphStyle TextStyle-dən nə ilə fərqlənir?

NSMutableParagraphStyle abzas formatlamasını (düzləndirmə, abzaslar, sətirarası boşluqlar) idarə edir, TextStyle isə simvol atributlarını (şrift, rəng, ölçü) idarə edir. Hər ikisi NSAttributedString vasitəsilə tətbiq olunur. ParagraphStyle abzas səviyyəsində, TextStyle simvol səviyyəsində işləyir. Bir abzasda bir neçə TextStyle ola bilər, lakin ParagraphStyle — yalnız bir.

Jetpack Compose-da abzas xəttini necə təyin etməli?

Jetpack Compose-da ilk sətrin abzası TextStyle daxilində TextIndent vasitəsilə təyin edilir: TextStyle(textIndent = TextIndent(firstLine = 16.sp)). Qiymət sp ilə olmalıdır ki, mətnlə miqyaslansın. Çoxsətirli mətn üçün abzas yeni abzas başlayan hər sətrə (\n simvolu) tətbiq olunur. İlk abzas üçün abzas həmişə tətbiq olunur.

SwiftUI-da abzaslar arası boşluğu necə konfiqurasiya etməli?

SwiftUI-da paragraphSpacing-in birbaşa analoqu yoxdur. Abzaslar arası boşluq üçün AttributedString (iOS 15+) istifadə et, NSMutableParagraphStyle və paragraphSpacing xüsusiyyəti ilə. Və ya abzasları Text("...\n\n...") vasitəsilə ayır və mətn blokları arasında .padding() əlavə et. Mürəkkəb tipoqrafik ssenarilər üçün UILabelRepresentable vasitəsilə NSAttributedString istifadə et.

Nə üçün paragraphSpacing Android TextView-də işləmir?

Android-də TextView-in paragraphSpacing xüsusiyyəti yoxdur — o, SpannableString ilə LeadingMarginSpan və ya xüsusi LineBackgroundSpan vasitəsilə təyin edilir. Sətirarası boşluq üçün setLineSpacing, abzaslararası boşluq üçün isə əlavə \n və ya bir neçə TextView-dən ibarət mürəkkəb konteyner istifadə et.

ParagraphStyle mobil tətbiqin əlçatanlığına necə təsir edir?

Düzgün ParagraphStyle əlçatanlığı yaxşılaşdırır: kifayət qədər paragraphSpacing koqnitiv pozuntuları olan istifadəçilərə abzas sərhədlərini daha yaxşı ayırd etməyə kömək edir. WCAG 2.2 abzasların vizual ayrılmasını tövsiyə edir (abzas və ya boşluq). paragraphSpacing 1.5 × line-height-dən az olmamalıdır. RTL lokalları üçün abzasların güzgü şəklində göstərildiyini yoxla.

Nəticə

  • ParagraphStyle — abzas formatlama qaydaları toplusu: düzləndirmə, abzaslar, sətirarası və abzaslararası boşluqlar.
  • iOS — 14+ parametrli NSMutableParagraphStyle, NSAttributedString vasitəsilə tətbiq olunur; SwiftUI-da AttributedString (iOS 15+).
  • Android View — ParagraphStyle tətbiqləri ilə SpannableString (AlignmentSpan, LeadingMarginSpan).
  • Android Compose — TextStyle.textAlign, lineHeight, textIndent və LineBreak köçürmələrin idarə edilməsi üçün.
  • Flutter — TextStyle.height, TextAlign, TextHeightBehavior və StrutStyle kombinasiyası sətir hündürlüyünün fiksasiyası üçün.
  • Lokallaşdırma — RTL lokalları üçün natural alignment istifadə et; hər iki düzendə abzasları yoxla.
  • Tipik səhvlər — natural əvəzinə sərt düzləndirmə, paragraphSpacingBefore-un nəzərə alınmaması, dar konteynerlər üçün səhv lineBreakMode.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun