Этот ответ был обновлен для Swift 4.2.
Краткий справочник
Общая форма создания и установки приписанной строки выглядит следующим образом. Вы можете найти другие общие варианты ниже.
// 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 ]
Остальная часть этого поста дает более подробную информацию для тех, кто заинтересован.
Атрибуты
Строковые атрибуты - это просто словарь в форме [NSAttributedString.Key: Any]
, где NSAttributedString.Key
это имя ключа атрибута и Any
значение некоторого типа. Значением может быть шрифт, цвет, целое число или что-то еще. В Swift есть много стандартных атрибутов, которые уже были предопределены. Например:
- имя ключа:,
NSAttributedString.Key.font
значение: aUIFont
- имя ключа:,
NSAttributedString.Key.foregroundColor
значение: aUIColor
- имя ключа:,
NSAttributedString.Key.link
значение: NSURL
илиNSString
Есть много других. Смотрите эту ссылку для более. Вы даже можете создавать свои собственные атрибуты, такие как:
имя ключа:, NSAttributedString.Key.myName
значение: какой-то тип.
если вы делаете расширение :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Создание атрибутов в Swift
Вы можете объявить атрибуты так же, как и любой другой словарь.
// 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" ]
Обратите внимание, что rawValue
это было необходимо для значения стиля подчеркивания.
Поскольку атрибуты являются просто словарями, вы также можете создать их, создав пустой словарь и добавив в него пары ключ-значение. Если значение будет содержать несколько типов, то вы должны использовать Any
в качестве типа. Вот multipleAttributes
пример сверху, воссозданный таким образом:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.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: [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)
Если вам потребуется изменить атрибуты или содержимое строки позже, вы должны использовать 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: [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)
Изменение атрибутной строки
В качестве примера давайте создадим приписанную строку в верхней части этого поста.
Сначала создайте NSMutableAttributedString
с новым атрибутом шрифта.
let myAttribute = [ NSAttributedString.Key.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)
Далее мы просто выберем слово «Strings», которое начинается с индекса 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(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Наконец, давайте добавим цвет фона. Для разнообразия, давайте использовать addAttributes
метод (обратите внимание s
). Я мог бы добавить несколько атрибутов одновременно с этим методом, но я просто добавлю один снова.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Обратите внимание, что атрибуты в некоторых местах перекрываются. Добавление атрибута не перезаписывает атрибут, который уже существует.
Связанный
Дальнейшее чтение
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue