NSAttributedString — คืออะไร การจัดรูปแบบข้อความและคุณสมบัติใน iOS

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-23 เวลาอ่าน: 9 นาที

NSAttributedString เป็นคลาสจากเฟรมเวิร์ก Foundation ใน iOS SDK ที่แสดงถึงสตริงที่มีชุดคุณสมบัติการจัดรูปแบบที่ใช้กับอักขระแต่ละตัวหรือช่วงของข้อความ แตกต่างจาก NSString ทั่วไป NSAttributedString จัดเก็บไม่เพียงแต่อักขระ Unicode แต่ยังจัดเก็บพจนานุกรมของคุณสมบัติ (แบบอักษร สี การเว้นระยะระหว่างอักขระ การจัดตำแหน่ง) สำหรับแต่ละส่วนของสตริง ตามเอกสารสำหรับนักพัฒนา Apple (2026) NSAttributedString เป็นพื้นฐานสำหรับการแสดงข้อความที่จัดรูปแบบในส่วนประกอบ UI ทั้งหมดของ iOS

ประเด็นสำคัญ

  • NSAttributedString — สตริงที่ไม่สามารถเปลี่ยนแปลงได้พร้อมคุณสมบัติ โดยที่แต่ละอักขระหรือช่วงจะสอดคล้องกับพจนานุกรม NSAttributedStringKey
  • NSMutableAttributedString — เวอร์ชันที่สามารถเปลี่ยนแปลงได้พร้อมเมธอด addAttribute, setAttributes, replaceCharacters สำหรับปรับเปลี่ยนคุณสมบัติในขณะรันไทม์
  • คุณสมบัติหลัก: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .backgroundColor
  • NSMutableParagraphStyle — อ็อบเจกต์ตัวช่วยสำหรับกำหนดการจัดตำแหน่ง ระยะห่างระหว่างบรรทัด การเยื้อง และทิศทางของข้อความ
  • UILabel, UITextView, UITextField รองรับ attributedText สำหรับแสดงสตริงที่มีคุณสมบัติ

NSAttributedString คืออะไร?

NSAttributedString เป็นคลาสพื้นฐานของ iOS/macOS สำหรับการทำงานกับข้อความที่จัดรูปแบบ มันขยาย NSString โดยการเพิ่มคุณสมบัติให้กับสตริง — พจนานุกรมของคู่คีย์-ค่า โดยที่คีย์คือค่าคงที่ NSAttributedStringKey (เช่น .font, .foregroundColor) และค่าคืออ็อบเจกต์ที่เกี่ยวข้อง (UIFont, UIColor) แต่ละอักขระในสตริงสามารถมีชุดคุณสมบัติของตัวเอง ทำให้สามารถจัดรูปแบบแบบผสมภายในสตริงเดียว

สถาปัตยกรรมของ NSAttributedString ขึ้นอยู่กับแนวคิดของการรันคุณสมบัติ (attribute runs) หากคุณตั้งค่าคุณสมบัติ .font เป็น UIFont.boldSystemFont(ofSize: 16) สำหรับช่วงอักขระ 0..5 อักขระทั้งหมดในช่วงนั้นจะปรากฏเป็นตัวหนา อักขระอื่นๆ อาจมีแบบอักษรอื่นหรือไม่มีคุณสมบัติเลย เมื่อเรนเดอร์สตริงที่มีคุณสมบัติ ระบบ UIKit จะรวมลักษณะจากช่วงต่างๆ และเรนเดอร์ข้อความอย่างสม่ำเสมอ

NSAttributedString ไม่สามารถเปลี่ยนแปลงได้ — หลังจากสร้างแล้ว คุณสมบัติและเนื้อหาของมันไม่สามารถเปลี่ยนแปลงได้ สำหรับการปรับเปลี่ยน มีคลาสย่อย NSMutableAttributedString ซึ่งมีเมธอดสำหรับการเพิ่ม ลบ และเปลี่ยนคุณสมบัติในช่วงใดๆ ความแตกต่างนี้สำคัญสำหรับมัลติเธรดดิ้ง: NSAttributedString ที่ไม่สามารถเปลี่ยนแปลงได้นั้นปลอดภัยต่อเธรด ในขณะที่ NSMutableAttributedString ไม่ปลอดภัย

