使用NSAttributeString創建樣式豐富的文字


出現的問題

我們希望在UI組件中使用的文字有豐富多彩的樣式,但是我們不希望為了豐富樣式而將每一個文字都分割開來分別定義樣式,更不希望先將文字圖片話處理,然后加入到組件中,這樣會占用更多的內存空間,對於iPhone等移動設備來說,這樣做不科學,也不合理!比如說要按如下樣式顯示一個字符串。

多樣式的字符串顯示

多樣式的字符串顯示

如何解決問題

其實這個問題在OS X的系統中早已經解決掉了,針對一個NSString對象,我們可以為其中的文字定義不同的樣式。但在iOS系統中,直到iOS 6才出現這個功能,所以使用這個功能時必須要考慮到系統的兼容性,如果希望兼容iOS 6之前的系統就得要重新考慮了。

具體做法就是使用NSAttributedString對象將普通的NSString對象屬性話,當然這個對象是不可變的,其對應的可變對象是NSMutableAttributedString。

NSAttributedString對象可以通過initWithString:方法進行初始化,由於這個對象不可變,所以我們為了能更好的定義樣式,通常使用其可變對象NSMutableString,初始化方法可能initWithString:是在NSAttributedString (NSExtendedAttributedString)中定義的。

然后可以通過創建屬性字典NSDictionary,來定義屬性,並用NSMutableAttributedString對象的- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range;方法來為傳入的NSString對象中的不同文字定義不同的樣式。

如何創建屬性字典

上面說了,我們需要定義一個屬性的字典為不同的樣式。這個可以通過API文檔查詢NSAttributedString看到有哪些屬性是可以定義的。這里就說說上面效果需要用到的幾個屬性:

NSFontAttributeName:通過傳入一個UIFont對象來定義文字的字體;

NSForegroundColorAttributeName:通過傳入一個UIColor對象來定義文字的顏色;

NSBackgroundColorAttributeName:通過傳入一個UIColor對象來定義文字的背景顏色;

NSShadowAttributeName:通過傳入一個NSShadow來定義文字的陰影。

實現程序

下面代碼就是上面效果的實現,通過定義一個label,然后設置其內容為一個帶樣式的文字對象即可。

//
//  ViewController.m
//  ConstructingDisplayingStyleText
//
//  Created by Mr. Right on 13-12-4.
//  Copyright (c) 2013年 XCoder Studio. All rights reserved.
//  XCoder Studio Website Http://www.xcoder.cn
//
 
#import "ViewController.h"
 
@interface ViewController ()
 
@property (nonatomic, strong) UILabel * label;
 
- (NSAttributedString *)attributedText;
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    self.label = [[UILabel alloc] init];
    self.label.backgroundColor = [UIColor clearColor];
 
    // 定義UILabel的含有樣式屬性的文字內容
    self.label.attributedText = [self attributedText];
    // 定義UILabel的大小,使其可以容納得下顯示內容
    [self.label sizeToFit];
    self.label.center = self.view.center;
    [self.view addSubview:self.label];
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
// 獲取帶有不同樣式的文字內容
- (NSAttributedString *)attributedText {
    // 定義要顯示的文字內容
    NSString * string = @"XCoder Studio";
 
    // 通過要顯示的文字內容來創建一個帶屬性樣式的字符串對象
    NSMutableAttributedString * result = [[NSMutableAttributedString alloc] initWithString:string];
 
    // 定義第一個單詞“XCoder”的文字樣式字典
    NSDictionary * attributesForFirstWord = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:40.0f],
                                              NSForegroundColorAttributeName: [UIColor redColor],
                                              NSBackgroundColorAttributeName: [UIColor blackColor]};
    // 定義第二個單詞“Studio”的陰影樣式
    NSShadow * shadow = [[NSShadow alloc] init];
    // 定義陰影的顏色
    shadow.shadowColor = [UIColor darkGrayColor];
    // 定義陰影的偏移位置
    shadow.shadowOffset = CGSizeMake(4.0f, 4.0f);
 
    // 定義第二個單詞“Studio”的文字樣式字典
    NSDictionary * attributesForSecondWord = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:40.0f],
                                               NSForegroundColorAttributeName: [UIColor whiteColor],
                                               NSBackgroundColorAttributeName: [UIColor redColor],
                                               NSShadowAttributeName: shadow};
    // 設置文字樣式
    [result setAttributes:attributesForFirstWord range:[string rangeOfString:@"XCoder"]];
    [result setAttributes:attributesForSecondWord range:[string rangeOfString:@"Studio"]];
 
    // 返回已經設置好了的帶有樣式的文字
    return [[NSAttributedString alloc] initWithAttributedString:result];
}
 
@end

編譯完成后就可以得到上述效果了!



轉載:http://www.xcoder.cn/index.php/archives/667


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: