码迷,mamicode.com
首页 > 其他好文 > 详细

富文本的封装-NSAttributedString 的简易封装

时间:2015-07-19 00:15:41      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:富文本   nsattributedstring   

有时我们经常写富文老是写出这样子的出来,极易出错而且可读性非常差,如下:

- (void)typeOne{

    NSString *string                            = @"你好,CSDN!";

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string];

    // 设置富文本样式

    [attributedString addAttribute:NSForegroundColorAttributeName

                             value:[UIColor redColor]

                             range:NSMakeRange(0, 1)];

    

    [attributedString addAttribute:NSFontAttributeName

                             value:[UIFont systemFontOfSize:24.f]

                             range:NSMakeRange(0, 2)];

    

    UILabel *label       = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 30)];

    label.attributedText = attributedString;

    [self.view addSubview:label];

}


- (void)typeTwo {

    NSString *string                            = @"你好,CSDN!";

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string];

    

    // 设置富文本样式

    [attributedString addAttribute:NSForegroundColorAttributeName

                             value:[UIColor redColor]

                             range:NSMakeRange(0, 1)];

    

    [attributedString addAttribute:NSFontAttributeName

                             value:[UIFont systemFontOfSize:24.f]

                             range:NSMakeRange(0, 2)];

    

    UILabel *label       = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 30)];

    label.attributedText = attributedString;

    [self.view addSubview:label];

}


- (void)typeThree {

    NSString *string = @"你好,CSDN! 你好,CSDN!\n你好,CSDN!";

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string];


    // 设置富文本 - 段落样式

    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];

    style.lineSpacing              = 10.f;

    style.paragraphSpacing         = 20.f;

    

    [attributedString addAttribute:NSParagraphStyleAttributeName

                             value:style

                             range:NSMakeRange(0, string.length)];

    

    UILabel *label       = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 400)];

    

    // 设置段落样式的时候,numberOfLines必须为0

    label.numberOfLines  = 0;

    label.attributedText = attributedString;

    [self.view addSubview:label];

}


我们可以封装,一个父类AttributedStyle,颜色和字体类都继承父类AttributedStyle,再写一个NSString的分类,如下:

#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>


@interface AttributedStyle : NSObject

@property (nonatomic, strong) NSString  *attributeName;

@property (nonatomic, strong) id         value;

@property (nonatomic)         NSRange    range;


/**

 *  便利构造器

 *

 *  @param attributeName 属性名字

 *  @param value         设置的值

 *  @param range         取值范围

 *

 *  @return 实例对象

 */

+ (AttributedStyle *)attributeName:(NSString *)attributeName value:(id)value range:(NSRange)range;


@end


#import "AttributedStyle.h"

@implementation AttributedStyle


+ (AttributedStyle *)attributeName:(NSString *)attributeName value:(id)value range:(NSRange)range {

    

    AttributedStyle *style = [[self class] new];

    

    style.attributeName = attributeName;

    style.value         = value;

    style.range         = range;

    

    return style;

}

@end


#import "AttributedStyle.h"

@interface ForeGroundColorStyle : AttributedStyle

+ (id)withColor:(UIColor *)color range:(NSRange)range;

@end


/**

 *  内联函数

 *

 *  @param color 颜色

 *  @param range 范围

 *

 *  @return 实例对象

 */

static inline AttributedStyle* colorStyle(UIColor *color, NSRange range) {

    return [ForeGroundColorStyle withColor:color range:range];

}


#import "ForeGroundColorStyle.h"

@implementation ForeGroundColorStyle

+ (id)withColor:(UIColor *)color range:(NSRange)range {

    id style = [super attributeName:NSForegroundColorAttributeName

                              value:color

                              range:range];

    

    return style;

}

@end


#import "AttributedStyle.h"

@interface FontStyle : AttributedStyle

+ (id)withFont:(UIFont *)font range:(NSRange)range;

@end


/**

 *  内联函数

 *

 *  @param font  字体

 *  @param range 范围

 *

 *  @return 实例对象

 */

static inline AttributedStyle* fontStyle(UIFont *font, NSRange range) {

    return [FontStyle withFont:font range:range];

}


#import "FontStyle.h"

@implementation FontStyle

+ (id)withFont:(UIFont *)font range:(NSRange)range {

    id fontStyle = [super attributeName:NSFontAttributeName

                                  value:font

                                  range:range];

    

    return fontStyle;

}

@end


#import "FontStyle.h"

@implementation FontStyle

+ (id)withFont:(UIFont *)font range:(NSRange)range {

    id fontStyle = [super attributeName:NSFontAttributeName

                                  value:font

                                  range:range];

    

    return fontStyle;

}

@end


#import <Foundation/Foundation.h>

#import "AttributedStyle.h"

@interface NSString (AttributeStyle)


/**

 *  根据styles数组创建出富文本

 *

 *  @param styles AttributedStyle对象构成的数组

 *

 *  @return 富文本

 */

- (NSAttributedString *)createAttributedStringWithStyles:(NSArray *)styles;

@end


#import "NSString+AttributeStyle.h"

@implementation NSString (AttributeStyle)

- (NSAttributedString *)createAttributedStringWithStyles:(NSArray *)styles {

    if (self.length <= 0) {

        return nil;

    }

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self];

    for (int count = 0; count < styles.count; count++) {

        AttributedStyle *style = styles[count];

        [attributedString addAttribute:style.attributeName

                                 value:style.value

                                 range:style.range];

    }

    return attributedString;

}


@end


如下使用,简单多了,清晰明了

#import "NSString+AttributeStyle.h"

#import "ForeGroundColorStyle.h"

#import "FontStyle.h"


- (void)viewDidLoad {

    [super viewDidLoad];

    NSString *string = @"你好,CSDN!";

    UILabel *label       = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 30)];

    label.attributedText = \

        [string createAttributedStringWithStyles:\

           @[colorStyle([UIColor redColor],             NSMakeRange(0, 2)),

             fontStyle ([UIFont systemFontOfSize:20.f], NSMakeRange(1, 2))]];

    

    [self.view addSubview:label];

}

@end


使用开源代码 GONMarkupParser 处理富文本

#import <Foundation/Foundation.h>

#import "GONMarkupParser_All.h"


@interface NSString (GONMarkupDemo)


- (NSString *)addColorMark:(NSString *)mark;


- (NSAttributedString *)createAttributedString;


@end


#import "NSString+GONMarkupDemo.h"


@implementation NSString (GONMarkupDemo)


- (NSString *)addColorMark:(NSString *)mark {

    

    if (self.length <= 0) {

        return nil;

    }

    

    return [NSString stringWithFormat:@"<color value=\"%@\">%@</>", mark, self];

}


- (NSAttributedString *)createAttributedString {

    return [[GONMarkupParserManager sharedParser] attributedStringFromString:self

                                                                       error:nil];

}


@end


#import "NSString+GONMarkupDemo.h"


- (void)viewDidLoad {

    [super viewDidLoad];


    NSString *strOne   = @"My";

    NSString *strTwo   = @"name";

    NSString *string   = [NSString stringWithFormat:@"%@ %@ is XX",

                          [strOne addColorMark:@"red"],

                          [strTwo addColorMark:@"green"]];

    

    

    UILabel *label       = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 200)];

    label.numberOfLines  = 0;

    label.attributedText = [string createAttributedString];

    [self.view addSubview:label];

}


@end



版权声明:本文为博主原创文章,未经博主允许不得转载。

富文本的封装-NSAttributedString 的简易封装

标签:富文本   nsattributedstring   

原文地址:http://blog.csdn.net/baitxaps/article/details/46946579

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!