Objective-C的UILabel学习笔记

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则不会收到影响:

屏幕快照 2019-10-25 下午9.37.05.png
//调整字体大小以适应宽度,默认为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个属性允许标签自动调整大小以适应一定的宽度,方法是将字体大小调整一个比例因子>=最小比例因子,并指定文本基线在需要缩小字体时的移动方式。

\color{red}{标签文本自动调整大小以适应宽度测试代码:}

- (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));
    }];  
}
屏幕快照 2019-10-25 下午9.35.10.png
@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 :在其中绘制文本的矩形。

\color{red}{实现文本居上与居下的标签:}

//
//  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

居上:

屏幕快照 2019-08-07 下午8.50.52.png

居中:

屏幕快照 2019-08-07 下午8.58.46.png

居下:

屏幕快照 2019-08-07 下午9.04.57.png
处理UILabel时的问题记录

在处理程序界面时遇到bug要求到图片位置时自动换行,bug如图:

屏幕快照 2019-07-02 下午5.05.22.png

自动换行么,简单,随即设置了UILabel的numberOfLines = 0;
发现效果是这样的:

屏幕快照 2019-07-02 下午5.09.15.png

因为后台返回的数据格式类似这样:2019-06-12 00:00:00 ~ 2019-06-13 00:00:00,日期与时间中间是存在空格的。后来修改UILabel的lineBreakMode属性为NSLineBreakByCharWrapping,

效果如下:

屏幕快照 2019-07-02 下午5.23.09.png

这只是一种处理方式的尝试,未必能解决其他情景下的UILabel换行问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容