Attributed Text: چیست، انواع ویژگی‌ها و استایل‌دهی

نویسنده: IT Sectr منتشر شده: 2026-07-23 زمان مطالعه: 8 دقیقه

Attributed Text مکانیزمی از iOS SDK است که توسط کلاس‌های NSAttributedString و NSMutableAttributedString ارائه می‌شود و به شما امکان می‌دهد استایل‌های متعددی را به بخش‌های مختلف یک رشته متنی اعمال کنید. برخلاف NSString معمولی، Attributed String نه تنها نویسه‌ها، بلکه فرهنگ لغت ویژگی‌ها را برای هر محدوده ذخیره می‌کند: فونت، رنگ، فاصله بین خطوط، سایه و تراز. طبق Apple Developer Documentation، Attributed String اساس نمایش متن قالب‌بندی شده در UILabel، UITextView و UITextField است. این روش استاندارد استایل‌دهی متن بدون WebKit یا کتابخانه‌های شخص ثالث است.

نکات کلیدی

  • NSAttributedString — کلاس تغییرناپذیر برای استایل‌دهی متن از طریق فرهنگ لغت ویژگی‌ها در iOS
  • ویژگی‌ها شامل فونت، رنگ، فاصله بین خطوط، سایه، زیرخط و تراز هستند
  • NSMutableAttributedString — نسخه قابل تغییر برای اعمال پویای استایل‌ها
  • addAttributes فرهنگ لغت ویژگی‌ها را به محدوده اعمال می‌کند، addAttribute — یک ویژگی
  • NSAttributedString در UILabel، UITextView، UITextField و Core Text استفاده می‌شود

Attributed Text در iOS چیست؟

NSAttributedString — کلاسی از فریم‌ورک Foundation است که یک رشته را با مجموعه‌ای از ویژگی‌های نام‌گذاری شده متصل به محدوده‌های نویسه نمایش می‌دهد. هر ویژگی یک جفت کلید-مقدار است: کلید توسط یک ثابت تعریف می‌شود (NSFontAttributeName، NSForegroundColorAttributeName) و مقدار توسط یک شیء مربوطه (UIFont، UIColor). ویژگی‌ها از طریق NSRange به محدوده نویسه‌ها اعمال می‌شوند.

این کلاس در تمام پلتفرم‌های اپل در دسترس است: iOS (2.0+)، macOS، tvOS، watchOS. NSAttributedString تغییرناپذیر است — پس از ایجاد، ویژگی‌های آن ثابت هستند. برای تغییر پویا از NSMutableAttributedString استفاده می‌شود که از NSAttributedString ارث برده و متدهای setAttributes، addAttributes، addAttribute، removeAttribute را اضافه می‌کند.

تفاوت با NSString

NSString — یک رشته ساده از نویسه‌ها بدون اطلاعات استایل است. هر متنی که از طریق text به UILabel ارسال شود، با یک فونت، رنگ و اندازه نمایش داده می‌شود. NSAttributedString که از طریق attributedText ارسال می‌شود به هر نویسه اجازه می‌دهد مجموعه ویژگی‌های خود را داشته باشد. UILabel، UITextView و UITextField به طور خودکار NSAttributedString را تشخیص داده و متن را مطابق ویژگی‌ها ترسیم می‌کنند.

فرمت ذخیره‌سازی

در داخل، NSAttributedString NSString را با متن و آرایه‌ای از محدوده‌های ویژگی ذخیره می‌کند. هر محدوده با یک ساختار NSRange و یک فرهنگ لغت ویژگی نمایش داده می‌شود. هنگام ترسیم، سیستم از میان محدوده‌ها عبور کرده و ویژگی‌های مربوطه را به هر بخش اعمال می‌کند. کارایی به تعداد تغییرات ویژگی بستگی دارد — تغییرات مکرر در بخش‌های کوتاه زمان ترسیم را افزایش می‌دهد.

