Этот ответ был обновлен для 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
textView.atrributedtText = myString
илиmyLabel.attributedText = myString
в начале вашего ответа. Как новичок я просто делалmyLabel.text
и не думал, что мне нужно было пройти через все ваши ответы. ** 3) ** Значит ли это, что вы можете иметь только один из нихattributedText
илиtext
что иметь их обоих было бы бессмысленно? 4) Я рекомендую вам также включитьlineSpacing
пример, подобный этому, в свой ответ, так как он очень полезен. 5) ачаар дахинappendAttributedString
это как «Конкатенация строк».addAttribute
добавляет новый атрибут в вашу строку.addAttribute
это методNSMutableAttributedString
. Вы правы, что вы не можете использовать его сString
илиNSAttributedString
. (ПроверьтеmyString
определение в разделе « Изменение строки атрибута » в этом посте. Я думаю, что отбросил вас, потому что я также использовалmyString
имя переменной в первой части поста, где она былаNSAttributedString
.)Swift использует то же,
NSMutableAttributedString
что и Obj-C. Вы создаете его, передавая вычисленное значение в виде строки:Теперь создайте приписанную
g
строку (хе). Примечание:UIFont.systemFontOfSize(_)
теперь это сбойный инициализатор, поэтому его нужно развернуть, прежде чем вы сможете его использовать:И затем добавьте это:
Затем вы можете настроить UILabel для отображения NSAttributedString следующим образом:
источник
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes)
Когда я устанавливаю свой UILabel.text = coffeeText, я получаю сообщение об ошибке «NSMutableAttributedString не конвертируется в« String ». Есть ли способ заставить UILabel принимать NSMutableAttributedString?Версия Xcode 6 :
Версия Xcode 9.3 :
Xcode 10, iOS 12, Swift 4 :
источник
Свифт 4:
источник
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Я очень рекомендую использовать библиотеку для приписанных строк. Это значительно облегчает задачу, например, если вам нужна одна строка с четырьмя разными цветами и четырьмя разными шрифтами. Вот мой любимый. Это называется SwiftyAttributes
Если вы хотите создать строку с четырьмя разными цветами и разными шрифтами, используя SwiftyAttributes:
finalString
покажет какисточник
Swift: xcode 6.1
источник
Лучший способ приблизиться к Attributed Strings на iOS - это использовать встроенный текстовый редактор Attributed Text в конструкторе интерфейса и избежать ненужного жесткого кодирования NSAtrributedStringKeys в ваших исходных файлах.
Позже вы можете динамически заменять placehoderls во время выполнения, используя это расширение:
Добавьте метку раскадровки с атрибутивным текстом, похожим на этот.
Затем вы просто обновляете значение каждый раз, когда вам это нужно:
Обязательно сохраните в initalAttributedString исходное значение.
Вы можете лучше понять этот подход, прочитав эту статью: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
источник
let nsRange = NSRange(range,in:valueString)
линии.Swift 2.0
Вот образец:
Swift 5.x
ИЛИ
источник
Хорошо работает в бета 6
источник
Я создал онлайн-инструмент, который решит вашу проблему! Вы можете написать свою строку и применить стили графически, и инструмент даст вам код target-c и swift для генерации этой строки.
Также с открытым исходным кодом, так что не стесняйтесь расширять его и отправлять PR.
Инструмент Трансформер
Github
источник
Swift 5 и выше
источник
//Реализация
источник
Swift 4
Вам нужно удалить необработанное значение в swift 4
источник
Для меня вышеупомянутые решения не работали при установке определенного цвета или свойства.
Это сработало:
источник
Swift 2.1 - Xcode 7
источник
Используйте этот пример кода. Это очень короткий код для достижения ваших требований. Это работает для меня.
источник
источник
Атрибуты могут быть установлены непосредственно в Swift 3 ...
Затем используйте переменную в любом классе с атрибутами
источник
Swift 4.2
источник
подробности
Решение
использование
Полный пример
результат
источник
Будет действительно легко решить вашу проблему с библиотекой, которую я создал. Это называется Атрибутика.
Вы можете найти его здесь https://github.com/psharanda/Atributika
источник
источник
Swifter Swift предлагает довольно приятный способ сделать это безо всякой работы. Просто предоставьте шаблон, который должен быть сопоставлен, и какие атрибуты применимы к нему. Они отлично подходят для многих вещей, проверьте их.
Если у вас есть несколько мест, где это может быть применено, и вы хотите, чтобы это происходило только в определенных случаях, этот метод не сработает.
Вы можете сделать это за один шаг, просто легче читать, когда разделены.
источник
Swift 4.x
источник
Swift 3.0 // создаем приписанную строку
Определите атрибуты как
источник
Пожалуйста, рассмотрите возможность использования Prestyler
источник
Swift 5
источник
}
// Используйте это как ниже
источник