NSTextAttachment: یہ کیا ہے اور iOS میں متن میں تصویر کیسے شامل کریں

مصنف: IT Sectr اشاعت: 2026-07-25 مطالعے کا وقت: 9 منٹ

NSTextAttachment UIKit فریم ورک کی ایک کلاس ہے جو NSAttributedString کے ذریعے فارمیٹ شدہ متن میں تصاویر اور دیگر میڈیا اشیاء کو ایمبیڈ کرنے کی اجازت دیتی ہے۔ یہ TextKit اور Core Text کی سطح پر کام کرتی ہے، جس سے ڈویلپرز کو متن کے بہاؤ کے اندر اٹیچمنٹ کے سائز، پوزیشن اور رویے پر کنٹرول ملتا ہے۔ Apple Documentation (2025) کے مطابق، NSTextAttachment تصاویر، PDF اور کسٹم ویو کنٹینرز کو سپورٹ کرتا ہے، جو UITextView اور UILabel کے ساتھ مربوط ہوتا ہے۔ iOS ایپلیکیشنز میں Rich Text بنانے کے لیے اس API کو سمجھنا ضروری ہے — چیٹس اور ایڈیٹرز سے لے کر کیپشن میں آئیکن والی نیوز فیڈز تک۔

اہم نکات

  • NSTextAttachment فارمیٹ شدہ iOS متن میں میڈیا ایمبیڈ کرنے کے لیے UIKit کلاس ہے۔
  • تصویر NSAttributedString کے ذریعے NSAttachmentAttributeName کلید کے ساتھ شامل کی جاتی ہے۔
  • bounds پراپرٹی اٹیچمنٹ کے سائز اور عمودی آفسیٹ کو کنٹرول کرتی ہے۔
  • NSTextAttachment ڈیٹا کنٹینر کے ذریعے تصاویر، PDF اور کسٹم فائلوں کو سپورٹ کرتا ہے۔
  • API لچکدار متن کی ترتیب کے لیے UITextView، UILabel اور TextKit کے ساتھ مربوط ہوتا ہے۔

NSTextAttachment کیا ہے؟

NSTextAttachment UIKit فریم ورک کی ایک کلاس ہے جو میڈیا اشیاء کو براہ راست NSAttributedString کے متن کے مواد میں ایمبیڈ کرنے کی اجازت دیتی ہے۔ متن کے ساتھ رکھے گئے علیحدہ UIImageView کے برعکس، NSTextAttachment تصویر کو متن کے بہاؤ کا حصہ بناتا ہے: تصویر لائنوں کے ساتھ منتقل ہوتی ہے، سیدھ میں حصہ لیتی ہے، اور ایک عام حرف کی طرح جگہ لیتی ہے۔

یہ کلاس TextKit آرکیٹیکچر کا حصہ ہے، جو iOS اور macOS پر متن کی رینڈرنگ کا انتظام کرتا ہے۔ TextKit متن کو glyphs میں توڑتا ہے، kernning، ligature اور leading کو مدنظر رکھتا ہے — اور NSTextAttachment اس پائپ لائن میں ایک خاص حرف کے طور پر فٹ بیٹھتا ہے جو ایک حرف کے طور پر نہیں بلکہ ایک گرافک آبجیکٹ کے طور پر رینڈر ہوتا ہے۔

ہر NSTextAttachment مثال میں contents (فائل ڈیٹا)، fileType (UTI مواد کی قسم) اور bounds (پوائنٹس میں ایک مستطیل جو سائز اور پوزیشن کی وضاحت کرتا ہے) شامل ہوتا ہے۔ Apple Human Interface Guidelines کے مطابق، bounds بطور ڈیفالٹ تصویر کے سائز کے برابر ہوتا ہے، لیکن فونٹ کے ساتھ عین مطابق فٹ کے لیے تبدیل کیا جا سکتا ہے۔

NSTextAttachment کو علیحدہ UIImageView کے بجائے استعمال کریں جب تصویر کو متن کے حصے کے طور پر برتاؤ کرنا چاہیے — چیٹس، نیوز فیڈز، ٹیکسٹ ایڈیٹرز اور ان پٹ فیلڈز میں آئیکن والے فارمز میں۔

NSTextAttachment کے ذریعے متن میں تصویر کیسے شامل کریں

