UILable 是一個(gè)只讀的文本視圖,使用這個(gè)類繪制單行或者多行的靜態(tài)文本。你可以將 UILable 作為你界面的一部分。UILable 提供了簡單文本和復(fù)合樣式文本的支持。你能夠控制文本的外觀,比如文本是否有陰影是否高亮。如果需要,你可以通過子類進(jìn)行深度的定制。
UILable 的默認(rèn)的內(nèi)容模式是 重繪,在這個(gè)模式下,每次 lable 的 bounds 發(fā)生改變的時(shí)候就會(huì)對 Lable 的內(nèi)容進(jìn)行重新繪制。(通過觸發(fā) setNeedsDisplay() 方法進(jìn)行重繪)你可以改變這個(gè)模式,通過修改繼承過來的 contentMode 屬性。
lable 對象是默認(rèn)忽略用戶事件并切除子 view 。 如果你想在自定義的子類中控制用戶事件,你必須明確的修改 lable 的 isUserInteractionEnabled 屬性值為 ture。如果你需去擴(kuò)展 lable 的 bounds 的區(qū)域,你必須修改 clipsToBounds 屬性的值為 false
**注意點(diǎn): **
- UILable 默認(rèn)是不能響應(yīng)用戶事件, 只用 isUserInteractionEnabled = ture 的時(shí)候可以。
- 超出 UILable 部分的內(nèi)容默認(rèn)情況下是被切除的。 (clipsToBounds = ture)
- UILable 默認(rèn)情況下只能顯示單行文字,只用在 numberOfLines = 0 的時(shí)候才顯示多行文本
1. 簡單文本的顯示
let lable = UILabel()
lable.text = "我是一個(gè)文本"
lable.frame = CGRect(x: 10, y: 74, width: 200, height: 50)
view.addSubview(lable)

2. 文本的換行模式
public enum NSLineBreakMode : Int {
case byWordWrapping // Wrap at word boundaries, default
case byCharWrapping // Wrap at character boundaries
case byClipping // Simply clip
case byTruncatingHead // Truncate at head of line: "...wxyz"
case byTruncatingTail // Truncate at tail of line: "abcd..."
case byTruncatingMiddle // Truncate middle of line: "ab...yz"
}
默認(rèn)的換行模式 NSLineBreakByTruncatingTail
public var lineBreakMode: NSLineBreakMode
// default is NSLineBreakByTruncatingTail. used for single and multiple lines of text

3. 陰影設(shè)置
// 設(shè)置陰影的顏色
lable.shadowColor = UIColor.red()
// 設(shè)置了陰影的偏移
lable.shadowOffset = CGSize(width: 10, height: 10)
width : 表示左右偏移。 + 向右,-向左
height: 表示上下偏移。 + 向上,- 向下

4. isEnabled
表示一個(gè)文本是否可用。 只決定了 text 如何繪制。
lable.isEnabled = false
文本默認(rèn)會(huì)變成灰色

5. 文本的高亮
// lable.isEnabled = false // 這個(gè)屬性會(huì)影響文本高亮
lable.highlightedTextColor = UIColor.red() // 這個(gè)值只會(huì)在 isHighlighted = true 的時(shí)候自動(dòng)顯示
lable.isHighlighted = true // 文本是否進(jìn)行高亮
/*
Button 中 的 lable 在用戶進(jìn)行按壓操作的時(shí)候 。 text 會(huì)進(jìn)入高亮狀態(tài)。
*/

