UIView 子类 (Swift4) - 自定义方法 (setNumber) 未按预期工作
UIView subclass (Swift4) - custom method (setNumber) not working as expected
我创建了一个名为 UIBingoBall 的 UIView 的子class 来显示宾果球(见下文)。为了简洁起见,我省略了 init - 但 class 按原样工作。我可以实例化它,设置 3 个属性 "myimage, myLetterLabel and myNumberLabel" 并查看正确的宾果球。
但是 - 我正在尝试向 class 添加一个名为 .setNumber(ballNumber: Int) 的方法,它将适当地更改球的 3 个属性 - 一步完成 - 但是当我这样做时所以,它只是部分工作。它正在更改图像并正确显示图像。它正在更改标签文本 - 但它没有显示它。
如果我单独更改值(而不是调用函数),一切正常。
有人可以快速看一下并告诉我我做错了什么吗?或者解释为什么行为不同?
这是我想使用的函数:
func setNumber(ballNumber: Int) {if ballNumber > 75 || ballNumber < 1 { return }
let fontModifier = frame.height / 70
let ballLetter:Int = (ballNumber - 1) / 15
self.myLetterLabel.text = bingoLetterArray[ballLetter]
self.myNumberLabel.text = "\(ballNumber)"
self.myimage.image = bingoBallImageArray[ballLetter]
self.myNumberLabel.font = UIFont.systemFont(ofSize: fontModifier / 24, weight: .heavy)
self.myLetterLabel.font = UIFont.systemFont(ofSize: fontModifier / 8, weight: .heavy)
}
以下是 属性 定义:
class UIBingoBall: UIView {
private let bingoBallImageArray: [UIImage] = [#imageLiteral(resourceName: "BingoBlankB"),#imageLiteral(resourceName: "BingoBlankI"),#imageLiteral(resourceName: "BingoBlankN"),#imageLiteral(resourceName: "BingoBlankG"),#imageLiteral(resourceName: "BingoBlankO")]
private let bingoLetterArray: [String] = ["B", "I", "N", "G", "O"]
var myimage: UIImageView = {
let image = UIImageView()
image.image = #imageLiteral(resourceName: "BlankBallB")
image.contentMode = .scaleAspectFill
image.backgroundColor = .clear
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
var myLetterLabel: UILabel = {
let label = UILabel()
label.text = "B"
label.textColor = .blue
label.backgroundColor = .clear
label.textAlignment = .center
label.numberOfLines = 1
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.systemFont(ofSize: 8, weight: .bold)
return label
}()
var myNumberLabel: UILabel = {
let label = UILabel()
label.text = "1"
label.textColor = .blue
label.backgroundColor = .clear
label.textAlignment = .center
label.numberOfLines = 1
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.systemFont(ofSize: 24, weight: .heavy)
return label
}()
而且,如果有必要,这是我从 init 调用的 setupViews()。
func setupViews() {
addSubview(myimage)
addSubview(myLetterLabel)
addSubview(myNumberLabel)
myimage.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
myimage.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
myimage.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
myimage.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
myNumberLabel.centerYAnchor.constraint(equalTo: myimage.centerYAnchor, constant: 3).isActive = true
myNumberLabel.centerXAnchor.constraint(equalTo: myimage.centerXAnchor).isActive = true
myLetterLabel.topAnchor.constraint(equalTo: myNumberLabel.topAnchor,constant: -8).isActive = true
myLetterLabel.heightAnchor.constraint(equalToConstant: 10).isActive = true
myLetterLabel.centerXAnchor.constraint(equalTo: myimage.centerXAnchor).isActive = true
}
提前感谢任何可以(并且确实)尝试提供帮助的人!
我认为是字体问题
let fontModifier = frame.height / 70
self.myNumberLabel.font = UIFont.systemFont(ofSize: fontModifier / 24, weight: .heavy)
self.myLetterLabel.font = UIFont.systemFont(ofSize: fontModifier / 8, weight: .heavy)
它的值可以设置为 0 ,框架高度应该是 70*24 = 1680 的倍数,以便为标签的字体大小提供 1,这肯定是不可预测的
我创建了一个名为 UIBingoBall 的 UIView 的子class 来显示宾果球(见下文)。为了简洁起见,我省略了 init - 但 class 按原样工作。我可以实例化它,设置 3 个属性 "myimage, myLetterLabel and myNumberLabel" 并查看正确的宾果球。
但是 - 我正在尝试向 class 添加一个名为 .setNumber(ballNumber: Int) 的方法,它将适当地更改球的 3 个属性 - 一步完成 - 但是当我这样做时所以,它只是部分工作。它正在更改图像并正确显示图像。它正在更改标签文本 - 但它没有显示它。 如果我单独更改值(而不是调用函数),一切正常。
有人可以快速看一下并告诉我我做错了什么吗?或者解释为什么行为不同?
这是我想使用的函数:
func setNumber(ballNumber: Int) {if ballNumber > 75 || ballNumber < 1 { return }
let fontModifier = frame.height / 70
let ballLetter:Int = (ballNumber - 1) / 15
self.myLetterLabel.text = bingoLetterArray[ballLetter]
self.myNumberLabel.text = "\(ballNumber)"
self.myimage.image = bingoBallImageArray[ballLetter]
self.myNumberLabel.font = UIFont.systemFont(ofSize: fontModifier / 24, weight: .heavy)
self.myLetterLabel.font = UIFont.systemFont(ofSize: fontModifier / 8, weight: .heavy)
}
以下是 属性 定义:
class UIBingoBall: UIView {
private let bingoBallImageArray: [UIImage] = [#imageLiteral(resourceName: "BingoBlankB"),#imageLiteral(resourceName: "BingoBlankI"),#imageLiteral(resourceName: "BingoBlankN"),#imageLiteral(resourceName: "BingoBlankG"),#imageLiteral(resourceName: "BingoBlankO")]
private let bingoLetterArray: [String] = ["B", "I", "N", "G", "O"]
var myimage: UIImageView = {
let image = UIImageView()
image.image = #imageLiteral(resourceName: "BlankBallB")
image.contentMode = .scaleAspectFill
image.backgroundColor = .clear
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
var myLetterLabel: UILabel = {
let label = UILabel()
label.text = "B"
label.textColor = .blue
label.backgroundColor = .clear
label.textAlignment = .center
label.numberOfLines = 1
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.systemFont(ofSize: 8, weight: .bold)
return label
}()
var myNumberLabel: UILabel = {
let label = UILabel()
label.text = "1"
label.textColor = .blue
label.backgroundColor = .clear
label.textAlignment = .center
label.numberOfLines = 1
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.systemFont(ofSize: 24, weight: .heavy)
return label
}()
而且,如果有必要,这是我从 init 调用的 setupViews()。
func setupViews() {
addSubview(myimage)
addSubview(myLetterLabel)
addSubview(myNumberLabel)
myimage.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
myimage.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
myimage.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
myimage.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
myNumberLabel.centerYAnchor.constraint(equalTo: myimage.centerYAnchor, constant: 3).isActive = true
myNumberLabel.centerXAnchor.constraint(equalTo: myimage.centerXAnchor).isActive = true
myLetterLabel.topAnchor.constraint(equalTo: myNumberLabel.topAnchor,constant: -8).isActive = true
myLetterLabel.heightAnchor.constraint(equalToConstant: 10).isActive = true
myLetterLabel.centerXAnchor.constraint(equalTo: myimage.centerXAnchor).isActive = true
}
提前感谢任何可以(并且确实)尝试提供帮助的人!
我认为是字体问题
let fontModifier = frame.height / 70
self.myNumberLabel.font = UIFont.systemFont(ofSize: fontModifier / 24, weight: .heavy)
self.myLetterLabel.font = UIFont.systemFont(ofSize: fontModifier / 8, weight: .heavy)
它的值可以设置为 0 ,框架高度应该是 70*24 = 1680 的倍数,以便为标签的字体大小提供 1,这肯定是不可预测的