Как сделать атрибутивную строку с помощью Swift?
Я пытаюсь сделать простой калькулятор кофе. Мне нужно отобразить количество кофе в граммах. Символ "g" для граммов должен быть прикреплен к моей UILabel, которую я использую для отображения суммы. Числа в UILabel динамически изменяются с пользовательским вводом, но мне нужно добавить строчную букву "g" в конце строки, которая отформатирована иначе, чем числа обновления. "G" необходимо прикрепить к номерам, чтобы при изменении размера и положения номера "g" перемещался вместе с числами. Я уверен, что эта проблема была решена раньше, так что ссылка в правильном направлении была бы полезна, поскольку я погуглил свое маленькое сердце.
Я искал в документации атрибутивную строку и даже загрузил "Attributed String Creator" из магазина приложений, но полученный код находится в Objective-C, и я использую Swift. То, что было бы замечательно и, вероятно, полезно для других разработчиков, изучающих этот язык, является ярким примером создания собственного шрифта с настраиваемыми атрибутами с использованием приписанной строки в Swift. Документация для этого очень запутанная, так как нет четкого пути, как это сделать. Мой план состоит в том, чтобы создать приписанную строку и добавить ее в конец моей строки coffeeAmount.
var coffeeAmount: String = calculatedCoffee + attributedText
Где вычисленный кофе - это Int, преобразованный в строку, а "attribuText" - это строчная буква "g" с настроенным шрифтом, который я пытаюсь создать. Может быть, я иду по этому пути неправильно. Любая помощь приветствуется!
31 ответ
Этот ответ был обновлен для 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 ]
Остальная часть этого поста дает более подробную информацию для тех, кто заинтересован.
Атрибуты
Строковые атрибуты - это просто словарь в форме [NSAttributedStringKey: Any]
, где NSAttributedStringKey
является ключевым именем атрибута и Any
значение некоторого Типа. Значением может быть шрифт, цвет, целое число или что-то еще. В Swift есть много стандартных атрибутов, которые уже были предопределены. Например:
- имя ключа:
NSAttributedStringKey.font
, значение:UIFont
- имя ключа:
NSAttributedStringKey.foregroundColor
, значение:UIColor
- имя ключа:
NSAttributedStringKey.link
, значение: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)
Далее мы просто выберем слово "Strings", которое начинается с индекса17
и имеет длину7
, Обратите внимание, что это NSRange
и не Свифт 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)
Обратите внимание, что атрибуты перекрываются в некоторых местах. Добавление атрибута не перезаписывает атрибут, который уже существует.
связанные с
- Как изменить текст
NSMutableAttributedString
но сохраняй атрибуты
Дальнейшее чтение
- Как получить атрибуты из местоположения крана
- Attributed String Руководство по программированию (очень информативно, но, к сожалению, только в Objective-C)
Swift использует то же самое NSMutableAttributedString
что делает Obj-C. Вы создаете его, передавая вычисленное значение в виде строки:
var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")
Теперь создайте атрибутированный g
Строка (хе). Замечания: UIFont.systemFontOfSize(_)
теперь является неудачным инициализатором, поэтому его необходимо развернуть, прежде чем использовать:
var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)!]
var gString = NSMutableAttributedString(string:"g", attributes:attrs)
И затем добавьте это:
attributedString.appendAttributedString(gString)
Затем вы можете настроить UILabel для отображения NSAttributedString следующим образом:
myLabel.attributedText = attributedString
Я очень рекомендую использовать библиотеку для приписанных строк. Это значительно облегчает задачу, например, если вам нужна одна строка с четырьмя разными цветами и четырьмя разными шрифтами. Вот мой любимый. Это называется SwiftyAttributes
Если вы хотите создать строку с четырьмя разными цветами и разными шрифтами, используя SwiftyAttributes:
let magenta = "Hello ".withAttributes([
.textColor(.magenta),
.font(.systemFont(ofSize: 15.0))
])
let cyan = "Sir ".withAttributes([
.textColor(.cyan),
.font(.boldSystemFont(ofSize: 15.0))
])
let green = "Lancelot".withAttributes([
.textColor(.green),
.font(.italicSystemFont(ofSize: 15.0))
])
let blue = "!".withAttributes([
.textColor(.blue),
.font(.preferredFont(forTextStyle: UIFontTextStyle.headline))
])
let finalString = magenta + cyan + green + blue
finalString
покажет как
Версия Xcode 6:
let attriString = NSAttributedString(string:"attriString", attributes:
[NSForegroundColorAttributeName: UIColor.lightGrayColor(),
NSFontAttributeName: AttriFont])
Версия Xcode 9.3:
let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedStringKey.foregroundColor: UIColor.lightGray,
NSAttributedStringKey.font: AttriFont])
Xcode 10, iOS 12, Swift 4:
let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
NSAttributedString.Key.font: AttriFont])
Swift 5
let attrStri = NSMutableAttributedString.init(string:"This is red")
let nsRange = NSString(string: "This is red").range(of: "red", options: String.CompareOptions.caseInsensitive)
attrStri.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.red, NSAttributedString.Key.font: UIFont.init(name: "PTSans-Regular", size: 15.0) as Any], range: nsRange)
self.label.attributedText = attrStri
Свифт 4:
let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!,
NSAttributedStringKey.foregroundColor: UIColor.white]
Swift: xcode 6.1
let font:UIFont? = UIFont(name: "Arial", size: 12.0)
let attrString = NSAttributedString(
string: titleData,
attributes: NSDictionary(
object: font!,
forKey: NSFontAttributeName))
Детали
- Swift 5.2, Xcode 11.4 (11E146)
Решение
protocol AttributedStringComponent {
var text: String { get }
func getAttributes() -> [NSAttributedString.Key: Any]?
}
// MARK: String extensions
extension String: AttributedStringComponent {
var text: String { self }
func getAttributes() -> [NSAttributedString.Key: Any]? { return nil }
}
extension String {
func toAttributed(with attributes: [NSAttributedString.Key: Any]?) -> NSAttributedString {
.init(string: self, attributes: attributes)
}
}
// MARK: NSAttributedString extensions
extension NSAttributedString: AttributedStringComponent {
var text: String { string }
func getAttributes() -> [Key: Any]? {
if string.isEmpty { return nil }
var range = NSRange(location: 0, length: string.count)
return attributes(at: 0, effectiveRange: &range)
}
}
extension NSAttributedString {
convenience init?(from attributedStringComponents: [AttributedStringComponent],
defaultAttributes: [NSAttributedString.Key: Any],
joinedSeparator: String = " ") {
switch attributedStringComponents.count {
case 0: return nil
default:
var joinedString = ""
typealias SttributedStringComponentDescriptor = ([NSAttributedString.Key: Any], NSRange)
let sttributedStringComponents = attributedStringComponents.enumerated().flatMap { (index, component) -> [SttributedStringComponentDescriptor] in
var components = [SttributedStringComponentDescriptor]()
if index != 0 {
components.append((defaultAttributes,
NSRange(location: joinedString.count, length: joinedSeparator.count)))
joinedString += joinedSeparator
}
components.append((component.getAttributes() ?? defaultAttributes,
NSRange(location: joinedString.count, length: component.text.count)))
joinedString += component.text
return components
}
let attributedString = NSMutableAttributedString(string: joinedString)
sttributedStringComponents.forEach { attributedString.addAttributes($0, range: $1) }
self.init(attributedString: attributedString)
}
}
}
Применение
let defaultAttributes = [
.font: UIFont.systemFont(ofSize: 16, weight: .regular),
.foregroundColor: UIColor.blue
] as [NSAttributedString.Key : Any]
let marketingAttributes = [
.font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
.foregroundColor: UIColor.black
] as [NSAttributedString.Key : Any]
let attributedStringComponents = [
"pay for",
NSAttributedString(string: "one",
attributes: marketingAttributes),
"and get",
"three!\n".toAttributed(with: marketingAttributes),
"Only today!".toAttributed(with: [
.font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
.foregroundColor: UIColor.red
])
] as [AttributedStringComponent]
let attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)
Полный пример
не забудьте вставить сюда код решения
import UIKit
class ViewController: UIViewController {
private weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel(frame: .init(x: 40, y: 40, width: 300, height: 80))
label.numberOfLines = 2
view.addSubview(label)
self.label = label
let defaultAttributes = [
.font: UIFont.systemFont(ofSize: 16, weight: .regular),
.foregroundColor: UIColor.blue
] as [NSAttributedString.Key : Any]
let marketingAttributes = [
.font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
.foregroundColor: UIColor.black
] as [NSAttributedString.Key : Any]
let attributedStringComponents = [
"pay for",
NSAttributedString(string: "one",
attributes: marketingAttributes),
"and get",
"three!\n".toAttributed(with: marketingAttributes),
"Only today!".toAttributed(with: [
.font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
.foregroundColor: UIColor.red
])
] as [AttributedStringComponent]
label.attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)
label.textAlignment = .center
}
}
Результат
Swift 2.0
Вот образец:
let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString
ИЛИ ЖЕ
let stringAttributes = [
NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 17.0)!,
NSUnderlineStyleAttributeName : 1,
NSForegroundColorAttributeName : UIColor.orangeColor(),
NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
NSStrokeWidthAttributeName : 2.0]
let atrributedString = NSAttributedString(string: "Sample String: Attributed", attributes: stringAttributes)
sampleLabel.attributedText = atrributedString
Лучший способ приблизиться к Attributed Strings на iOS - это использовать встроенный текстовый редактор Attributed Text в конструкторе интерфейса и избежать ненужного жесткого кодирования NSAtrributedStringKeys в ваших исходных файлах.
Позже вы можете динамически заменять placehoderls во время выполнения, используя это расширение:
extension NSAttributedString {
func replacing(placeholder:String, with valueString:String) -> NSAttributedString {
if let range = self.string.range(of:placeholder) {
let nsRange = NSRange(range,in:valueString)
let mutableText = NSMutableAttributedString(attributedString: self)
mutableText.replaceCharacters(in: nsRange, with: valueString)
return mutableText as NSAttributedString
}
return self
}
}
Добавьте метку раскадровки с атрибутивным текстом, который выглядит следующим образом.
Затем вы просто обновляете значение каждый раз, когда вам это нужно:
label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)
Обязательно сохраните в initalAttributedString исходное значение.
Вы можете лучше понять этот подход, прочитав эту статью: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
Я создал онлайн-инструмент, который решит вашу проблему! Вы можете написать свою строку и применить стили в графическом виде, и инструмент предоставит вам код target-c и swift для генерации этой строки.
Также с открытым исходным кодом, так что не стесняйтесь расширять его и отправлять PR.
Хорошо работает в бета 6
let attrString = NSAttributedString(
string: "title-title-title",
attributes: NSDictionary(
object: NSFont(name: "Arial", size: 12.0),
forKey: NSFontAttributeName))
Swift 5 и выше
let attributedString = NSAttributedString(string:"targetString",
attributes:[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
NSAttributedString.Key.font: UIFont(name: "Arial", size: 18.0) as Any])
Свифт 3,4,5
Используйте приведенный ниже код для цвета текста, шрифта, цвета фона и цвета подчеркивания/подчеркивания.
let text = "swift is language"
let attributes = [NSAttributedString.Key.foregroundColor: UIColor.red, NSAttributedString.Key.backgroundColor: UIColor.blue,NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25.0),NSAttributedString.Key.underlineColor: UIColor.white,NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue] as [NSAttributedString.Key : Any]
let textAttribute = NSAttributedString(string: text, attributes: attributes)
swiftLabel1.attributedText = textAttribute
func decorateText(sub:String, des:String)->NSAttributedString{
let textAttributesOne = [NSAttributedStringKey.foregroundColor: UIColor.darkText, NSAttributedStringKey.font: UIFont(name: "PTSans-Bold", size: 17.0)!]
let textAttributesTwo = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "PTSans-Regular", size: 14.0)!]
let textPartOne = NSMutableAttributedString(string: sub, attributes: textAttributesOne)
let textPartTwo = NSMutableAttributedString(string: des, attributes: textAttributesTwo)
let textCombination = NSMutableAttributedString()
textCombination.append(textPartOne)
textCombination.append(textPartTwo)
return textCombination
}
//Реализация
cell.lblFrom.attributedText = decorateText(sub: sender!, des: " - \(convertDateFormatShort3(myDateString: datetime!))")
Используйте этот пример кода. Это очень короткий код, соответствующий вашим требованиям. Это работает для меня.
let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]
let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)
Swift 4
let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]
let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)
Вам нужно удалить необработанное значение в swift 4
Для меня вышеупомянутые решения не работали при установке определенного цвета или свойства.
Это сработало:
let attributes = [
NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 12.0)!,
NSUnderlineStyleAttributeName : 1,
NSForegroundColorAttributeName : UIColor.darkGrayColor(),
NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
NSStrokeWidthAttributeName : 3.0]
var atriString = NSAttributedString(string: "My Attributed String", attributes: attributes)
Я сделал функцию, которая принимает массив строк и возвращает строку с атрибутами с указанными вами атрибутами.
func createAttributedString(stringArray: [String], attributedPart: Int, attributes: [NSAttributedString.Key: Any]) -> NSMutableAttributedString? {
let finalString = NSMutableAttributedString()
for i in 0 ..< stringArray.count {
var attributedString = NSMutableAttributedString(string: stringArray[i], attributes: nil)
if i == attributedPart {
attributedString = NSMutableAttributedString(string: attributedString.string, attributes: attributes)
finalString.append(attributedString)
} else {
finalString.append(attributedString)
}
}
return finalString
}
В приведенном выше примере вы указываете, какой части строки вы хотите присвоить атрибут attributedPart: Int
А затем вы задаете для него атрибуты с атрибутами: [NSAttributedString.Key: Any]
ПРИМЕР ИСПОЛЬЗОВАНИЯ
if let attributedString = createAttributedString(stringArray: ["Hello ", "how ", " are you?"], attributedPart: 2, attributes: [NSAttributedString.Key.foregroundColor: UIColor.systemYellow]) {
myLabel.attributedText = attributedString
}
Сделаю:
Swift 2.1 - Xcode 7
let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo", attributes: attributes)
myLabel.attributedText = attrString
Swift 4.2
extension UILabel {
func boldSubstring(_ substr: String) {
guard substr.isEmpty == false,
let text = attributedText,
let range = text.string.range(of: substr, options: .caseInsensitive) else {
return
}
let attr = NSMutableAttributedString(attributedString: text)
let start = text.string.distance(from: text.string.startIndex, to: range.lowerBound)
let length = text.string.distance(from: range.lowerBound, to: range.upperBound)
attr.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: self.font.pointSize)],
range: NSMakeRange(start, length))
attributedText = attr
}
}
Атрибуты могут быть установлены непосредственно в Swift 3...
let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!,
NSForegroundColorAttributeName : UIColor .white,
NSTextEffectAttributeName : NSTextEffectLetterpressStyle])
Затем используйте переменную в любом классе с атрибутами
let attrString = NSAttributedString (
string: "title-title-title",
attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
extension UILabel{
func setSubTextColor(pSubString : String, pColor : UIColor){
let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);
let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
if range.location != NSNotFound {
attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
}
self.attributedText = attributedString
}
}
Swifter Swift предлагает довольно приятный способ сделать это безо всякой работы. Просто предоставьте шаблон, который должен соответствовать, и какие атрибуты применить к нему. Они отлично подходят для многих вещей, проверьте их.
``` Swift
let defaultGenreText = NSAttributedString(string: "Select Genre - Required")
let redGenreText = defaultGenreText.applying(attributes: [NSAttributedString.Key.foregroundColor : UIColor.red], toRangesMatching: "Required")
``
Если у вас есть несколько мест, где это будет применяться, и вы хотите, чтобы это происходило только в определенных случаях, этот метод не сработает.
Вы можете сделать это за один шаг, просто легче читать, когда разделены.
Будет действительно легко решить вашу проблему с библиотекой, которую я создал. Это называется Атрибутика.
let calculatedCoffee: Int = 768
let g = Style("g").font(.boldSystemFont(ofSize: 12)).foregroundColor(.red)
let all = Style.font(.systemFont(ofSize: 12))
let str = "\(calculatedCoffee)<g>g</g>".style(tags: g)
.styleAll(all)
.attributedString
label.attributedText = str
Вы можете найти его здесь https://github.com/psharanda/Atributika
Swift 4.x
let attr = [NSForegroundColorAttributeName:self.configuration.settingsColor, NSFontAttributeName: self.configuration.settingsFont]
let title = NSAttributedString(string: self.configuration.settingsTitle,
attributes: attr)
Пожалуйста, рассмотрите возможность использования Prestyler
import Prestyler
...
Prestyle.defineRule("$", UIColor.red)
label.attributedText = "\(calculatedCoffee) $g$".prestyled()
Swift 3.0 // создаем приписанную строку
Определите атрибуты как
let attributes = [NSAttributedStringKey.font : UIFont.init(name: "Avenir-Medium", size: 13.0)]
Objective C 2.0 Пример:
myUILabel.text = @"€ 60,00";
NSMutableAttributedString *amountText = [[NSMutableAttributedString alloc] initWithString:myUILabel.text];
//Add attributes you are looking for
NSDictionary *dictionaryOfAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont systemFontOfSize:12],NSFontAttributeName,
[UIColor grayColor],NSForegroundColorAttributeName,
nil];
//Will gray color and resize the € symbol
[amountText setAttributes:dictionaryOfAttributes range:NSMakeRange(0, 1)];
myUILabel.attributedText = amountText;