简易使用UILabel的富文本
使用效果:
源码:
NSString+YX.h NSString+YX.m
//
// NSString+YX.h
// YXKit
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ConfigAttributedString.h"
@interface NSString (YX)
// 创建富文本并配置富文本(NSArray中的数据必须是ConfigAttributedString对象合集)
- (NSMutableAttributedString *)createAttributedStringAndConfig:(NSArray *)configs;
// 用于搜寻一段字符串在另外一段字符串中的NSRange值
- (NSRange)rangeFrom:(NSString *)string;
// 本字符串的range
- (NSRange)range;
@end
//
// NSString+YX.m
// YXKit
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//
#import "NSString+YX.h"
@implementation NSString (YX)
- (NSMutableAttributedString *)createAttributedStringAndConfig:(NSArray *)configs
{
NSMutableAttributedString *attributedString = \
[[NSMutableAttributedString alloc] initWithString:self];
[configs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
ConfigAttributedString *oneConfig = obj;
[attributedString addAttribute:oneConfig.attribute
value:oneConfig.value
range:oneConfig.range];
}];
return attributedString;
}
- (NSRange)rangeFrom:(NSString *)string
{
return [string rangeOfString:self];
}
- (NSRange)range
{
return NSMakeRange(0, self.length);
}
@end
ConfigAttributedString.h ConfigAttributedString.m
//
// ConfigAttributedString.h
// NSMutableAttributedString
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ConfigAttributedString : NSObject
@property (nonatomic, strong, readonly) NSString *attribute; // 富文本属性
@property (nonatomic, strong, readonly) id value; // 富文本值
@property (nonatomic, assign, readonly) NSRange range; // 富文本范围值
// 通用型配置
+ (instancetype)attribute:(NSString *)attribute
value:(id)value
range:(NSRange)range;
// 配置字体
+ (instancetype)font:(UIFont *)font
range:(NSRange)range;
// 配置字体颜色
+ (instancetype)foregroundColor:(UIColor *)color
range:(NSRange)range;
// 配置字体背景颜色
+ (instancetype)backgroundColor:(UIColor *)color
range:(NSRange)range;
// 字体描边颜色以及描边宽度以及阴影(以下两个方法可以一起使用)
+ (instancetype)strokeColor:(UIColor *)color
range:(NSRange)range;
+ (instancetype)strokeWidth:(float)number
range:(NSRange)range;
+ (instancetype)shadow:(NSShadow *)shadow
range:(NSRange)range;
// 配置文字的中划线
+ (instancetype)strikethroughStyle:(NSInteger)number
range:(NSRange)range;
// 配置文字的下划线
+ (instancetype)underlineStyle:(NSInteger)number
range:(NSRange)range;
// 字间距
+ (instancetype)kern:(float)number
range:(NSRange)range;
// 段落样式(需要将UILabel中的numberOfLines设置成0才有用)
+ (instancetype)paragraphStyle:(NSMutableParagraphStyle *)style
range:(NSRange)range;
@end
//
// ConfigAttributedString.m
// NSMutableAttributedString
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//
#import "ConfigAttributedString.h"
@interface ConfigAttributedString ()
@property (nonatomic, strong) NSString *attribute;
@property (nonatomic, strong) id value;
@property (nonatomic, assign) NSRange range;
@end
@implementation ConfigAttributedString
+ (instancetype)attribute:(NSString *)attribute value:(id)value range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = attribute;
config.value = value;
config.range = range;
return config;
}
+ (instancetype)font:(UIFont *)font range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSFontAttributeName;
config.value = font;
config.range = range;
return config;
}
+ (instancetype)foregroundColor:(UIColor *)color range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSForegroundColorAttributeName;
config.value = color;
config.range = range;
return config;
}
+ (instancetype)backgroundColor:(UIColor *)color range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSBackgroundColorAttributeName;
config.value = color;
config.range = range;
return config;
}
+ (instancetype)strikethroughStyle:(NSInteger)number range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSStrikethroughStyleAttributeName;
config.value = [NSNumber numberWithInteger:number];
config.range = range;
return config;
}
+ (instancetype)paragraphStyle:(NSMutableParagraphStyle *)style range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSParagraphStyleAttributeName;
config.value = style;
config.range = range;
return config;
}
+ (instancetype)kern:(float)number range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSKernAttributeName;
config.value = [NSNumber numberWithFloat:number];
config.range = range;
return config;
}
+ (instancetype)underlineStyle:(NSInteger)number range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSUnderlineStyleAttributeName;
config.value = [NSNumber numberWithInteger:number];
config.range = range;
return config;
}
+ (instancetype)strokeColor:(UIColor *)color range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSStrokeColorAttributeName;
config.value = color;
config.range = range;
return config;
}
+ (instancetype)strokeWidth:(float)number range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSStrokeWidthAttributeName;
config.value = [NSNumber numberWithFloat:number];
config.range = range;
return config;
}
+ (instancetype)shadow:(NSShadow *)shadow range:(NSRange)range
{
ConfigAttributedString *config = [self new];
config.attribute = NSShadowAttributeName;
config.value = shadow;
config.range = range;
return config;
}
@end
控制器源码:
//
// RootViewController.m
// RichText
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//
#import "RootViewController.h"
#import "NSString+YX.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 字符串
NSString *str = @"未选择的路-弗罗斯特\n黄色的树林里分出两条路,\n可惜我不能同时去涉足,\n我在那路口久久伫立,\n我向着一条路极目望去,\n直到它消失在丛林深处。\n但我却选了另外一条路,\n它荒草萋萋,十分幽寂,\n显得更诱人、更美丽,\n虽然在这两条小路上,\n都很少留下旅人的足迹,\n虽然那天清晨落叶满地,\n两条路都未经脚印污染。\n啊,留下一条路等改日再见!\n但我知道路径延绵无尽头,\n恐怕我难以再回返。\n也许多少年后在某个地方,\n我将轻声叹息把往事回顾,\n一片树林里分出两条路,\n而我选了人迹更少的一条,\n从此决定了我一生的道路。";
// 设置组
NSArray *array = \
@[// 全局设置
[ConfigAttributedString font:[UIFont systemFontOfSize:10.f] range:[str range]],
[ConfigAttributedString paragraphStyle:[self style] range:[str range]],
// 局部设置
[ConfigAttributedString foregroundColor:[UIColor redColor]
range:[@"未选择的路" rangeFrom:str]],
[ConfigAttributedString font:[UIFont systemFontOfSize:20.f]
range:[@"未选择的路" rangeFrom:str]]];
// 初始化富文本
UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];
label.numberOfLines = 0;
label.attributedText = [str createAttributedStringAndConfig:array];
[self.view addSubview:label];
}
// 段落样式
- (NSMutableParagraphStyle *)style
{
NSMutableParagraphStyle *style = [NSMutableParagraphStyle new];
style.lineSpacing = 10.f;
style.firstLineHeadIndent = 10.f;
return style;
}
@end
设计原理:
我把配置抽象成了一个对象,一个对象可能对应着不同的配置,这样写起来就不会乱
使用的时候直接就在数组中配置
通过NSString的Category直接生成富文本赋值给attributedText即完成了富文本的操作
这才叫面向对象编程嘛:)