在 iOS 中使用 swift 制作自定义 UILabel 有框架问题
Making custom UILabel using swift in iOS having frame issues
我想使用 swift 创建我自己的自定义 UILabel 并且我 运行 在使用 init super class 时遇到框架问题 class。
这是我之前的:
let label = UILabel()
我以前基本都是用普通的UILabel。首先我的问题是,框架是如何设置的?因为当我进入 UILabel class 时,它继承自 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 之前没有提供框架?我该如何处理?
1) 这就是我用框架
初始化标签的方式
UILabel(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100.0 , height: 60.0)))
2) 自定义 class 虽然你可以这样做...
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)
}
这就是您 class 的设置方式:
记得使用"convenience"关键字。通过使用 convenience 关键字,您不需要添加 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
我想使用 swift 创建我自己的自定义 UILabel 并且我 运行 在使用 init super class 时遇到框架问题 class。
这是我之前的:
let label = UILabel()
我以前基本都是用普通的UILabel。首先我的问题是,框架是如何设置的?因为当我进入 UILabel class 时,它继承自 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 之前没有提供框架?我该如何处理?
1) 这就是我用框架
初始化标签的方式UILabel(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100.0 , height: 60.0)))
2) 自定义 class 虽然你可以这样做...
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)
}
这就是您 class 的设置方式:
记得使用"convenience"关键字。通过使用 convenience 关键字,您不需要添加 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