UILable

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): **

  1. UILable 默認(rèn)是不能響應(yīng)用戶事件, 只用 isUserInteractionEnabled = ture 的時(shí)候可以。
  2. 超出 UILable 部分的內(nèi)容默認(rèn)情況下是被切除的。 (clipsToBounds = ture)
  3. 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)
Snip20160726_1.png

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
Snip20160726_3.png

3. 陰影設(shè)置

// 設(shè)置陰影的顏色
lable.shadowColor = UIColor.red()

// 設(shè)置了陰影的偏移
lable.shadowOffset = CGSize(width: 10, height: 10)

width : 表示左右偏移。 + 向右,-向左
height: 表示上下偏移。 + 向上,- 向下

1.gif

4. isEnabled

表示一個(gè)文本是否可用。 只決定了 text 如何繪制。

 lable.isEnabled = false

文本默認(rèn)會(huì)變成灰色

Snip20160726_4.png

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)。
*/
Snip20160726_5.png

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!)
1.gif

允許由于截?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)
Snip20160727_8.png

這種計(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.gif

**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)
}
2.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容