คุณสมบัติหลักของการจัดรูปแบบข้อความ

NSAttributedString รองรับประมาณ 40 คุณสมบัติมาตรฐานที่กำหนดใน NSAttributedStringKey แต่ละคุณสมบัติส่งผลต่อลักษณะเฉพาะของลักษณะที่ปรากฏของข้อความ: แบบอักษร สี ตำแหน่ง การขีดเส้นใต้ เงา การเว้นระยะระหว่างอักขระ รูปแบบย่อหน้า และไฮเปอร์ลิงก์ หากต้องการตั้งค่าคุณสมบัติ ให้ใช้ค่าคงที่ NSAttributedStringKey และกำหนดอ็อบเจกต์ของประเภทที่เกี่ยวข้องให้กับมัน

คีย์คุณสมบัติประเภทค่าวัตถุประสงค์
.fontUIFontแบบอักษรและขนาดข้อความ
.foregroundColorUIColorสีข้อความ
.backgroundColorUIColorสีพื้นหลังด้านหลังข้อความ
.paragraphStyleNSParagraphStyleการจัดตำแหน่ง ระยะห่างระหว่างบรรทัด การเยื้อง
.kernNSNumber (Float)ระยะห่างระหว่างอักขระ (kerning)
.underlineStyleNSUnderlineStyle (Int)รูปแบบการขีดเส้นใต้ (เดี่ยว คู่ หนา ลวดลาย)
.strikethroughStyleNSUnderlineStyle (Int)รูปแบบการขีดทับ
.linkNSURLURL สำหรับไฮเปอร์ลิงก์แบบโต้ตอบ
.shadowNSShadowเงาของข้อความพร้อม offset, blurRadius และสี
.baselineOffsetNSNumber (Float)การออฟเซตข้อความจากเส้นฐาน

NSParagraphStyle — การจัดรูปแบบย่อหน้า

NSMutableParagraphStyle เป็นอ็อบเจกต์ที่จัดการลักษณะที่มองเห็นของย่อหน้า: การจัดตำแหน่ง (.alignment: .left, .center, .right, .justified), ระยะห่างระหว่างบรรทัด (.lineSpacing), ระยะห่างระหว่างย่อหน้า (.paragraphSpacing), การเยื้องบรรทัดแรก (.firstLineHeadIndent), การเยื้องซ้ายและขวา (.headIndent, .tailIndent) และทิศทางของข้อความ (.baseWritingDirection) ParagraphStyle ถูกนำไปใช้กับช่วงที่มีอักขระขึ้นบรรทัดใหม่หากต้องการการจัดรูปแบบเดียวกันสำหรับทั้งย่อหน้า

วิธีสร้าง NSAttributedString ในโค้ด

การสร้าง NSAttributedString ทำได้ผ่านตัวเริ่มต้นที่รับสตริงและพจนานุกรมของคุณสมบัติ คุณสมบัติจะถูกนำไปใช้กับทั้งสตริง สำหรับการจัดรูปแบบแบบผสม (คุณสมบัติต่างกันในส่วนต่างๆ ของสตริง) จะใช้ NSMutableAttributedString ด้วยการเพิ่มคุณสมบัติในภายหลังไปยังช่วงที่เฉพาะเจาะจง Objective-C ใช้พจนานุกรม NSAttributedStringKey: UIFont ในขณะที่ Swift ใช้พจนานุกรม [NSAttributedString.Key: Any] ที่ปลอดภัยต่อชนิด

swift
let plainText = "Hello, Swift!"

// Create with uniform attributes for the entire string
let attributes: [NSAttributedString.Key: Any] = [
    NSAttributedString.Key.font:
        UIFont.systemFont(ofSize: 18),
    NSAttributedString.Key.foregroundColor:
        UIColor.darkText,
    NSAttributedString.Key.kern: 1.5
]

let attributedString =
    NSAttributedString(string: plainText,
                        attributes: attributes)

การสร้างด้วย NSMutableParagraphStyle

