Câu trả lời này đã được cập nhật cho Swift 4.2.
Tham khảo nhanh
Hình thức chung để tạo và thiết lập một chuỗi được quy là như thế này. Bạn có thể tìm thấy các tùy chọn phổ biến khác dưới đây.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
Phần còn lại của bài đăng này cung cấp thêm chi tiết cho những người quan tâm.
Thuộc tính
Các thuộc tính chuỗi chỉ là một từ điển ở dạng [NSAttributedString.Key: Any]
, trong đó NSAttributedString.Key
là tên khóa của thuộc tính và Any
là giá trị của một số Loại. Giá trị có thể là phông chữ, màu sắc, số nguyên hoặc thứ gì khác. Có nhiều thuộc tính tiêu chuẩn trong Swift đã được xác định trước. Ví dụ:
- tên khóa:
NSAttributedString.Key.font
, giá trị: aUIFont
- tên khóa:
NSAttributedString.Key.foregroundColor
, giá trị: aUIColor
- tên khóa :
NSAttributedString.Key.link
, giá trị: một NSURL
hoặcNSString
Có nhiều người khác. Xem liên kết này để biết thêm. Bạn thậm chí có thể tạo các thuộc tính tùy chỉnh của riêng mình như:
Tên khóa : NSAttributedString.Key.myName
, giá trị: một số Loại.
nếu bạn thực hiện một phần mở rộng :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Tạo thuộc tính trong Swift
Bạn có thể khai báo các thuộc tính giống như khai báo bất kỳ từ điển nào khác.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Lưu ý rawValue
rằng điều đó là cần thiết cho giá trị kiểu gạch chân.
Vì các thuộc tính chỉ là Từ điển, bạn cũng có thể tạo chúng bằng cách tạo một Từ điển trống và sau đó thêm các cặp khóa-giá trị vào đó. Nếu giá trị sẽ chứa nhiều loại, thì bạn phải sử dụng Any
làm loại. Dưới đây là multipleAttributes
ví dụ từ trên, được tái tạo theo cách này:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Chuỗi được quy
Bây giờ bạn đã hiểu các thuộc tính, bạn có thể tạo các chuỗi được gán.
Khởi tạo
Có một vài cách để tạo các chuỗi được quy. Nếu bạn chỉ cần một chuỗi chỉ đọc, bạn có thể sử dụng NSAttributedString
. Dưới đây là một số cách để khởi tạo nó:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Nếu bạn sẽ cần thay đổi các thuộc tính hoặc nội dung chuỗi sau này, bạn nên sử dụng NSMutableAttributedString
. Các khai báo rất giống nhau:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Thay đổi một chuỗi thuộc tính
Ví dụ, hãy tạo chuỗi được gán ở đầu bài này.
Đầu tiên tạo một NSMutableAttributedString
thuộc tính phông chữ mới.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Nếu bạn đang làm việc cùng, hãy đặt chuỗi được gán thành một UITextView
(hoặc UILabel
) như thế này:
textView.attributedText = myString
Bạn không sử dụng textView.text
.
Đây là kết quả:
Sau đó nối thêm một chuỗi được quy cho không có bất kỳ thuộc tính nào được đặt. (Lưu ý rằng mặc dù tôi đã sử dụnglet
khai báo myString
ở trên, tôi vẫn có thể sửa đổi nó vì nó là NSMutableAttributedString
. Điều này có vẻ không phù hợp với tôi và tôi sẽ không ngạc nhiên nếu điều này thay đổi trong tương lai. Hãy để lại nhận xét khi điều đó xảy ra.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Tiếp theo, chúng tôi sẽ chỉ chọn từ "Chuỗi", bắt đầu từ chỉ mục 17
và có độ dài 7
. Lưu ý rằng đây là một NSRange
và không phải là Swift Range
. (Xem câu trả lời này để biết thêm về Phạm vi.) addAttribute
Phương thức cho phép chúng ta đặt tên khóa thuộc tính ở vị trí đầu tiên, giá trị thuộc tính ở vị trí thứ hai và phạm vi ở vị trí thứ ba.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Cuối cùng, hãy thêm một màu nền. Để đa dạng, hãy sử dụngaddAttributes
phương pháp (lưu ý s
). Tôi có thể thêm nhiều thuộc tính cùng một lúc với phương thức này, nhưng tôi sẽ chỉ thêm một thuộc tính nữa.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Lưu ý rằng các thuộc tính được chồng chéo ở một số nơi. Thêm một thuộc tính không ghi đè lên một thuộc tính đã có.
Liên quan
Đọc thêm
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue