NSTextAttachment: bu nima va iOS-da matnga rasmni qanday qo'shish mumkin

Muallif: IT Sectr Nashr etilgan: 2026-07-25 O'qish vaqti: 9 daq

NSTextAttachment — UIKit freymvorkidagi sinf bo'lib, NSAttributedString orqali formatlangan matnga tasvirlar va boshqa media obyektlarni joylashtirish imkonini beradi. TextKit va Core Text darajasida ishlaydi, dasturchilarga matn oqimi ichidagi ilovalarning o'lchami, joylashuvi va xatti-harakati ustidan nazorat beradi. Apple Documentation (2025) ma'lumotlariga ko'ra, NSTextAttachment tasvirlar, PDF va maxsus ko'rinish konteynerlarini qo'llab-quvvatlaydi, UITextView va UILabel bilan integratsiyalanadi. Ushbu API-ni tushunish iOS ilovalarida Rich Text yaratish uchun zarur — chatlar va muharrirlardan tortib, imzolardagi ikonkalari bo'lgan yangiliklar lentalarigacha.

Asosiy fikrlar

  • NSTextAttachment — formatlangan iOS matniga media joylashtirish uchun UIKit sinfi.
  • Tasvir NSAttributedString orqali NSAttachmentAttributeName kaliti bilan qo'shiladi.
  • bounds xususiyati ilovaning o'lchami va vertikal siljishini boshqaradi.
  • NSTextAttachment tasvirlar, PDF va ma'lumot konteyneri orqali maxsus fayllarni qo'llab-quvvatlaydi.
  • API moslashuvchan matn joylashuvi uchun UITextView, UILabel va TextKit bilan integratsiyalanadi.

NSTextAttachment nima?

NSTextAttachment — UIKit freymvorkidagi sinf bo'lib, NSAttributedString matn tarkibiga bevosita media obyektlarni joylashtirish imkonini beradi. Matn yonida joylashgan alohida UIImageView-dan farqli o'laroq, NSTextAttachment tasvirni matn oqimining bir qismiga aylantiradi: tasvir qatorlar bilan birga ko'chiriladi, tekislashda ishtirok etadi va oddiy belgi kabi joy egallaydi.

Sinf iOS va macOS-da matnni ko'rsatishni boshqaradigan TextKit arxitekturasining bir qismidir. TextKit matnni gliflarga ajratadi, kerning, ligatura va interlinyani hisobga oladi — va NSTextAttachment ushbu konveyerga harf emas, balki grafik obyekt sifatida ko'rsatiladigan maxsus belgi sifatida qo'shiladi.

