自定义的两端对齐的Label

使用方法:

FNLabel *textL = [[FNLabel alloc] initWithFrame:(CGRect){20,100,300,MAXFLOAT}];

NSString *textStr = @",攻击哦评价,发我家偶奇偶给,我看了您访问利率;赶紧弄魔法卡片,课堂为规范嘛呢;拉倒给我扑克牌,给我恐怕,比,客人可观评价,发我;赶紧弄魔法 卡片,课堂为规范嘛呢;拉倒给我扑克牌,给我恐怕,比,客人可观评价,发我家偶奇偶给,我看了您访";

textL.backgroundColor = [UIColor redColor];

[self.view addSubview:textL];

使用效果

核心方法:

文本属性NSMutableParagraphStyle与CoreText结合

使用注意:

1.不用设置numberOfLines,自动换行

2.默认行间距为5,可在104行更改,可以自己添加更多属性

3.string属性用于添加富文本,text为普通文本

代码----声明文件

#import <UIKit/UIKit.h>

@interface FNLabel : UIView
@property (nonatomic, strong)NSMutableAttributedString* string;
@property (nonatomic, strong)UIFont* font;
@property (nonatomic, strong)UIColor* textColor;

- (void)setText:(NSString*)text;
@end

代码----实现文件

  1 #import "FNLabel.h"
  2 #import <CoreText/CoreText.h>
  3
  4 @implementation FNLabel
  5
  6 - (id)initWithFrame:(CGRect)frame
  7 {
  8     self = [super initWithFrame:frame];
  9     if (self) {
 10         self.backgroundColor = [UIColor clearColor];
 11     }
 12     return self;
 13 }
 14
 15 - (void)drawRect:(CGRect)rect
 16 {
 17     [self formatString];
 18
 19     CGContextRef ctx = UIGraphicsGetCurrentContext();
 20
 21     // 从文本空间到用户控件的转换矩阵
 22     CGContextSetTextMatrix(ctx, CGAffineTransformIdentity);
 23     // 缩放范围
 24     CGContextTranslateCTM(ctx,0, self.bounds.size.height);
 25     // 调整正确的坐标系
 26     CGContextScaleCTM(ctx, 1.0, -1.0);
 27
 28     // 1.由富文本得到framesetter
 29     CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)_string);
 30     // 2.由self.bounds得到path
 31     CGMutablePathRef path = CGPathCreateMutable();
 32     CGPathAddRect(path, NULL, self.bounds);
 33     // 3.由framesetter(内涵文本内容),range(要画的范围),path文本矩形 得到CTFrameRef
 34     CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, [_string length]), path, NULL);
 35     // 4.画文本
 36     CTFrameDraw(frame, ctx);
 37
 38     CFRelease(path);
 39     CFRelease(frame);
 40     CFRelease(frameSetter);
 41 }
 42 #pragma mark - 普通的两端对齐文本
 43 - (void)setText:(NSString *)text
 44 {
 45     _string = [[NSMutableAttributedString alloc] initWithString:text];
 46     if (_textColor) {
 47         [_string addAttribute:NSForegroundColorAttributeName value:_textColor range:NSMakeRange(0, [_string length])];
 48     }
 49     if (_font) {
 50         [_string addAttribute:NSFontAttributeName value:_font range:NSMakeRange(0, [_string length])];
 51     }
 52     [self setNeedsDisplay];
 53 }
 54 #pragma mark - 保存整体文字颜色
 55 - (void)setTextColor:(UIColor *)textColor
 56 {
 57     _textColor = textColor;
 58 }
 59 #pragma mark - 保存整体字体
 60 - (void)setFont:(UIFont *)font
 61 {
 62     _font = font;
 63 }
 64 #pragma mark - 添加所有富文本属性
 65 - (void)setString:(NSMutableAttributedString *)string
 66 {
 67
 68     NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:string.string];
 69
 70     _string = str;
 71     // 设置文字颜色
 72     if (_textColor == nil) {
 73         _textColor = [UIColor blackColor];
 74     }
 75     [_string addAttribute:NSForegroundColorAttributeName value:_textColor range:NSMakeRange(0, [string length])];
 76     if (_font == nil) {
 77         _font = [UIFont systemFontOfSize:20];
 78     }
 79     // 设置文字字体
 80     [_string addAttribute:NSFontAttributeName value:_font range:NSMakeRange(0, [string length])];
 81
 82     // 遍历添加所有字体文本属性
 83     [string enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, _string.length) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {
 84         if (value) {
 85             [_string addAttribute:NSFontAttributeName value:value range:range];
 86
 87             [self setNeedsDisplay];
 88         }
 89     }];
 90     // 遍历添加所有颜色文本属性
 91     [string enumerateAttribute:NSForegroundColorAttributeName inRange:NSMakeRange(0, _string.length) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {
 92         if (value) {
 93             [_string addAttribute:NSForegroundColorAttributeName value:value range:range];
 94
 95             [self setNeedsDisplay];
 96         }
 97     }];
 98 }
 99 #pragma mark - 添加两端对齐属性
