Подкласс UIView (Swift4) - пользовательский метод (setNumber) не работает должным образом - PullRequest
0 голосов
/ 28 мая 2018

Я создал подкласс UIView под названием UIBingoBall для отображения шара для бинго (см. Ниже).Для краткости я оставил инициалы, но класс работает как есть.Я могу создать его экземпляр, установить 3 свойства «myimage, myLetterLabel и myNumberLabel» и увидеть правильный шар для бинго.

Но - я пытаюсь добавить метод в класс с именем .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
}()

И,в случае необходимости, вот мой setupViews (), который я вызываю из init.

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

}

Заранее спасибо всем, кто может (и делает) попытаться помочь!

1 Ответ

0 голосов
/ 28 мая 2018

Я думаю, что проблема в шрифте

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 для размера шрифта метки, который навернякане предсказуемо

...