簡體   English   中英

如何以編程方式檢查 UILabel 是否具有屬性文本或普通文本?

[英]How to check if UILabel has attributedText or normal text programmatically?

有什么方法可以判斷 UILabel 是否使用label.attributedTextlabel.text屬性設置其文本?

問題是當您設置attributedTexttext也會更新,反之亦然,因此無法檢查這些屬性是否為零。

受@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM