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

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];
omz
sumber
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])
ejkujan
sumber
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])];
ZeMoon
sumber
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])
Tommie C.
sumber
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)
George Maisuradze
sumber
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))
Ashwin G
sumber
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]];
mahendra
sumber
2
Harap edit jawaban Anda dan format kode agar dapat dibaca.
kleopatra