如何检查UILabel是否以编程方式归因于文本或普通文本?

时间:2015-04-03 18:41:17

标签: ios uilabel nsattributedstring

有没有办法判断UILabel是否使用label.attributedTextlabel.text属性设置了文本?

问题是当您设置attributedText时,text也会更新,反之亦然,因此无法检查nil的这些属性。

5 个答案:

答案 0 :(得分:3)

受@ lukas-o的启发我在UILabel上写了一个扩展名,确定它是否包含attributedText。实际上,如果NSAttributedString不包含任何属性,则此计算属性会将其评估为不归因。

extension UILabel {
    var isAttributed: Bool {
        guard let attributedText = attributedText else { return false }
        let range = NSMakeRange(0, attributedText.length)
        var allAttributes = [Dictionary<String, Any>]()
        attributedText.enumerateAttributes(in: range, options: []) { attributes, _, _ in
            allAttributes.append(attributes)
        }
        return allAttributes.count > 1
    }
} 

答案 1 :(得分:2)

来自apple docs

  

默认情况下,此属性为零。为此属性分配新值也会使用相同的字符串数据替换text属性的值,尽管没有任何格式信息。此外,指定新值会更新font,textColor和其他与样式相关的属性中的值,以便它们反映从属性字符串中的位置0开始的样式信息。

你是对的,不可能发现检查一个或另一个为零。你可以知道文本归属的一种方法是使用类似的东西:

NSMutableArray *strAttrs = [NSMutableArray new];
NSMutableArray *strRanges = [NSMutableArray new];

[label.attributedText enumerateAttributesInRange:NSMakeRange(0, label.attributedText.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
        [strAttrs addObject:attrs];
        [strRanges addObject:[NSValue valueWithRange:(range)]];
}];

通过这种方式,您可以了解是否存在多个属性。您还可以比较属性是否与标准属性匹配,并假设仅在此情况下设置了text属性。

答案 2 :(得分:0)

这就是我使用的。如果范围长度等于未归因的文本长度,则文本只有一个属性,因此未归因。

NSRange range;
[label.attributedText attributesAtIndex:0 effectiveRange:&range];
BOOL isAttributed = label.text.length==range.length;

答案 3 :(得分:0)

这是我想出的实现,但逻辑有些改动。这是@Vallette接受的答案的Swift端口,带有附加的保护声明。

仅当true不为零,不为空并且具有至少一个不适用于整个文本范围的属性时,该函数才返回attributedText

extension UILabel {

    var isPartiallyAttributed: Bool {
        guard let attributedText = attributedText else {
            return false
        }
        guard !attributedText.string.isEmpty else {
            return false
        }
        var range = NSRange()
        attributedText.attributes(at: 0, effectiveRange: &range)
        return attributedText.string.count != range.length
    }
}

答案 4 :(得分:0)

更好的方法是检查Range属性的长度是否与字符串的长度相同。如果相同,则可以假定这是非归因标签。 但是,如果将100%应用于整个NSAttributes文本,我不知道UILabel检查属性文本的可靠方法。

private extension UILabel {
    
    var hasAttributedText: Bool {
    guard let attributedText = attributedText,
          attributedText.string.isEmpty == false else { return false }
    var range = NSRange(location: 0, length: attributedText.length)
    _ = attributedText.attributes(at: 0,
                                  effectiveRange: &range)
    return range.length != attributedText.length
}
    
}