2.3 文本控件——UILabel

在任意一款应用中,随处可见各种各样的文字标签,Label(标签)是应用程序UI体系中最基础也是最简单的一个控件。顾名思义,其主要作用是在屏幕视图上显示一行或多行文本,类似于生活中的便条标签。在UIKit框架中,UILabel有很多可定制属性提供给开发者进行控件的自定义设置。

2.3.1 使用UILabel在屏幕上创建一个标签控件

在第1章中,通过storyboard文件很轻松地在视图上创建了显示Hello World的标签,这一小节我们使用代码实现同样的效果。打开Xcode开发工具,创建一个名为HelloWorldText的工程,在ViewController中的viewDidLoad方法中添加如下代码。

Swift语言版本:

            override func viewDidLoad() {
                super.viewDidLoad()
                let label = UILabel(frame: CGRect(x: 20, y: 100, width: 280, height: 30))
                label.text = "Hello World"
                self.view.addSubview(label)
            }

Objective-C语言版本:

        - (void)viewDidLoad {
            [super viewDidLoad];
            UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(20, 100, 280, 30)];
            label.text = @"Hello World";
            [self.view addSubview:label];
        }

在上面的代码中,Objective-C语言的initWithFrame方法和Swift语言的UILabel(frame:)构造方法是UILabel类中的初始化方法,该初始化方法中需要传入一个CGRect类型的结构体,这个结构体的参数决定在屏幕上创建UILabel控件的位置和尺寸,CGRect确定在iOS的UI系统中绘制的一个矩形区域。Objective-C代码中的CGRectMake()方法可以构造出一个CGRect结构体,其中的4个参数依次设置这个矩形区域的x坐标、y坐标、宽度和高度。

提示 在UIKit框架中,UI坐标系与生活中的数学坐标系略有不同,数据坐标系中横向为x轴,向右增大,纵向为y轴,向上增大,在UI坐标系中,横向为x轴,向右增大,纵向为y轴,向下增大,即原点在左上角。

UILabel类的text属性用于设置标签上的文字,必须设置为一个String(Objective-C代码中为NSString)类型的字符串值。在调用UIView类的addSubview方法后,将UILabel控件添加在当前的视图上,运行工程会看到如图2-3所示的效果。

图2-3 代码创建的UILabel控件

2.3.2 自定义标签控件的相关属性

在上面创建的HelloWorldText工程中,标签控件的样式是系统默认的模样,有时开发者需要更多元化的标签(如各种颜色、各种字体等), UILabel中有大量的属性提供给开发者进行自定义,代码示例如下。

Swift语言版本:

            override func viewDidLoad() {
                super.viewDidLoad()
                let label = UILabel(frame: CGRect(x: 20, y: 100, width: 280, height: 30))
                label.text = "Hello World"
                //设置背景颜色
                label.backgroundColor = UIColor.red
                //设置字体和字号
                label.font = UIFont.systemFont(ofSize: 23)
                //设置字体颜色
                label.textColor = UIColor.white
                //设置对齐模式
                label.textAlignment = .center
                //设置引用颜色
                label.shadowColor = UIColor.green
                //设置阴影偏移量
                label.shadowOffset = CGSize(width: 10, height: 10)
                self.view.addSubview(label)
            }

Objective-C语言版本:

        - (void)viewDidLoad {
            [super viewDidLoad];
            UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(20, 100, 280, 30)];
            label.text = @"Hello World";
            //设置背景颜色
            label.backgroundColor = [UIColor redColor];
            //设置字体和字号
            label.font = [UIFont systemFontOfSize:23];
            //设置字体颜色
            label.textColor = [UIColor whiteColor];
            //设置对齐模式
            label.textAlignment = NSTextAlignmentCenter;
            //设置阴影颜色
            label.shadowColor = [UIColor greenColor];
            //设置阴影的偏移量
            label.shadowOffset =CGSizeMake(10, 10);
            [self.view addSubview:label];
        }

backgroundColor属性设置了标签的背景颜色,实际上backgroundColor并非是UILabel特有的属性,很多继承UIView的子类都有这个属性。font属性设置UILabel控件上的字体相关属性;textColor属性设置UILabel控件上字体的颜色;TextAlignment属性设置UILabel控件上文字的对齐模式,默认是居中对齐。下面列举设置对齐模式使用的枚举值。

Swift语言版本:

        public enum NSTextAlignment : Int {
            case left        //局左对齐
            case center      //居中对齐
            case right       //居右对齐
        }

Objective-C语言版本:

        typedef NS_ENUM(NSInteger, NSTextAlignment) {
            NSTextAlignmentLeft      =0,    //居左对齐
            NSTextAlignmentCenter    =1,    //居中对齐
            NSTextAlignmentRight     =2,    //居右对齐
        };

shadowColor属性设置文字的阴影颜色,shadowOffset属性设置阴影的偏移量,即阴影与本体之间的偏移距离,这个属性要设置一个CGSize类型的结构体,CGSize中的两个参数分别代表横向偏移量和纵向偏移量。通过添加上面的代码,再次运行工程,效果如图2-4所示。

图2-4 自定义属性的UILabel

2.3.3 多行显示的UILabel与换行模式

通过initWithFrame初始化方法创建的UILabel控件会有一个宽度,如果文字长度超过了UILabel控件的宽度,默认的UILabel控件并不会换行,而是用省略号代替超出的部分。例如,将UILabel控件高度和text属性修改如下:

Swift语言版本:

                  let label = UILabel(frame: CGRect(x: 20, y: 100, width: 280, height: 30))
                  label.text = "Hello World, It is a good idea, So, what do you want to konw? "

Objective-C语言版本:

        UILabel * label = [[UILabel alloc]initWithFrame: CGRectMake(20, 100, 280, 100)];
        label.text = @"Hello World, It is a good idea, So, what do you want to konw? ";

提示 UILabel可以多行显示的前提是有足够的高度。

运行工程,会看到多出的文字被截断了,UILabel并没有换行,如图2-5所示。

图2-5 文字被截断的UILabel控件

默认的UILabel都是单行显示的,可以通过如下属性设置显示的行数:

    label.numberOfLines = 0;

将numberOfLines设置为一个整数值,代表支持多少行显示,如果设置为0,就代表无限换行,直到文字结束或到达UILabel控件的最底端为止。

UILabel中还有一个lineBreakMode属性,这个属性可以设置换行和截断模式,这个属性设置的值为NSLineBreakMode枚举,意义如下。

Swift语言版本:

        public enum NSLineBreakMode : Int {
            case byWordWrapping      //以单词为标准进行换行
            case byCharWrapping      //以字符为标准进行换行

            case byTruncatingHead     //头部截断
            case byTruncatingTail      //尾部截断
            case byTruncatingMiddle    //中间截断
      }

Objective-C语言版本:

      typedef NS_ENUM(NSInteger, NSLineBreakMode) {
          NSLineBreakByWordWrapping=0,                  //以单词为标准换行
          NSLineBreakByCharWrapping,                      //以字符为标准换行
          NSLineBreakByTruncatingHead,                     //头部截断
          NSLineBreakByTruncatingTail,                      //尾部截断
          NSLineBreakByTruncatingMiddle                    //中间截断
      } NS_ENUM_AVAILABLE(10_0, 6_0);

上面这个枚举值的设置效果如图2-6~图2-10所示。

图2-6 NSLineBreakBy WordWrapping

图2-7 NSLineBreakBy CharWrapping

图2-8 NSLineBreakBy TruncatingHead

图2-9 NSLineBreakBy TruncatingTail

图2-10 NSLineBreakBy TruncatingMiddle