NSAttributedString menambahkan perataan teks


109

Bagaimana cara menambahkan atribut perataan teks ke NSAttributedString ke tengah teks?

Sunting: Apakah saya melakukan sesuatu yang salah? Sepertinya tidak mengubah perataan.

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

Jawaban:


39

Sebagai NSAttributedStringterutama digunakan dengan Core Teks pada iOS, Anda harus menggunakan CTParagraphStylebukan NSParagraphStyle. Tidak ada varian yang bisa berubah.

Sebagai contoh:

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

Saya tidak, saya menggunakan perpustakaan bernama EGOTextView, itu mendapat string yang dikaitkan
aryaxt

1
Ada yang salah dengan cara Anda membuat gaya paragraf. Periksa contoh yang telah saya tambahkan, itu berfungsi di EGOTextView, setidaknya itu menampilkan garis sebagai tengah, tetapi masalahnya tampaknya buggy, pemilihan tidak berfungsi dengan baik dengan teks di tengah.
omz

Ya, itu penuh dengan bug, saya telah membenturkan kepala saya ke papan keay saya mencoba memperbaiki bug selama 4 minggu terakhir. Tapi itu adalah awal yang bagus, tanpanya saya tidak tahu harus mulai dari mana dengan editor teks kaya saya, Terima kasih atas jawaban Anda, ini berhasil untuk saya.
aryaxt

1
@omz Anda menyelamatkan pekerjaan saya. : D Terima kasih
Awais Tariq

1
@bobby Saya setuju, tetapi saya menulis jawaban itu 5 tahun yang lalu, dan NSParagraphStyletidak tersedia di iOS saat itu.
omz

266
 NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new;
 paragraphStyle.alignment                = NSTextAlignmentCenter;

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

Swift 4.2.0

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

    let attributedString = NSAttributedString(string: "someText", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])

1
Ini tidak berhasil NSTextAlignmentJustified. bisakah kamu tahu kenapa? dan bagaimana saya bisa mengatur perataan seperti yang dibenarkan?
Sam

1
Catatan: jawaban yang diterima tidak berfungsi untuk saya di iOS7, meskipun sejauh yang saya tahu jawabannya 100% benar. Jawaban ini bekerja dengan benar, dan tentu saja kode yang jauh lebih sederhana :)
Adam

Saya dengan masalah yang sama yang dilaporkan Sam. Tidak apa-apa untuk semua perataan, kecuali NSTextAlignmentJustified. Apakah ini bug iOS7?
Matheus Abreu

6
Terpecahkan. Cukup tambahkan NSBaselineOffsetAttributeName : @0ke atribut Dictionary.
Matheus Abreu

Terima kasih itu berhasil untuk saya juga, ngomong-ngomong apa sih synthax itu NSAttributedString.alloc?
klefevre

92

Saya sedang mencari masalah yang sama dan dapat memusatkan teks di NSAttributedString dengan cara ini:

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
Ini adalah jawaban terbaik, tetapi ketika saya mengajukan pertanyaan ini, API yang digunakan dalam jawaban ini belum tersedia di iOS
aryaxt

apakah ada cara untuk menerapkan ini hanya pada rentang tertentu?
nburk

Ya, dengan mengedit parameter rentang. NSMakeRange(0, [string length])Merupakan string lengkap.
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])

(jawaban asli di bawah)

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

Sayangnya tidak berfungsi dalam hubungannya dengan fungsi draw () NSAttributedString
Ash

21

Jawaban 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

Dalam 4 cepat:

    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 pada kisaran: 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
Harap edit jawaban Anda dan format kode agar dapat dibaca.
kleopatra
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.