一、简介
<<UILabel类实现一个只读的文本视图。您可以使用这个类的静态文本,如你可能会使用它来识别你的用户界面的其他部分,绘制一个或多个行。基本UILabel类提供控制文本的外观,包括它是否使用了一层阴影,或汲取的一大亮点。如果需要,您可以自定义文本的外观进一步通过继承
<<UILabel(标签) : 是显示文本的控件.在App中UILabel是出现频率最高的控件之一.
<<继承关系:UILabel --> UIView -->UIResponder-->NSObject
<<UILabel是UIView的子类,作为子类一般是为了扩充父类的功能,UILabel扩展了文字显示的功能,UILabel是能显示文字的视图.
格式为
1--> 设置文字(属性的作用)
typedef NS_ENUM(NSInteger, NSTextAlignment) {
NSTextAlignmentLeft = 0, // Visually left aligned
#if TARGET_OS_IPHONE
NSTextAlignmentCenter = 1, // Visually centered
NSTextAlignmentRight = 2, // Visually right aligned
#else /* !TARGET_OS_IPHONE */
NSTextAlignmentRight = 1, // Visually right aligned
NSTextAlignmentCenter = 2, // Visually centered
#endif
NSTextAlignmentJustified = 3, // Fully-justified. The last line in a paragraph is natural-aligned.
NSTextAlignmentNatural = 4, // Indicates the default alignment for script
}(如果属性有枚举类型的话,这里会有枚举类型说明)
label.text = @"Hello World!!!"; (这是具体的例子)
@property(nullable, nonatomic,copy) NSString *text;// 设置显示文字, 默认是空的 (这是属性的说明)
二、UILabel的文本属性(属性的顺序与苹果API一致)
1-->设置文字
label.text = @"Hello World!!!";
@property(nullable, nonatomic,copy) NSString *text;// 设置显示文字, 默认是空的
2-->设置字号//一般方法
label.font = [UIFont systemFontOfSize:30];
@property(null_resettable, nonatomic,strong) UIFont *font;// 设置字体(系统字体默认17号字体)
3-->文字字体加粗//系统加粗方法
[Label setFont:[UIFont boldSystemFontOfSize:25]];
4-->设置文字字体和字号
label.font = [UIFont fontWithName:@"Zapfino"size:30];
5-->设置文字字体加粗
[Label setFont:[UIFont fontWithName:@"Helvetica-Bold"size:25]];
6-->设置文字颜色
label.textColor = [UIColor blueColor];
@property(null_resettable, nonatomic,strong) UIColor *textColor;// 字体的颜色(默认是黑色)
7-->阴影颜色--设置文字的阴影颜色
label.shadowColor = [UIColor redColor];
@property(nullable, nonatomic,strong) UIColor *shadowColor;// 阴影的颜色
8--> shadowOffset 阴影偏移(必须先设置文字的阴影颜色)--让文字在原有的基础上偏移
label.shadowOffset = CGSizeMake(2,2);
@property(nonatomic) CGSize shadowOffset;// 阴影的偏移量,默认是 CGSizeMake(0, -1)
9-->文字对齐方式
typedef NS_ENUM(NSInteger, NSTextAlignment) {
NSTextAlignmentLeft = 0, // 居左对齐
#if TARGET_OS_IPHONE
NSTextAlignmentCenter = 1, //居中对齐
NSTextAlignmentRight = 2, // 居右对齐
#else /* !TARGET_OS_IPHONE */
NSTextAlignmentRight = 1, //居右对齐
NSTextAlignmentCenter = 2, //居中对齐
#endif
NSTextAlignmentJustified = 3, //合理铺满 等同于居左
NSTextAlignmentNatural = 4, //默认 等同于居左
}
label.textAlignment = NSTextAlignmentCenter;
@property(nonatomic) NSTextAlignment textAlignment;// 对齐方式,默认是NSTextAlignmentNatural (iOS 9之前, 默认是 NSTextAlignmentLeft)
注意:
默认都是竖直居中的
UILabel不能设置竖直方向的排列布局,但是可以通过sizeToFit改变label的frame来实现曲线救国。
10-->断行模式
typedef NS_ENUM(NSInteger, NSLineBreakMode) {
NSLineBreakByWordWrapping = 0, //以单词为显示单位显示,后面部分省略不显示。
NSLineBreakByCharWrapping, //以字符为显示单位显示,后面部分省略不显示。
NSLineBreakByClipping, //剪切与文本宽度相同的内容长度,后半部分被删除。
NSLineBreakByTruncatingHead, //前面部分文字以……方式省略,显示尾部文字内容。
NSLineBreakByTruncatingTail, //结尾部分的内容以……方式省略,显示头的文字内容
NSLineBreakByTruncatingMiddle //中间的内容以……方式省略,显示头尾的文字内容。
} NS_ENUM_AVAILABLE(10_0, 6_0);
label.lineBreakMode = NSLineBreakByClipping;
@property(nonatomic) NSLineBreakMode lineBreakMode(换行方式);// 默认是 NSLineBreakByTruncatingTail.用于多行和多行文本 字符截断类型 设置文字过长时的显示格式
例子:
NSLineBreakByClipping--会出现显示半个字的情况
NSLineBreakByTruncatingHead--没显示玩的文字会以省略号形式代替显示(省略号出现在左下角)
NSLineBreakByTruncatingTail--(省略号出现在右下角)
NSLineBreakByTruncatingTail--(省略号出现在最后一行的中间位置)
三、UILabel的富文本属性
1-->attributedText更改任意文字的颜色和字体大小
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:label.text];-->先把label上的文字赋值给可变字符串
[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(5,10)];-->设置更改后的颜色和改变文字的区域
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(20, 25)];-->设置更改后的字体大小和改变文字的区域
label.attributedText = str;-->把改后的字符串重新赋值给label
@property(nullable, nonatomic,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0);
四、UILabel的高亮属性
1-->highlighted高亮显示时候的文本颜色
label.highlightedTextColor=[UIColor blueColor];//高亮显示时候的文本颜色
@property(nullable, nonatomic,strong) UIColor *highlightedTextColor; // 高亮 状态的字体颜色
2-->highlighted是否高亮显示
label.highlighted=YES;
@property(nonatomic,getter=isHighlighted) BOOL highlighted; //是否高亮, 默认是NO
3-->设置是否能与用户进行交互
label.userInteractionEnabled = YES;
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; // 设置是否能与用户进行交互,默认没有打开交互
4-->设置label中的文字是否可变
label.enabled = YES;
@property(nonatomic,getter=isEnabled) BOOL enabled; // 设置label中的文字是否可变,默认值是YES
五、UILabel的换行属性
1-->设置文字换行
label.numberOfLines = 0;
@property(nonatomic) NSInteger numberOfLines;//换行 默认值是1行。0值意味着没有限制
注意:
// 最大显示的行数(默认是1)
// Δ 这里需要去理解一下
// 1. 当label的内容足够多, 而且, label足够高, 最大显示numberOfLines行
// 2. 当label的内容足够多, 但是, label的高度不够高, 最大显示label能容纳多少行
// 3. 当label的内容不够多, 能显示多少行, 显示多少行
// o 表示不限制最大行数
六、UILabel的自适应属性
1-->设置字体自适应adjustsLetterSpacingToFitWidth
label.adjustsLetterSpacingToFitWidth=YES;
@property(nonatomic) BOOL adjustsFontSizeToFitWidth; // default is NO 设置字体大小适应label宽度 默认NO
2-->控制文本基线
typedef NS_ENUM(NSInteger, UIBaselineAdjustment) {
UIBaselineAdjustmentAlignBaselines = 0, // default. used when shrinking text to position based on the original baseline 默认,文本最上端与中线对齐
UIBaselineAdjustmentAlignCenters,//文本中线与label中线对齐
UIBaselineAdjustmentNone,//文本最低端与label中线对齐。
};
label.baselineAdjustment=UIBaselineAdjustmentAlignBaselines;
@property(nonatomic) UIBaselineAdjustment baselineAdjustment; // 默认是UIBaselineAdjustmentAlignBaselines,如果adjustsFontSizeToFitWidth属性设置为YES,这个属性就来控制文本基线的行为
3-->minimumScaleFactor设置最小收缩比例
label.minimumScaleFactor=0.5;
@property(nonatomic) CGFloat minimumScaleFactor NS_AVAILABLE_IOS(6_0); // 默认是0
注意:
Fixed Font Size默认,如果label宽度小于文字长度时,文字大小不自动缩放
minimumScaleFactor设置最小收缩比例,如果Label宽度小于文字长度时,文字进行收缩,收缩超过比例后,停止收缩。
4-->设置多行label的最大宽度的
label.allowsDefaultTighteningForTruncation=YES;这个属性是用来设置多行label的最大宽度的
@property(nonatomic) BOOL allowsDefaultTighteningForTruncation NS_AVAILABLE_IOS(9_0); // 默认是NO
注意:
当自动布局的时候约束这个label的时候这个属性会起作用
在自动布局添加约束中,若文本超过了指定的最大宽度的时候 文本会另起一行 从而增加了label的高度
七、UILabel的图和定位覆盖方法
1-->计算UILabel随字体多行后的高度
CGRect bounds = CGRectMake(0, 0, 200, 300);
heightLabel = [myLabel textRectForBounds:bounds
limitedToNumberOfLines:20]; //计算20行后的Label的Frame
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;
2-->描边label
- (void)drawTextInRect:(CGRect)rect {
CGSizeshadowOffset =self.shadowOffset;
UIColor*textColor =self.textColor;
CGContextRef c = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(c,self.outlineWidth);
CGContextSetLineJoin(c, kCGLineJoinRound);
CGContextSetTextDrawingMode(c, kCGTextStroke);
self.textColor=self.outlineColor;
[superdrawTextInRect:rect];
CGContextSetTextDrawingMode(c, kCGTextFill);
self.textColor= textColor;
self.shadowOffset= CGSizeMake(0,0);
[superdrawTextInRect:rect];
self.shadowOffset= shadowOffset;
}
- (void)drawTextInRect:(CGRect)rect;
八、UILabel的auto layou属性
1-->设置了auto layou的适配宽度
label.preferredMaxLayoutWidth =label.frame.size.width;
iOS6开始 UILabel下面需要设置preferredMaxLayoutWidth ,设置了autolayout和numberofline的UIlabel才显示多行
九、UILabel的边框圆角属性
1-->borderWidth设置边框宽度
label.layer.borderWidth=2;
2-->borderColor设置边框颜色
label.layer.borderColor=[UIColor blueColor].CGColor
3-->设置圆角颜色
label.backgroundColor=[UIColor blueColor];;
4-->设置圆角半径
label.layer.cornerRadius =5;
十、UILabel的边框圆角拓展
第一种方法:通过设置layer的属性
最简单的一种,但是很影响性能,一般在正常的开发中使用很少.
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100,100,100)];
//只需要设置layer层的两个属性
//设置圆角
imageView.layer.cornerRadius = imageView.frame.size.width /2;
//将多余的部分切掉
imageView.layer.masksToBounds =YES;
[self.view addSubview:imageView];
第二种方法:使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100,100,100)];
imageView.image= [UIImage imageNamed:@"1"];//开始对imageView进行画图UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO,1.0);//使用贝塞尔曲线画出一个圆形图[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.frame.size.width] addClip];
[imageView drawRect:imageView.bounds];
imageView.image=UIGraphicsGetImageFromCurrentImageContext();//结束画图UIGraphicsEndImageContext();
[self.view addSubview:imageView];
第三种方法:使用CAShapeLayer和UIBezierPath设置圆角
首先需要导入<AVFoundation/AVFoundation.h>
UIImageView*imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100,100,100)];
imageView.image= [UIImage imageNamed:@"1"];
UIBezierPath*maskPath =[UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imageView.bounds.size];
CAShapeLayer*maskLayer =[[CAShapeLayer alloc]init];
//设置大小
maskLayer.frame =imageView.bounds;
//设置图形样子
maskLayer.path =maskPath.CGPath;
imageView.layer.mask=maskLayer;
[self.view addSubview:imageView];
这三种方法中第三种最好,对内存的消耗最少啊,而且渲染快速。