簡體   English   中英

在有框架問題的iOS中使用Swift制作自定義UILabel

[英]Making custom UILabel using swift in iOS having frame issues

我想使用swift創建自己的自定義UILabel,並且在使用init超級類時遇到框架問題。

這是我以前的經歷:

 let label = UILabel()

我以前基本上使用普通的UILabel。 首先,我的問題是,如何為此設定框架? 因為當我進入UILabel類時,它繼承自UIView,而UIView中的init方法采用一個框架。 那么如何創建此框架?

然后,這將我帶到我自己的自定義UILabel,我將其稱為TimeLabel。 這是它的實現:

class TimeLabel: UILabel {

    var clientName: String?
    var time: Time?

    init(name:String, time:Time) {
        self.clientName = name
        self.time = time
        super.init(frame: ??)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(frame:??)
    }
}

現在,這鏈接到第一個問題,我應該從哪里得到這個框架? 打電話給UILabel之前我沒有提供框架嗎? 我該如何處理?

這是您設置課程的方式:

記住要使用“便利”關鍵字。 通過使用便捷關鍵字,您無需添加UIVIew繼承的NSCoding協議。

class TimeLabel: UILabel {
    var clientName: String?
    var time: Time?

    // Use convenience keyword
    convenience init(name: String?, time: Time?) {
        self.init(frame: CGRect.zero)
        self.clientName = name
        self.time = time
    }
}

這是您根據內容獲取寬度和高度的方式

1.從單行標簽獲取寬度和高度

let timeLabel = TimeLabel(name: "John", time: sometime)
let size = timeLabel.sizeThatFits(CGSize.zero)

// This is the label calculated width and height
let width = size.width
let height = size.height

2.從多行標簽獲取寬度和高度

let timeLabel = TimeLabel(name: "John", time: sometime)

// To active multiline features, set numberOfLines to 0
timeLabel.numberOfLines = 0

let size = timeLabel.sizeThatFits(CGSize(width: putYourWidthHere, height: 0))

// This is the label calculated width and height
let width = size.width
let height = size.height

1)這就是我如何用框架初始化標簽

UILabel(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100.0 , height: 60.0)))

2)在自定義類中,盡管您可以執行此操作...

override init(frame: CGRect) {
super.init(frame: frame)
}

兩者都是分開的事情..我說對了嗎? 如有疑問請提問

一個參考

如果您不想在初始化時提供框架,請使用CGRect.zero

class TimeLabel: UILabel {
    var clientName: String?
    var time: Time?

    init(name:String, time:Time) {
        self.clientName = name
        self.time = time
        super.init(frame: CGRect.zero)
    }
}

您隨時可以在以后更改框架,或使用自動布局,然后將為您設置框架。

您的init(coder:)方法應僅解碼子類的屬性(如果需要),並將所有其他內容留給超類:

    required init?(coder aDecoder: NSCoder) {
        // decode clientName and time if you want
        super.init(coder: aDecoder)
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM