NSAttributedString metin hizalama ekleme


109

Metni ortalamak için bir NSAttributedString'e nasıl metin hizalama niteliği ekleyebilirim?

Düzenleme: Yanlış bir şey mi yapıyorum? Hizalamayı değiştirmiş gibi görünmüyor.

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

Yanıtlar:


39

NSAttributedStringÖncelikle iOS'ta Core Text ile kullanıldığı gibi , CTParagraphStylebunun yerine kullanmanız gerekir NSParagraphStyle. Değişken bir varyant yoktur.

Örneğin:

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

Ben kullanmıyorum, EGOTextView adlı bir kitaplık kullanıyorum, atıfta
bulunulan

1
Paragraf stilinizi yaratma şeklinizde yanlış bir şeyler var. Eklediğim örneği kontrol edin, EGOTextView'da çalıştı, en azından çizgiyi ortalanmış olarak gösteriyordu, ancak şey hatalı görünüyor, seçim ortalanmış metinle düzgün çalışmıyor.
omz

Evet, hatalarla dolu, son 4 haftadır hataları düzeltmeye çalışırken kafamı keayboard'uma vuruyordum. Ama harika bir başlangıçtı, onsuz zengin metin editörümle nereden başlayacağımı bilemezdim, Cevabınız için teşekkürler, benim için çalıştı.
aryaxt

1
@omz işimi kurtardın. : D Teşekkürler
Awais Tariq

1
@bobby Katılıyorum, ancak bu cevabı 5 yıl önce yazdım ve NSParagraphStyleo zamanlar iOS'ta mevcut değildi.
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
Bu işe yaramıyor NSTextAlignmentJustified. nedenini söyleyebilir misin ve hizalamayı nasıl gerekçelendirebilirim?
Sam

1
Not: Kabul edilen yanıt, anlayabildiğim kadarıyla% 100 doğru görünmesine rağmen iOS7'de benim için işe yaramadı. Bu cevap doğru çalıştı ve elbette çok daha basit bir kod :)
Adam

Sam'in bildirdiği aynı problemle yaşıyorum. Hariç tüm hizalamalar için sorun yok NSTextAlignmentJustified. İOS7 hatası mı?
Matheus Abreu

6
Çözüldü. NSBaselineOffsetAttributeName : @0Sözlük özniteliklerine ekleyin .
Matheus Abreu

Teşekkürler benim için de çalıştı, bu arada bu synthax da neyin nesi NSAttributedString.alloc?
klefevre

92

Aynı sorunu arıyordum ve metni bir NSAttributedString'de şu şekilde ortalayabildim:

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
Bu en iyi yanıt, ancak bu soruyu sorduğumda, bu yanıtta kullanılan API henüz iOS'ta mevcut değildi
aryaxt

Bunu yalnızca belirli bir aralığa uygulamanın bir yolu var mı?
nburk

Evet, aralık parametresini düzenleyerek. NSMakeRange(0, [string length])Tam dizeyi temsil eder.
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])

(aşağıdaki orijinal cevap)

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

Ne yazık ki NSAttributedString'in draw () işlevi ile birlikte çalışmıyor
Ash

21

Hızlı 4 cevap:

// 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

Swift 4'te:

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

aralıkta tek tek: 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
Lütfen yanıtınızı düzenleyin ve okunabilir hale getirmek için kodu biçimlendirin.
kleopatra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.