NSAttributedString เพิ่มการจัดตำแหน่งข้อความ


109

ฉันจะเพิ่มแอตทริบิวต์การจัดแนวข้อความให้กับ NSAttributedString เพื่อจัดข้อความให้อยู่กึ่งกลางได้อย่างไร

แก้ไข: ฉันทำอะไรผิดหรือเปล่า? ดูเหมือนจะไม่เปลี่ยนแนว

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

คำตอบ:


39

ตามที่ใช้NSAttributedStringเป็นหลักกับ Core Text บน iOS คุณต้องใช้CTParagraphStyleแทนNSParagraphStyleไฟล์. ไม่มีตัวแปรที่ไม่แน่นอน

ตัวอย่างเช่น:

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

ฉันไม่ได้ใช้ไลบรารีชื่อ EGOTextView มันได้รับสตริงที่มาจากแหล่งข้อมูล
aryaxt

1
มีบางอย่างผิดปกติกับวิธีสร้างลักษณะย่อหน้าของคุณ ตรวจสอบตัวอย่างที่ฉันได้เพิ่มมันใช้งานได้ใน EGOTextView อย่างน้อยมันก็แสดงบรรทัดที่อยู่กึ่งกลาง แต่ดูเหมือนว่าสิ่งนี้จะมีปัญหาการเลือกทำงานไม่ถูกต้องกับข้อความที่อยู่ตรงกลาง
omz

ใช่มันเต็มไปด้วยข้อบกพร่องฉันกำลังก้มหน้าไปที่คีย์บอร์ดของฉันเพื่อพยายามแก้ไขข้อบกพร่องในช่วง 4 สัปดาห์ที่ผ่านมา แต่มันเป็นการเริ่มต้นที่ยอดเยี่ยมโดยที่ฉันไม่รู้ว่าจะเริ่มต้นด้วยตัวแก้ไข Rich Text จากไหนขอขอบคุณสำหรับคำตอบของคุณที่ได้ผลสำหรับฉัน
aryaxt

1
@omz คุณบันทึกงานของฉัน : D Thanks
Awais Tariq

1
@bobby ฉันเห็นด้วย แต่ฉันเขียนคำตอบนั้นเมื่อ 5 ปีที่แล้วและNSParagraphStyleไม่สามารถใช้ได้บน iOS ในตอนนั้น
omz

267
 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
NSTextAlignmentJustifiedอยากทำงานนี้ บอกได้ไหมว่าทำไม? และฉันจะตั้งค่าการจัดตำแหน่งให้เป็นธรรมได้อย่างไร?
แซม

1
หมายเหตุ: คำตอบที่ยอมรับใช้ไม่ได้สำหรับฉันบน iOS7 แม้ว่าจะดูเหมือนว่าถูกต้อง 100% เท่าที่ฉันสามารถบอกได้ คำตอบนี้ทำงานได้อย่างถูกต้องและแน่นอนว่าเป็นรหัสที่ง่ายกว่ามาก :)
อดัม

ฉันมีปัญหาเดียวกันกับแซมรายงาน NSTextAlignmentJustifiedมันตกลงสำหรับการจัดตำแหน่งทั้งหมดยกเว้น มันเป็นข้อผิดพลาดของ iOS7 หรือไม่?
Matheus Abreu

6
แก้ไขแล้ว. เพียงเพิ่มลงNSBaselineOffsetAttributeName : @0ในพจนานุกรมแอตทริบิวต์
Matheus Abreu

ขอบคุณที่มันใช้งานได้สำหรับฉันเช่นกันโดยวิธีที่ synthax NSAttributedString.allocคืออะไร?
klefevre

92

ฉันกำลังค้นหาปัญหาเดียวกันและสามารถจัดกึ่งกลางข้อความใน NSAttributedString ด้วยวิธีนี้:

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
นี่เป็นคำตอบที่ดีที่สุด แต่เมื่อฉันถามคำถามนี้ API ที่ใช้ในคำตอบนี้ยังไม่สามารถใช้ได้กับ iOS
aryaxt

มีวิธีใดบ้างที่จะใช้สิ่งนี้กับบางช่วงเท่านั้น
nburk

ใช่โดยการแก้ไขพารามิเตอร์ช่วง NSMakeRange(0, [string length])แสดงสตริงที่สมบูรณ์
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])

(คำตอบเดิมด้านล่าง)

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

น่าเศร้าที่ไม่ทำงานร่วมกับฟังก์ชัน draw () ของ NSAttributedString
เถ้า

21

คำตอบ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

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

off-by-one ในช่วง: 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
โปรดแก้ไขคำตอบของคุณและจัดรูปแบบรหัสเพื่อให้อ่านได้
kleopatra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.