NSAttributedString dodaje wyrównanie tekstu

109

Jak mogę dodać atrybut wyrównania tekstu do NSAttributedString, aby wyśrodkować tekst?

Edycja: Czy robię coś złego? Wydaje się, że nie zmienia to wyrównania.

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
źródło

Odpowiedzi:

39

Ponieważ NSAttributedStringjest używany głównie z Core Text na iOS, musisz użyć CTParagraphStylezamiast NSParagraphStyle. Nie ma wariantu zmiennego.

Na przykład:

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
źródło
Nie, używam biblioteki o nazwie EGOTextView, otrzymuje przypisany ciąg
aryaxt
1
Coś jest nie tak w sposobie tworzenia stylu akapitu. Sprawdź przykład, który dodałem, działał w EGOTextView, przynajmniej wyświetlał linię jako wyśrodkowaną, ale rzecz wydaje się być błędna, zaznaczenie nie działa poprawnie z wyśrodkowanym tekstem.
omz
Tak, jest pełen błędów, przez ostatnie 4 tygodnie waliłem głową w mój keayboard, próbując naprawić błędy. Ale to był świetny początek, bez niego nie wiedziałbym, od czego zacząć, z moim edytorem tekstu sformatowanego. Dzięki za odpowiedź, zadziałało.
aryaxt
1
@omz uratowałeś mi pracę. : D Dzięki
Awais Tariq
1
@bobby Zgadzam się, ale napisałem tę odpowiedź 5 lat temu i NSParagraphStylenie było wtedy dostępne na 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])
ejkujan
źródło
1
To nie działa NSTextAlignmentJustified. czy możesz powiedzieć dlaczego i jak ustawić wyrównanie jako uzasadnione?
Sam,
1
Uwaga: zaakceptowana odpowiedź nie działała dla mnie na iOS7, chociaż wydawała się w 100% poprawna, o ile mogłem stwierdzić. Ta odpowiedź zadziałała poprawnie i oczywiście jest to znacznie prostszy kod :)
Adam
Mam ten sam problem, który zgłasza Sam. Jest w porządku dla wszystkich wyrównań z wyjątkiem NSTextAlignmentJustified. Czy to błąd iOS7?
Matheus Abreu
6
Rozwiązany. Wystarczy dodać NSBaselineOffsetAttributeName : @0do słownika atrybutów.
Matheus Abreu
Dzięki, dla mnie też zadziałało, a przy okazji, co to do cholery jest za syntezator NSAttributedString.alloc?
klefevre,
92

Szukałem tego samego problemu i byłem w stanie wyśrodkować tekst w NSAttributedString w ten sposób:

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
źródło
1
To najlepsza odpowiedź, ale kiedy zadałem to pytanie, API użyte w tej odpowiedzi nie było jeszcze dostępne na iOS
aryaxt
czy istnieje sposób, aby zastosować to tylko do określonego zakresu?
nburk
Tak, edytując parametr zakresu. NSMakeRange(0, [string length])Reprezentuje cały ciąg.
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])

(oryginalna odpowiedź poniżej)

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.
źródło
Niestety nie działa w połączeniu z funkcją draw () NSAttributedString
Ash,
21

Odpowiedź 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
źródło
2

W 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.
źródło
jeden po drugim w zasięgu: NSMakeRange (0, liczba str.)
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
źródło
2
Zmień swoją odpowiedź i sformatuj kod, aby był czytelny.
kleopatra