在iOS中使用swift制作自定义UILabel时会出现帧问题

时间:2016-06-19 15:00:08

标签: ios swift uilabel

我想使用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之前,我还没有提供一个框架?我该怎么处理这个?

3 个答案:

答案 0 :(得分:3)

这就是你设置班级的方法:

请记住使用"方便"关键词。通过使用便捷关键字,您不需要添加由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 :(得分:0)

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)
}

两者都是不同的东西..我帮你做对了吗?问一个问题是否有任何疑问

一个reference

答案 2 :(得分:0)

如果您不想在初始化时提供帧,请使用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)
    }