iOS开发封装一个可以响应超链接的label——基于RCLabel的交互扩展

简介:

iOS开发封装一个可以响应超链接的label——基于RCLabel的交互扩展

一、引言

        iOS系统是一个十分注重用户体验的系统,在iOS系统中,用户交互的方案也十分多,然而要在label中的某部分字体中添加交互行为确实不容易的,如果使用其他类似Button的控件来模拟,文字的排版又将是一个解决十分困难的问题。这个问题的由来是项目中的一个界面中有一些广告位标签,而这些广告位的标签却是嵌在文本中的,当用户点击文字标签的位置时,会跳转到响应的广告页。

        CoreText框架和一些第三方库可以解决这个问题,但直接使用CoreText十分复杂,第三方库多注重于富文本的排版,对类似文字超链接的支持亦不是特别简洁,我们可以借助一些第三方的东西进行针对性更强,更易用的封装。

        RCLabel是一个第三方的将html字符串进行文本布局的工具,代码十分轻巧,并且其是基于CoreText框架的,其原生性和扩展性十分强。在以前的一篇博客中,我将RCLabel进行了一些改进,使其支持异步加载远程图片,并且提供了更加简洁的面向应用的方法,博客地址如下:

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计:http://my.oschina.net/u/2340880/blog/499311 。

        本篇博文,将在其基础上,完成设计一个可以支持文本超链接的文字视图。

二、视图类与模型类的设计

        RCLabel的核心之处在于将HTML文本转换为富文本布局视图,因此我们可以将要显示的文本编程html字符串,将其可以进行用户交互的部分进行html超链接关联,RCLabel就检测到我们点击的区域进行响应逻辑的回调。设计类如下:

.h文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//文本与超链接地址关联的model类 后面会说
@ class  YHBaseLinkingLabelModel;
 
@protocol YHBaseLinkingLabelProtocol <NSObject>
 
@optional
/**
  *点击超链接后出发的代理方法 model中有链接地址和文字
  */
-( void )YHBaseLinkingLabelClickLinking:(YHBaseLinkingLabelModel *)model;
/**
  *尺寸改变后出发的方法
  */
-( void )YHBaseLinkingLabelSizeChange:(CGSize)size;
@end
 
@interface YHBaseLinkingLabel : YHBaseView
/**
  *文字数组 里面存放这文字对应的超链接对象
  */
@property(nonatomic,strong)NSArray<YHBaseLinkingLabelModel *> * textArray;
@property(nonatomic,weak)id<YHBaseLinkingLabelProtocol>delegate;
/**
  *设置文字颜色
  */
@property(nonatomic,strong)UIColor * textColor;
/**
  *设置超链接文字颜色
  */
@property(nonatomic,strong)UIColor * linkColor;
/**
  *设置字体大小
  */
@property(nonatomic,assign)NSUInteger fontSize;
/**
  *设置超链接字体大小
  */
@property(nonatomic,assign) int  linkingFontSize;
/**
  *设置是否显示下划线
  */
@property(nonatomic,assign) BOOL  isShowUnderLine;
@end

.m文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
@interface YHBaseLinkingLabel()<YHBaseHtmlViewProcotop>
@end
 