NSTextAttachment کے ساتھ بنیادی ورک فلو تین مراحل پر مشتمل ہے: ایک مثال بنائیں، تصویر سیٹ کریں، اور اسے NSAttributedString سے منسلک کریں۔ آئیے Swift کا استعمال کرتے ہوئے عمل دیکھتے ہیں۔

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:) کو کال کرنے کے بعد، NSTextAttachment آبجیکٹ NSAttachmentAttributeName وصف میں تبدیل ہو جاتا ہے، جو ایک خاص آبجیکٹ ریپلیسمنٹ کریکٹر (کوڈ 0xFFFC) سے منسلک ہوتا ہے۔ یہ حرف ایک حرف کے طور پر ظاہر نہیں ہوتا — اس کے بجائے، image پراپرٹی سے تصویر اس کی جگہ کھینچی جاتی ہے۔

اگر تصویر کو متن کی لائن کے بیچ میں رکھنا چاہیے (مثال کے طور پر، ایک لفظ کے بعد آئیکن)، تو بس NSMutableAttributedString میں مطلوبہ پوزیشن پر attachmentString داخل کریں۔ TextKit خود بخود لائن کی اونچائی کو مدنظر رکھے گا اور تصویر کو بیس لائن پر سیدھ میں لائے گا۔

اہم: image پراپرٹی صرف iOS پر دستیاب ہے (iOS 7 سے)۔ macOS پر، NSImage کے ساتھ contents پراپرٹی استعمال کریں۔ پسماندہ مطابقت کے لیے، ڈیٹا کنٹینر پر انحصار کرنے کے بجائے ہمیشہ براہ راست image سیٹ کرنے کو ترجیح دیں۔

bounds اور اٹیچمنٹ کی پوزیشن کی ترتیب

بطور ڈیفالٹ، NSTextAttachment تصویر کو پوائنٹس میں اصل سائز پر ڈسپلے کرتا ہے۔ عملی طور پر، تقریباً ہمیشہ سائز اور عمودی پوزیشن کو ایڈجسٹ کرنے کی ضرورت ہوتی ہے — یہ bounds پراپرٹی کا استعمال کرتے ہوئے کیا جاتا ہے۔

CGRect bounds ڈھانچے میں origin (X اور Y کے ذریعے آفسیٹ) اور size (چوڑائی اور اونچائی) شامل ہے۔ Y آفسیٹ خاص طور پر اہم ہے: منفی قدر تصویر کو بیس لائن سے نیچے لے جاتی ہے، مثبت قدر اسے اوپر اٹھاتی ہے۔ ایک عام منظر نامہ ایک آئیکن کو متن کی لائن کے مرکز میں سیدھ میں لانا ہے۔

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
)

سیدھ کا حساب کتاب فونٹ کے capHeight کا استعمال کرتا ہے — مکمل لائن کی اونچائی نہیں، بلکہ بڑے حرف کی اونچائی۔ یہ یقینی بناتا ہے کہ آئیکن بیس لائن اور ایسنڈر کے درمیان تیرنے کے بجائے بصری طور پر متن کے اوپری کنارے سے میل کھاتا ہے۔ مثال میں تصویر کا سائز 18×18 pt ہے، جو UI متن میں آئیکن کے لیے عام ہے۔

اگر تصویر متن کی لائن سے بڑی ہونی چاہیے (مثال کے طور پر، چیٹ میں فوٹو پیش نظارہ)، TextKit خود بخود موجودہ لائن کے لیے لائن اسپیسنگ بڑھا دے گا۔ اس صورت میں، bounds قدرتی سائز پر اور Y آفسیٹ صفر پر سیٹ کیا جانا چاہیے۔

PDF اور کسٹم اٹیچمنٹ

NSTextAttachment نہ صرف PNG اور JPEG بلکہ PDF دستاویزات کے ساتھ ساتھ contents پراپرٹی کے ذریعے صوابدیدی فائلوں کو بھی سپورٹ کرتا ہے۔ یہ اسے iOS ایپلیکیشنز میں Rich Text کے لیے ایک عالمگیر ٹول بناتا ہے۔

attachment.image میں PDF تصویر سیٹ کرتے وقت، سسٹم خود بخود دستاویز کا پہلا صفحہ رینڈر کرتا ہے۔ تاہم، عین مطابق رینڈرنگ کے لیے، ڈیٹا اور UTI قسم کے ساتھ init کے ذریعے براہ راست ڈیٹا استعمال کریں:

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 پیرامیٹر ایک UTI سٹرنگ (Uniform Type Identifier) قبول کرتا ہے۔ معیاری اقسام میں شامل ہیں: public.image (کوئی بھی تصویر)، public.jpeg، public.png، com.adobe.pdf۔ صحیح UTI بتانے پر، سسٹم مناسب رینڈرنگ طریقہ منتخب کرتا ہے — PDF کے لیے یہ CGPDFDocument ہے، تصاویر کے لیے یہ CGImageSource ہے۔

