有没有办法判断UILabel是否使用label.attributedText
或label.text
属性设置了文本?
问题是当您设置attributedText
时,text
也会更新,反之亦然,因此无法检查nil的这些属性。
答案 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
}
}