Praca z tekstem to kluczowe zadanie podczas tworzenia interfejsów nowoczesnych aplikacji mobilnych. Od wyboru czcionki po ustawienie odstępów między znakami — każdy aspekt wpływa na postrzeganie produktu. Według dokumentacji Apple NSAttributedString, prawidłowe formatowanie tekstu jest bezpośrednio związane z czytelnością i dostępnością interfejsu.
Najważniejsze punkty
NSAttributedString to podstawowa klasa iOS do pracy z sformatowanym tekstem. Pozwala na stosowanie atrybutów do pojedynczych znaków lub zakresów: czcionki przez UIFont, koloru przez UIColor, odstępu między znakami przez kern i odstępu między wierszami przez NSMutableParagraphStyle. W aplikacjach mobilnych NSAttributedString jest używany wszędzie — od UILabel po złożone UITextView z obsługą edycji.
UIFont to główna klasa do pracy z czcionkami na iOS. Obsługuje czcionki systemowe, niestandardowe i Dynamic Type. UIFont(name:size:) ładuje czcionkę po nazwie, UIFont.systemFont(ofSize:weight:) ładuje czcionkę systemową. UIFontDescriptor umożliwia modyfikację istniejącej czcionki: zmianę rozmiaru, wagi lub dodanie macierzy transformacji. Dla niestandardowych czcionek plik .ttf jest dodawany do projektu i rejestrowany w Info.plist pod kluczem 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 to modyfikowalna wersja ParagraphStyle do konfigurowania wyświetlania akapitów. Kontroluje wyrównanie (alignment), odstęp między wierszami (lineSpacing), wcięcia (headIndent, tailIndent) i tryb przycinania (lineBreakMode). ParagraphStyle jest kluczowy dla czytelności długich tekstów na urządzeniach mobilnych: odpowiedni lineSpacing zapobiega łączeniu się wierszy, a lineBreakMode zapobiega przycinaniu słów. Ustawienie paragraphSpacing definiuje odstęp między akapitami.
SpannableString to główne narzędzie do formatowania tekstu na Androidzie. Działa poprzez mechanizm obiektów Span, z których każdy odpowiada za jeden aspekt: StyleSpan dla pogrubienia lub kursywy, ForegroundColorSpan dla koloru, URLSpan dla linków, UnderlineSpan dla podkreślenia. SpannableStringBuilder jest odpowiednikiem NSMutableAttributedString, umożliwiając budowanie tekstu z wielu fragmentów. Zrozumienie SpannableString jest niezbędne do tworzenia elastycznych interfejsów z sformatowanym tekstem w aplikacjach mobilnych.
Typeface to klasa do pracy z czcionkami na Androidzie. Obsługuje systemowe kroje Roboto i Noto, a także niestandardowe czcionki. Typeface.createFromResource() ładuje czcionkę z res/font/, Typeface.createFromAsset() z folderu assets. Android 8.0+ obsługuje rodziny czcionek w XML, łącząc wiele plików czcionek w jeden zasób. Niestandardową czcionkę dla tekstu w aplikacjach mobilnych na Androidzie ustawia się za pomocą atrybutu android:fontFamily lub programowo przez setTypeface().
TextMeasurer (API 29+) to nowoczesne narzędzie do pomiaru tekstu bez wiązania z widokiem. Oblicza szerokość, wysokość i pozycje znaków przed renderowaniem. W starszych API używa się Paint.measureText() dla tekstu jednowierszowego lub StaticLayout dla wielowierszowego. TextMeasurer jest szczególnie przydatny w niestandardowych widokach, gdzie tekst jest rysowany przez Canvas.drawText(). Prawidłowy pomiar zapobiega przycinaniu znaków w interfejsie.
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
Typografia w aplikacjach mobilnych to kompleksowa konfiguracja czcionek, odstępów między znakami i wierszami. Prawidłowa typografia w programowaniu mobilnym bezpośrednio wpływa na czytelność tekstu i wizualne postrzeganie interfejsu. Przyjrzyjmy się kluczowym parametrom dostępnym na obu platformach.
Kerning to regulacja odstępu między określonymi parami znaków (AV, To, Wa). Tracking to równomierny odstęp między znakami dla całego tekstu lub jego fragmentu. Na iOS kerning ustawia się przez NSKernAttributeName, na Androidzie — przez właściwość letterSpacing w TextView. Ujemne wartości zbliżają znaki, dodatnie je oddalają. Typografia w programowaniu mobilnym wymaga starannego dostrojenia tych parametrów: dla dużych nagłówków odstęp między znakami jest zwykle zwiększany, dla tekstu głównego pozostaje standardowy.
| Parametr | iOS | Android |
|---|---|---|
| Stylizowany ciąg | NSAttributedString | SpannableString |
| Czcionka | UIFont / CTFont | Typeface |
| Odstęp między znakami | NSKernAttributeName | letterSpacing |
| Odstęp między wierszami | lineSpacing | lineSpacingExtra |
| Ligatury | NSLigatureAttributeName | Funkcje OpenType |
| Elipsa | lineBreakMode .byTruncatingTail | android:ellipsize |
Ligatury to specjalne glify zastępujące kombinacje dwóch lub więcej znaków: fi, fl, ffi. Na iOS ligatury są kontrolowane przez NSLigatureAttributeName: 0 — wyłączone, 1 — standardowe, 2 — wszystkie dostępne. Na Androidzie ligatury są kontrolowane na poziomie czcionki przez funkcje OpenType. Włączenie ligatur poprawia wygląd tekstu, szczególnie w krojach szeryfowych. Typografia w programowaniu mobilnym używa ligatur głównie dla nagłówków i logo.
Niestandardowe czcionki to jedno z głównych narzędzi do tworzenia unikalnego stylu wizualnego aplikacji. Pomagają wyróżnić markę i poprawić doświadczenie użytkownika. W aplikacjach mobilnych niestandardowe czcionki są używane do nagłówków, logo, elementów akcentujących i identyfikacji wizualnej.
Czcionki zmienne to nowoczesna technologia czcionek, w której jeden plik zawiera wiele stylów: od cienkiego do bardzo grubego, od wąskiego do szerokiego. Zmniejsza to rozmiar aplikacji, zastępując kilka plików czcionek jednym. Na iOS czcionki zmienne są obsługiwane przez UIFont z parametrem weight. Na Androidzie — przez Typeface.Builder z określeniem osi zmienności wght, wdth, slnt. Użycie czcionek zmiennych upraszcza typografię w aplikacjach mobilnych: programista nie musi ładować oddzielnych plików dla każdego stylu.
let customFont = UIFont(name: "CustomFont-Regular", size: 16)
let scaledFont = UIFontMetrics.default
.scaledFont(for: customFont)
label.font = scaledFont
label.adjustsFontForContentSizeCategory(true)
NSTextAttachment na iOS umożliwia osadzenie UIImage wewnątrz NSAttributedString — obraz wyrównuje się do linii bazowej i przesuwa wraz z tekstem. Na Androidzie odpowiednikiem jest ImageSpan wewnątrz SpannableString. Oba podejścia są przydatne do czatów z emoji, kanałów informacyjnych z ikonami i formularzy z niestandardowymi polami wyboru. Ważne jest odpowiednie skalowanie obrazu do wysokości czcionki, aby tekst i grafika wyglądały harmonijnie.
Oprócz podstawowego formatowania, tekst w aplikacjach mobilnych obsługuje dodatkowe efekty wizualne: cienie, obrysy, przekreślenie i podkreślenie. Narzędzia te poszerzają możliwości typografii, ale wymagają ostrożnego stosowania, aby zachować czytelność.
Cień tekstu na iOS ustawia się przez NSShadow z offset, blurRadius i color. Obrys — przez NSStrokeWidthAttributeName: ujemne wartości tworzą wypełnienie z obrysem, dodatnie tylko kontur. Przekreślenie — NSUnderlineStyle (.single, .thick, .double). Na Androidzie cień TextView konfiguruje się przez android:shadowRadius, android:shadowDx, android:shadowDy. SpannableString obsługuje StrikethroughSpan i UnderlineSpan. Obrys tekstu na Androidzie jest implementowany przez OutlineSpan lub niestandardową czcionkę.
Elipsa to przycinanie tekstu z wielokropkiem, gdy kontener jest przepełniony. Na iOS konfiguruje się przez lineBreakMode .byTruncatingTail i numberOfLines. Na Androidzie — przez android:ellipsize="end" i android:maxLines. Marquee to animacja przewijania tekstu dostępna na Androidzie przez android:ellipsize="marquee". Na iOS nie ma wbudowanego odpowiednika — używana jest biblioteka MarqueeLabel. Elipsa jest obowiązkowa dla wszystkich jednowierszowych tekstów w aplikacjach mobilnych, aby uniknąć przycinania treści.
Dynamic Type to adaptacyjny system tekstu na iOS, który dostosowuje rozmiar czcionki do ustawień dostępności użytkownika. Użyj UIFontMetrics do skalowania niestandardowych czcionek. Dynamic Type jest obowiązkowy dla aplikacji zgodnych z dostępnością. Na Androidzie odpowiednikiem są jednostki sp i scaledPixels, które skalują się zgodnie z systemowymi ustawieniami rozmiaru tekstu.
Często zadawane pytania
NSAttributedString to klasa iOS do tworzenia sformatowanego tekstu z atrybutami czcionki, koloru i stylu na poziomie znaków i zakresów.
SpannableString to klasa Android do znakowania tekstu przez obiekty Span: ForegroundColorSpan, StyleSpan, URLSpan, UnderlineSpan.
Dodaj plik .ttf do projektu, określ go w Info.plist pod kluczem Fonts provided by application, następnie użyj UIFont(name:).
Umieść plik .ttf w res/font/, utwórz rodzinę czcionek XML i określ android:fontFamily lub użyj Typeface.createFromAsset().
Kerning to odstęp między parami znaków. Ligatury to specjalne glify dla kombinacji liter. Są kontrolowane przez NSKernAttributeName i NSLigatureAttributeName.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.