NSAttributedString aggiunge l'allineamento del testo


109

Come posso aggiungere l'attributo di allineamento del testo a una stringa NSAttributedString per centrare il testo?

Modifica: sto facendo qualcosa di sbagliato? Non sembra cambiare l'allineamento.

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

Risposte:


39

Poiché NSAttributedStringviene utilizzato principalmente con Core Text su iOS, devi usare al CTParagraphStyleposto di NSParagraphStyle. Non esiste una variante modificabile.

Per esempio:

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

Io no, uso una libreria chiamata EGOTextView, riceve una stringa attribuita
aryaxt

1
C'è qualcosa di sbagliato nel modo in cui crei il tuo stile di paragrafo. Controlla l'esempio che ho aggiunto, ha funzionato in EGOTextView, almeno mostrava la linea come centrata, ma la cosa sembra essere buggata, la selezione non funziona correttamente con il testo centrato.
omz

Sì, è pieno di bug, ho sbattuto la testa sul mio keayboard cercando di risolvere i bug nelle ultime 4 settimane. Ma è stato un ottimo inizio, senza di esso non saprei da dove iniziare con il mio editor di testo RTF, grazie per la tua risposta ha funzionato per me.
aryaxt

1
@omz hai salvato il mio lavoro. : D Grazie
Awais Tariq

1
@bobby Sono d'accordo, ma ho scritto quella risposta 5 anni fa e NSParagraphStyleall'epoca non era disponibile su iOS.
omz

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
Questo non funziona per NSTextAlignmentJustified. puoi dire perché? e come posso impostare l'allineamento come giustificato?
Sam

1
Nota: la risposta accettata non ha funzionato per me su iOS7, anche se sembrava corretta al 100% per quanto ne sapevo. Questa risposta ha funzionato correttamente e, naturalmente, è un codice molto più semplice :)
Adam

Ho lo stesso problema riportato da Sam. Va bene per tutti gli allineamenti, tranne NSTextAlignmentJustified. È un bug di iOS7?
Matheus Abreu

6
Risolto. Basta aggiungere NSBaselineOffsetAttributeName : @0agli attributi Dizionario.
Matheus Abreu

Grazie ha funzionato anche per me, a proposito, che diavolo è quella sintassi NSAttributedString.alloc?
klefevre

92

Stavo cercando lo stesso problema ed ero in grado di centrare l'allineamento del testo in un NSAttributedString in questo modo:

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
Questa è la risposta migliore, ma quando ho posto questa domanda l'API utilizzata in questa risposta non era ancora disponibile su iOS
aryaxt

c'è un modo per applicarlo solo a un determinato intervallo?
nburk

Sì, modificando il parametro range. NSMakeRange(0, [string length])Rappresenta la stringa completa.
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 e versioni successive

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

(risposta originale sotto)

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

Purtroppo non funziona in combinazione con la funzione draw () di NSAttributedString
Ash

21

Risposta rapida 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

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

off-by-one in gamma: NSMakeRange (0, str. cont.)
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
Modifica la tua risposta e formatta il codice per renderlo leggibile.
kleopatra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.