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 字间距、行间距、两端对齐、分行显示相关推荐

  1. iOS UIlabel文字排版(改变字间距行间距)分类

    在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节. 比如一个Labe ...

  2. 怎样使一排文字中间有间隔_Word如何调整字间距,行间距

    Word 如何调整字间距.行间距 字间距决定行内文字之间的距离. 行距决定段落中各行文字之间的垂直距离. 段落间距 决定段落上方或下方的间距量. 一.调整汉字与英文字母.数字间的距离 Word 中的汉 ...

  3. docx行间距怎么设置_Word如何调整字间距,行间距.docx

    PAGE PAGE #/ 2 Word 如何调整字间距.行间距 字间距决定行内文字之间的距离.行距决定段落中各行文字之间的垂直距 离.段落间距决定段落上方或下方的间距量. 一.调整汉字与英文字母.数字 ...

  4. html字体大小间距,自定义CSS字间距行间距宽度大小

    有些时候发现网站的字间距或者行间距太密或者太松,想要调整一下,最好的办法就是用CSS控制,那么,如何利用CSS控制字间距或者行间距的宽度大小呢,乾元轩提供的方法如下: 对于字间距,可以这样设置 绝对值 ...

  5. 图表横坐标怎么改倾斜_Excel 图表横轴文字太长,不想让它倾斜,如何分行显示?...

    Excel 中的图表,如果横轴文字过长,就会自动倾斜显示.有些同学觉得倾斜的文字不美观,希望仍然横排,超出长度可以自动换行.有没有可能实现? 图表本身并没有这个功能,但是我想了一个很简单办法,就可以实 ...

  6. 如何设置行间距和字间距?

    设置行间距和字之间的距离需要用到css样式.用line-height设置行间距:用letter-spacing设置字间距.具体如下: <!DOCTYPE HTML> <html> ...

  7. textview点击展开全部或收起,内容过长显示省略号,设置行间距,字间距,跑马灯显示

    跑马灯显示 android:ellipsize="marquee" android:singleLine="true" paomad.setSelected(t ...

  8. ios label文字行间距_iOS 设置UILabel行间距【原创】

    今天在项目中遇到需要设置较多文字的行间距问题,得到解决办法分享给大家. 下面贴出代码供参考: 1.正常使用 UILabel *label = [[UILabel alloc] initWithFram ...

  9. ios label文字行间距_iOS设置UILabel文字的行间距和字间距

    释放双眼,带上耳机,听听看~! 可以在UILabel的Category中提供如下几个方法: .h文件 @interface UILabel (ChangeLineSpaceAndWordSpace) ...

最新文章

  1. linux权限管理(chown、chgrp、chomd)
  2. 苹果手机声音突然变小是怎么回事_苹果7通话声音小,苹果7听筒声音小怎么回事...
  3. NYOJ 93 汉诺塔 (数学)
  4. 类与对象的演练 好好学习的学生 java 1613807015
  5. 学python看什么书-python有什么好的书籍
  6. 腾讯校园招聘笔试 2019-8-17 第四题
  7. mdadm管理raid
  8. 计算机系统管理内存的大小是由什么决定的,计算机内存容量大小由什么决定
  9. VRP--车辆路径问题 c++
  10. 新塘单片机烧写器_ICP Programming Tool
  11. 拼多多发单软件使用教程永久免费
  12. Tomcat Caused by:java.lang.IllegalArgumentException: 指定的主资源集[……]无效
  13. python培训骗局
  14. android 炫酷背景,纯css3自动背景变换背景颜色,很炫酷
  15. 什么是抽象类,什么情况下会用到抽象类?
  16. 【MATLAB】遗传算法(GA)求解TSP问题
  17. 江西副省长吴忠琼接见孙立一行,共话打造世界级XR产业中心
  18. 【摘自网上】Delphi TppReport
  19. Information:java: Errors occurred while compiling module ‘mt‘
  20. Android视频直播原理详解

热门文章

  1. Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken
  2. 五种常见的计算机高级语言,[转]计算机语言的种类总结
  3. HDU 5446 Unknown Treasure(Lucas定理+CRT)
  4. 基于OpenCV的车道偏离预警系统
  5. 入大数据行业,主要应该要学习什么?
  6. OOP_多态(C#)
  7. 关于AMM解决滑点、无常损失问题的新认知 | TokenInsight
  8. 文本摘要常用数据集和方法研究综述
  9. ssm教育机构管理系统毕业设计源码010224
  10. 【二分】【卡常】砍树(luogu P1873)