@implementation YHBaseLinkingLabel
{
     //以前博客中 封装的显示HTML字符串富文本的视图
     YHBaseHtmlView * _label;
}
/*
// 重载一些初始化方法
- (instancetype)init
{
     self = [super init];
     if  (self) {
         _label = [[YHBaseHtmlView alloc]init];
         [self addSubview:_label];
         [_label mas_makeConstraints:^(MASConstraintMaker *make) {
             make.leading.equalTo(@0);
             make.trailing.equalTo(@0);
             make.top.equalTo(@0);
             make.bottom.equalTo(@0);
         }];
          _label.delegate=self;
     }
     return  self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
     self = [super initWithCoder:coder];
     if  (self) {
         _label = [[YHBaseHtmlView alloc]init];
         [self addSubview:_label];
         [_label mas_makeConstraints:^(MASConstraintMaker *make) {
             make.leading.equalTo(@0);
             make.trailing.equalTo(@0);
             make.top.equalTo(@0);
             make.bottom.equalTo(@0);
         }];
          _label.delegate=self;
     }
     return  self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
     self = [super initWithFrame:frame];
     if  (self) {
         _label = [[YHBaseHtmlView alloc]init];
         [self addSubview:_label];
         [_label mas_makeConstraints:^(MASConstraintMaker *make) {
             make.leading.equalTo(@0);
             make.trailing.equalTo(@0);
             make.top.equalTo(@0);
             make.bottom.equalTo(@0);
         }];
         _label.delegate=self;
     }
     return  self;
}
//设置文本数组
-( void )setTextArray:(NSArray<YHBaseLinkingLabelModel *> *)textArray{
     _textArray = textArray;
     //进行html转换
     NSString * htmlString = [self transLinkingDataToHtmlStr:textArray];
     //进行布局
     [_label reSetHtmlStr:htmlString];
     
}
-( void )setTextColor:(UIColor *)textColor{
     _textColor = textColor;
     _label.fontColor = textColor;
}
-( void )setLinkColor:(UIColor *)linkColor{
     _linkColor = linkColor;
     _label.linkingColor = linkColor;
}
-( void )setFontSize:(NSUInteger)fontSize{
     _fontSize = fontSize;
     [_label setFontSize:( int )fontSize];
}
-( void )setLinkingFontSize:( int )linkingFontSize{
     _linkingFontSize = linkingFontSize;
     [_label setLinkingSize:linkingFontSize];
}
-( void )setIsShowUnderLine:( BOOL )isShowUnderLine{
     _isShowUnderLine = isShowUnderLine;
     [_label setShowUnderLine:isShowUnderLine];
}
-(NSString *)transLinkingDataToHtmlStr:(NSArray<YHBaseLinkingLabelModel *> *)data{
     NSMutableString * mutStr = [[NSMutableString alloc]init];
     for  ( int  i=0; i<data.count; i++) {
     //这个model中存放的是超链接部分的文字和对应的url
         YHBaseLinkingLabelModel * model = data[i];
         if  (!model.linking) {
             [mutStr appendString:model.text];
         } else  {
             [mutStr appendString:@ "<a href=" ];
             [mutStr appendString:model.linking];
             [mutStr appendString:@ ">" ];
             [mutStr appendString:model.text];
             [mutStr appendString:@ "</a>" ];
         }
     }
     return  mutStr;
}
 
#pragma mark delegate
//点击的回调
-( void )YHBaseHtmlView:(YHBaseHtmlView *)htmlView ClickLink:(NSString *)url{
     for  (YHBaseLinkingLabelModel * model in _textArray) {
         if  ([model.linking isEqualToString:url]) {
             if  ([self.delegate respondsToSelector:@selector(YHBaseLinkingLabelClickLinking:)]) {
                 [self.delegate YHBaseLinkingLabelClickLinking:model];
                 return ;
             }
         }
     }
}
//布局尺寸改变的回调
-( void )YHBaseHtmlView:(YHBaseHtmlView *)htmlView SizeChanged:(CGSize)size{
     if  ([self.delegate respondsToSelector:@selector(YHBaseLinkingLabelSizeChange:)]) {
         [self.delegate YHBaseLinkingLabelSizeChange:size];
     }
}
@end

上面我们有用到一个YHBaseLinkingLabelModel类,这个类进行了链接与字符的映射,设计如下:

?
1
2
3
4
5
6
7
8
9
10
11
@interface YHBaseLinkingLabelModel : YHBaseModel
/**
  *文字内容
  */
@property(nonatomic,strong)NSString * text;
/**
  *超链接地址 nil则为无
  */
@property(nonatomic,strong)NSString * linking;
 
@end

        YHBaseHtmlView类是对RCLabel的一层封装,其中也对RCLabel进行了一些优化和改动,代码较多且在上篇博客中有介绍,这里不再多做解释了。

        在ViewController中写如下代码进行使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- ( void )viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
    YHBaseLinkingLabel * label = [[YHBaseLinkingLabel alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];
     NSMutableArray * array = [[NSMutableArray alloc]init];
     for  ( int  i=0; i<6; i++) {
         YHBaseLinkingLabelModel * model = [[YHBaseLinkingLabelModel alloc]init];
         if  (!(i%2)) {
             model.text =[NSString stringWithFormat:@ "第%d个标签" ,i];
             model.linking = [NSString stringWithFormat:@ "第%d个标签" ,i];
         } else {
             model.text = @ ",不能点得文字," ;
         }
         [array addObject:model];
     }
     label.textColor = [UIColor blackColor];
     label.linkColor = [UIColor purpleColor];
     label.fontSize = 15;
     label.linkingFontSize = 17;
     label.isShowUnderLine=YES;
     label.delegate=self;
     label.textArray = array;
     [self.view addSubview:label];
    
}
-( void )YHBaseLinkingLabelClickLinking:(YHBaseLinkingLabelModel *)model{
     NSLog(@ "%@" ,model.linking);
}

运行效果如下:

224957_KSL8_2340880.png

效果不错,并且十分简单易用,对吧。

目录
相关文章
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
88 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
9天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
12 0
|
24天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
200 2
|
3月前
|
数据可视化 iOS开发
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
40 4
|
3月前
|
iOS开发
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
28 1
|
iOS开发
iOS - Label 数字动态变化
1、数字动态变化 具体实现代码见 GitHub 源码 QExtension QCountingLabel.h /// 文本数字变化方式枚举 typedef NS_ENUM(NSUInteger, QCountingMethod) { QCountingMetho...
993 0
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
39 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
93 2