کسٹم فائل کی اقسام کے لیے (مثال کے طور پر، SVG فارمیٹ میں ویکٹر گرافکس)، آپ کو NSTextAttachment کے ذیلی طبقے کی ضرورت ہوگی جو image(forBounds:textContainer:characterIndex:) طریقہ کو اوور رائڈ کرتا ہے۔ اگر معیاری رینڈرنگ موزوں نہیں ہے، تو nil لوٹائیں اور draw طریقہ میں Core Graphics کے ذریعے ڈرائنگ کو نافذ کریں۔

UITextView میں NSTextAttachment اور ڈیلیگیشن

NSTextAttachment UILabel اور UITextView دونوں میں درست طریقے سے کام کرتا ہے۔ تاہم، UITextView مزید صلاحیتیں فراہم کرتا ہے: اٹیچمنٹ کے ساتھ تعامل (آئیکن پر ٹیپ کرنا)، تصاویر کے ساتھ متن میں ترمیم کرنا، اور NSAttachmentBehavior کے لیے سپورٹ۔

UITextView میں NSTextAttachment پر ٹیپ کو ہینڈل کرنے کے لیے، UITextViewDelegate پروٹوکول اور textView(_:shouldInteractWith:in:interaction:) طریقہ استعمال کریں۔ یہ طریقہ اس وقت کال کیا جاتا ہے جب صارف کسی اٹیچمنٹ پر ٹیپ کرتا ہے اور اسکرین پر جانے، پاپ اپ کھولنے یا اینیمیشن چلانے کی اجازت دیتا ہے۔

swift
func textView(_ textView: UITextView,
                shouldInteractWith attachment: NSTextAttachment,
                in characterRange: NSRange,
                interaction: UITextItemInteraction) -> Bool {
    if interaction == .preview {
        return false
    }
    // تفصیل کی اسکرین کھولیں
    showImageDetail(attachment.image)
    return false
}

یہ طریقہ interaction پیرامیٹر کے ذریعے تعامل کی اقسام میں فرق کرتا ہے: .preview (3D Touch / Haptic Touch)، .default (عام ٹیپ)، اور .presentActions (سیاق و سباق کا مینو)۔ ہر قسم کے لیے، آپ اپنا رویہ بیان کر سکتے ہیں یا false لوٹا کر اسے غیر فعال کر سکتے ہیں۔

NSTextAttachment کے ساتھ UITextView میں ترمیم کرتے وقت، یہ یاد رکھنا ضروری ہے: ریپلیسمنٹ کریکٹر (0xFFFC) کو حذف کرنے سے اٹیچمنٹ بھی حذف ہو جاتا ہے۔ صارف تصویر کو ایک واحد عنصر کے طور پر دیکھتا ہے — یہ پکسل بہ پکسل نہیں بلکہ مجموعی طور پر منتخب ہوتا ہے۔ iOS 15+ پر اٹیچمنٹ کے ڈریگ اینڈ ڈراپ سپورٹ کے لیے، NSTextAttachmentViewProvider استعمال کریں۔

NSTextAttachment کے ساتھ کام کرتے وقت عام غلطیاں

پہلی عام غلطی bounds کو نظر انداز کرنا ہے۔ ڈویلپرز اکثر اصل تصویر کے سائز پر انحصار کرتے ہیں، جس کی وجہ سے متن میں بڑے آئیکن یا اس کے برعکس بمشکل نظر آنے والی تصاویر بنتی ہیں۔ ہمیشہ فونٹ اور سیاق و سباق کو مدنظر رکھتے ہوئے bounds کو واضح طور پر سیٹ کریں۔

دوسری غلطی غلط Y آفسیٹ ہے۔ bounds.origin.y میں مثبت قدر تصویر کو نیچے لے جاتی ہے (UIKit کے کوآرڈینیٹ سسٹم میں، Y محور نیچے کی طرف اشارہ کرتا ہے — یہ غیر منطقی لگتا ہے، لیکن Core Graphics اسی طرح کام کرتا ہے)۔ ایک لائن کے اندر مرکز میں سیدھ کرنے کے لیے، سیکشن 3 میں دکھائے گئے مطابق فونٹ کے capHeight کے ساتھ فارمولا استعمال کریں۔