ویژگی‌های NSAttributedString

ویژگی‌های NSAttributedString — ثابت‌هایی هستند که در UIKit (iOS) و AppKit (macOS) تعریف شده‌اند و هر کدام مربوط به جنبه خاصی از قالب‌بندی بصری متن هستند. همه ویژگی‌ها رشته‌های NSAttributedString.Key هستند و مقادیر آنها اشیاء کلاس‌های مشخصی هستند. ویژگی‌ها به دو دسته نویسه‌ای (تأثیر بر نویسه‌ها) و پاراگرافی (تأثیر بر پاراگراف‌ها) تقسیم می‌شوند.

ویژگی‌های نویسه‌ای شامل فونت (NSFontAttributeName)، رنگ متن (NSForegroundColorAttributeName)، رنگ پس‌زمینه (NSBackgroundColorAttributeName)، زیرخط (NSUnderlineStyleAttributeName)، خط‌خطا (NSStrikethroughStyleAttributeName)، سایه (NSShadowAttributeName) هستند. ویژگی‌های پاراگرافی از طریق NSParagraphStyleAttributeName تنظیم می‌شوند که تراز، تورفتگی، فاصله بین خطوط و تب‌ها را کنترل می‌کند.

ویژگی‌های لینک و تعاملی

NSLinkAttributeName یک لینک قابل کلیک در متن ایجاد می‌کند: مقدار آن URL یا یک رشته است. UITextView اگر تعامل فعال باشد، به طور خودکار چنین لینک‌هایی را پردازش می‌کند. NSAttachmentAttributeName امکان جاسازی NSTextAttachment — تصویری درون متن که به عنوان یک عنصر درون‌خطی نمایش داده می‌شود را فراهم می‌کند. این برای ایجاد متن با آیکون‌ها، ایموجی‌ها یا نماهای سفارشی درون رشته استفاده می‌شود.

ویژگی‌های اصلی استایل‌دهی

هر ویژگی NSAttributedString یک مقدار به شدت تایپ شده دارد. بیایید به پرکاربردترین ویژگی‌ها در توسعه iOS نگاه کنیم. فونت توسط شیء UIFont، رنگ توسط UIColor، فاصله بین خطوط از طریق NSMutableParagraphStyle تنظیم می‌شود که به شما امکان می‌دهد تراز، تورفتگی و فاصله‌ها را در یک شیء پیکربندی کنید.

کلید ویژگینوع مقدارهدف
NSFontAttributeNameUIFontفونت متن
NSForegroundColorAttributeNameUIColorرنگ متن
NSBackgroundColorAttributeNameUIColorرنگ پس‌زمینه زیر متن
NSUnderlineStyleAttributeNameNSNumber (Int)استایل زیرخط
NSParagraphStyleAttributeNameNSParagraphStyleتنظیمات پاراگراف
NSKernAttributeNameNSNumber (Float)فاصله بین حروف

NSParagraphStyle

NSParagraphStyle — ظرفی برای ویژگی‌های پاراگراف: alignment، lineSpacing، paragraphSpacing، firstLineHeadIndent، lineBreakMode، minimumLineHeight و موارد دیگر. برای تغییر این پارامترها، NSMutableParagraphStyle ایجاد می‌شود، ویژگی‌های مورد نیاز تنظیم می‌شوند و شیء به عنوان مقدار ویژگی NSParagraphStyleAttributeName ارسال می‌شود. این تنها راه کنترل فاصله بین خطوط در NSAttributedString است.

سایه و افکت‌ها

NSShadow امکان افزودن سایه به متن را فراهم می‌کند: پارامترهای shadowOffset، shadowBlurRadius، shadowColor جابجایی، تاری و رنگ سایه را تعیین می‌کنند. ویژگی‌های زیرخط و خط‌خطا ترکیبی از استایل‌ها را می‌پذیرند: NSUnderlineStyle.single، .double، .thick، .patternDash، .patternDot. برای کنترل دقیق ضخامت و رنگ خطوط از NSUnderlineColorAttributeName و NSStrikethroughColorAttributeName استفاده می‌شود.

