Этот ответ обновлен для Swift 4.0.
общая форма для создания и установки атрибутной строки такова. Вы можете найти другие общие варианты ниже.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedStringKey.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedStringKey.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleSingle.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedStringKey.shadow: myShadow ]
Остальная часть этого сообщения дает более подробную информацию для тех, кто интересуется.
Атрибуты String - это просто словарь в форме [NSAttributedStringKey: Any]
, где NSAttributedStringKey
- это ключевое имя атрибута, а Any
- значение некоторого типа. Значение может быть шрифтом, цветом, целым числом или чем-то еще. В Swift есть много стандартных атрибутов, которые уже были предопределены. Например:
NSAttributedStringKey.font
, значение: a UIFont
NSAttributedStringKey.foregroundColor
, значение: a UIColor
NSAttributedStringKey.link
, значение: a NSURL
или String
Есть много других. См. эту ссылку для получения дополнительной информации. Вы можете даже создавать свои собственные пользовательские атрибуты, такие как:
NSAttributedStringKey.myName
, значение: некоторый тип. если вы создаете расширение : extension NSAttributedStringKey {
static let myName = NSAttributedStringKey(rawValue: "myCustomAttributeKey")
}
Создание атрибутов в Swift
Вы можете объявлять атрибуты так же, как объявление любого другого словаря.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedStringKey.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedStringKey.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleDouble.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedStringKey : Any] = [
NSAttributedStringKey.foregroundColor: UIColor.green,
NSAttributedStringKey.backgroundColor: UIColor.yellow,
NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleDouble.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedStringKey.myName: "Some value" ]
Обратите внимание на rawValue
, который был необходим для значения стиля подчеркивания.
Поскольку атрибуты - это просто словари, вы также можете создавать их, создавая пустой словарь, а затем добавляя ключ -значные пары. Если значение будет содержать несколько типов, тогда вы должны использовать Any
в качестве типа. Вот пример multipleAttributes
сверху, воссозданный таким образом:
var multipleAttributes = [NSAttributedStringKey : Any]()
multipleAttributes[NSAttributedStringKey.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedStringKey.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedStringKey.underlineStyle] = NSUnderlineStyle.styleDouble.rawValue
Теперь, когда вы понимаете атрибуты, вы можете создавать атрибутные строки.
Инициализация
Существует несколько способов создания атрибутированных строк. Если вам просто нужна строка только для чтения, вы можете использовать NSAttributedString
. Вот несколько способов его инициализации:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedStringKey.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedStringKey.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Если вам нужно будет изменить атрибуты или строковое содержимое позже, вы должны использовать NSMutableAttributedString
. Объявления очень похожи:
// 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: [NSAttributedStringKey.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedStringKey.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
В качестве примера давайте создадим строку с атрибутом вверху этого сообщения.
Сначала создайте NSMutableAttributedString
с новым атрибутом шрифта.
let myAttribute = [ NSAttributedStringKey.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Если вы работаете вместе, установите атрибутную строку в UITextView
(или UILabel
) следующим образом:
textView.attributedText = myString
Вы не используете textView.text
.
Вот результат:
Затем добавьте другую атрибутированную строку, которая не имеет атрибутов. (Обратите внимание, что даже если я использовал let
для объявления myString
выше, я все еще могу его изменить, потому что это NSMutableAttributedString
. Это кажется мне скорее несовместимым, и я не удивлюсь, если это изменится в будущем. Оставьте мне комментарий, когда это произойдет.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Затем мы просто выберем слово «Строки», которое начинается с индекса 17
и имеет длину 7
. Обратите внимание, что это NSRange
, а не Swift Range
. (См. этот ответ для получения дополнительных сведений о диапазонах.) Метод addAttribute
позволяет нам поместить имя ключа атрибута в первое место, значение атрибута во втором месте и диапазон в третьем месте.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: myRange)
Наконец, давайте добавим цвет фона. Для разнообразия воспользуемся методом addAttributes
(обратите внимание на s
). Я мог бы добавить сразу несколько атрибутов с этим методом, но я просто добавлю его снова.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedStringKey.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Обратите внимание, что атрибуты перекрываются в некоторые места.