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文件


//文本与超链接地址关联的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文件


@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

目录
相关文章
|
19天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
111 66
|
5天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
29天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
2月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
34 2
|
2月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
58 9
|
2月前
|
vr&ar Android开发 iOS开发
安卓与iOS开发中的用户界面设计原则
【10月更文挑战第41天】探索移动应用开发的精髓,本文将深入分析安卓和iOS平台上用户界面设计的核心原则。通过比较两大操作系统的设计哲学,我们将揭示如何打造直观、易用且美观的应用程序界面。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在竞争激烈的应用市场中脱颖而出。