NSAttributedStringはテキストの配置を追加します


109

NSAttributedStringにテキスト配置属性を追加してテキストを中央揃えするにはどうすればよいですか?

編集:私は何か悪いことをしていますか?配置を変更していないようです。

CTParagraphStyleSetting setting;
setting.spec = kCTParagraphStyleSpecifierAlignment;
setting.valueSize = kCTCenterTextAlignment;

CTParagraphStyleSetting settings[1] = {
    {kCTParagraphStyleSpecifierAlignment, sizeof(CGFloat), &setting},           
};

CTParagraphStyleRef paragraph = CTParagraphStyleCreate(settings, sizeof(setting));

NSMutableAttributedString *mutableAttributed = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedString];
[mutableAttributed addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)paragraph ,(NSString*) kCTParagraphStyleAttributeName, nil] range:_selectedRange];

回答:


39

NSAttributedString主にiOSのコア・テキストで使用され、あなたが使用する必要がありますCTParagraphStyle代わりにNSParagraphStyle。変更可能なバリアントはありません。

例えば:

CTTextAlignment alignment = kCTCenterTextAlignment;

CTParagraphStyleSetting alignmentSetting;
alignmentSetting.spec = kCTParagraphStyleSpecifierAlignment;
alignmentSetting.valueSize = sizeof(CTTextAlignment);
alignmentSetting.value = &alignment;

CTParagraphStyleSetting settings[1] = {alignmentSetting};

size_t settingsCount = 1;
CTParagraphStyleRef paragraphRef = CTParagraphStyleCreate(settings, settingsCount);
NSDictionary *attributes = @{(__bridge id)kCTParagraphStyleAttributeName : (__bridge id)paragraphRef};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"Hello World" attributes:attributes];

私は使用しません。EGOTextViewという名前のライブラリを使用します。属性付きの文字列を取得します
aryaxt

1
段落スタイルの作成方法に問題があります。私が追加した例を確認してください、それはEGOTextViewで動作しました、少なくともそれは中央揃えとして行を表示しましたが、問題があるようで、中央揃えされたテキストでは選択が正しく機能しません。
omz '24

はい、それはバグでいっぱいです。私は過去4週間、バグを修正するためにキーボードに頭をぶつけてきました。しかし、それは素晴らしいスタートでした。それがないと、リッチテキストエディターをどこから始めればよいのかわからなかったのです。回答ありがとうございます。
aryaxt

1
@omzあなたは私の仕事を救った。:Dありがとう
Awais Tariq 2014

1
@bobby同意しますが、5年前にその回答を書きましたが、NSParagraphStyle当時はiOSで利用できませんでした。
omz 2016年

266
 NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new;
 paragraphStyle.alignment                = NSTextAlignmentCenter;

 NSAttributedString *attributedString   = 
[NSAttributedString.alloc initWithString:@"someText" 
                              attributes:
         @{NSParagraphStyleAttributeName:paragraphStyle}];

Swift 4.2

let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center

    let attributedString = NSAttributedString(string: "someText", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])

1
これはに対しては機能しませんNSTextAlignmentJustified。理由がわかりますか?そして、どうすれば整列を正当化することができますか?
Sam

1
注:認められた回答はiOS7では機能しませんでしたが、私の知る限りでは100%正しいように見えました。この答えは正しく機能し、もちろんはるかに単純なコードです:)
Adam

サムが報告するのと同じ問題があります。以外のすべての配置で問題ありませんNSTextAlignmentJustified。iOS7のバグですか?
Matheus Abreu 14

6
解決しました。NSBaselineOffsetAttributeName : @0属性ディクショナリに追加するだけです。
Matheus Abreu 2014

おかげでそれは私にとってもうまくいきました、ところで、そのシンタックスは一体NSAttributedString.alloc何ですか
klefevre 2014

92

私は同じ問題を探していて、NSAttributedStringのテキストを次のように中央揃えにすることができました。

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init] ;
[paragraphStyle setAlignment:NSTextAlignmentCenter];

NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithString:string];
[attribString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [string length])];

1
これが最良の回答ですが、私がこの質問をしたとき、この回答で使用されたAPIはiOSではまだ利用できませんでした
aryaxt

これを特定の範囲にのみ適用する方法はありますか?
nburk

ええ、範囲パラメーターを編集することによって。NSMakeRange(0, [string length])完全な文字列を表します。
ZeMoon、2015年

67

Swift 4.0以降

let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.alignment = .center

let titleFont = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
let title = NSMutableAttributedString(string: "You Are Registered", 
    attributes: [.font: titleFont,    
    .foregroundColor: UIColor.red, 
    .paragraphStyle: titleParagraphStyle])

Swift 3.0以降

let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.alignment = .center

let titleFont = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
let title = NSMutableAttributedString(string: "You Are Registered", 
    attributes: [NSFontAttributeName:titleFont,    
    NSForegroundColorAttributeName:UIColor.red, 
    NSParagraphStyleAttributeName: titleParagraphStyle])

(以下の元の回答)

Swift 2.0以降

let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.alignment = .Center

let titleFont = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
let title = NSMutableAttributedString(string: "You Are Registered",
    attributes:[NSFontAttributeName:titleFont,   
    NSForegroundColorAttributeName:UIColor.redColor(), 
    NSParagraphStyleAttributeName: titleParagraphStyle])

悲しいことに、NSAttributedStringのdraw()関数と一緒に機能しません
Ash

21

スウィフト4の答え:

// Define paragraph style - you got to pass it along to NSAttributedString constructor
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center

// Define attributed string attributes
let attributes = [NSAttributedStringKey.paragraphStyle: paragraphStyle]

let attributedString = NSAttributedString(string:"Test", attributes: attributes)

2

Swift 4の場合:

    let paraStyle = NSMutableParagraphStyle.init()
    paraStyle.alignment = .left

    let str = "Test Message"
    let attribute = [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 12)]

    let attrMessage = NSMutableAttributedString(string: str, attributes: attribute)


    attrMessage.addAttribute(kCTParagraphStyleAttributeName as NSAttributedStringKey, value: paraStyle, range: NSMakeRange(0, str.count))

範囲外の1つずつ:NSMakeRange(0、str.count)
Martin-Gilles Lavoie

-5
[averagRatioArray addObject:[NSString stringWithFormat:@"When you respond Yes to %@ the average response to    %@ was %0.02f",QString1,QString2,M1]];
[averagRatioArray addObject:[NSString stringWithFormat:@"When you respond No  to %@ the average response to    %@ was %0.02f",QString1,QString2,M0]];

UIFont *font2 = [UIFont fontWithName:@"Helvetica-Bold" size:15];
UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:12];

NSMutableAttributedString *str=[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"When you respond Yes to %@ the average response to %@ was",QString1,QString2]];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange(0,[@"When you respond Yes to " length])];
[str addAttribute:NSFontAttributeName value:font2 range:NSMakeRange([@"When you respond Yes to " length],[QString1 length])];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange([QString1 length],[@" the average response to " length])];
[str addAttribute:NSFontAttributeName value:font2 range:NSMakeRange([@" the average response to " length],[QString2 length])];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange([QString2 length] ,[@" was" length])];
// [str addAttribute:NSFontAttributeName value:font2 range:NSMakeRange(49+[QString1 length]+[QString2 length] ,8)];
[averagRatioArray addObject:[NSString stringWithFormat:@"%@",str]];

2
解答を編集し、コードを読みやすい形式にしてください。
クレオパトラ2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.