ตัวอย่างสาธิต การจัดรูปแบบย่อหน้า ผ่าน NSMutableParagraphStyle กำหนดการจัดตำแหน่งกึ่งกลาง ระยะห่างระหว่างบรรทัด 8 จุด ระยะห่างหลังย่อหน้า 12 จุด ParagraphStyle ถูกเพิ่มไปยังพจนานุกรมคุณสมบัติภายใต้คีย์ .paragraphStyle NSAttributedString คัดลอก paragraphStyle ที่ส่งเข้ามา ดังนั้นหลังจากสร้างสตริงแล้ว คุณสามารถปรับเปลี่ยนได้โดยไม่กระทบต่อสตริงที่สร้างไว้แล้ว

swift
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.center
paragraphStyle.lineSpacing = 8.0
paragraphStyle.paragraphSpacing = 12.0
paragraphStyle.firstLineHeadIndent = 20.0

let attributed = NSAttributedString(
    string: "Centered paragraph with spacing",
    attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])

NSMutableAttributedString และการปรับเปลี่ยนคุณสมบัติ

NSMutableAttributedString เป็นคลาสย่อยของ NSAttributedString ที่อนุญาตให้ปรับเปลี่ยนเนื้อหาและคุณสมบัติหลังจากสร้าง เมธอดหลัก: addAttribute(_:value:range:) สำหรับเพิ่มคุณสมบัติเดียวให้กับช่วง; addAttributes(_:range:) สำหรับเพิ่มหลายคุณสมบัติ; setAttributes(_:range:) สำหรับแทนที่คุณสมบัติทั้งหมดในช่วง; removeAttribute(_:range:) สำหรับลบคุณสมบัติ; replaceCharacters(in:with:) สำหรับแทนที่ข้อความ

addAttribute และ addAttributes เพิ่มคุณสมบัติไปยังที่มีอยู่โดยไม่ลบคุณสมบัติที่ตั้งไว้แล้ว หากช่วงมีคุณสมบัติที่มีคีย์เดียวกันอยู่แล้ว ค่าของมันจะถูกแทนที่ setAttributes แทนที่พจนานุกรมคุณสมบัติทั้งหมดสำหรับช่วง — คุณสมบัติที่ตั้งไว้ก่อนหน้านี้ทั้งหมดจะถูกลบ สิ่งนี้สำคัญที่ต้องเข้าใจเมื่อจัดรูปแบบสตริงเดียวตามลำดับ: addAttributes ปลอดภัยกว่าเพราะมันไม่ได้รีเซ็ตแบบอักษรและสีที่ตั้งไว้แล้ว

ช่วง (NSRange) ถูกระบุโดยใช้โครงสร้าง NSRange(location: 0, length: 5) location คือดัชนีเริ่มต้น (ฐาน 0), length คือจำนวนอักขระ หากช่วงเกินขอบเขตของสตริง NSMutableAttributedString จะสร้างข้อยกเว้น NSRangeException สำหรับการดำเนินการกับช่วงที่ปลอดภัย ให้ใช้เมธอด NSRange จาก Foundation เช่น NSIntersectionRange และ NSUnionRange

swift
let attributed = NSMutableAttributedString(
    string: "Bold and red text here")

// Apply bold font to first 9 characters
let boldRange = NSRange(location: 0, length: 9)
attributed.addAttribute(
    NSAttributedString.Key.font,
    value: UIFont.boldSystemFont(ofSize: 16),
    range: boldRange)

// Apply red color to characters 13-16 ("text")
let redRange = NSRange(location: 13, length: 4)
attributed.addAttribute(
    NSAttributedString.Key.foregroundColor,
    value: UIColor.red,
    range: redRange)

// Apply underline to the entire string
let fullRange = NSRange(location: 0,
                       length: attributed.length)
attributed.addAttribute(
    NSAttributedString.Key.underlineStyle,
    value: NSUnderlineStyle.single.rawValue,
    range: fullRange)

ตัวอย่างการแสดงสตริงที่มีคุณสมบัติใน UILabel

