- iOS开发实战:从入门到上架App Store(第2版) (移动开发丛书)
- 张益珲
- 1708字
- 2020-11-28 14:56:43
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