Подтвердить что ты не робот

Можно ли получить список атрибутов и диапазонов для NSMutableAttributedString?

Я создал метод, который принимает NSAttributedString, и я хочу динамически создавать субвью и ярлык для ввода строки. Поскольку атрибуты, такие как шрифт и размер, должны быть определены для правильного определения размера метки, мне нужно определить, можно ли перебирать значения и диапазоны, которые были применены к атрибутной строке?

Я понимаю, что могу передавать атрибуты отдельно, но для повторного использования я хотел бы иметь возможность передавать как можно меньше параметров в метод.

4b9b3361

Ответ 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!])
        }
    }
}