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];
aryaxt
la source

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];
omz
la source
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])
ejkujan
la source
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])];
ZeMoon
la source
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])
Tommie C.
la source
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)
George Maisuradze
la source
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))
Ashwin G
la source
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
la source
2
Veuillez modifier votre réponse et formater le code pour le rendre lisible.
kleopatra