NSAttributedStringを取得するメソッドを作成し、文字列を挿入するサブビューとラベルを動的に作成しようとしています。フォントやサイズなどの属性を決定してラベルのサイズを正しく決定する必要があるため、属性付き文字列に適用された値と範囲を反復処理できるかどうかを判断する必要がありますか?
属性を個別に渡すことができることは理解していますが、再利用性のために、できる限り少ないパラメーターをメソッドに渡すことができるようにしたいと思います。
Appleは、あなたが enumerateAttributesInRange:options:usingBlock:
。指定したブロックは、範囲とその範囲に適用可能な属性を受け取ります。
私はコードでそれを使用して、ハイパーリンクとして機能するようにテキストの背後に配置される不可視のボタンを作成しました。
enumerateAttribute:inRange:options:usingBlock:
興味のあるものが1つしかないが、すべての属性ではなく、たとえば2つの属性に興味があるかもしれない中途の家が提供されていない場合。
let attributedText = NSAttributedString(string: "Hello, playground", attributes: [
.foregroundColor: UIColor.red,
.backgroundColor: UIColor.green,
.ligature: 1,
.strikethroughStyle: 1
])
// retrieve attributes
let attributes = attributedText.attributes(at: 0, effectiveRange: nil)
// iterate each attribute
for attr in attributes {
print(attr.key, attr.value)
}
場合は、ラベルのattributedText
を定義していること。
var attributes = attributedText.attributes(
at: 0,
longestEffectiveRange: nil,
in: NSRange(location: 0, length: attributedText.length))
Swift 2.2
var attributes = attributedText.attributesAtIndex(0,
longestEffectiveRange: nil,
inRange: NSMakeRange(0, attributedText.length))
範囲全体の文字列のすべての属性が必要な場合は、次のコードを使用します。
NSDictionary *attributesFromString = [stringWithAttributes attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, stringWithAttributes.length)];
Appleのドキュメント 属性にアクセスするためのメソッドがいくつかあります:
属性付き文字列のいずれかのタイプから属性値を取得するには、次のいずれかの方法を使用します。
attributesAtIndex:effectiveRange:
attributesAtIndex:longestEffectiveRange:inRange:
attribute:atIndex:effectiveRange:
attribute:atIndex:longestEffectiveRange:inRange:
fontAttributesInRange:
rulerAttributesInRange:
スウィフト3:
// in case, that you have defined `attributedText` of label
var attributes = attributedText.attributes(at: 0, longestEffectiveRange: nil, in: NSMakeRange(0, attributedText.length))
...
スウィフト4:
NSTextAttachmentの属性を取得する場合(フォントが必要な場合は属性値を変更します)
commentTextView.attributedText.enumerateAttribute(NSAttachmentAttributeName,
in:NSMakeRange(0, commentTextView.attributedText.length),
options:.longestEffectiveRangeNotRequired) {
value, range, stop in
if let attachment = value as? NSTextAttachment {
print("GOT AN ATTACHMENT! for comment at \(indexPath.row)")
}
}
無限の再帰とアプリケーションのクラッシュを防ぐために、提案された修正で回答の1つを修正しました。
@IBDesignable
extension UITextField{
@IBInspectable var placeHolderColor: UIColor? {
get {
if let color = self.attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor {
return color
}
return nil
}
set {
self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[.foregroundColor: newValue!])
}
}
}