Har bir NSTextAttachment namunasi contents (fayl ma'lumotlari), fileType (UTI mazmun turi) va bounds (o'lcham va joylashuvni aniqlaydigan nuqtalardagi to'rtburchak) xususiyatlarini o'z ichiga oladi. Apple Human Interface Guidelines-ga ko'ra, bounds sukut bo'yicha tasvir o'lchamiga teng, lekin shriftga aniq moslashtirish uchun o'zgartirilishi mumkin.

NSTextAttachment-dan alohida UIImageView o'rniga, tasvir matnning bir qismi kabi harakat qilishi kerak bo'lganda foydalaning — chatlarda, yangiliklar lentalarida, matn muharrirlarida va kiritish maydonlarida ikonkalari bo'lgan formalarda.

NSTextAttachment orqali matnga rasmni qanday qo'shish mumkin

NSTextAttachment bilan ishlashning asosiy stsenariysi uch bosqichdan iborat: namunani yaratish, tasvirni o'rnatish va NSAttributedString-ga biriktirish. Jarayonni Swift misolida ko'rib chiqaylik.

swift
let attachment = NSTextAttachment()
attachment.image = UIImage(named: "icon-star")

let attachmentString = NSAttributedString(attachment: attachment)

let text = NSMutableAttributedString(string: "Rating: ")
text.append(attachmentString)

let label = UILabel()
label.attributedText = text

NSAttributedString(attachment:) chaqirilgandan so'ng, NSTextAttachment obyekti NSAttachmentAttributeName atributiga aylanadi, u maxsus o'rnini bosuvchi belgiga (object replacement character, kod 0xFFFC) biriktiriladi. Bu belgi harf sifatida ko'rsatilmaydi — uning o'rniga image xususiyatidan tasvir chiziladi.

Agar tasvir matn qatorining o'rtasida joylashishi kerak bo'lsa (masalan, so'zdan keyin ikonka), shunchaki attachmentString-ni NSMutableAttributedString-ning kerakli pozitsiyasiga joylashtiring. TextKit avtomatik ravishda qator balandligini hisobga oladi va tasvirni asosiy chiziq bo'ylab tekislaydi.

Muhim: image xususiyati faqat iOS-da (iOS 7 dan boshlab) mavjud. macOS-da NSImage bilan contents xususiyatidan foydalaning. Orqaga moslik uchun har doim image-ni to'g'ridan-to'g'ri o'rnating, ma'lumot konteyneriga tayanmang.

bounds va ilova joylashuvini sozlash

Sukut bo'yicha NSTextAttachment tasvirni uning asl o'lchamida nuqtalarda ko'rsatadi. Amalda deyarli har doim o'lcham va vertikal joylashuvni tuzatish talab qilinadi — buning uchun bounds xususiyati ishlatiladi.

CGRect bounds strukturasi origin (X va Y bo'yicha siljish) va size (kenglik va balandlik) ni o'z ichiga oladi. Y bo'yicha siljish ayniqsa muhim: salbiy qiymat tasvirni asosiy chiziqdan pastga tushiradi, ijobiy qiymat yuqoriga ko'taradi. Odatdagi stsenariy — ikonkani matn qatorining markaziga tekislash.

swift
let attachment = NSTextAttachment()
attachment.image = UIImage(named: "icon-star")

let font = UIFont.systemFont(ofSize: 16)
let fontCapHeight = font.capHeight
let imageSize = CGSize(width: 18, height: 18)

attachment.bounds = CGRect(
    x: 0,
    y: (fontCapHeight - imageSize.height) / 2,
    width: imageSize.width,
    height: imageSize.height
)

Tekislashni hisoblash shriftning capHeight -dan foydalanadi — qatorning to'liq balandligi emas, balki bosh harfning balandligi. Bu ikonkaning vizual ravishda matnning yuqori chegarasiga mos kelishini ta'minlaydi, baseline va ascender o'rtasida silkinmaydi. Misoldagi tasvir o'lchami 18×18 pt, bu UI matnidagi ikonkalar uchun odatiy.

Agar tasvir matn qatoridan kattaroq bo'lishi kerak bo'lsa (masalan, chatdagi fotosuratni oldindan ko'rish), TextKit joriy qator uchun qatorlararo intervalni avtomatik ravishda oshiradi. Bu holda bounds tabiiy o'lchamda o'rnatiladi, Y bo'yicha siljish esa nolga teng.

PDF va maxsus ilovalar

NSTextAttachment nafaqat PNG va JPEG, balki PDF hujjatlarini va contents xususiyati orqali ixtiyoriy fayllarni ham qo'llab-quvvatlaydi. Bu uni iOS ilovalarida Rich Text uchun universal vositaga aylantiradi.

attachment.image da PDF tasvirini o'rnatishda tizim avtomatik ravishda hujjatning birinchi sahifasini ko'rsatadi. Biroq, aniq ko'rsatish uchun ma'lumotlarni to'g'ridan-to'g'ri data va UTI turi bilan inizilizator orqali foydalaning:

swift
guard let pdfData = Bundle.main.url(forResource: "document",
                                  withExtension: "pdf") else { return }

let fileData = Data(contentsOf: pdfData)
let attachment = NSTextAttachment(data: fileData,
                                       ofType: "com.adobe.pdf")

attachment.bounds = CGRect(x: 0, y: -4,
                           width: 24, height: 24)

let pdfString = NSAttributedString(attachment: attachment)

ofType parametri UTI qatorini (Uniform Type Identifier) qabul qiladi. Standart turlar: public.image (istalgan tasvir), public.jpeg, public.png, com.adobe.pdf. To'g'ri UTI ko'rsatilganda tizim to'g'ri ko'rsatish usulini tanlaydi — PDF uchun bu CGPDFDocument, tasvirlar uchun CGImageSource.

Maxsus fayl turlari uchun (masalan, SVG formatidagi vektor grafikasi) NSTextAttachment ning image(forBounds:textContainer:characterIndex:) metodini bekor qiladigan pastki sinfi talab qilinadi. Agar standart ko'rsatish mos kelmasa, nil qaytaring va draw metodida Core Graphics orqali chizishni amalga oshiring.

UITextView-da NSTextAttachment va delegatsiya

NSTextAttachment UILabel da ham, UITextView da ham to'g'ri ishlaydi. Biroq UITextView ko'proq imkoniyatlarni taqdim etadi: ilovalar bilan o'zaro aloqa (ikonkaga teginish), tasvirlar bilan birga matnni tahrirlash va NSAttachmentBehavior qo'llab-quvvatlashi.

UITextView da NSTextAttachment ga teginishni boshqarish uchun UITextViewDelegate delegati va textView(_:shouldInteractWith:in:interaction:) metodidan foydalaniladi. Bu metod foydalanuvchi ilovaga tekkanda chaqiriladi va ekranga o'tish, popup ochish yoki animatsiyani ijro etish imkonini beradi.

swift
func textView(_ textView: UITextView,
                shouldInteractWith attachment: NSTextAttachment,
                in characterRange: NSRange,
                interaction: UITextItemInteraction) -> Bool {
    if interaction == .preview {
        return false
    }
    // Tafsilot ekranini ochish
    showImageDetail(attachment.image)
    return false
}

Metod o'zaro ta'sir turlarini interaction parametri orqali farqlaydi: .preview (3D Touch / Haptic Touch), .default (oddiy teginish) va .presentActions (kontekst menyusi). Har bir tur uchun o'z xatti-harakatini o'rnatishingiz yoki false qaytarib uni taqiqlashingiz mumkin.

NSTextAttachment bilan UITextView ni tahrirlashda muhim: o'rnini bosuvchi belgini (0xFFFC) o'chirish ilovani ham o'chiradi. Foydalanuvchi tasvirni yagona element sifatida ko'radi — u butunlay tanlanadi, pikselma-piksel emas. iOS 15+ da ilovalarni sudrab tashlashni qo'llab-quvvatlash uchun NSTextAttachmentViewProvider dan foydalaning.

NSTextAttachment bilan ishlashdagi odatiy xatolar

Birinchi keng tarqalgan xato — bounds ni e'tiborsiz qoldirish. Dasturchilar ko'pincha tasvirning asl o'lchamiga tayanadilar, bu esa matnda ulkan ikonkalarga yoki aksincha, zo'rg'a ko'rinadigan tasvirlarga olib keladi. Har doim bounds ni shrift va kontekstni hisobga olgan holda aniq belgilang.

Ikkinchi xato — Y bo'yicha noto'g'ri siljish. bounds.origin.y dagi ijobiy qiymat tasvirni pastga tushiradi (UIKit koordinata tizimida Y o'qi pastga yo'naltirilgan — bu mantiqsiz ko'rinadi, lekin Core Graphics shunday ishlaydi). Qator markaziga tekislash uchun 3-bo'limda ko'rsatilganidek, shriftning capHeight formulasidan foydalaning.

Uchinchi muammo — traitCollection o'zgarishida tasvirning yo'qolishi. Foydalanuvchi Dark Mode yoki Dynamic Type ni o'zgartirganda, shrift o'lchami o'zgarishi mumkin, bounds esa avvalgidek qoladi. Yechim — bounds ni layoutSubviews metodida yoki font dagi KVO orqali dinamik hisoblash.

To'rtinchi tez-tez uchraydigan xato — UILabel da numberOfLines > 1 bilan NSTextAttachment ishlatish. Ko'p qatorli rejimda va cheklangan kenglikda TextKit qatorlarni tasvir bilan birga to'g'ri ko'chiradi. Muammo ilova balandligi qator balandligidan oshib ketganda yuzaga keladi — qo'shni qatorlar bir-birining ustiga chiqadi. Yechim — NSMutableParagraphStyle orqali lineSpacing ni oshirish.

Ko'p beriladigan savollar

NSTextAttachment matndagi UIImageView dan qanday farq qiladi?

NSTextAttachment tasvirni matn oqimining bir qismiga aylantiradi: u matn bilan birga ko'chiriladi, tekislanadi va masshtablanadi. UIImageView superview koordinatalariga bog'langan va matn joylashuvida ishtirok etmaydi.

NSTextAttachment ni UILabel ga qo'shish mumkinmi?

Ha, agar text o'rniga attributedText xususiyatini o'rnatsangiz. UILabel NSTextAttachment ni to'g'ri ko'rsatadi, lekin interaktivlikni qo'llab-quvvatlamaydi. Ilovaga teginish uchun UITextView dan foydalaning.

Attachment yaratgandan so'ng tasvir o'lchamini qanday o'zgartirish mumkin?

Mavjud NSTextAttachment namunasining bounds xususiyatini o'zgartiring. Matn avtomatik ravishda yangi o'lchamlar bilan qayta ko'rsatiladi, yangi NSAttributedString yaratish shart emas.

NSTextAttachment animatsion tasvirlarni qo'llab-quvvatlaydimi?

NSTextAttachment statik tasvirlarni qo'llab-quvvatlaydi. GIF va animatsion formatlar uchun iOS 15+ da NSTextAttachmentViewProvider yoki CADisplayLink orqali maxsus amalga oshirish talab qilinadi.

Matnga NSTextAttachment ni dasturiy ravishda qanday qo'shish mumkin?

NSTextAttachment namunasini yarating, image yoki data o'rnating, bounds belgilang, NSAttributedString(attachment:) bilan o'rab oling va insert(_:at:) metodi orqali NSMutableAttributedString ga joylashtiring.

Xulosa

  • NSTextAttachment — formatlangan matnga tasvirlar, PDF va boshqa media joylashtirish uchun UIKit sinfi.
  • Tasvir NSAttributedString(attachment:) orqali qo'shiladi va matn oqimining bir qismiga aylanadi.
  • bounds xususiyati o'lcham va joylashuvni boshqaradi: har doim shriftni hisobga olgan holda aniq belgilang.
  • Ikonkani qator markaziga tekislash uchun joriy shriftning capHeight formulasidan foydalaning.
  • PDF ilovalari data va to'g'ri UTI turi bilan inizilizator orqali qo'llab-quvvatlanadi.
  • Ilovaga teginishni boshqarish uchun UITextViewDelegate va shouldInteractWith metodidan foydalaning.
  • Dynamic Type o'zgarishida bounds ni dinamik qayta hisoblang, qatorlarning ustma-ust tushishiga yo'l qo'ymang.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing