Работата с текст е ключова задача при създаването на интерфейси на съвременни мобилни приложения. От избора на шрифт до настройката на разстоянието между символите — всеки аспект влияе върху възприемането на продукта. Според документацията на Apple NSAttributedString, правилното форматиране на текст е пряко свързано с четливостта и достъпността на интерфейса.
Основни точки
NSAttributedString е основният iOS клас за работа с форматиран текст. Той позволява прилагането на атрибути към отделни символи или диапазони: шрифт чрез UIFont, цвят чрез UIColor, разстояние между символи чрез kern и междуредие чрез NSMutableParagraphStyle. В мобилните приложения NSAttributedString се използва навсякъде — от UILabel до сложни UITextView с поддръжка на редактиране.
UIFont е основният клас за работа с шрифтове на iOS. Той поддържа системни шрифтове, персонализирани шрифтове и Dynamic Type. UIFont(name:size:) зарежда шрифт по име, UIFont.systemFont(ofSize:weight:) зарежда системния шрифт. UIFontDescriptor позволява модифициране на съществуващ шрифт: промяна на размер, тегло или добавяне на трансформационна матрица. За персонализирани шрифтове файлът .ttf се добавя към проекта и се регистрира в Info.plist под ключа Fonts provided by application.
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont(name: "HelveticaNeue-Bold", size: 18) as Any,
.foregroundColor: UIColor.darkGray as Any,
.kern: 1.5 as Any
]
let attributedString = NSAttributedString(
string: "Форматированный текст",
attributes: attributes
)
label.attributedText = attributedString
NSMutableParagraphStyle е променяема версия на ParagraphStyle за конфигуриране на показването на абзаци. Той контролира подравняването (alignment), междуредието (lineSpacing), отстъпите (headIndent, tailIndent) и режима на прекъсване (lineBreakMode). ParagraphStyle е критичен за четливостта на дълги текстове на мобилни устройства: правилното lineSpacing предотвратява сливането на редове, а lineBreakMode предотвратява отрязването на думи. Настройката paragraphSpacing определя разстоянието между абзаците.
SpannableString е основният инструмент за форматиране на текст на Android. Той работи чрез механизъм от Span обекти, всеки от които отговаря за един аспект: StyleSpan за получер или курсив, ForegroundColorSpan за цвят, URLSpan за връзки, UnderlineSpan за подчертаване. SpannableStringBuilder е аналогът на NSMutableAttributedString, позволяващ изграждане на текст от множество фрагменти. Разбирането на SpannableString е необходимо за създаване на гъвкави интерфейси с форматиран текст в мобилни приложения.
Typeface е класът за работа с шрифтове на Android. Той поддържа системните шрифтове Roboto и Noto, както и персонализирани шрифтове. Typeface.createFromResource() зарежда шрифт от res/font/, Typeface.createFromAsset() от папката assets. Android 8.0+ поддържа шрифтови семейства в XML, комбинирайки множество файлове с шрифтове в един ресурс. Персонализиран шрифт за текст в мобилни приложения на Android се задава чрез атрибута android:fontFamily или програмно чрез setTypeface().
TextMeasurer (API 29+) е модерен инструмент за измерване на текст без обвързване с View. Той изчислява ширина, височина и позиции на символите преди рендиране. На по-стари API се използва Paint.measureText() за едноредов текст или StaticLayout за многоредов текст. TextMeasurer е особено полезен в персонализирани изгледи, където текстът се рисува чрез Canvas.drawText(). Правилното измерване предотвратява отрязването на символи в интерфейса.
val spannable = SpannableString("Жирный текст с цветом")
spannable.setSpan(
StyleSpan(Typeface.BOLD),
0, 6,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable.setSpan(
ForegroundColorSpan(Color.RED),
14, 19,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable
Типографията в мобилните приложения е цялостна конфигурация на шрифтове, разстояние между символи и междуредие. Правилната типография в мобилната разработка пряко влияе върху четливостта на текста и визуалното възприемане на интерфейса. Нека разгледаме ключовите параметри, достъпни на двете платформи.
Кернинг е регулиране на разстоянието между конкретни двойки символи (AV, To, Wa). Тракинг е равномерно разстояние между символите за целия текст или част от него. На iOS кернингът се задава чрез NSKernAttributeName, на Android — чрез свойството letterSpacing на TextView. Отрицателните стойности сближават символите, положителните ги раздалечават. Типографията в мобилната разработка изисква внимателно настройване на тези параметри: за големи заглавия разстоянието между символите обикновено се увеличава, за основния текст остава стандартно.
| Параметър | iOS | Android |
|---|---|---|
| Стилизиран низ | NSAttributedString | SpannableString |
| Шрифт | UIFont / CTFont | Typeface |
| Разстояние между символи | NSKernAttributeName | letterSpacing |
| Междуредие | lineSpacing | lineSpacingExtra |
| Лигатури | NSLigatureAttributeName | OpenType функции |
| Елипсис | lineBreakMode .byTruncatingTail | android:ellipsize |
Лигатурите са специални глифове, които заместват комбинации от два или повече символа: fi, fl, ffi. На iOS лигатурите се управляват чрез NSLigatureAttributeName: 0 — изключени, 1 — стандартни, 2 — всички налични. На Android лигатурите се управляват на ниво шрифт чрез OpenType функции. Включването на лигатури подобрява външния вид на текста, особено при шрифтове със серифи. Типографията в мобилната разработка използва лигатури предимно за заглавия и лога.
Персонализираните шрифтове са един от основните инструменти за създаване на уникален визуален стил на приложението. Те помагат да се подчертае марката и да се подобри потребителското изживяване. В мобилните приложения персонализираните шрифтове се използват за заглавия, лога, акцентни елементи и корпоративна идентичност.
Променливите шрифтове са съвременна шрифтова технология, при която един файл съдържа множество стилове: от тънък до екстра дебел, от тесен до широк. Това намалява размера на приложението, като заменя няколко шрифтови файла с един. На iOS променливите шрифтове се поддържат чрез UIFont с параметър weight. На Android — чрез Typeface.Builder с посочване на осите на променливост wght, wdth, slnt. Използването на променливи шрифтове опростява типографията в мобилните приложения: разработчикът не трябва да зарежда отделни файлове за всеки стил.
let customFont = UIFont(name: "CustomFont-Regular", size: 16)
let scaledFont = UIFontMetrics.default
.scaledFont(for: customFont)
label.font = scaledFont
label.adjustsFontForContentSizeCategory(true)
NSTextAttachment на iOS позволява вграждане на UIImage в NSAttributedString — изображението се подравнява спрямо базовата линия и се движи заедно с текста. На Android аналогът е ImageSpan в SpannableString. И двата подхода са полезни за чат с емоджи, новинарски емици с икони и формуляри с персонализирани квадратчета за отметка. Важно е правилно да мащабирате изображението спрямо височината на шрифта, така че текстът и графиката да изглеждат хармонично.
Освен основното форматиране, текстът в мобилните приложения поддържа допълнителни визуални ефекти: сенки, контури, зачертаване и подчертаване. Тези инструменти разширяват възможностите на типографията, но изискват внимателно прилагане за запазване на четливостта.
Сянка на текст на iOS се задава чрез NSShadow с offset, blurRadius и color. Контур — чрез NSStrokeWidthAttributeName: отрицателните стойности създават запълване с контур, положителните — само контур. Зачертаване — NSUnderlineStyle (.single, .thick, .double). На Android сянката на TextView се конфигурира чрез android:shadowRadius, android:shadowDx, android:shadowDy. SpannableString поддържа StrikethroughSpan и UnderlineSpan. Контурът на текст на Android се реализира чрез OutlineSpan или персонализиран шрифт.
Елипсис е отрязване на текст с многоточие при препълване на контейнера. На iOS се конфигурира чрез lineBreakMode .byTruncatingTail и numberOfLines. На Android — чрез android:ellipsize="end" и android:maxLines. Marquee е анимация с превъртащ се текст, достъпна на Android чрез android:ellipsize="marquee". На iOS няма вграден аналог — използва се библиотеката MarqueeLabel. Елипсисът е задължителен за всички едноредови текстове в мобилни приложения, за да се избегне отрязване на съдържанието.
Dynamic Type е адаптивна текстова система на iOS, която регулира размера на шрифта според настройките за достъпност на потребителя. Използвайте UIFontMetrics за мащабиране на персонализирани шрифтове. Dynamic Type е задължителен за приложения, съвместими с достъпност. На Android аналогът са единиците sp и scaledPixels, които се мащабират според системните настройки за размер на текста.
Често задавани въпроси
NSAttributedString е iOS клас за създаване на форматиран текст с атрибути на шрифт, цвят и стил на ниво символи и диапазони.
SpannableString е Android клас за маркиране на текст чрез Span обекти: ForegroundColorSpan, StyleSpan, URLSpan, UnderlineSpan.
Добавете .ttf файла към проекта, посочете го в Info.plist под ключа Fonts provided by application, след което използвайте UIFont(name:).
Поставете .ttf файла в res/font/, създайте XML шрифтово семейство и посочете android:fontFamily или използвайте Typeface.createFromAsset().
Кернинг е разстоянието между двойки символи. Лигатурите са специални глифове за комбинации от букви. Те се управляват чрез NSKernAttributeName и NSLigatureAttributeName.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.