6. lable 自帶 API 文本尺寸的處理
**文本 fit矩形區(qū)域 去調(diào)整字體 **
public var adjustsFontSizeToFitWidth: Bool // default is NO
這個(gè)屬性是表明,是否調(diào)整 lable 字體的大小去適應(yīng)給定的 矩形范圍。
通常情況下,lable 的文本繪制會(huì)按照 font 指定的進(jìn)行繪制。 如果 adjustsFontSizeToFitWidth 設(shè)置為 true , 無論怎樣,只要 lable 的文本超過 lable 的矩形范圍,這個(gè) lable 就會(huì)調(diào)整字體的大小去適應(yīng)矩形區(qū)域。直到達(dá)到最小字體。在 iOS6 之前的版本中只用 numberOfLines 為 1 的時(shí)候才是有效的。
如果你 設(shè)置 了 adjustsFontSizeToFitWidth = true ,也應(yīng)該同時(shí)設(shè)置 minimumFontSize 屬性。
self.lable = UILabel()
self.lable!.frame = CGRect(x: 10, y: 75, width: 100, height: 100)
// 設(shè)置背景顏色主要是為了看清楚 lable 的范圍
lable?.backgroundColor = UIColor.gray()
// 讓文本多行顯示
lable?.numberOfLines = 0
lable?.adjustsFontSizeToFitWidth = true
lable?.minimumScaleFactor = 0.5 // minimumFontSize 是等效的
view.addSubview(lable!)

允許由于截?cái)嗟脑蜻M(jìn)行默認(rèn)的收縮處理
public var adjustsFontSizeToFitWidth: Bool // default is NO
默認(rèn)值為 false
在設(shè)置為 true 的時(shí)候,文本在進(jìn)行截?cái)嘀皶?huì)收縮字符空間。
這個(gè)最大的收縮量有字體,行寬,換行模式,和另一些相關(guān)的信息決定。
(測試的效果不是太明顯)
基準(zhǔn)線調(diào)整
public var baselineAdjustment: UIBaselineAdjustment // default is UIBaselineAdjustmentAlignBaselines
這個(gè)屬性 只有 numberOfLines = 1 的時(shí)候才有效果
(測試的效果不是很明顯)
adjustsFontSizeToFitWidth = true ,text 在文字在進(jìn)行縮放的時(shí)候調(diào)整文本的基準(zhǔn)線。
** 文本行數(shù)的處理 **
public var numberOfLines: Int
這個(gè)是用來控制 文本 矩形區(qū)域中能夠顯示的最大行數(shù)。
當(dāng) numberOfLines = 0 的時(shí)候表示沒有行數(shù)限制。
當(dāng)最大行數(shù)顯示的內(nèi)容超過 文本矩形區(qū)域顯示的范圍,不能顯示后就以換行模式進(jìn)行處理。
當(dāng) lable 調(diào)用 sizeToFit() 方法后,numberOfLines 的值就會(huì)進(jìn)行計(jì)算并進(jìn)行存儲(chǔ)。
7. 文本繪制的處理
/*
子類進(jìn)重載:
1. 想要在完成一些計(jì)算之前去改變文本的矩形區(qū)域, 使用 返回值可以現(xiàn)在文本的高度
這個(gè)方法是在調(diào)用 sizeToFit() 或者 sizeThatFits(_:) 之前進(jìn)行調(diào)用。
*/
public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect
// 需要修改默認(rèn)的文本繪制行為的時(shí)候進(jìn)行重載
/*
Lable 根據(jù)默認(rèn)的圖形上下文環(huán)境進(jìn)行配置后會(huì)調(diào)用這個(gè)方法。
重載:
自己進(jìn)行圖形上下配置,調(diào)用父類進(jìn)行真實(shí)的繪制行為,或者進(jìn)行一些自己的繪制行為。
如果進(jìn)行自行渲染文本就不需要調(diào)用父類
*/
public func drawText(in rect: CGRect)
這兩個(gè)方法都是用來給子類進(jìn)行重載操作的。
8. 文本 size 的計(jì)算
**1. 單行文本的計(jì)算 **
public func size(attributes attrs: [String : AnyObject]? = [:]) -> CGSize
// 1. 單行文本計(jì)算
let str = "1234567890"
let label = UILabel()
self.label = label
label.backgroundColor = UIColor.red()
label.textColor = UIColor.white()
label.text = str
// 根據(jù) label 的屬性來計(jì)算文本的尺寸
let size = (str as NSString).size(attributes: [NSFontAttributeName : label.font])
// 默認(rèn)情況下,這種方式和上一種方式一樣的效果
// let size = (str as NSString).size(attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 17)])
print(size)
label.frame = CGRect(x: 10, y: 74, width: size.width, height: size.height)
view.addSubview(label)

