ios label文字行间距_ios实践之Label 字间距、行间距、两端对齐、分行显示
UILabel算是iOS里使用最多的控件了吧,下面来说说它特殊的应用需求吧
一、设置字间距、行间距
这是一个比较常见的需求了
写一个UILabel的分类
@interface UILabel (extension)
/**
* 设置字间距
*/
-(void)setColumnSpace:(CGFloat)columnSpace;
/**
* 设置行距
*/
- (void)setRowSpace:(CGFloat)rowSpace;
@end
#import "UILabel+extension.h"
#import
@implementation UILabel (extension)
- (void)setColumnSpace:(CGFloat)columnSpace
{
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
//调整间距
[attributedString addAttribute:(__bridge NSString *)kCTKernAttributeName value:@(columnSpace) range:NSMakeRange(0, [attributedString length])];
self.attributedText = attributedString;
}
- (void)setRowSpace:(CGFloat)rowSpace
{
self.numberOfLines = 0;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
//调整行距
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = rowSpace;
paragraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [self.text length])];
self.attributedText = attributedString;
}
@end
然后再重写UILabel
@interface RDNewLabel : UILabel
@property (nonatomic, assign) float charactSpace; //字间距
@property (nonatomic, assign) float lineSpace; //行间距
+ (CGFloat)textHeight:(NSString *)text width:(CGFloat)labelWidth font:(UIFont *)font charactSpace:(CGFloat)charactSpace LineSpace:(CGFloat)lineSpace numberLines:(NSInteger)numberLines;
(CGFloat)textWidth:(NSString *)text height:(CGFloat)labelHeight font:(UIFont *)font charactSpace:(CGFloat)charactSpace LineSpace:(CGFloat)lineSpace;
#define CharactSpacing 0.4 //字间距
#define LinesSpacing 4.0 //行间距
@implementation RDNewLabel
- (void)setText:(NSString *)text{
[super setText:text];
//默认字间距为0.4
if (_charactSpace==0) {
[self setColumnSpace:CharactSpacing];
}else{
[self setColumnSpace:_charactSpace];
}
//默认行间距为4.0,当设置0.01时则不设置行间距
if (_lineSpace == 0) {
[self setRowSpace:LinesSpacing];
}else{
if (_lineSpace <= 0.01) {
}else{
[self setRowSpace:_lineSpace];
}
}
}
+ (CGFloat)textHeight:(NSString *)text width:(CGFloat)labelWidth font:(UIFont *)font charactSpace:(CGFloat)charactSpace LineSpace:(CGFloat)lineSpace numberLines:(NSInteger)numberLines{
CGFloat textHeight = 0;
RDNewLabel *label = [RDNewLabel new];
label.font = font;
if (charactSpace == 0) {
charactSpace = CharactSpacing;
}
label.charactSpace = charactSpace;
if (lineSpace == 0) {
lineSpace = LinesSpacing;
}
label.lineSpace = lineSpace;
label.text = text;
label.numberOfLines = numberLines;
textHeight = [label sizeThatFits:CGSizeMake(labelWidth, MAXFLOAT)].height;
return textHeight;
}
+ (CGFloat)textWidth:(NSString *)text height:(CGFloat)labelHeight font:(UIFont *)font charactSpace:(CGFloat)charactSpace LineSpace:(CGFloat)lineSpace{
CGFloat textWidth = 0;
RDNewLabel *label = [RDNewLabel new];
label.font = font;
if (charactSpace == 0) {
charactSpace = CharactSpacing;
}
label.charactSpace = charactSpace;
if (lineSpace == 0) {
lineSpace = LinesSpacing;
}
label.lineSpace = lineSpace;
label.text = text;
label.numberOfLines = 0;
textWidth = [label sizeThatFits:CGSizeMake(MAXFLOAT, labelHeight)].width;
return textWidth;
}
二、Label 两端对齐
很多情况我们会遇到这样的需求,要求Label文字两端对齐。
使用UILabel的NSTextAlignment设置两端对齐并不是达到效果,而使用UILabel的attributedText确实可以实现两端对齐。
重写UILabel的setText方法
@implementation ALLabel
- (void)setText:(NSString *)text{
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc]initWithString:text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.alignment = NSTextAlignmentJustified;//设置两端对齐
[attributedStr setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:self.font,NSUnderlineStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleNone]} range:NSMakeRange(0, attributedStr.length)];
[self setAttributedText:attributedStr];
}
初始化一个ALLabel
@property (weak, nonatomic) IBOutlet ALLabel *label;
NSString* msg = @"壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风《赤壁赋》文徵明书徐来,水波不兴。举酒属(zhǔ)客,诵明月之诗,歌窈窕之章。少(shǎo) 焉,月出于东山之上,徘徊于斗(dǒu)牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯 (píng) 虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。”
_label.text = msg;
计算label自适应高度还是一样
CGSize resultSize = [msg boundingRectWithSize:size options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]} context:nil].size
三、分行显示
也许我们会遇到类似需求:本来多行的文字,却首先只显示两行,最二行末尾处放置一个“查看更多”的按钮,点击查看更多按钮则全部显示。
思路:
1、设置一个lines为0的allTextLabel;
2、放置一个lines为1的firstLineLabel,top、left、right和allTextLabel对齐;
3、放置一个lines也为1的secondLineLabel,left与firstLineLabel对齐,top与firstLineLabel的bottom间距为0,right与“查看更多按钮”的间距为0;
4、放置一个“查看更多”的按钮moreTextButton,right与firstLineLabel对齐,top与firstLineLabel的bottom间距为0,宽度固定
@property (weak, nonatomic) IBOutlet UILabel *allTextLabel;
@property (weak, nonatomic) IBOutlet UILabel *firstLineLabel;
@property (weak, nonatomic) IBOutlet UILabel *secondLineLabel;
@property (weak, nonatomic) IBOutlet UIButton *moreTextButton;
根据文字内容和宽度返回一个以行数line为索引的数组
#import
- (NSArray *)getSeparatedLinesFromLabelText:(NSString *)text font:(UIFont *)font width:(CGFloat)width
{
CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
[attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)myFont range:NSMakeRange(0, attStr.length)];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,width,MAXFLOAT));
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
NSMutableArray *linesArray = [[NSMutableArray alloc]init];
for (id line in lines)
{
CTLineRef lineRef = (__bridge CTLineRef )line;
CFRange lineRange = CTLineGetStringRange(lineRef);
NSRange range = NSMakeRange(lineRange.location, lineRange.length);
NSString *lineString = [text substringWithRange:range];
[linesArray addObject:lineString];
}
return linesArray;
}
接下来就是赋值了
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSString * msg = @"土地是以它的肥沃和收获而被估价的;才能也是土地,不过它生产的不是粮食,而是真理。如果只能滋生瞑想和幻想的话,即使再大的才能也只是砂地或盐池,那上面连小草也长不出来的
_allTextLabel.hidden = TRUE;
CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
_textLines = [self getSeparatedLinesFromLabelText:msg font:[UIFont systemFontOfSize:15] width:screenWidth-90];
_firstLineLabel.text = _textLines[0];
_secondLineLabel.text = _textLines[1];
}
点击查看更多按钮,其实就是赋值后隐藏firstLineLabel和secondLineLabel
- (IBAction)onClickShowMoreText:(id)sender {
_allTextLabel.text = msg ;
_allTextLabel.hidden = FALSE;
_firstLineLabel.hidden = TRUE;
_secondLineLabel.hidden = TRUE;
_moreTextButton.hidden = TRUE;
}
ios label文字行间距_ios实践之Label 字间距、行间距、两端对齐、分行显示相关推荐
- iOS UIlabel文字排版(改变字间距行间距)分类
在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节. 比如一个Labe ...
- 怎样使一排文字中间有间隔_Word如何调整字间距,行间距
Word 如何调整字间距.行间距 字间距决定行内文字之间的距离. 行距决定段落中各行文字之间的垂直距离. 段落间距 决定段落上方或下方的间距量. 一.调整汉字与英文字母.数字间的距离 Word 中的汉 ...
- docx行间距怎么设置_Word如何调整字间距,行间距.docx
PAGE PAGE #/ 2 Word 如何调整字间距.行间距 字间距决定行内文字之间的距离.行距决定段落中各行文字之间的垂直距 离.段落间距决定段落上方或下方的间距量. 一.调整汉字与英文字母.数字 ...
- html字体大小间距,自定义CSS字间距行间距宽度大小
有些时候发现网站的字间距或者行间距太密或者太松,想要调整一下,最好的办法就是用CSS控制,那么,如何利用CSS控制字间距或者行间距的宽度大小呢,乾元轩提供的方法如下: 对于字间距,可以这样设置 绝对值 ...
- 图表横坐标怎么改倾斜_Excel 图表横轴文字太长,不想让它倾斜,如何分行显示?...
Excel 中的图表,如果横轴文字过长,就会自动倾斜显示.有些同学觉得倾斜的文字不美观,希望仍然横排,超出长度可以自动换行.有没有可能实现? 图表本身并没有这个功能,但是我想了一个很简单办法,就可以实 ...
- 如何设置行间距和字间距?
设置行间距和字之间的距离需要用到css样式.用line-height设置行间距:用letter-spacing设置字间距.具体如下: <!DOCTYPE HTML> <html> ...
- textview点击展开全部或收起,内容过长显示省略号,设置行间距,字间距,跑马灯显示
跑马灯显示 android:ellipsize="marquee" android:singleLine="true" paomad.setSelected(t ...
- ios label文字行间距_iOS 设置UILabel行间距【原创】
今天在项目中遇到需要设置较多文字的行间距问题,得到解决办法分享给大家. 下面贴出代码供参考: 1.正常使用 UILabel *label = [[UILabel alloc] initWithFram ...
- ios label文字行间距_iOS设置UILabel文字的行间距和字间距
释放双眼,带上耳机,听听看~! 可以在UILabel的Category中提供如下几个方法: .h文件 @interface UILabel (ChangeLineSpaceAndWordSpace) ...
最新文章
- linux权限管理(chown、chgrp、chomd)
- 苹果手机声音突然变小是怎么回事_苹果7通话声音小,苹果7听筒声音小怎么回事...
- NYOJ 93 汉诺塔 (数学)
- 类与对象的演练 好好学习的学生 java 1613807015
- 学python看什么书-python有什么好的书籍
- 腾讯校园招聘笔试 2019-8-17 第四题
- mdadm管理raid
- 计算机系统管理内存的大小是由什么决定的,计算机内存容量大小由什么决定
- VRP--车辆路径问题 c++
- 新塘单片机烧写器_ICP Programming Tool
- 拼多多发单软件使用教程永久免费
- Tomcat Caused by:java.lang.IllegalArgumentException: 指定的主资源集[……]无效
- python培训骗局
- android 炫酷背景,纯css3自动背景变换背景颜色,很炫酷
- 什么是抽象类,什么情况下会用到抽象类?
- 【MATLAB】遗传算法(GA)求解TSP问题
- 江西副省长吴忠琼接见孙立一行,共话打造世界级XR产业中心
- 【摘自网上】Delphi TppReport
- Information:java: Errors occurred while compiling module ‘mt‘
- Android视频直播原理详解
热门文章
- Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken
- 五种常见的计算机高级语言,[转]计算机语言的种类总结
- HDU 5446 Unknown Treasure(Lucas定理+CRT)
- 基于OpenCV的车道偏离预警系统
- 入大数据行业,主要应该要学习什么?
- OOP_多态(C#)
- 关于AMM解决滑点、无常损失问题的新认知 | TokenInsight
- 文本摘要常用数据集和方法研究综述
- ssm教育机构管理系统毕业设计源码010224
- 【二分】【卡常】砍树(luogu P1873)