NSAttributedString agregar alineación de texto

109

¿Cómo puedo agregar un atributo de alineación de texto a un NSAttributedString para centrar el texto?

Editar: ¿Estoy haciendo algo mal? No parece cambiar la alineación.

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
fuente

Respuestas:

39

Como NSAttributedStringse usa principalmente con Core Text en iOS, debe usar en CTParagraphStylelugar de NSParagraphStyle. No hay una variante mutable.

Por ejemplo:

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
fuente
Yo no, uso una biblioteca llamada EGOTextView, obtiene una cadena atribuida
aryaxt
1
Hay algo mal en la forma en que crea su estilo de párrafo. Verifique el ejemplo que agregué, funcionó en EGOTextView, al menos mostró la línea como centrada, pero la cosa parece tener errores, la selección no funciona correctamente con el texto centrado.
omz
Sí, está lleno de errores, me he estado golpeando la cabeza con el teclado tratando de corregir errores durante las últimas 4 semanas. Pero fue un gran comienzo, sin él no sabría por dónde empezar con mi editor de texto enriquecido. Gracias por tu respuesta, funcionó para mí.
aryaxt
1
@omz salvaste mi trabajo. : D Gracias
Awais Tariq
1
@bobby Estoy de acuerdo, pero escribí esa respuesta hace 5 años y NSParagraphStyleno estaba disponible en iOS en ese entonces.
omz
266
 NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new;
 paragraphStyle.alignment                = NSTextAlignmentCenter;

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

Rápido 4.2

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

    let attributedString = NSAttributedString(string: "someText", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
ejkujan
fuente
1
Esto no funciona NSTextAlignmentJustified. ¿puedes decir por qué? y ¿cómo puedo establecer la alineación como justificada?
Sam
1
Nota: la respuesta aceptada no funcionó para mí en iOS7, aunque parecía 100% correcta por lo que pude ver. Esta respuesta funcionó correctamente y, por supuesto, es un código mucho más simple :)
Adam
Estoy con el mismo problema que informa Sam. Está bien para toda la alineación, excepto NSTextAlignmentJustified. ¿Es un error de iOS7?
Matheus Abreu
6
Resuelto. Simplemente agregue NSBaselineOffsetAttributeName : @0al Diccionario de atributos.
Matheus Abreu
Gracias, también funcionó para mí, por cierto, ¿qué diablos es ese Synthax NSAttributedString.alloc?
klefevre
92

Estaba buscando el mismo problema y pude centrar la alineación del texto en un NSAttributedString de esta manera:

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
fuente
1
Esta es la mejor respuesta, pero cuando hice esta pregunta, la API utilizada en esta respuesta aún no estaba disponible en iOS
aryaxt
¿Hay alguna forma de aplicar esto solo a un cierto rango?
nburk
Sí, editando el parámetro de rango. NSMakeRange(0, [string length])Representa la cadena 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+

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

(respuesta original a continuación)

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.
fuente
Lamentablemente no funciona junto con la función draw () de NSAttributedString
Ash
21

Respuesta rápida 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)
George Maisuradze
fuente
2

En 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))
Ashwin G
fuente
uno a uno en rango: 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
fuente
2
Edite su respuesta y formatee el código para que sea legible.
kleopatra