100 - (void)formatString
101 {
102     NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
103     style.alignment = NSTextAlignmentJustified;
104     style.lineSpacing = 5;
105     [_string addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, _string.length)];
106
107 }
108
109 @end
时间: 2024-08-21 01:11:26

自定义的两端对齐的Label的相关文章

不同浏览器下兼容文本两端对齐

在form表单的前端布局中,我们经常需要将文本框的提示文本两端对齐,例如: 比较粗暴的做法是在需要隔离边距的文本中加标签,然后分别控制每个文字的边距,这种方法比直接加空格或者占位符更精准,我之前也都是这么做的.但是写的多了之后开始思考能不能抽象出来用于更多的场景?让代码更好看一些?维护成本更低一些? 1.首先想到是能不能直接靠css解决问题 css .test-justify { text-align: justify; } html <div class="test-justify&qu

两端对齐的TextView

做Android的时候一直为TextView的两端对齐烦恼,看了一些网上的代码,很多仅仅是对英文或中文有效果,中英文混合后依旧无效,于是自己自定义实现了一个TextView,效果还不错,地址:https://github.com/androiddevelop/AlignTextView 系统要求 Android 4.0以上 快速使用 <cn.androiddevelop.aligntextview.lib.AlignTextView android:id="@+id/alignTv&quo

css之文本两端对齐

在进行网页设计时,我们经常会看到这样的样式:文本两端对齐. css为我们提供了一个属性可以实现这样的效果:text-align: justify.不过这个只能用来设置多行文本(除最后一行).如果只有单行的话,是不起效果的.那怎么办呢?这里有两种解决方案: 第一种 借助伪元素或者内联元素使文本不是最后一行.具体代码: <form> <p> <label>用户名</label>: <input type="text"> </

模拟公交站台竖直排列,两端对齐

今天看到一个公家车站台的公家站牌,对站名的排列方式很有兴趣,html和css没有提供文字竖直排列的简便方法,需要我们利用一些技巧才能完成  大概要的效果就是这样的,竖直排列,两端对齐 首先先对竖直排列进行设计 先上html代码: 1 <ul> 2 <li><b>站牌1</b></li> 3 <li><b>站牌2</b></li> 4 <li><b>长站牌3</b>

自适应的两端对齐:text-align:justify

1 2 3 <!DOCTYPE HTML> 4 <html> 5 <head> 6 <title>文本两端对齐 by hongchenok</title> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <style> 9 .box{ 10 width:50%; 11 padding:20

关于文本两端对齐的处理!

<div> <p>对照组1:文档流<span></span></p> <p>对照组2:两端对齐(本组支持谷歌)<span></span></p> <p>对 照 组3:两 端 对 齐 ( 本 组 支 持 谷 歌.火狐 .IE9+)<span></span></p> <p>对照组4:我们不保证内容的正确性.通过使用本站内容随之而来的风险与本站无

Text Justification 实现两端对齐功能

实现office word中的两端对齐功能. 只有个单词时,右边补齐空格.最后一行每个词间一个空格,整下的空格右边补齐.给定字符串,和每行的字符数L.进行两端对齐输出. 我的思路是写一个函数,给定相应的参数就返回该行的string.然后在主函数里只要负责给参数就好了.参数包括words字符串数组本身,然后每个字符串的长度数组.开始start记录从字符串数组只的那个词开始,end记录到哪个词结束.L就是每行的最大字符数.在子函数里实现如果是最后一个单词了,那么就每个词空一个空格.其余后面补齐.在主

不定长度导航的两端对齐

1.导航按钮的字数不固定  有长有短,且个数不确定.布局比较麻烦. 2.利用flex 进行布局.兼容性还是比较差,不太稳定,确保flex生效的前提下 ,不失为快速有效的办法,也比较推荐. 3.利用行内元素的两端对齐 <html> <head> <title></title> <meta charset="UTF-8" /> </head> <style> .nav_list { width: 800px

HTML,文字两端对齐

text-align: justify样式的意思是文字两端对齐,但是有时候你会发现这东西不起左右,比如在div标签中的文字. 解决方法:在div中放一个空的span标签,并使用下面的样式. .justify        {            text-align: justify;            width: 100px;        }        .justify > span        {            display: inline-block /* Ope