[英]How to check if UILabel has attributedText or normal text programmatically?
有什么方法可以判斷 UILabel 是否使用label.attributedText
或label.text
屬性設置其文本?
問題是當您設置attributedText
, text
也會更新,反之亦然,因此無法檢查這些屬性是否為零。
受@lukas-o 的啟發,我在UILabel
上編寫了一個擴展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
}
}
來自蘋果文檔:
默認情況下,此屬性為零。 為該屬性分配一個新值也會用相同的字符串數據替換 text 屬性的值,盡管沒有任何格式信息。 此外,分配新的 a 值會更新 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 屬性。
這就是我使用的。 如果范圍長度等於無屬性文本長度,則文本只有一個屬性,因此是無屬性的。
NSRange range;
[label.attributedText attributesAtIndex:0 effectiveRange:&range];
BOOL isAttributed = label.text.length==range.length;
這是我想出的實現,有一些稍微改變的邏輯。 這是@Vallette 接受的答案的 Swift 端口,帶有額外的保護語句。
該函數僅在attributedText
不為零、不為空並且至少有一個不適用於整個文本范圍的attributedText
時才返回true
:
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
}
}
更好的方法是檢查屬性的Range
長度是否與字符串的長度相同。 如果相同,您可以假設這是非歸屬標簽。 但是,如果NSAttributes
應用於整個UILabel
文本,我不知道100%
可靠的方法來檢查屬性文本。
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.