2015-12-28 17 views
6

最近、NSFontAttributesの組み合わせをNSMutableAttributedStringに適用しようとしていましたが、他の属性を削除しないで徹底的に説明することはできません。太字と斜体をNSMutableAttributedStringの範囲に適用する方法は?

私は束を検索し、このquestionはHTMLでそれを行う方法に関する発見、およびテキストを太字や斜体されたを見つけていないが、実際にそれを行う方法については何もする方法について、このquestionました。

斜体:定数CXItalicsFontAttributeNameCXBoldAttributeNameから、次の2つの値を抽出[mutableAttributedString addAttribute:NSFontAttributeName value:[fontAttributes valueForKey:CXBoldFontAttributeName] range:r];

[mutableAttributedString addAttribute: NSFontAttributeName value:[fontAttributes valueForKey:CXItalicsFontAttributeName] range:r];

太字を次のように

現在、私は形式に刺さにしてみてください辞書を尊重します:

UIFont *italicsFont = [UIFont fontWithName:@"Avenir-BookOblique" size:14.0f]; 
UIFont *boldFont = [UIFont fontWithName:@"Avenir-Heavy" size:14.0f]; 

NSAttributedString standard attributesにはItalicsFontAttributeやBoldFontAttributeが含まれていないため、これは正しい書式設定にはならないことは知っていますが、これを行う方法が適切ではありません。誰も私を助けることができますか?

答えて

4

各(太字または斜体)の特性を個別に適用する場合は、太字とイタリックの範囲が重複しないか、または1つの特性が別の特性を上書きするかどうかを確認する必要があります。

太字の両方を適用する唯一の方法は、太字とイタリックの両方のフォントを使用して、両方の特性を同時に適用することです。の範囲に斜体を適用する方法です。

let str = "Normal Bold Italics BoldItalics" 

let font = UIFont(name: "Avenir", size: 14.0)! 
let italicsFont = UIFont(name: "Avenir-BookOblique", size: 14.0)! 
let boldFont = UIFont(name: "Avenir-Heavy", size: 14.0)! 
let boldItalicsFont = UIFont(name: "Avenir-HeavyOblique", size: 14.0)! 

let attributedString = NSMutableAttributedString(string: str, attributes: [NSFontAttributeName : font]) 
attributedString.addAttribute(NSFontAttributeName, value: boldFont, range: NSMakeRange(7, 4)) 
attributedString.addAttribute(NSFontAttributeName, value: italicsFont, range: NSMakeRange(12, 7)) 
attributedString.addAttribute(NSFontAttributeName, value: boldItalicsFont, range: NSMakeRange(20, 11)) 

enter image description here

+0

この方法は実用的でないと思われます。つまり、すべてのケースを試して説明するためにできるだけ多くの組み合わせを作成する必要があるということです。私はそれを避けることを望んでいた。 – Micrified

+0

@Owatchここでは[列挙について質問する](http://stackoverflow.com/q/14161254/4151918)です。その場でフォントを構築する必要があります。その周りに方法はありません。 –

+0

私は以前に解決策として選択肢を選択しましたが、代替案は見つけられませんでしたが、私が探していたものにもう少し適したものが見つかったので、チェックマークを削除しました。矛盾していることをお詫び申し上げます。 – Micrified

4

私の問題を解決する最善の方法はこれまでのところ、私が遭遇した各ケースのために必要なUIFontを私に提供するためにUIFontDescriptorクラスを利用するようになっています。私はサイズ14と私の主なフォントとしてAvenir-Bookを使用するよう、次のように

は、例えば、私はUIFontDescriptorを作成することができます。

UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Avenir-Book" size:14.0f];

次に、私はイタリック体、太字を取得したい場合は、

NSString *normalFont = [[fontDescriptor fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 
NSString *italicsFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 
NSString *boldFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 
NSString *boldAndItalicsFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic]fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 

そして、印刷したときに、これは確かに必要なフォントを生成します:またはその両方の組み合わせ、私は次のように行うのは簡単で持って

NSLog(@"Normal Font: %@ Size: %@\n",normalFont,[[fontDescriptor fontAttributes]valueForKey:UIFontDescriptorSizeAttribute]); 
NSLog(@"Italics Font: %@\n",italicsFont); 
NSLog(@"Bold Font: %@\n",boldFont); 
NSLog(@"Bold and Italics Font: %@\n",boldAndItalicsFont); 

出力:

Normal Font: Avenir-Book Size: 14 
Italics Font: Avenir-BookOblique 
Bold Font: Avenir-Black 
Bold and Italics Font: Avenir-BlackOblique 

ここでの利点は、私はもはや個々のフォントの種類を自分で作成する必要があるということではない、と家族からのフォントはそうするのに十分です。

3
スウィフトで

と拡張子を使用して:

extension UIFont { 

    func withTraits(_ traits: UIFontDescriptorSymbolicTraits) -> UIFont { 

     // create a new font descriptor with the given traits 
     if let fd = fontDescriptor.withSymbolicTraits(traits) { 
      // return a new font with the created font descriptor 
      return UIFont(descriptor: fd, size: pointSize) 
     } 

     // the given traits couldn't be applied, return self 
     return self 
    } 

    func italics() -> UIFont { 
     return withTraits(.traitItalic) 
    } 

    func bold() -> UIFont { 
     return withTraits(.traitBold) 
    } 

    func boldItalics() -> UIFont { 
     return withTraits([ .traitBold, .traitItalic ]) 
    } 
} 

例:

if let font = UIFont(name: "Avenir", size: 30) { 
    let s = NSAttributedString(string: "Hello World!", attributes: [ NSFontAttributeName: font.italic() ]) 
    let t = NSAttributedString(string: "Hello World!", attributes: [ NSFontAttributeName: font.boldItalic()) ]) 
} 
関連する問題