2011-12-18 12 views

Trả lời

28

Điều này có thể thực hiện với NSAttributedString. Hằng số thuộc tính bạn đang tìm kiếm phụ thuộc vào nền tảng của bạn. Đối với Mac OS X, nó là NSSuperscriptAttributeName và trên iOS là kCTSuperscriptAttributeName. Chuyển giá trị âm cho chỉ số con.

Thông báo trước duy nhất là UILabel trên iOS không thể vẽ NSAttributedString giây (tuy nhiên, các ngón tay được chuyển cho iOS 6). Bạn sẽ cần phải vẽ văn bản bằng cách sử dụng Văn bản cốt lõi hoặc tìm một số thay thế của bên thứ ba cho UILabel có thể vẽ NSAttributedString.

+0

Cảm ơn. Bạn có thể sử dụng kCTSuperscriptAttributeName để tạo các siêu ký tự không? – Mahir

+1

Có như tôi đã nói, một giá trị dương là cho các chữ viết tay. Giá trị âm cho các bảng con. –

+0

Xin lỗi, tôi không biết làm thế nào tôi bỏ lỡ điều đó. Cảm ơn một lần nữa. – Mahir

33

Đây là những gì tôi đã làm trong iOS 6. Trước tiên, thêm các khung công tác CoreText và QuartzCore. Sau đó, nhập:

#import <QuartzCore/QuartzCore.h> 
#import <CoreText/CTStringAttributes.h> 
#import <CoreText/CoreText.h> 

Tôi đã thực hiện một hàm nhỏ nhập NSString thuần túy và xuất NSMutableAttributedString với ký tự cuối cùng trong phần siêu phía trên. Điều này có thể được sửa đổi để cho phép thiết lập superscript hoặc subscript, thay đổi giá trị kCTSuperscriptAttributeName thành -1. Ngoài ra, bạn có thể thêm một biến để xác định nơi để đặt các siêu trong chuỗi. Ngay bây giờ nó chỉ giả định kết thúc của chuỗi.

- (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string; 
{ 
    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string]; 
    UIFont *font = [UIFont systemFontOfSize:10.0f]; 
    UIFont *smallFont = [UIFont systemFontOfSize:9.0f]; 

    [attString beginEditing]; 
    [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)]; 
    [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)]; 
    [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)]; 
    [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)]; 
    [attString endEditing]; 
    return attString; 
} 

Bây giờ khi tôi muốn sử dụng nó tôi có thể làm như sau để đặt nó trong một UITextField:

NSString *qlwUnitsPlainText = @"m3"; 
    self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText]; 

Tôi hy vọng điều này sẽ giúp người khác, không có nhiều ví dụ ngoài kia!

+0

Bạn có thể vui lòng xem phần này của thuộc tính AttributedString: https://gist.github.com/mladjan/6663691 Không muốn hiển thị siêu văn bản: ( – dormitkon

+3

Bạn không nên thông số NSMakeRange là vị trí đầu tiên và chiều dài (thay vào đó) Trong ví dụ đầu đọc có thể gây hiểu nhầm – dwbrito

+0

làm cách nào tôi có thể xóa nó –

0

bạn cũng có thể làm như sau nếu bạn muốn làm cho nó một trình dọn dẹp litle

NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
         (NSString*)kCTSuperscriptAttributeName: @1 } 

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);     
[subKeyString setAttributes:attr range:fabricWeightRange]; 
5

Trên iOS, tôi đã bỏ lỡ kCTSuperscriptAttributeName đổi nhưng có kết quả tốt với kích thước phông chữ và "cơ sở". Nó mang đến cho bạn một chút kiểm soát nhiều quá cho các phông chữ ít vâng lời:

+ (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize 
{ 
    UIFont *normalFont = [Styles mainFontWithSize:textSize]; 
    UIFont *superFont = [Styles mainFontWithSize:textSize/2]; 

    NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}]; 

    NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}]; 

    [finalStr appendAttributedString:superStr]; 

    return finalStr; 
}  
+0

Cảm ơn rất nhiều @hari – Ramdy

+0

'Kiểu dáng' ở đây là gì? –

+0

@AadilKeshwani Chỉ là một lớp tĩnh để tập trung phông chữ, kích cỡ, màu sắc và –

0

Đối với giá trị sử dụng subscript cho kCTSuperscriptAttributeName như @ -1.

Theo tài liệu

@discussion Giá trị phải là CFNumberRef. Mặc định là giá trị int 0. Nếu được hỗ trợ theo phông chữ được chỉ định, giá trị 1 cho phép thay thế và giá trị là -1 cho phép lập chỉ mục.

extern const CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE (10_5, 3_2);

Example- [lblHeader setText:@“Headers [Alpha1 – text”]; 

     NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText]; 

     [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)];  

     [lblHeader setAttributedText:headerSubscript]; 
+0

@Bhargav Rao Đó là một cách nhanh chóng, đó là lý do tại sao tôi đã viết câu trả lời này. –