Label是開(kāi)發(fā)中相當(dāng)常見(jiàn)的一種UI控件赴邻。在iOS和tvOS中,這個(gè)控件都叫 UILabel 啡捶。有個(gè)很奇怪的點(diǎn)姥敛,在macOS中沒(méi)有這個(gè)控件,而是用一個(gè) NSTextField 來(lái)代替瞎暑。
按慣例彤敛,我們先簡(jiǎn)單寫(xiě)個(gè)demo對(duì)比一下這兩種寫(xiě)法:
import UIKit
// iOS or tvOS
let label = UILabel()
label.frame = CGRect(origin: .zero, size: CGSize(width: 100, height: 44))
label.text = "My awesome label"
label.backgroundColor = .white
label.sizeToFit()
這里沒(méi)啥好說(shuō)的,初始化label了赌,設(shè)frame墨榄、文案、顏色勿她,自適應(yīng)大小袄秩。一般開(kāi)發(fā)中,我們不用調(diào)用sizeToFit逢并,除非要精確的計(jì)算控件尺寸之剧、位置。我一般都根據(jù)控件優(yōu)先級(jí)設(shè)定約束來(lái)進(jìn)行布局筒狠。
說(shuō)完ios/tvOS平臺(tái)猪狈,我們進(jìn)入重點(diǎn),看看macOS下是如何實(shí)現(xiàn):
import Cocoa
// macOS
let label = NSTextField()
label.frame = CGRect(origin: .zero, size: CGSize(width: 100, height: 44))
label.stringValue = "My awesome label"
label.backgroundColor = .white
label.isBezeled = false
label.isEditable = false
label.sizeToFit()
我們首先創(chuàng)建一個(gè)NSTextField控件并且設(shè)定一個(gè)frame辩恼。然后添加text雇庙,NSTextField沒(méi)有像UILable一樣提供一個(gè)text屬性,而是要設(shè)定一個(gè)stringValue灶伊。stringValue屬性不是NSTextField中聲明的疆前,而是繼承自NSControl中。NSControl還有類(lèi)似的其他屬性聘萨,比如doubleValue竹椒, floatValue, intValue等等米辐。這個(gè)最好注意一下胸完,其他繼承自NSControl的類(lèi)也有這些屬性。如果需要從NSTextField中取text翘贮,也要從這個(gè)屬性來(lái)取赊窥。
接下來(lái)是設(shè)定背景顏色,如果你記得NSView實(shí)現(xiàn)的方式狸页,你會(huì)發(fā)現(xiàn)一丟丟細(xì)微的不同锨能。NSView中通過(guò)layer來(lái)設(shè)置CGColor類(lèi)型的顏色。NSTextField中直接聲明了一個(gè)backgroundColor屬性,類(lèi)型為NSColor址遇。并且在NSTextField中熄阻,通過(guò)layer設(shè)置背景顏色是無(wú)效的。
用sizeToFit方法是可以讓label展示倔约,但是和我們預(yù)想的有一絲絲的差異秃殉。如果我們不需要外面的框線(xiàn),我們可以設(shè)置isBezeled屬性為false跺株。最后記住复濒,想更像UILable而不是NSTextField,把isEditable屬性設(shè)為false乒省。
以上,Have Fun .