UILabel - 标签
一种显示一行或多行只读文本的视图,通常与控件一起用于描述它们的预期用途。可以使用UILabel样式相关属性配置UILabel显示文本的整体外观,也可以使用富文本设置UILabel显示文本的样式,可以使用编程方式或使用界面生成器(Interface Builder)在界面中添加和自定义标签。
按照以下步骤向界面添加标签:
提供表示内容的字符串或富文本。
如果使用的是不是富文本,需要配置标签的外观。
设置自动布局规则以控制界面中标签的大小和位置。
提供可访问性信息和本地化字符串。
UILabel常用属性
@property(nullable, nonatomic,copy) NSString *text;
属性描述 :标签显示的文本,此属性默认为 nil。为这个属性赋值也会用没有任何固有样式属性的相同的文本替换attributedText属性的值,并使用标签样式相关属性设置标签样式。
@property(null_resettable, nonatomic,strong) UIFont *font;
属性描述 :标签显示文本的字体,改属性默认值为系统字体(大小为17逻辑像素(points),即[UIFont systemFontOfSize:17]),将此属性设置为nil会导致它被重置为默认值。如果attributedText属性设置了富文本且富文本设置了字体,如果在为attributedText属性设置富文本之前设置此属性,不会影响富文本设置的字体,如果在为attributedText属性设置富文本之后设置此属性,则该属性设置的字体值会应用于attributedText属性中的整个字符串。 如果只想将字体应用于富文本的一部分,请使用所需的样式信息创建一个新的富文本字符串,并将其与UILabel关联。
@property(null_resettable, nonatomic,strong) UIColor *textColor;
属性描述 :标签显示文本的颜色,默认为系统的标签颜色(会动态适应暗模式的变化),将此属性设置为nil会导致它被重置为默认值。如果attributedText属性设置了富文本且富文本设置了颜色,如果在为attributedText属性设置富文本之前设置此属性,不会影响富文本设置的颜色,如果在为attributedText属性设置富文本之后设置此属性,则该属性设置的颜色值会应用于attributedText属性中的整个字符串。 如果只想将颜色应用于富文本的一部分,请使用所需的样式信息创建一个新的富文本字符串,并将其与UILabel关联。
@property(nullable, nonatomic,strong) UIColor *shadowColor;
属性描述 :标签显示文本的阴影颜色,默认为nil(无阴影)。
@property(nonatomic) CGSize shadowOffset;
属性描述 :标签显示文本的阴影偏移量,shadowColor不为nil时才能使此属性生效,默认偏移大小为 (0, -1),表示文本上方有一个阴影。
@property(nonatomic) NSTextAlignment textAlignment;
属性描述 :标签显示文本的对齐方式,默认为NSTextAlignmentNatural(在ios9之前,默认为NSTextAlignmentLeft)。如果attributedText属性设置了富文本且富文本设置了对齐方式,如果在为attributedText属性设置富文本之前设置此属性,不会影响富文本设置的对齐方式,如果在为attributedText属性设置富文本之后设置此属性,则该属性设置的对齐方式值会应用于attributedText属性中的整个字符串。 如果只想将对齐方式应用于富文本的一部分,请使用所需的样式信息创建一个新的富文本字符串,并将其与UILabel关联。
@property(nonatomic) NSLineBreakMode lineBreakMode;
属性描述 :标签显示文本过长时的显示格式,默认是NSLineBreakByTruncatingTail,用于单行和多行文本。
- NSLineBreakMode枚举值如下:
typedef NS_ENUM(NSInteger, NSLineBreakMode) {
// 以单词为显示单位显示,后面部分省略不显示。
NSLineBreakByWordWrapping = 0,
// 以字符为显示单位显示,后面部分省略不显示。
NSLineBreakByCharWrapping,
// 剪切与文本宽度相同的内容长度,后半部分被删除。
NSLineBreakByClipping,
// 前面部分文字以……方式省略,显示尾部文字内容。
NSLineBreakByTruncatingHead,
// 结尾部分的内容以……方式省略,显示头的文字内容。
NSLineBreakByTruncatingTail,
// 中间的内容以……方式省略,显示头尾的文字内容。
NSLineBreakByTruncatingMiddle
} NS_ENUM_AVAILABLE(10_0, 6_0);
@property(nullable, nonatomic,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0);
属性描述 :设置标签富文本字符串,默认为nil,为该属性指定新值也会用相同的文本替换text属性的值。
@property(nonatomic,getter=isHighlighted) BOOL highlighted;
属性描述 :标签是否突出显示,默认为NO。为了使标签突出显示,highlightTextColor属性必须包含一个非nil值。
@property(nullable, nonatomic,strong) UIColor *highlightedTextColor;
属性描述 :设置标签突出显示的文本颜色,默认为nil。
@property(nonatomic) NSInteger numberOfLines;
属性描述 :标签显示文本的最大行数,此属性的默认值为1。如果不想限制标签显示文本的最大行数,需要将此属性的值设置为0。如果使用此属性约标签显示文本的最大行数,则标签会根据lineBreakMode属性截断任何不适合最大行数和边界矩形内的文本。该属性还会影响sizeToFit方法调整标签大小。
@property(nonatomic,getter=isEnabled) BOOL enabled;
属性描述 :是否启用,默认为 YES。
将enabled设为NO,原本为红色文本的标签变为如下的样式,如果设置了shadowColor,shadowColor则不会收到影响:
//调整字体大小以适应宽度,默认为NO
@property(nonatomic) BOOL adjustsFontSizeToFitWidth;
//基线调整,默认为UIBaselineAdjustmentAlignBaselines
@property(nonatomic) UIBaselineAdjustment baselineAdjustment;
//最低比例因子,默认为 0.0
@property(nonatomic) CGFloat minimumScaleFactor NS_AVAILABLE_IOS(6_0);
- UIBaselineAdjustment枚举值如下:
typedef NS_ENUM(NSInteger, UIBaselineAdjustment) {
//根据原始基线将文本缩小到位置时使用
UIBaselineAdjustmentAlignBaselines = 0,
//基线调整对准中心
UIBaselineAdjustmentAlignCenters,
//不进行基线调整
UIBaselineAdjustmentNone,
};
属性描述 :这3个属性允许标签自动调整大小以适应一定的宽度,方法是将字体大小调整一个比例因子>=最小比例因子,并指定文本基线在需要缩小字体时的移动方式。
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectZero];
label.text = @"测试标签";
label.textColor = [UIColor redColor];
label.font = [UIFont systemFontOfSize:18.0];
label.adjustsFontSizeToFitWidth = YES;
label.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
label.minimumScaleFactor = 0.0;
label.enabled = YES;
[self.view addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_offset(CGSizeMake(20, 50));
}];
}
@property(nonatomic) BOOL allowsDefaultTighteningForTruncation NS_AVAILABLE_IOS(9_0);
属性描述 :一个布尔值,默认值是NO,确定标签在截断文本之前是否收紧文本。当此属性的值为YES时,标签会在允许进行任何截断之前收紧文本的字符间间距。标签根据字体、当前行宽、换行方式等相关信息自动确定最大收紧量。这种自动收缩行为只适用于单行标签。
UILabel常用函数
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;
函数描述 :返回标签文本的绘图矩形。在需要系统执行其他文本布局计算之前更改标签的边界矩形的子类中覆盖此方法,使用numberOfLines参数中的值可以将返回矩形的高度限制为指定的文本行数。
如果之前调用了sizeToFit或sizeThatFits:方法,则系统可能会调用此方法。需要注意系统UITableViewCell对象中的标签具有基于单元格尺寸的大小,而不是请求的大小。
参数 :
bounds :标签的边界矩形。
numberOfLines : 标签使用的最大行数。
返回值 :标签文本的计算绘制矩形。
- (void)drawTextInRect:(CGRect)rect;
函数描述 :在指定的矩形中绘制标签的文本或其阴影,不要直接调用这个方法,如果要修改标签文本的默认绘制行为,请在子类中覆盖此方法。
当系统调用此方法时,当前图形上下文已经配置了默认的绘图环境和文本颜色。 在覆盖方法中,可以进一步配置当前上下文,然后调用super进行实际绘图,或者可以自己进行绘图,如果自定义渲染文本,不要调用super。
参数 :
rect :在其中绘制文本的矩形。
//
// CustomLabel.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef enum {
//垂直对齐居上
VerticalAlignmentTop = 0,
//垂直对齐居中
VerticalAlignmentMiddle,
//垂直对齐居下
VerticalAlignmentBottom
}VerticalAlignment;
@interface CustomLabel : UILabel
@property (nonatomic) VerticalAlignment verticalAlignment;
@end
NS_ASSUME_NONNULL_END
//
// CustomLabel.m
#import "CustomLabel.h"
@implementation CustomLabel
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.verticalAlignment = VerticalAlignmentMiddle;
}
return self;
}
- (void)setVerticalAlignment:(VerticalAlignment)verticalAlignment {
_verticalAlignment = verticalAlignment;
[self setNeedsLayout];
}
/// 返回标签文本的绘图矩形。
/// @param bounds 标签的边界矩形。
/// @param numberOfLines 用于标签的最大行数。
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
switch (self.verticalAlignment) {
case VerticalAlignmentTop:
textRect.origin.y = bounds.origin.y;
break;
case VerticalAlignmentBottom:
textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height;
break;
case VerticalAlignmentMiddle:
default:
textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2.0;
}
return textRect;
}
/// 在指定的矩形中绘制标签的文本或其阴影。
/// @param requestedRect 在其中绘制文本的矩形。
-(void)drawTextInRect:(CGRect)requestedRect {
CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
[super drawTextInRect:actualRect];
}
@end
居上:
居中:
居下:
处理UILabel时的问题记录
在处理程序界面时遇到bug要求到图片位置时自动换行,bug如图:
自动换行么,简单,随即设置了UILabel的numberOfLines = 0;
发现效果是这样的:
因为后台返回的数据格式类似这样:2019-06-12 00:00:00 ~ 2019-06-13 00:00:00,日期与时间中间是存在空格的。后来修改UILabel的lineBreakMode属性为NSLineBreakByCharWrapping,
效果如下:
这只是一种处理方式的尝试,未必能解决其他情景下的UILabel换行问题。