iOS:如何实现在文字上添加拼音
一、介绍
最近项目有一个需求,需要给朗诵的文字添加对应的拼音,而且要求使用原生的控件实现。一开始听到这个需求挺懵逼的,感觉有点难。后来,静下来想一下,其实还是可以实现的,无非就是自定义了。下面,就来说说思想。
二、思想
server端首先返回汉字和拼音一一对应的字符串,我们根据需要分别截取存入数组。一个汉字要添加拼音,拼音使用一个view显示,汉字也使用一个view显示,那么包含这两个控件的则是一个父view。许多个父view根据横向瀑布流的布局排列,就可以实现需要的汉字添加拼音的效果。结构图如下:

具体步骤如下:
1、创建一个textView,继承自UIScrollView,因为内容可能很多,需要滚动才能显示完;
2、在textView中接收模型时,动态创建很多的contanerView, 拼音View,汉字View,并使用masonry约束;
3、采用横向瀑布流算法对很多的contanerView进行布局;
4、在viewController中创建并添加textView,最后设置它的contentSize即可。
三、特点
优点:采用原生的控件实现,效果很流畅,用户体验好。
缺点:因为是一次性创建并添加很多的控件,如果文字特别多时,view渲染的过程比较耗时,建议放到自动释放池中进行创建。
四、代码
核心算法:
#pragma mark - layout subviews
-(void)setupSubviewsConstraints { //(子视图采用横向瀑布流布局)
CGFloat margin = 2.5;
CGFloat viewHeight = (kFont.pointSize+) * ;
CGFloat sumWidth = ;
CGFloat limitWidth = kScreenWidth-*margin;
CGFloat viewX = margin;
CGFloat viewY = margin;
CGFloat row = ; for (int i= ; i<self.contentArray.count; i++) { //实际宽度
CGFloat chineseWidth = [self layoutListNameLength:self.contentArray[i]];
CGFloat pinYinWidth = [self layoutListNameLength:self.pinYinArray[i]];
CGFloat maxWidth = MAX(chineseWidth, pinYinWidth); //添加容器
UIView *containerView = [[UIView alloc] init];
[self addSubview:containerView]; //添加拼音
UILabel *pinYinLabel = [[UILabel alloc] init];
pinYinLabel.textColor = [UIColor grayColor];
pinYinLabel.font = kFont;
pinYinLabel.text = self.pinYinArray[i];
pinYinLabel.textAlignment = NSTextAlignmentCenter;
[containerView addSubview:pinYinLabel]; //添加汉字
UILabel *chineseLabel = [[UILabel alloc] init];
chineseLabel.textColor = [UIColor blackColor];
chineseLabel.font = kFont;
chineseLabel.text = self.contentArray[i];
chineseLabel.textAlignment = NSTextAlignmentCenter;
[containerView addSubview:chineseLabel]; //设置约束
[containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(viewHeight));
make.width.equalTo(@(maxWidth));
make.left.equalTo(@(viewX));
make.top.equalTo(@(viewY));
}];
[pinYinLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.right.equalTo(containerView);
make.height.equalTo(containerView.mas_height).multipliedBy(0.5);
}];
[chineseLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.bottom.right.equalTo(containerView);
make.height.equalTo(containerView.mas_height).multipliedBy(0.5);
}]; //计算坐标
sumWidth += (maxWidth + margin);
if (i < self.contentArray.count-) {
chineseWidth = [self layoutListNameLength:self.contentArray[i+]];
pinYinWidth = [self layoutListNameLength:self.pinYinArray[i+]];
maxWidth = MAX(chineseWidth, pinYinWidth);
}
if (limitWidth - sumWidth >= maxWidth) { ///不换行
viewX = sumWidth + margin;
}
else{ ///换行
row++;
sumWidth = ;
viewX = margin;
if (i==self.contentArray.count-) {
row--;
}
}
viewY = (viewHeight + *margin)*row + margin;
} self.realHeight = viewY + viewHeight + 1.5*margin;
}
完整代码:(在github上,觉得有用就给个star吧,
iOS:如何实现在文字上添加拼音的更多相关文章
- iOS 给NSString文字上添加横线 中间和下划线
有时候我们需要给文字添加横线,有两种情况: 第一种是贯穿中间的横线: 横线的颜色和文字的颜色保持一致 _oldPriceLabel.text = "; _oldPriceLabel.text ...
- IOS 6 和 IOS7 UITableViewCell上添加控件的获取
假设每个cell上面都有UIButton,怎么判断哪个Cell上的按钮被按下了呢? IOS6上 -(IBAction)btnClick:(id)sender { UIButton *btn = (UI ...
- Inno Setup技巧[界面]欢迎页面上添加文字
原文:Inno Setup技巧[界面]欢迎页面上添加文字 本文介绍在"欢迎页面添加文字"的两种方法. 界面预览: Setup技巧[界面]欢迎页面上添加文字" title= ...
- python 图片上添加文字
import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDraw #设置字体,如果没有,也可以不 ...
- iOS: 获取UITableViewCell上添加的子控件对应的cell
一.简单介绍 UITableViewCell是UITableView的核心部分,我们在开发中因为功能的扩展经常需要自定义,以便在其上面添加子控件,例如button.label等.添加后获取这些子控件的 ...
- Office WORD如何在图片上添加文字
如图所示,在图片格式中选择图片衬于文字下方即可,这样看起来感觉就像在图片上直接加字一样,没有生硬的感觉. 最终效果: Word如何在图片上添加文字Word如何在图片上添加文字Word如何在图片上添加文 ...
- python如何在图片上添加文字(中文和英文)
Python在图片上添加文字的两种方法:OpenCV和PIL 一.OpenCV方法 1.安装cv2 pip install opencv-python 2.利用putText方法来实现在图片的指定位置 ...
- iOS 在tableView上添加button导致按钮没有点击效果和不能滑动的 zhuang
转载请注明出处. 今天在调试代码的时候,在tableviewcell上添加button,发现button快速点击的话,是看不出点击效果的,查找资料发现, ios7上UITableViewCell子层容 ...
- C#在图片上添加文字代码
创建.NET WinForm程序,设置项目的默认命名空间为Keleyi.Com,在窗体上添加一个PictureBox控件pictureBox_keleyi_com和一个Button控件button_A ...
随机推荐
- HDU 1435 Stable Match 【稳定婚姻问题】
<题目链接> 题目大意:给你n个发射站和n个接受站的位置,并且给出他们的容量,现在需要你对这n对站台进行匹配,距离越近的站台越稳定,如果两个站台距离相等,容量越大的越稳定.问你稳定匹配是什 ...
- POJ 1470 Closest Common Ancestors (模板题)(Tarjan离线)【LCA】
<题目链接> 题目大意:给你一棵树,然后进行q次询问,然后要你统计这q次询问中指定的两个节点最近公共祖先出现的次数. 解题分析:LCA模板题,下面用的是离线Tarjan来解决.并且为了代码 ...
- HDU4578 Transformation【线段树】
<题目链接> <转载于 >>> > 题目大意: 有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部乘c. 3:区间[l ...
- The more, The Better
The more, The Better依赖背包+树形dpf[x][j+1]=max(f[x][j+1],f[x][j+1-k]+f[i->n][k]);我的一个疑问就是这k个节点会不会选重复, ...
- 004.Ansible Ad-Hoc命令集
一 Ad-Hoc使用场景 Ad-Hoc更倾向于解决简单.临时性任务. 1.1 Ad-Hoc基础命令 基本语法: 1 ansible <host-pattern> [options] < ...
- JMeter快速入门
今天的年会已过,仍然是空手而归,不过俺坚信能让生活稳定永远都是努力.由于隔壁组负责年会的抢红包项目,因而趁此机会把通过工具模拟高并发的知识补了补,通过和身边大师的交流,总算是对压力测试有了个简要的了解 ...
- spring之基础知识总结
spring是轻量级的(非侵入式,不用继承spring中的父类等).Spring框架主要提供了IoC容器.AOP.数据访问.Web开发.消息.测试等相关技术.本文主要介绍Spring中的一些小知识点, ...
- JVM五大知识点
1 JVM的基本特性 1.1 基于栈(Stack-based): 不同于Intel x86和ARM等比较流行的计算机处理器都是基于寄存器(register)架构,JVM是基于栈执行的. 1.2 符号引 ...
- 使用IntelliJ Idea新建SpringBoot项目
简单给大家介绍一下我来创建SpringBoot项目使用的工具,本人使用IntelliJ Idea来创建项目,利用其中的Spring Initializr工具来快速创建项目. 步骤如下: 菜单栏中选择F ...
- UVA 12108 Extraordinarily Tired Students
思路: ①用结构体stu,属性有清醒时间,睡眠时间,开始处于的时间,状态(醒着还是睡着), 还有计数器. ②二维数组存表格. ③在确定接下来要进入的状态之后,就一次把表格里持续状态的数据都修改掉,比如 ...