نحوه استفاده از NSAttributedString در کد

ایجاد NSAttributedString در Swift از طریق مقداردهنده اولیه با مشخص کردن متن و فرهنگ لغت ویژگی‌ها یا از طریق NSMutableAttributedString با اعمال گام به گام استایل‌ها انجام می‌شود. رویکرد پایه — تعریف فرهنگ لغت ویژگی‌ها برای کل متن، سپس افزودن یا تغییر ویژگی‌ها برای محدوده‌های خاص.

ایجاد با ویژگی‌ها برای کل متن

مثال ساده — تنظیم فونت، رنگ و تراز برای کل رشته. فرهنگ لغت ویژگی‌ها به مقداردهنده NSAttributedString ارسال می‌شود. کلیدهای فرهنگ لغت ثابت‌های NSAttributedString.Key هستند، مقادیر اشیاء مربوطه UIKit هستند. این گزینه پایه زمانی است که کل متن به صورت یکنواخت قالب‌بندی می‌شود.

swift
let attributes: [NSAttributedString.Key: Any] = [
    .font: UIFont.systemFont(ofSize: 16),
    .foregroundColor: UIColor.darkGray,
    .paragraphStyle: let style = NSMutableParagraphStyle()
    style.alignment = .center
    style.lineSpacing = 4
    return style
]
let attributedString = NSAttributedString(
    string: "Hello world",
    attributes: attributes
)
label.attributedText = attributedString

متن با فونت systemFont 16، رنگ خاکستری تیره، تراز وسط و فاصله بین خطوط 4pt نمایش داده می‌شود. این رویکرد برای عنوان‌های ثابت و دکمه‌ها مناسب است.

اعمال به محدوده

NSMutableAttributedString امکان اعمال استایل‌های متفاوت به بخش‌های مختلف متن را فراهم می‌کند. متد addAttribute یک ویژگی به محدوده اضافه می‌کند، addAttributes — یک فرهنگ لغت ویژگی. متد setAttributes همه ویژگی‌های محدوده را با ویژگی‌های جدید جایگزین می‌کند. این ابزار اصلی برای ایجاد متن با برجسته‌سازی است.

swift
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
    value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
    value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed

کلمه «1999» سبز و پررنگ خواهد بود، بقیه متن — استاندارد. NSRange به صورت دستی محاسبه می‌شود — مهم است که طول را به درستی بر حسب نویسه بشماریم، به ویژه هنگام کار با ایموجی‌ها و نویسه‌های ترکیبی Unicode.

استایل‌های پویا با NSMutableAttributedString

NSMutableAttributedString متدهایی برای تغییر پویای متن و ویژگی‌ها فراهم می‌کند: append، insert، replace، delete، setAttributes، addAttribute، removeAttribute، enumerateAttributes. این امکان ساخت متن از منابع مختلف، ترکیب استایل‌ها و واکنش به رویدادهای رابط را فراهم می‌کند.

برخلاف NSAttributedString تغییرناپذیر، نسخه mutable از تغییر محتوا بدون ایجاد یک شیء جدید پشتیبانی می‌کند. این برای ویرایشگرهای متن، چت‌ها و فرم‌ها حیاتی است، جایی که کاربر می‌تواند متن را ویرایش کند و استایل‌ها باید حفظ شوند.

ترکیب استایل‌ها در چت

در پیام‌رسان‌ها، هر پیام حاوی نام کاربر (فونت پررنگ)، متن پیام (معمولی)، زمان (رنگ خاکستری) است. NSMutableAttributedString امکان ساخت چنین رشت‌ای را در یک مرحله فراهم می‌کند و بخش‌ها را به ترتیب مناسب با ویژگی‌های مربوطه اضافه می‌کند.