這種計(jì)算的 size 和 label 是否是 多行沒有關(guān)系。
動(dòng)態(tài)計(jì)算文本
var label: UILabel?
override func viewDidLoad() {
super.viewDidLoad()
// 1. 單行文本計(jì)算
let str = "1234567890"
let label = UILabel()
self.label = label
label.backgroundColor = UIColor.red()
label.textColor = UIColor.white()
label.text = str
label.numberOfLines = 0
// 根據(jù) label 的屬性來計(jì)算文本的尺寸
let size = (str as NSString).size(attributes: [NSFontAttributeName : label.font])
// 默認(rèn)情況下,這種方式和上一種方式一樣的效果
// let size = (str as NSString).size(attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 17)])
print(size)
label.frame = CGRect(x: 10, y: 74, width: size.width, height: size.height)
view.addSubview(label)
// 輸入框
let textF = UITextField()
textF.borderStyle = .roundedRect
textF.frame = CGRect(x: 10, y: view.frame.size.height - 50, width: view.frame.size.width - 20, height: 44)
textF.addTarget(self, action: #selector(textChange), for: .editingChanged)
view.addSubview(textF)
}
func textChange(sender: UITextField) {
// 設(shè)置 字符串
self.label!.text = sender.text
// 計(jì)算字符串大小
let size = (sender.text! as NSString).size(attributes: [NSFontAttributeName : self.label!.font])
// 設(shè)置字符串 frame
label!.frame = CGRect(x: 10, y: 74, width: size.width, height: size.height)
}

**2. 多行文本的計(jì)算 **
public func boundingRect(with size: CGSize,
options: NSStringDrawingOptions = [],
attributes: [String : AnyObject]? = [:],
context: NSStringDrawingContext?) -> CGRect
// 字符串繪制選項(xiàng)
public struct NSStringDrawingOptions : OptionSet {
public init(rawValue: Int)
// 繪制文本時(shí)使用 line fragement origin 而不是 baseline origin
public static var usesLineFragmentOrigin: NSStringDrawingOptions { get }
// 計(jì)算行高時(shí)使用行距。(譯者注:字體大小 + 行間距=行距)
public static var usesFontLeading: NSStringDrawingOptions { get }
// 計(jì)算布局時(shí)使用圖元字形(而不是印刷字體)。
public static var usesDeviceMetrics: NSStringDrawingOptions { get }
@available(iOS 6.0, *)
// 如果文本內(nèi)容超出指定的矩形限制,文本將被截去并在最后一個(gè)字符后加上省略號。
// 如果沒有指定NSStringDrawingUsesLineFragmentOrigin選項(xiàng),則該選項(xiàng)被忽略
public static var truncatesLastVisibleLine: NSStringDrawingOptions { get }
}
Attributes 是文本字體的屬性:該參數(shù)要設(shè)置字體的大小。
Context 是上下文對象,用于包含信息:如何調(diào)整字間距以及縮放。最終,該對象包含的信息將用于文本繪制。該參數(shù)可為 nil。
var label: UILabel?
override func viewDidLoad() {
super.viewDidLoad()
// 1. 單行文本計(jì)算
let str = "1234567890"
let label = UILabel()
self.label = label
label.backgroundColor = UIColor.red()
label.textColor = UIColor.white()
label.text = str
label.numberOfLines = 0
let width = view.frame.size.width - 20
let size = (str as NSString).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 17)], context: nil)
print(size)
label.frame = CGRect(x: 10, y: 74, width: size.width, height: size.height)
view.addSubview(label)
// 輸入框
let textF = UITextField()
textF.borderStyle = .roundedRect
textF.frame = CGRect(x: 10, y: view.frame.size.height - 50, width: view.frame.size.width - 20, height: 44)
textF.addTarget(self, action: #selector(textChange), for: .editingChanged)
view.addSubview(textF)
}
func textChange(sender: UITextField) {
// 設(shè)置 字符串
self.label!.text = sender.text
// 限制的文本寬度
let width = view.frame.size.width - 20
// 計(jì)算字符串大小
let size = ((self.label?.text)! as NSString).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 17)], context: nil)
// 設(shè)置字符串 frame
label!.frame = CGRect(x: 10, y: 74, width: size.width, height: size.height)
}
