Размер этикетки не изменяется в контейнере, несмотря на несколько методов - PullRequest
0 голосов
/ 01 января 2019

У меня есть класс многократного использования, который я вызываю, когда хочу добавить исчезающий subView в другое представление.У меня есть расширение UILabel, чтобы определить, когда слишком много текста для текущего размера метки (это расширение работает), и в этом закрытии я пытаюсь расширить: contianerView(regView)'s высоту, высоту метки и меткуякорь высоты, так как метка была создана программно.Как вы уже догадались, ярлык не расширяется правильно.

Я пытался установить numberOfLines на 0;изменение рамки этикетки;используя .layoutSubviews;удаление, когда якорь высоты был изначально установлен, поэтому теперь он вызывается только при использовании метода просмотра с изменением размера.

Расширение метки:

extension UILabel {

var isTruncated: Bool {

    guard let labelText = text else {
        return false
    }

    let labelTextSize = (labelText as NSString).boundingRect(
        with: CGSize(width: frame.size.width, height: .greatestFiniteMagnitude),
        options: .usesLineFragmentOrigin,
        attributes: [.font: font],
        context: nil).size

    return labelTextSize.height > bounds.size.height
}
}

функция для добавления вида для повторного использования (большая частьв цикле while внизу):

    func addDisapearingView(toview: UIView, text: String, textColor: UIColor, colorView: UIColor, alpha: CGFloat, height: CGFloat){

    regView.backgroundColor = colorView
    regView.alpha = alpha
    toview.addSubview(regView)

    regView.translatesAutoresizingMaskIntoConstraints = false
    if #available(iOS 11.0, *) {
        let guide = toview.safeAreaLayoutGuide
        regView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
        regView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
        regView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
        UIView.animate(withDuration: 5.0) {
            self.regView.heightAnchor.constraint(equalToConstant: height).isActive = true
        }

    } else {
        NSLayoutConstraint(item: regView,
                           attribute: .top,
                           relatedBy: .equal,
                           toItem: toview, attribute: .top,
                           multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: regView,
                           attribute: .leading,
                           relatedBy: .equal, toItem: toview,
                           attribute: .leading,
                           multiplier: 1.0,
                           constant: 0).isActive = true
        NSLayoutConstraint(item: regView, attribute: .trailing,
                           relatedBy: .equal,
                           toItem: toview,
                           attribute: .trailing,
                           multiplier: 1.0,
                           constant: 0).isActive = true

        regView.heightAnchor.constraint(equalToConstant: height).isActive = true
    }

    let label = UILabel(frame: CGRect(x: regView.frame.origin.x, y: regView.frame.origin.y, width: regView.bounds.width, height: regView.bounds.height))
    label.numberOfLines = 0
    label.adjustsFontSizeToFitWidth = true
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.translatesAutoresizingMaskIntoConstraints = false
    label.center.x = newView.center.x
    label.center.y = newView.center.y
    label.textAlignment = .center
    label.text = text
    label.textColor = textColor
    regView.addSubview(label)
    if label.isTruncated {
        print("LABEL IS TRUNCATED")
    }
    //test if there is more text than the label has room for
    while label.isTruncated {
        print("printing while truncating in the wHiLE loop")
        regView.bounds.size.height += 5
        label.bounds.size.height += 5
        var currentLabelHeight = label.bounds.height
        let amt = currentLabelHeight + 5
        label.frame = CGRect(x: regView.frame.origin.x, y: regView.frame.origin.y, width: regView.bounds.width, height: CGFloat(amt))
        var heighT : CGFloat = height
        heighT += 5
        regView.heightAnchor.constraint(equalToConstant: heighT).isActive = true

    }
    regView.layoutSubviews()
    label.sizeToFit()
    //remove
    Timer.scheduledTimer(withTimeInterval: 2.8, repeats: false) { (action) in
        UIView.animate(withDuration: 2.8, animations: {
            self.regView.heightAnchor.constraint(equalToConstant: 0).isActive = true
            label.heightAnchor.constraint(equalToConstant: 0).isActive = true
        })
    }

}

Я кратко делал это раньше в storyboard, где мне приходилось расширять метку в другом представлении, когда текст был слишком длинным (на этот раз это былоработать!), и важной частью там было редактирование ограничения высоты, так что я думаю, что это может иметь какое-то отношение к изменению ограничения высоты.

Любая помощь будет принята с благодарностью!

ОТВЕТ:


Я задал еще один вопрос здесь: Программно созданная метка в представлении контейнера не будет расширяться для текста

она имеетздесь тот же код и все в вопросе, но ответ работает.

1 Ответ

0 голосов
/ 01 января 2019

Если я правильно понимаю, у вас есть ваш вид и метка, и вы хотите, чтобы ваш вид динамически изменял высоту, зависит от содержимого метки.Я предлагаю вам разбить эту задачу на куски и решить ее шаг за шагом.

1 - Возможно, вы захотите добавить тестовый объект UIView вместо метки с фиксированным размером.Когда вы сделаете это, вы увидите, расширяется ли родительский вид в зависимости от размера тестового представления.

2 - Если это так, вы готовы создать метку с нужной вам высотой.Все что вам нужно знать его шрифт, текст и ширину.Я думаю эта ссылка может вам помочь.Убедившись в правильности размера этикетки (вы можете распечатать ее), вы можете добавить его как любой другой объект UIView в родительское представление.

...