swift
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
    attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
    attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
    attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result

نتیجه — یک رشته با سه بخش استایلی. Append به طور خودکار NSRange را به درستی محاسبه می‌کند، موقعیت‌ها نیازی به محاسبه دستی ندارند. این رویکرد برای هر تعداد قطعه مقیاس‌پذیر است.

پیمایش ویژگی‌ها

متد enumerateAttributes(in:options:using:) از تمام محدوده‌های ویژگی در بازه مشخص شده عبور می‌کند. این برای تحلیل قالب‌بندی مفید است: یافتن همه لینک‌ها، تغییر رنگ ویژگی‌های خاص یا صادرات متن به HTML. در بسته، فرهنگ لغت ویژگی و NSRange بخش فعلی ارسال می‌شود.

Attributed Text در کامپوننت‌های UIKit

همه کامپوننت‌های اصلی UI برای نمایش متن در UIKit از NSAttributedString از طریق ویژگی attributedText پشتیبانی می‌کنند. UILabel متن استایل‌دار ثابت را نمایش می‌دهد، UITextView از ویرایش و لینک‌ها پشتیبانی می‌کند، UITextField ویژگی‌ها را برای placeholder و متن وارد شده به طور جداگانه می‌پذیرد.

UILabel با attributedText

UILabel — سبک‌ترین کامپوننت برای نمایش متن استایل‌دار است. از همه ویژگی‌های نویسه‌ای پشتیبانی می‌کند، اما لینک‌های قابل کلیک را به طور خودکار پردازش نمی‌کند (برای این کار UITextView نیاز است). UILabel برای عنوان‌ها، برچسب‌ها و متن‌های کوتاه با قالب‌بندی ایده‌آل است.

UITextView با لینک‌ها

UITextView NSLinkAttributeName را پردازش کرده و لینک‌ها را به عنوان عناصر تعاملی نمایش می‌دهد. برای فعال کردن این قابلیت، isSelectable = true و isEditable = false را تنظیم کنید. هنگام کلیک روی لینک، delegate فراخوانی textView(_:shouldInteractWith:in:interaction:) را دریافت می‌کند. UITextView همچنین از NSTextAttachment برای تصاویر درون متن پشتیبانی می‌کند.

swift
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
    value: URL(string: "https://developer.apple.com")!,
    range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false

پس از تنظیم isSelectable و isEditable، ناحیه متنی مانند یک بلوک متنی ثابت رفتار می‌کند، اما لینک‌ها فعال باقی می‌مانند. delegate UITextViewDelegate رفتار هنگام کلیک را مدیریت می‌کند.

ادغام با Core Text

Core Text — فریم‌ورک سطح پایین اپل برای رندر متن است که مستقیماً با NSAttributedString کار می‌کند. برخلاف UIKit، Core Text از NSAttributedString مستقیماً به عنوان یک شیء قابل نمایش استفاده نمی‌کند، بلکه آن را به CTFramesetter، سپس CTFrame تبدیل کرده و در بافت Core Graphics رندر می‌کند. این کنترل کامل بر روی چیدمان خطوط و گلیف‌ها را فراهم می‌کند.

استفاده از Core Text برای چیدمان‌های سفارشی متن توجیه دارد: ستون‌ها، جریان در اطراف تصاویر، چرخش متن، شکستن خطوط غیراستاندارد. NSMutableParagraphStyle Core Text شامل ویژگی‌هایی است که در UIKit وجود ندارند: kCTParagraphStyleSpecifierMaximumLineSpacing، kCTParagraphStyleSpecifierLineBreakMode با حالت‌های اضافی.

تبدیل بین UIKit و Core Text

