2015-04-03 73 views
6

有沒有什麼辦法可以判斷UILabel的文本是否使用label.attributedTextlabel.text屬性?如何檢查UILabel是否以編程方式對文本或普通文本進行了歸屬?

問題是當你設置attributedText,text也被更新,反之亦然,所以不可能檢查這些屬性爲零。

+2

你想要弄清楚這一點,你想完成什麼? – ColdLogic 2015-04-03 18:47:53

+0

請指出你的意思是檢查*編程*如果一個標籤具有attributesText(如果這實際上是你的意思)。 – 2015-04-30 13:29:02

回答

0

這就是我使用的。如果範圍長度等於未歸屬文本長度,則文本只具有單個屬性,因此是未歸因的。

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

我認爲最後一行應該是'BOOL isAttributed = label.text.length!= range.length'。 – 2017-11-06 22:00:43

0

我已經完成了這些故事板。

1)單擊標籤,然後在右側窗口中將文本設置爲歸因。 2)然後選擇文本並更改它的字體或文本顏色。 enter image description here

1

apple docs

此屬性默認爲零。爲該屬性分配一個新值也會將文本屬性的值替換爲相同的字符串數據,儘管沒有任何格式信息。另外,分配一個新的值會更新字體,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)]]; 
}]; 

這樣可能會導致你看到不止一個屬性是否存在。您還可以比較這些屬性是否與您的標準屬性匹配,並假定僅在此情況下設置了文本屬性。

1

受@ 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 
    } 
} 
相關問題