NSAttributedString เป็นคลาสจากเฟรมเวิร์ก Foundation ใน iOS SDK ที่แสดงถึงสตริงที่มีชุดคุณสมบัติการจัดรูปแบบที่ใช้กับอักขระแต่ละตัวหรือช่วงของข้อความ แตกต่างจาก NSString ทั่วไป NSAttributedString จัดเก็บไม่เพียงแต่อักขระ Unicode แต่ยังจัดเก็บพจนานุกรมของคุณสมบัติ (แบบอักษร สี การเว้นระยะระหว่างอักขระ การจัดตำแหน่ง) สำหรับแต่ละส่วนของสตริง ตามเอกสารสำหรับนักพัฒนา Apple (2026) NSAttributedString เป็นพื้นฐานสำหรับการแสดงข้อความที่จัดรูปแบบในส่วนประกอบ UI ทั้งหมดของ iOS
ประเด็นสำคัญ
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 และกำหนดอ็อบเจกต์ของประเภทที่เกี่ยวข้องให้กับมัน
| คีย์คุณสมบัติ | ประเภทค่า | วัตถุประสงค์ |
|---|---|---|
| .font | UIFont | แบบอักษรและขนาดข้อความ |
| .foregroundColor | UIColor | สีข้อความ |
| .backgroundColor | UIColor | สีพื้นหลังด้านหลังข้อความ |
| .paragraphStyle | NSParagraphStyle | การจัดตำแหน่ง ระยะห่างระหว่างบรรทัด การเยื้อง |
| .kern | NSNumber (Float) | ระยะห่างระหว่างอักขระ (kerning) |
| .underlineStyle | NSUnderlineStyle (Int) | รูปแบบการขีดเส้นใต้ (เดี่ยว คู่ หนา ลวดลาย) |
| .strikethroughStyle | NSUnderlineStyle (Int) | รูปแบบการขีดทับ |
| .link | NSURL | URL สำหรับไฮเปอร์ลิงก์แบบโต้ตอบ |
| .shadow | NSShadow | เงาของข้อความพร้อม offset, blurRadius และสี |
| .baselineOffset | NSNumber (Float) | การออฟเซตข้อความจากเส้นฐาน |
NSMutableParagraphStyle เป็นอ็อบเจกต์ที่จัดการลักษณะที่มองเห็นของย่อหน้า: การจัดตำแหน่ง (.alignment: .left, .center, .right, .justified), ระยะห่างระหว่างบรรทัด (.lineSpacing), ระยะห่างระหว่างย่อหน้า (.paragraphSpacing), การเยื้องบรรทัดแรก (.firstLineHeadIndent), การเยื้องซ้ายและขวา (.headIndent, .tailIndent) และทิศทางของข้อความ (.baseWritingDirection) ParagraphStyle ถูกนำไปใช้กับช่วงที่มีอักขระขึ้นบรรทัดใหม่หากต้องการการจัดรูปแบบเดียวกันสำหรับทั้งย่อหน้า
การสร้าง NSAttributedString ทำได้ผ่านตัวเริ่มต้นที่รับสตริงและพจนานุกรมของคุณสมบัติ คุณสมบัติจะถูกนำไปใช้กับทั้งสตริง สำหรับการจัดรูปแบบแบบผสม (คุณสมบัติต่างกันในส่วนต่างๆ ของสตริง) จะใช้ NSMutableAttributedString ด้วยการเพิ่มคุณสมบัติในภายหลังไปยังช่วงที่เฉพาะเจาะจง Objective-C ใช้พจนานุกรม NSAttributedStringKey: UIFont ในขณะที่ Swift ใช้พจนานุกรม [NSAttributedString.Key: Any] ที่ปลอดภัยต่อชนิด
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 กำหนดการจัดตำแหน่งกึ่งกลาง ระยะห่างระหว่างบรรทัด 8 จุด ระยะห่างหลังย่อหน้า 12 จุด ParagraphStyle ถูกเพิ่มไปยังพจนานุกรมคุณสมบัติภายใต้คีย์ .paragraphStyle NSAttributedString คัดลอก paragraphStyle ที่ส่งเข้ามา ดังนั้นหลังจากสร้างสตริงแล้ว คุณสามารถปรับเปลี่ยนได้โดยไม่กระทบต่อสตริงที่สร้างไว้แล้ว
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 เป็นคลาสย่อยของ 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
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)
วิธีที่ พบมากที่สุด ในการแสดง NSAttributedString คือการกำหนดให้กับคุณสมบัติ attributedText ของ UILabel แตกต่างจากคุณสมบัติ text, attributedText ใช้คุณสมบัติสำหรับการเรนเดอร์ รองรับการจัดรูปแบบแบบผสม สำคัญ: หากตั้งค่า attributedText แล้ว UILabel จะละเว้นคุณสมบัติ font, textColor และ textAlignment — ลักษณะที่มองเห็นทั้งหมดมาจากคุณสมบัติของ NSAttributedString
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 รองรับลิงก์แบบโต้ตอบใน NSAttributedString คุณสมบัติ .link พร้อม NSURL ทำให้ข้อความคลิกได้ สำหรับจัดการการแตะ ให้ใช้ UITextViewDelegate พร้อมเมธอด textView(_:shouldInteractWith:in:interaction:) UITextView ยังรองรับการเลือกข้อความและการใช้ UIMenuController สำหรับการดำเนินการมาตรฐาน (คัดลอก, ค้นหา)
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 สามารถจัดการทั้งสองรูปแบบผ่านอินเทอร์เฟซเดียว
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 จัดเก็บเฉพาะลำดับของอักขระ Unicode โดยไม่มีข้อมูลการจัดรูปแบบใดๆ NSAttributedString จัดเก็บอักขระและสำหรับแต่ละช่วงย่อยประกอบด้วยพจนานุกรมของคุณสมบัติ (แบบอักษร สี สไตล์) เมื่อแสดงผล UIKit จะใช้คุณสมบัติเหล่านี้สำหรับการเรนเดอร์ สร้างข้อความที่จัดรูปแบบ
สาเหตุที่พบบ่อยที่สุดคือการใช้คุณสมบัติ text แทน attributedText เมื่อกำหนดผ่าน text คุณสมบัติทั้งหมดจะถูกละเว้น สาเหตุที่สอง: หลังจากตั้งค่า attributedText แล้ว คุณเปลี่ยน font, textColor หรือ textAlignment ของ UILabel — การเปลี่ยนแปลงเหล่านี้รีเซ็ต attributedText ใช้เฉพาะ attributedText สำหรับข้อความที่จัดรูปแบบ
สร้าง NSMutableAttributedString และเรียก addAttribute(.font, value: boldFont, range: boldRange) สำหรับแต่ละส่วนที่มีแบบอักษรต่างกัน แต่ละการเรียกใช้คุณสมบัติเฉพาะกับช่วงที่ระบุ อักขระที่เหลือจะคงแบบอักษรมาตรฐานหรือแบบอื่นที่ตั้งไว้ก่อนหน้านี้ ด้วยวิธีนี้จะสร้างการรันคุณสมบัติที่มีแบบอักษรต่างกัน
ใช่ NSAttributedString จัดการข้อความหลายบรรทัดอย่างถูกต้อง รวมถึงอักขระขึ้นบรรทัดใหม่ ( ) UITextView และ UILabel (ที่มี numberOfLines = 0) จะตัดข้อความไปยังบรรทัดใหม่โดยอัตโนมัติ NSMutableParagraphStyle จัดการระยะห่างระหว่างบรรทัด การเยื้อง และการจัดตำแหน่งสำหรับแต่ละย่อหน้าอย่างอิสระ
ใช้ NSMutableAttributedString พร้อมคุณสมบัติ .foregroundColor สำหรับแต่ละช่วงสี สำหรับข้อความสีแดง: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange) สำหรับสีน้ำเงิน: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange) สีจะถูกนำไปใช้เฉพาะกับช่วงอักขระที่ระบุ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