NSAttributedString به طور یکپارچه بین UIKit و Core Text منتقل می‌شود، زیرا هر دو فریم‌ورک با یک نوع کار می‌کنند. ویژگی‌های UIKit (NSFontAttributeName، NSForegroundColorAttributeName) به طور خودکار توسط Core Text شناسایی می‌شوند و بالعکس — ویژگی‌های Core Text (kCTFontAttributeName) توسط UIKit خوانده می‌شوند. این امکان استفاده از UIKit برای کارهای ساده و Core Text برای رندر سفارشی روی یک شیء NSAttributedString را فراهم می‌کند.

سوالات متداول

تفاوت NSAttributedString با NSString چیست؟

NSString فقط متن را بدون اطلاعات استایل ذخیره می‌کند. NSAttributedString متن را با یک فرهنگ لغت ویژگی برای هر محدوده نویسه تکمیل می‌کند. هنگام ارسال به UILabel از طریق ویژگی text، NSString به صورت متن ساده نمایش داده می‌شود. هنگام ارسال NSAttributedString از طریق ویژگی attributedText، همه ویژگی‌ها اعمال می‌شوند: فونت‌ها، رنگ‌ها و فاصله‌های مختلف در یک رشته.

چگونه چندین ویژگی را به یک محدوده اضافه کنیم؟

از متد addAttributes(_:range:) با یک فرهنگ لغت ویژگی استفاده کنید: addAttributes([.font: font, .foregroundColor: color], range: range). برای افزودن یا تغییر یک ویژگی از addAttribute(_:value:range:) استفاده کنید. متد setAttributes همه ویژگی‌های موجود در محدوده را با ویژگی‌های جدید جایگزین می‌کند.

چگونه فاصله بین خطوط را در NSAttributedString تغییر دهیم؟

NSMutableParagraphStyle ایجاد کنید، ویژگی lineSpacing را تنظیم کنید، سپس آن را به عنوان مقدار ویژگی NSParagraphStyleAttributeName ارسال کنید. برای کنترل کامل، minimumLineHeight، maximumLineHeight، paragraphSpacing، lineBreakMode و alignment نیز در دسترس هستند. ParagraphStyle تنها راه کنترل فاصله بین خطوط است.

آیا ویژگی‌ها در SwiftUI کار می‌کنند؟

بله، SwiftUI در iOS 15+ از NSAttributedString از طریق Text(attributedString:) پشتیبانی می‌کند. در نسخه‌های قدیمی‌تر از UIViewRepresentable با UILabel یا UITextView استفاده کنید. SwiftUI همچنین نوع AttributedString مخصوص خود (SwiftUI، نه Foundation) را برای قالب‌بندی اعلامی با نحوی شبیه به Markdown ارائه می‌دهد.

چگونه اندازه NSAttributedString را محاسبه کنیم؟

از متد boundingRect(with:options:context:) استفاده کنید که CGRect لازم برای نمایش رشته با ویژگی‌های مشخص شده را برمی‌گرداند. پارامتر options: [.usesLineFragmentOrigin, .usesFontLeading] فاصله‌های بین خطوط و معیارهای فونت را در نظر می‌گیرد. برای UILabel با تعداد خطوط محدود از sizeThatFits استفاده کنید.

خلاصه

  • NSAttributedString — کلاس Foundation برای استایل‌دهی متن از طریق فرهنگ لغت ویژگی‌ها در iOS
  • ویژگی‌ها شامل فونت (UIFont)، رنگ (UIColor)، زیرخط، سایه و تنظیمات پاراگراف هستند
  • NSMutableAttributedString — نسخه پویا با افزودن و حذف ویژگی‌ها
  • addAttributes(_:range:) فرهنگ لغت ویژگی‌ها را به محدوده نویسه اعمال می‌کند
  • NSParagraphStyle فاصله بین خطوط، تراز و تورفتگی را کنترل می‌کند
  • UILabel، UITextView، UITextField از attributedText برای نمایش استایل‌ها پشتیبانی می‌کنند
  • Core Text از همان NSAttributedString برای رندر سطح پایین استفاده می‌کند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید