Можно ли получить список атрибутов и диапазонов для NSMutableAttributedString?
Я создал метод, который принимает NSAttributedString, и я хочу динамически создавать субвью и ярлык для ввода строки. Поскольку атрибуты, такие как шрифт и размер, должны быть определены для правильного определения размера метки, мне нужно определить, можно ли перебирать значения и диапазоны, которые были применены к атрибутной строке?
Я понимаю, что могу передавать атрибуты отдельно, но для повторного использования я хотел бы иметь возможность передавать как можно меньше параметров в метод.
Ответы
Ответ 1
Apple ожидает, что вы будете использовать enumerateAttributesInRange:options:usingBlock:
. Блок, который вы поставляете, будет получать диапазоны и атрибуты, применимые для этого диапазона.
Я использовал это в своем коде для создания невидимых кнопок, которые помещаются за текстом, чтобы он действовал как гиперссылка.
Вы также можете использовать enumerateAttribute:inRange:options:usingBlock:
, если вас интересует только один, но нет полупустого дома, где вам может быть интересно в, скажем, два атрибута, но не каждый атрибут.
Ответ 2
Свифт 5 - 4
let attributedText = NSAttributedString(string: "Hello, playground", attributes: [
.foregroundColor: UIColor.red,
.backgroundColor: UIColor.green,
.ligature: 1,
.strikethroughStyle: 1
])
// retrieve attributes
let attributes = attributedText.attributes(at: 0, effectiveRange: nil)
// iterate each attribute
for attr in attributes {
print(attr.key, attr.value)
}
В случае, если вы определили attributedText
метки.
Свифт 3
var attributes = attributedText.attributes(
at: 0,
longestEffectiveRange: nil,
in: NSRange(location: 0, length: attributedText.length))
Swift 2.2
var attributes = attributedText.attributesAtIndex(0,
longestEffectiveRange: nil,
inRange: NSMakeRange(0, attributedText.length))
Ответ 3
Если вам нужны все атрибуты из строки во всем диапазоне, используйте этот код:
NSDictionary *attributesFromString = [stringWithAttributes attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, stringWithAttributes.length)];
Ответ 4
Apple Docs имеют ряд способов доступа к атрибутам:
Чтобы извлечь значения атрибутов из любого типа атрибутной строки, используйте любой из этих методов:
attributesAtIndex:effectiveRange:
attributesAtIndex:longestEffectiveRange:inRange:
attribute:atIndex:effectiveRange:
attribute:atIndex:longestEffectiveRange:inRange:
fontAttributesInRange:
rulerAttributesInRange:
Ответ 5
Swift 3:
// in case, that you have defined `attributedText` of label
var attributes = attributedText.attributes(at: 0, longestEffectiveRange: nil, in: NSMakeRange(0, attributedText.length))
...
Ответ 6
Swift 4:
Если вы хотите получить атрибуты для NSTextAttachment (просто измените значение атрибута, если хотите шрифт)
commentTextView.attributedText.enumerateAttribute(NSAttachmentAttributeName,
in:NSMakeRange(0, commentTextView.attributedText.length),
options:.longestEffectiveRangeNotRequired) {
value, range, stop in
if let attachment = value as? NSTextAttachment {
print("GOT AN ATTACHMENT! for comment at \(indexPath.row)")
}
}
Ответ 7
Я изменил один из ответов, предложив исправления, чтобы предотвратить бесконечную рекурсию и сбои приложения.
@IBDesignable
extension UITextField{
@IBInspectable var placeHolderColor: UIColor? {
get {
if let color = self.attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor {
return color
}
return nil
}
set {
self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[.foregroundColor: newValue!])
}
}
}