Attributed Text مکانیزمی از iOS SDK است که توسط کلاسهای NSAttributedString و NSMutableAttributedString ارائه میشود و به شما امکان میدهد استایلهای متعددی را به بخشهای مختلف یک رشته متنی اعمال کنید. برخلاف NSString معمولی، Attributed String نه تنها نویسهها، بلکه فرهنگ لغت ویژگیها را برای هر محدوده ذخیره میکند: فونت، رنگ، فاصله بین خطوط، سایه و تراز. طبق Apple Developer Documentation، Attributed String اساس نمایش متن قالببندی شده در UILabel، UITextView و UITextField است. این روش استاندارد استایلدهی متن بدون WebKit یا کتابخانههای شخص ثالث است.
نکات کلیدی
NSAttributedString — کلاسی از فریمورک Foundation است که یک رشته را با مجموعهای از ویژگیهای نامگذاری شده متصل به محدودههای نویسه نمایش میدهد. هر ویژگی یک جفت کلید-مقدار است: کلید توسط یک ثابت تعریف میشود (NSFontAttributeName، NSForegroundColorAttributeName) و مقدار توسط یک شیء مربوطه (UIFont، UIColor). ویژگیها از طریق NSRange به محدوده نویسهها اعمال میشوند.
این کلاس در تمام پلتفرمهای اپل در دسترس است: iOS (2.0+)، macOS، tvOS، watchOS. NSAttributedString تغییرناپذیر است — پس از ایجاد، ویژگیهای آن ثابت هستند. برای تغییر پویا از NSMutableAttributedString استفاده میشود که از NSAttributedString ارث برده و متدهای setAttributes، addAttributes، addAttribute، removeAttribute را اضافه میکند.
NSString — یک رشته ساده از نویسهها بدون اطلاعات استایل است. هر متنی که از طریق text به UILabel ارسال شود، با یک فونت، رنگ و اندازه نمایش داده میشود. NSAttributedString که از طریق attributedText ارسال میشود به هر نویسه اجازه میدهد مجموعه ویژگیهای خود را داشته باشد. UILabel، UITextView و UITextField به طور خودکار NSAttributedString را تشخیص داده و متن را مطابق ویژگیها ترسیم میکنند.
در داخل، NSAttributedString NSString را با متن و آرایهای از محدودههای ویژگی ذخیره میکند. هر محدوده با یک ساختار NSRange و یک فرهنگ لغت ویژگی نمایش داده میشود. هنگام ترسیم، سیستم از میان محدودهها عبور کرده و ویژگیهای مربوطه را به هر بخش اعمال میکند. کارایی به تعداد تغییرات ویژگی بستگی دارد — تغییرات مکرر در بخشهای کوتاه زمان ترسیم را افزایش میدهد.
ویژگیهای NSAttributedString — ثابتهایی هستند که در UIKit (iOS) و AppKit (macOS) تعریف شدهاند و هر کدام مربوط به جنبه خاصی از قالببندی بصری متن هستند. همه ویژگیها رشتههای NSAttributedString.Key هستند و مقادیر آنها اشیاء کلاسهای مشخصی هستند. ویژگیها به دو دسته نویسهای (تأثیر بر نویسهها) و پاراگرافی (تأثیر بر پاراگرافها) تقسیم میشوند.
ویژگیهای نویسهای شامل فونت (NSFontAttributeName)، رنگ متن (NSForegroundColorAttributeName)، رنگ پسزمینه (NSBackgroundColorAttributeName)، زیرخط (NSUnderlineStyleAttributeName)، خطخطا (NSStrikethroughStyleAttributeName)، سایه (NSShadowAttributeName) هستند. ویژگیهای پاراگرافی از طریق NSParagraphStyleAttributeName تنظیم میشوند که تراز، تورفتگی، فاصله بین خطوط و تبها را کنترل میکند.
NSLinkAttributeName یک لینک قابل کلیک در متن ایجاد میکند: مقدار آن URL یا یک رشته است. UITextView اگر تعامل فعال باشد، به طور خودکار چنین لینکهایی را پردازش میکند. NSAttachmentAttributeName امکان جاسازی NSTextAttachment — تصویری درون متن که به عنوان یک عنصر درونخطی نمایش داده میشود را فراهم میکند. این برای ایجاد متن با آیکونها، ایموجیها یا نماهای سفارشی درون رشته استفاده میشود.
هر ویژگی NSAttributedString یک مقدار به شدت تایپ شده دارد. بیایید به پرکاربردترین ویژگیها در توسعه iOS نگاه کنیم. فونت توسط شیء UIFont، رنگ توسط UIColor، فاصله بین خطوط از طریق NSMutableParagraphStyle تنظیم میشود که به شما امکان میدهد تراز، تورفتگی و فاصلهها را در یک شیء پیکربندی کنید.
| کلید ویژگی | نوع مقدار | هدف |
|---|---|---|
| NSFontAttributeName | UIFont | فونت متن |
| NSForegroundColorAttributeName | UIColor | رنگ متن |
| NSBackgroundColorAttributeName | UIColor | رنگ پسزمینه زیر متن |
| NSUnderlineStyleAttributeName | NSNumber (Int) | استایل زیرخط |
| NSParagraphStyleAttributeName | NSParagraphStyle | تنظیمات پاراگراف |
| NSKernAttributeName | NSNumber (Float) | فاصله بین حروف |
NSParagraphStyle — ظرفی برای ویژگیهای پاراگراف: alignment، lineSpacing، paragraphSpacing، firstLineHeadIndent، lineBreakMode، minimumLineHeight و موارد دیگر. برای تغییر این پارامترها، NSMutableParagraphStyle ایجاد میشود، ویژگیهای مورد نیاز تنظیم میشوند و شیء به عنوان مقدار ویژگی NSParagraphStyleAttributeName ارسال میشود. این تنها راه کنترل فاصله بین خطوط در NSAttributedString است.
NSShadow امکان افزودن سایه به متن را فراهم میکند: پارامترهای shadowOffset، shadowBlurRadius، shadowColor جابجایی، تاری و رنگ سایه را تعیین میکنند. ویژگیهای زیرخط و خطخطا ترکیبی از استایلها را میپذیرند: NSUnderlineStyle.single، .double، .thick، .patternDash، .patternDot. برای کنترل دقیق ضخامت و رنگ خطوط از NSUnderlineColorAttributeName و NSStrikethroughColorAttributeName استفاده میشود.
ایجاد NSAttributedString در Swift از طریق مقداردهنده اولیه با مشخص کردن متن و فرهنگ لغت ویژگیها یا از طریق NSMutableAttributedString با اعمال گام به گام استایلها انجام میشود. رویکرد پایه — تعریف فرهنگ لغت ویژگیها برای کل متن، سپس افزودن یا تغییر ویژگیها برای محدودههای خاص.
مثال ساده — تنظیم فونت، رنگ و تراز برای کل رشته. فرهنگ لغت ویژگیها به مقداردهنده NSAttributedString ارسال میشود. کلیدهای فرهنگ لغت ثابتهای NSAttributedString.Key هستند، مقادیر اشیاء مربوطه UIKit هستند. این گزینه پایه زمانی است که کل متن به صورت یکنواخت قالببندی میشود.
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 همه ویژگیهای محدوده را با ویژگیهای جدید جایگزین میکند. این ابزار اصلی برای ایجاد متن با برجستهسازی است.
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 متدهایی برای تغییر پویای متن و ویژگیها فراهم میکند: append، insert، replace، delete، setAttributes، addAttribute، removeAttribute، enumerateAttributes. این امکان ساخت متن از منابع مختلف، ترکیب استایلها و واکنش به رویدادهای رابط را فراهم میکند.
برخلاف NSAttributedString تغییرناپذیر، نسخه mutable از تغییر محتوا بدون ایجاد یک شیء جدید پشتیبانی میکند. این برای ویرایشگرهای متن، چتها و فرمها حیاتی است، جایی که کاربر میتواند متن را ویرایش کند و استایلها باید حفظ شوند.
در پیامرسانها، هر پیام حاوی نام کاربر (فونت پررنگ)، متن پیام (معمولی)، زمان (رنگ خاکستری) است. NSMutableAttributedString امکان ساخت چنین رشتای را در یک مرحله فراهم میکند و بخشها را به ترتیب مناسب با ویژگیهای مربوطه اضافه میکند.
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 بخش فعلی ارسال میشود.
همه کامپوننتهای اصلی UI برای نمایش متن در UIKit از NSAttributedString از طریق ویژگی attributedText پشتیبانی میکنند. UILabel متن استایلدار ثابت را نمایش میدهد، UITextView از ویرایش و لینکها پشتیبانی میکند، UITextField ویژگیها را برای placeholder و متن وارد شده به طور جداگانه میپذیرد.
UILabel — سبکترین کامپوننت برای نمایش متن استایلدار است. از همه ویژگیهای نویسهای پشتیبانی میکند، اما لینکهای قابل کلیک را به طور خودکار پردازش نمیکند (برای این کار UITextView نیاز است). UILabel برای عنوانها، برچسبها و متنهای کوتاه با قالببندی ایدهآل است.
UITextView NSLinkAttributeName را پردازش کرده و لینکها را به عنوان عناصر تعاملی نمایش میدهد. برای فعال کردن این قابلیت، isSelectable = true و isEditable = false را تنظیم کنید. هنگام کلیک روی لینک، delegate فراخوانی textView(_:shouldInteractWith:in:interaction:) را دریافت میکند. UITextView همچنین از NSTextAttachment برای تصاویر درون متن پشتیبانی میکند.
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 — فریمورک سطح پایین اپل برای رندر متن است که مستقیماً با NSAttributedString کار میکند. برخلاف UIKit، Core Text از NSAttributedString مستقیماً به عنوان یک شیء قابل نمایش استفاده نمیکند، بلکه آن را به CTFramesetter، سپس CTFrame تبدیل کرده و در بافت Core Graphics رندر میکند. این کنترل کامل بر روی چیدمان خطوط و گلیفها را فراهم میکند.
استفاده از Core Text برای چیدمانهای سفارشی متن توجیه دارد: ستونها، جریان در اطراف تصاویر، چرخش متن، شکستن خطوط غیراستاندارد. NSMutableParagraphStyle Core Text شامل ویژگیهایی است که در UIKit وجود ندارند: kCTParagraphStyleSpecifierMaximumLineSpacing، kCTParagraphStyleSpecifierLineBreakMode با حالتهای اضافی.
NSAttributedString به طور یکپارچه بین UIKit و Core Text منتقل میشود، زیرا هر دو فریمورک با یک نوع کار میکنند. ویژگیهای UIKit (NSFontAttributeName، NSForegroundColorAttributeName) به طور خودکار توسط Core Text شناسایی میشوند و بالعکس — ویژگیهای Core Text (kCTFontAttributeName) توسط UIKit خوانده میشوند. این امکان استفاده از UIKit برای کارهای ساده و Core Text برای رندر سفارشی روی یک شیء NSAttributedString را فراهم میکند.
سوالات متداول
NSString فقط متن را بدون اطلاعات استایل ذخیره میکند. NSAttributedString متن را با یک فرهنگ لغت ویژگی برای هر محدوده نویسه تکمیل میکند. هنگام ارسال به UILabel از طریق ویژگی text، NSString به صورت متن ساده نمایش داده میشود. هنگام ارسال NSAttributedString از طریق ویژگی attributedText، همه ویژگیها اعمال میشوند: فونتها، رنگها و فاصلههای مختلف در یک رشته.
از متد addAttributes(_:range:) با یک فرهنگ لغت ویژگی استفاده کنید: addAttributes([.font: font, .foregroundColor: color], range: range). برای افزودن یا تغییر یک ویژگی از addAttribute(_:value:range:) استفاده کنید. متد setAttributes همه ویژگیهای موجود در محدوده را با ویژگیهای جدید جایگزین میکند.
NSMutableParagraphStyle ایجاد کنید، ویژگی lineSpacing را تنظیم کنید، سپس آن را به عنوان مقدار ویژگی NSParagraphStyleAttributeName ارسال کنید. برای کنترل کامل، minimumLineHeight، maximumLineHeight، paragraphSpacing، lineBreakMode و alignment نیز در دسترس هستند. ParagraphStyle تنها راه کنترل فاصله بین خطوط است.
بله، SwiftUI در iOS 15+ از NSAttributedString از طریق Text(attributedString:) پشتیبانی میکند. در نسخههای قدیمیتر از UIViewRepresentable با UILabel یا UITextView استفاده کنید. SwiftUI همچنین نوع AttributedString مخصوص خود (SwiftUI، نه Foundation) را برای قالببندی اعلامی با نحوی شبیه به Markdown ارائه میدهد.
از متد boundingRect(with:options:context:) استفاده کنید که CGRect لازم برای نمایش رشته با ویژگیهای مشخص شده را برمیگرداند. پارامتر options: [.usesLineFragmentOrigin, .usesFontLeading] فاصلههای بین خطوط و معیارهای فونت را در نظر میگیرد. برای UILabel با تعداد خطوط محدود از sizeThatFits استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید