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

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];
omz
quelle
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])
ejkujan
quelle
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])];
ZeMoon
quelle
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])
Tommie C.
quelle
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)
George Maisuradze
quelle
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))
Ashwin G.
quelle
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]];
Mahendra
quelle
2
Bitte bearbeiten Sie Ihre Antwort und formatieren Sie den Code, damit er lesbar ist.
Kleopatra