简易使用UILabel的富文本

简易使用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即完成了富文本的操作

这才叫面向对象编程嘛:)

时间: 2024-10-07 19:00:43

简易使用UILabel的富文本的相关文章

使用UIWebView中html标签显示富文本

使用UIWebView中html标签显示富文本 用UIWebView来渲染文本并期望达到富文本的效果开销很大哦!   Work 本人此处直接加载自定义字体"新蒂小丸子体",源码不公开,望见谅. 代码如下: 渲染后效果如下图所示,效果是不是挺不错的呢. 我们再把尽头两个字渲染成红色试试. 源码: - (void)viewDidLoad { [super viewDidLoad]; // 注册字体 REGISTER_FONT(bundleFont(@"XinDiXiaoWanZi

iOS文本布局探讨之三——使用TextKit框架进行富文本布局

iOS文本布局探讨之三--使用TextKit框架进行富文本布局 一.引言         关于图文混排,其实以前的博客已经讨论很多,在实际开发中,经常使用第三方的框架来完成排版的需求,其中RCLabel和RTLabel是两个比较好用的第三方库,他们的实现都是基于UIView的,通过更底层的CoreText相关API来进行图文处理.相关介绍博客地址如下: iOS中支持HTML标签渲染的MDHTMLLaebl:http://my.oschina.net/u/2340880/blog/703254.

lotus: 公式语言怎么验证富文本域不能为空?。。。。。。。。。。。。。

问题描述 lotus: 公式语言怎么验证富文本域不能为空?............. lotus: 公式语言怎么验证富文本域不能为空?.........................

lotus表单中勾选某一列前的复选框,则这个列下的富文本域由灰色,变成可以上传的正常状态?怎么做?

问题描述 lotus表单中勾选某一列前的复选框,则这个列下的富文本域由灰色,变成可以上传的正常状态?怎么做? 可以在表单中做到这样的效果吗:勾选某一列前的复选框,则这个列下的富文本域由灰色(不可上传),变成可以上传的正常状态?怎么做?

sharepoint 2010中使用extend InputFormText扩展富文本框上传图片功能

在sharepoint开发中,我们有时候会用到一个叫富文本框的控件InputFormTextBox,这个控件非常好用,只是有一个地方不太人性化,就是插入上传图片的时候,只能是插入一个图片地址,而没有选择本地图片的功能.我们看看原来的界面时什么样的. 首先,在页面或者是webpart上面,添加一个富文本框InputFormTextBox的控件 <SharePoint:InputFormTextBoxTitle=""ID="txtContents"runat=&q

富文本带点击事件的解决方案

富文本带点击事件的解决方案   效果   分析 富文本中要添加点击link事件,需要深入到CoreText里面才能够解决,本人将TTTAttributedLabel进行了封装(封装并不完全,以后会继续完善),简化了操作.   源码 https://github.com/YouXianMing/UI-Component-Collection https://github.com/TTTAttributedLabel/TTTAttributedLabel // // TTTAttributeLabe

常用的HTML富文本编译器UEditor、CKEditor、TinyMCE、HTMLArea、eWebEditor、KindEditor简介

1.UEditor UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于BSD协议,允许自由使用和修改代码... 主要特点: 轻量级:代码精简,加载迅速. 定制化:全新的分层理念,满足多元化的需求.采用三层架构:1. 核心层: 为命令层提供底层API,如range/selection/domUtils类.2. 命令插件层: 基于核心层开发command命令,命令之间相互独立.3. 界面层: 为命令层提供用户使用界面.满足不同层次用

求高手kindeditor富文本编辑器,使用源码及详解,谢谢各位,急,急,急,急,急急

问题描述 求高手kindeditor富文本编辑器,使用源码及详解,谢谢各位,急,急,急,急,急急 求高手kindeditor富文本编辑器,使用源码及详解,谢谢各位,急,急,急,急,急急 解决方案 参考:http://blog.csdn.net/thinkhlin_down/article/details/6065619http://www.poluoluo.com/jzxy/201306/214700.htmlhttp://cshbbrain.iteye.com/blog/1892698 解决方

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计         在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText.但是在前些日的做的一个项目中,我并没有采用这套框架,原因有二,一是这套框架体积非常大,而项目的需求其实并不太高:二是要在这套框架中修改一些东西,难度也非常大,我最终采用的是一个叫做RCLabel的第三方控件,经过一些简单的优化和完善,达到了项目的要求.         先来介绍一下我项