تیسرا مسئلہ traitCollection تبدیلی پر تصویر کا کھو جانا ہے۔ جب صارف ڈارک موڈ یا Dynamic Type کو تبدیل کرتا ہے، تو فونٹ کا سائز بدل سکتا ہے، لیکن bounds وہی رہتا ہے۔ حل layoutSubviews طریقہ میں یا فونٹ پر KVO کے ذریعے bounds کو متحرک طور پر شمار کرنا ہے۔

چوتھی بار بار ہونے والی غلطی numberOfLines > 1 والے UILabel میں NSTextAttachment استعمال کرنا ہے۔ محدود چوڑائی کے ساتھ کثیر السطور موڈ میں، TextKit تصویر کے ساتھ لائنوں کو درست طریقے سے لپیٹتا ہے۔ مسئلہ اس وقت پیدا ہوتا ہے جب اٹیچمنٹ کی اونچائی لائن کی اونچائی سے تجاوز کر جاتی ہے — ملحقہ لائنیں ایک دوسرے پر چڑھ جاتی ہیں۔ حل NSMutableParagraphStyle کے ذریعے lineSpacing بڑھانا ہے۔

اکثر پوچھے گئے سوالات

متن میں NSTextAttachment UIImageView سے کیسے مختلف ہے؟

NSTextAttachment تصویر کو متن کے بہاؤ کا حصہ بناتا ہے: یہ متن کے ساتھ لپٹتا ہے، سیدھ میں آتا ہے اور اسکیل ہوتا ہے۔ UIImageView سپر ویو کوآرڈینیٹ سے منسلک ہوتا ہے اور متن کی ترتیب میں حصہ نہیں لیتا۔

کیا UILabel میں NSTextAttachment شامل کیا جا سکتا ہے؟

ہاں، اگر آپ text کے بجائے attributedText پراپرٹی سیٹ کرتے ہیں۔ UILabel NSTextAttachment کو درست طریقے سے ڈسپلے کرتا ہے لیکن انٹرایکٹیویٹی کو سپورٹ نہیں کرتا۔ اٹیچمنٹ پر ٹیپ کے لیے، UITextView استعمال کریں۔

اٹیچمنٹ بنانے کے بعد تصویر کا سائز کیسے تبدیل کروں؟

موجودہ NSTextAttachment مثال کی bounds پراپرٹی تبدیل کریں۔ نیا NSAttributedString بنانے کی ضرورت کے بغیر متن خود بخود نئے سائز کے ساتھ دوبارہ رینڈر ہو جائے گا۔

کیا NSTextAttachment اینی میٹڈ تصاویر کو سپورٹ کرتا ہے؟

NSTextAttachment جامد تصاویر کو سپورٹ کرتا ہے۔ GIF اور اینی میٹڈ فارمیٹس کے لیے، iOS 15+ پر NSTextAttachmentViewProvider یا CADisplayLink کے ذریعے کسٹم نفاذ کی ضرورت ہے۔

پروگرامی طور پر متن میں NSTextAttachment کیسے شامل کروں؟

ایک NSTextAttachment مثال بنائیں، تصویر یا ڈیٹا سیٹ کریں، bounds سیٹ کریں، اسے NSAttributedString(attachment:) میں لپیٹیں، اور insert(_:at:) طریقہ استعمال کرتے ہوئے NSMutableAttributedString میں داخل کریں۔

خلاصہ

  • NSTextAttachment فارمیٹ شدہ متن میں تصاویر، PDF اور دیگر میڈیا ایمبیڈ کرنے کے لیے UIKit کلاس ہے۔
  • تصویر NSAttributedString(attachment:) کے ذریعے شامل کی جاتی ہے اور متن کے بہاؤ کا حصہ بن جاتی ہے۔
  • bounds پراپرٹی سائز اور پوزیشن کو کنٹرول کرتی ہے: ہمیشہ فونٹ کو مدنظر رکھتے ہوئے اسے واضح طور پر سیٹ کریں۔
  • ایک لائن کے اندر آئیکن کو مرکز میں رکھنے کے لیے، موجودہ فونٹ کے capHeight کے ساتھ فارمولا استعمال کریں۔
  • PDF اٹیچمنٹ data اور صحیح UTI قسم کے ساتھ init کے ذریعے سپورٹ کیے جاتے ہیں۔
  • اٹیچمنٹ پر ٹیپ کو ہینڈل کرنے کے لیے، UITextViewDelegate اور shouldInteractWith طریقہ استعمال کریں۔
  • Dynamic Type تبدیل ہونے پر، لائنوں کے اوورلیپ سے بچنے کے لیے bounds کو متحرک طور پر دوبارہ شمار کریں۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں