NSAttributedString fügt Textausrichtung hinzu


109

Wie kann ich einem NSAttributedString ein Textausrichtungsattribut hinzufügen, um den Text zu zentrieren?

Edit: Mache ich etwas falsch? Es scheint die Ausrichtung nicht zu ändern.

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];

Antworten:


39

Wie NSAttributedStringes hauptsächlich bei Core Text unter iOS verwendet wird, müssen Sie CTParagraphStylestattdessen verwenden NSParagraphStyle. Es gibt keine veränderliche Variante.

Beispielsweise:

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];

Ich nicht, ich benutze eine Bibliothek namens EGOTextView, sie bekommt eine zugeordnete Zeichenfolge
aryaxt

1
Bei der Erstellung Ihres Absatzstils stimmt etwas nicht. Überprüfen Sie das Beispiel, das ich hinzugefügt habe. Es hat in EGOTextView funktioniert. Zumindest wurde die Zeile als zentriert angezeigt, aber das Ding scheint fehlerhaft zu sein. Die Auswahl funktioniert mit zentriertem Text nicht richtig.
Omz

Ja, es ist voller Fehler. Ich habe in den letzten 4 Wochen meinen Kopf gegen mein Keayboard geschlagen, um Fehler zu beheben. Aber es war ein großartiger Start, ohne ihn würde ich nicht wissen, wo ich mit meinem Rich-Text-Editor anfangen soll. Vielen Dank für Ihre Antwort, es hat bei mir funktioniert.
Aryaxt

1
@omz du hast meinen Job gerettet. : D Danke
Awais Tariq

1
@bobby Ich stimme zu, aber ich habe diese Antwort vor 5 Jahren geschrieben und NSParagraphStylewar damals unter iOS nicht verfügbar.
Omz

265
 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
Dies funktioniert nicht für NSTextAlignmentJustified. Kannst du sagen warum? und wie kann ich die Ausrichtung als gerechtfertigt einstellen?
Sam

1
Hinweis: Die akzeptierte Antwort funktionierte bei iOS7 nicht, obwohl sie, soweit ich das beurteilen konnte, zu 100% korrekt erschien. Diese Antwort hat richtig funktioniert und ist natürlich viel einfacher Code :)
Adam

Ich habe das gleiche Problem, das Sam berichtet. Es ist für alle Ausrichtungen in Ordnung, außer NSTextAlignmentJustified. Ist es ein iOS7-Fehler?
Matheus Abreu

6
Gelöst. Fügen Sie einfach NSBaselineOffsetAttributeName : @0zu den Attributen Wörterbuch hinzu.
Matheus Abreu

Danke, es hat auch bei mir funktioniert NSAttributedString.alloc. Übrigens, was zum Teufel ist das für eine Synthax ?
Klefevre

92

Ich habe nach demselben Problem gesucht und konnte den Text in einem NSAttributedString folgendermaßen zentrieren:

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
Dies ist die beste Antwort, aber als ich diese Frage stellte, war die in dieser Antwort verwendete API noch nicht auf iOS verfügbar
aryaxt

Gibt es eine Möglichkeit, dies nur auf einen bestimmten Bereich anzuwenden?
nburk

Ja, indem Sie den Bereichsparameter bearbeiten. NSMakeRange(0, [string length])Repräsentiert die vollständige Zeichenfolge.
ZeMoon

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])

(ursprüngliche Antwort unten)

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])

Funktioniert leider nicht in Verbindung mit der draw () -Funktion von NSAttributedString
Ash

21

Swift 4 Antwort:

// 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

In schnell 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))

off-by-one on range: 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
Bitte bearbeiten Sie Ihre Antwort und formatieren Sie den Code, damit er lesbar ist.
Kleopatra
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.