NSAttributedString thêm căn chỉnh văn bản


109

Làm cách nào để thêm thuộc tính căn chỉnh văn bản vào NSAttributedString để căn giữa văn bản?

Chỉnh sửa: Tôi có làm gì sai không? Nó dường như không thay đổi sự liên kết.

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

Câu trả lời:


39

NSAttributedStringđược sử dụng chủ yếu với Core Text trên iOS, bạn phải sử dụng CTParagraphStylethay thế NSParagraphStyle. Không có biến thể có thể thay đổi.

Ví dụ:

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

Tôi không, tôi sử dụng một thư viện tên EGOTextView, nó được một chuỗi do
aryaxt

1
Có điều gì đó không ổn với cách bạn tạo kiểu đoạn văn của mình. Kiểm tra ví dụ mà tôi đã thêm, nó hoạt động trong EGOTextView, ít nhất nó hiển thị dòng ở giữa, nhưng có vẻ như có lỗi, lựa chọn không hoạt động đúng với văn bản được căn giữa.
omz

Vâng, nó đầy lỗi, tôi đã đập đầu vào keayboard của mình để cố gắng sửa lỗi trong 4 tuần qua. Nhưng đó là một khởi đầu tuyệt vời, nếu không có nó, tôi sẽ không biết bắt đầu từ đâu với Trình chỉnh sửa văn bản đa dạng thức của mình, Cảm ơn câu trả lời của bạn, nó đã hiệu quả với tôi.
aryaxt

1
@omz bạn đã cứu công việc của tôi. : D Cảm ơn
Awais Tariq

1
@bobby Tôi đồng ý, nhưng tôi đã viết câu trả lời đó cách đây 5 năm và NSParagraphStylechưa có trên iOS hồi đó.
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
Điều này không hoạt động cho NSTextAlignmentJustified. bạn có thể cho biết tại sao? và làm cách nào để tôi có thể đặt căn chỉnh là hợp lý?
Sam

1
Lưu ý: câu trả lời được chấp nhận không hoạt động với tôi trên iOS7, mặc dù nó có vẻ đúng 100% theo như tôi có thể nói. Câu trả lời này hoạt động chính xác và tất nhiên là mã đơn giản hơn nhiều :)
Adam

Tôi đang gặp vấn đề tương tự như Sam báo cáo. Nó là OK cho tất cả các căn chỉnh, ngoại trừ NSTextAlignmentJustified. Nó có phải là một lỗi iOS7 không?
Matheus Abreu

6
Đã giải quyết. Chỉ cần thêm NSBaselineOffsetAttributeName : @0vào Từ điển thuộc tính.
Matheus Abreu

Cảm ơn nó cũng làm việc cho tôi, nhân tiện, tổng hợp đó là cái quái gì vậy NSAttributedString.alloc?
klefevre

92

Tôi đang tìm kiếm vấn đề tương tự và có thể căn giữa văn bản trong NSAttributedString theo cách này:

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
Đây là câu trả lời hay nhất, nhưng khi tôi hỏi câu hỏi này, API được sử dụng trong câu trả lời này vẫn chưa có trên iOS
aryaxt

có cách nào để áp dụng điều này chỉ cho một phạm vi nhất định?
nburk

Vâng, bằng cách chỉnh sửa thông số phạm vi. NSMakeRange(0, [string length])Đại diện cho chuỗi hoàn chỉnh.
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])

(câu trả lời gốc bên dưới)

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

Đáng tiếc là không hoạt động cùng với hàm draw () của NSAttributedString
Ash

21

Câu trả lời 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

Trong 4 nhanh:

    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 on range: 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
Vui lòng chỉnh sửa câu trả lời của bạn và định dạng mã để có thể đọc được.
kleopatra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.