วิธีที่ พบมากที่สุด ในการแสดง NSAttributedString คือการกำหนดให้กับคุณสมบัติ attributedText ของ UILabel แตกต่างจากคุณสมบัติ text, attributedText ใช้คุณสมบัติสำหรับการเรนเดอร์ รองรับการจัดรูปแบบแบบผสม สำคัญ: หากตั้งค่า attributedText แล้ว UILabel จะละเว้นคุณสมบัติ font, textColor และ textAlignment — ลักษณะที่มองเห็นทั้งหมดมาจากคุณสมบัติของ NSAttributedString

swift
let label = UILabel()
label.numberOfLines = 0

let fullText = NSMutableAttributedString(
    string: "Price: $24.99 per month")

// Format "Price:" label with bold font
let priceLabelRange = NSRange(
    location: 0, length: 6)
fullText.addAttribute(
    NSAttributedString.Key.font,
    value: UIFont.boldSystemFont(ofSize: 16),
    range: priceLabelRange)

// Format "$24.99" with green color
let amountRange = NSRange(
    location: 7, length: 6)
fullText.addAttribute(
    NSAttributedString.Key.foregroundColor,
    value: UIColor.systemGreen(),
    range: amountRange)
fullText.addAttribute(
    NSAttributedString.Key.font,
    value: UIFont.boldSystemFont(ofSize: 22),
    range: amountRange)

// Apply gray color to "per month" text
let periodRange = NSRange(
    location: 14, length: 9)
fullText.addAttribute(
    NSAttributedString.Key.foregroundColor,
    value: UIColor.secondaryLabel,
    range: periodRange)

label.attributedText = fullText

การแสดงใน UITextView พร้อมลิงก์แบบโต้ตอบ

UITextView รองรับลิงก์แบบโต้ตอบใน NSAttributedString คุณสมบัติ .link พร้อม NSURL ทำให้ข้อความคลิกได้ สำหรับจัดการการแตะ ให้ใช้ UITextViewDelegate พร้อมเมธอด textView(_:shouldInteractWith:in:interaction:) UITextView ยังรองรับการเลือกข้อความและการใช้ UIMenuController สำหรับการดำเนินการมาตรฐาน (คัดลอก, ค้นหา)

การแปลง NSAttributedString เป็น HTML และ RTF

NSAttributedString รองรับการแปลงจาก HTML และ RTF ผ่าน NSAttributedString.DocumentType ในการโหลด HTML ให้ใช้ตัวเริ่มต้นพร้อมพารามิเตอร์ documentAttributes: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil) ในทำนองเดียวกันสำหรับ RTF: .rtf หรือ .rtfd กลไกนี้มีประโยชน์สำหรับการแสดงเนื้อหา HTML โดยไม่ต้องใช้ WebView

สำหรับ การส่งออก เป็น HTML ให้ใช้เมธอด data(from:documentAttributes:) พร้อมช่วงและประเภทเอกสาร การส่งออก HTML: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]) ข้อมูลที่ได้สามารถบันทึกลงในไฟล์ ส่งไปยังเซิร์ฟเวอร์ หรือแสดงใน WebView ระหว่างการส่งออก แบบอักษร สี การจัดตำแหน่ง รายการ — คุณสมบัติการจัดรูปแบบทั้งหมด — จะถูกแปลงเป็นสไตล์ CSS

การรองรับ RTF มีความเกี่ยวข้องโดยเฉพาะสำหรับแอปพลิเคชัน macOS ซึ่ง RTF เป็นรูปแบบข้อความแบบ Rich Text มาตรฐาน iOS ยังรองรับการอ่านและเขียน RTF แต่ไม่ได้ใช้เป็นรูปแบบหลัก ความแตกต่างระหว่าง RTF และ RTFD: RTFD รวมทรัพยากรที่ฝังไว้ (รูปภาพ) ที่บรรจุในไดเรกทอรี NSAttributedString สามารถจัดการทั้งสองรูปแบบผ่านอินเทอร์เฟซเดียว

swift
let htmlString = "<p><b>Bold<\/b> and <i>italic<\/i><\/p>"
guard let htmlData = htmlString.data(
    using: String.Encoding.utf8) else { return }

let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
    NSAttributedString.DocumentReadingOptionKey.documentType:
        NSAttributedString.DocumentType.html
]

