NSAttributedString ajouter un alignement de texte


109

Comment puis-je ajouter un attribut d'alignement de texte à un NSAttributedString pour centrer le texte?

Edit: Est-ce que je fais quelque chose de mal? Cela ne semble pas changer l'alignement.

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

Réponses:


39

Comme il NSAttributedStringest principalement utilisé avec Core Text sur iOS, vous devez utiliser à la CTParagraphStyleplace de NSParagraphStyle. Il n'y a pas de variante mutable.

Par exemple:

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

Je ne le fais pas, j'utilise une bibliothèque nommée EGOTextView, elle obtient une chaîne attribuée
aryaxt

1
Il y a un problème avec la façon dont vous créez votre style de paragraphe. Vérifiez l'exemple que j'ai ajouté, cela fonctionnait dans EGOTextView, au moins il affichait la ligne comme centrée, mais la chose semble être boguée, la sélection ne fonctionne pas correctement avec du texte centré.
omz

Oui, c'est plein de bugs, je me cogne la tête contre mon keayboard en essayant de corriger des bogues depuis 4 semaines. Mais c'était un bon début, sans cela, je ne saurais pas par où commencer avec mon éditeur de texte enrichi, merci pour votre réponse, cela a fonctionné pour moi.
aryaxt

1
@omz vous avez sauvé mon travail. : D Merci
Awais Tariq

1
@bobby Je suis d'accord, mais j'ai écrit cette réponse il y a 5 ans et je NSParagraphStylen'étais pas disponible sur iOS à l'époque.
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
Cela ne fonctionne pas pour NSTextAlignmentJustified. pouvez-vous dire pourquoi? et comment puis-je définir l'alignement comme justifié?
Sam

1
Remarque: la réponse acceptée n'a pas fonctionné pour moi sur iOS7, même si elle semblait correcte à 100% pour autant que je sache. Cette réponse a fonctionné correctement, et bien sûr est un code beaucoup plus simple :)
Adam

Je suis avec le même problème que Sam rapporte. C'est OK pour tous les alignements, sauf NSTextAlignmentJustified. Est-ce un bug iOS7?
Matheus Abreu

6
Résolu. Ajoutez simplement NSBaselineOffsetAttributeName : @0au dictionnaire d'attributs.
Matheus Abreu

Merci, cela a fonctionné pour moi aussi, au fait, c'est quoi cette synthax NSAttributedString.alloc?
klefevre

92

Je cherchais le même problème et j'ai pu centrer le texte dans un NSAttributedString de cette façon:

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
C'est la meilleure réponse, mais quand j'ai posé cette question, l'API utilisée dans cette réponse n'était pas encore disponible sur iOS
aryaxt

existe-t-il un moyen de l'appliquer uniquement à une certaine plage?
nburk

Ouais, en éditant le paramètre de plage. NSMakeRange(0, [string length])Représente la chaîne complète.
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])

(réponse originale ci-dessous)

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

Malheureusement, ne fonctionne pas en conjonction avec la fonction draw () de NSAttributedString
Ash

21

Réponse de Swift 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

Dans 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 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
Veuillez modifier votre réponse et formater le code pour le rendre lisible.
kleopatra
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.