let attributedFromHTML =
    try? NSAttributedString(
        data: htmlData,
        options: options,
        documentAttributes: nil)

คำถามที่พบบ่อย

ความแตกต่างระหว่าง NSString และ NSAttributedString คืออะไร?

NSString จัดเก็บเฉพาะลำดับของอักขระ Unicode โดยไม่มีข้อมูลการจัดรูปแบบใดๆ NSAttributedString จัดเก็บอักขระและสำหรับแต่ละช่วงย่อยประกอบด้วยพจนานุกรมของคุณสมบัติ (แบบอักษร สี สไตล์) เมื่อแสดงผล UIKit จะใช้คุณสมบัติเหล่านี้สำหรับการเรนเดอร์ สร้างข้อความที่จัดรูปแบบ

ทำไม UILabel ไม่แสดงคุณสมบัติของ NSAttributedString?

สาเหตุที่พบบ่อยที่สุดคือการใช้คุณสมบัติ text แทน attributedText เมื่อกำหนดผ่าน text คุณสมบัติทั้งหมดจะถูกละเว้น สาเหตุที่สอง: หลังจากตั้งค่า attributedText แล้ว คุณเปลี่ยน font, textColor หรือ textAlignment ของ UILabel — การเปลี่ยนแปลงเหล่านี้รีเซ็ต attributedText ใช้เฉพาะ attributedText สำหรับข้อความที่จัดรูปแบบ

วิธีใช้แบบอักษรต่างกันกับสตริงเดียว?

สร้าง NSMutableAttributedString และเรียก addAttribute(.font, value: boldFont, range: boldRange) สำหรับแต่ละส่วนที่มีแบบอักษรต่างกัน แต่ละการเรียกใช้คุณสมบัติเฉพาะกับช่วงที่ระบุ อักขระที่เหลือจะคงแบบอักษรมาตรฐานหรือแบบอื่นที่ตั้งไว้ก่อนหน้านี้ ด้วยวิธีนี้จะสร้างการรันคุณสมบัติที่มีแบบอักษรต่างกัน

NSAttributedString ทำงานกับข้อความหลายบรรทัดหรือไม่?

ใช่ NSAttributedString จัดการข้อความหลายบรรทัดอย่างถูกต้อง รวมถึงอักขระขึ้นบรรทัดใหม่ ( ) UITextView และ UILabel (ที่มี numberOfLines = 0) จะตัดข้อความไปยังบรรทัดใหม่โดยอัตโนมัติ NSMutableParagraphStyle จัดการระยะห่างระหว่างบรรทัด การเยื้อง และการจัดตำแหน่งสำหรับแต่ละย่อหน้าอย่างอิสระ

วิธีสร้างข้อความสีที่มีสีต่างกันในสตริงเดียว?

ใช้ NSMutableAttributedString พร้อมคุณสมบัติ .foregroundColor สำหรับแต่ละช่วงสี สำหรับข้อความสีแดง: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange) สำหรับสีน้ำเงิน: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange) สีจะถูกนำไปใช้เฉพาะกับช่วงอักขระที่ระบุ

สรุป

  • NSAttributedString — สตริงที่มีคุณสมบัติการจัดรูปแบบ (แบบอักษร สี สไตล์) จัดเก็บในพจนานุกรมสำหรับแต่ละช่วงของอักขระ
  • NSMutableAttributedString — เวอร์ชันที่สามารถเปลี่ยนแปลงได้พร้อมเมธอด addAttribute, setAttributes และ removeAttribute สำหรับการจัดรูปแบบแบบไดนามิก
  • คุณสมบัติหลัก: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .shadow, .baselineOffset
  • NSMutableParagraphStyle จัดการการจัดตำแหน่ง ระยะห่างระหว่างบรรทัด การเยื้อง และทิศทางของข้อความสำหรับย่อหน้า
  • UILabel, UITextView, UITextField รองรับการแสดงข้อความที่จัดรูปแบบผ่านคุณสมบัติ attributedText
  • การแปลง HTML/RTF — NSAttributedString รองรับการนำเข้าและส่งออกข้อความที่จัดรูปแบบผ่าน documentType

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม