UILabel sizeToFit не считает длинный перенос строки - PullRequest
0 голосов
/ 03 мая 2020

Я попытался использовать sizeToFit, чтобы высота UILabel динамически изменялась как текст. Тем не менее, он считается "\ n", но, кажется, не считая перенос длинных слов в новую строку. Текст в конечном итоге будет переполнен.

В коде я сначала добавляю scrollview и stackview и создаю две функции для настройки их ограничения и цвета фона. Когда все было сделано, я попытался написать for-l oop, создав UIView с UILabel и используя

label.numberOfLines = 0

label.lineBreakMode = NSLineBreakMode. byWordWrapping

чтобы обернуть длинное слово. И я создаю for-l oop, чтобы получить более длинную строку.

label.text = "This is first line and it is very very long long long."
            for _ in 0...i{
                label.text! += "\n"+"This is new added line and is also very very long long long"
            }

Исходный код, как показано ниже, при необходимости.

Я не могу понять, какой шаг идет не так, как надо .

Спасибо за помощь.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor(red: 213/255, green: 165/255, blue: 68/255, alpha: 1)
        //scroll and stack view adjust
        let scrollView = UIScrollView()
        scrollViewAdjust(scrollView: scrollView)
        let stackView = UIStackView()
        stackViewAdjust(stackView: stackView, scrollView: scrollView)

        for i in 0..<5{
            let newView = UIView()
            stackView.addArrangedSubview(newView)
            newView.translatesAutoresizingMaskIntoConstraints = false
            newView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
            newView.layer.cornerRadius = 5
            let label = UILabel()
            newView.addSubview(label)
            label.translatesAutoresizingMaskIntoConstraints = false
            label.numberOfLines = 0
            label.lineBreakMode = NSLineBreakMode.byWordWrapping
            label.text = "This is first line and it is very very long long long."
            for _ in 0...i{
                label.text! += "\n"+"This is new added line and is also very very long long long"
            }
            label.topAnchor.constraint(equalTo: newView.topAnchor).isActive = true
            label.leadingAnchor.constraint(equalTo: newView.leadingAnchor, constant: 3).isActive = true
            label.trailingAnchor.constraint(equalTo: newView.trailingAnchor, constant: 3).isActive = true
            label.sizeToFit()
            print(label.frame.size.height)
            newView.heightAnchor.constraint(equalToConstant: label.frame.size.height).isActive = true
        }


    }

    //functions
    func scrollViewAdjust(scrollView: UIScrollView){
        view.addSubview(scrollView)
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 6).isActive = true
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    }

    func stackViewAdjust(stackView:UIStackView, scrollView:UIScrollView){
        stackView.axis = .vertical
        stackView.spacing = 20
        scrollView.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor).isActive = true
        stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 0.8).isActive = true
        stackView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 15).isActive = true
        stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вы должны установить ширину метки при ее создании. Я обновил для l oop из вашего примера, чтобы он соответствовал ширине вашего stackView:

    for i in 0..<5{
        let newView = UIView()
        stackView.addArrangedSubview(newView)
        newView.translatesAutoresizingMaskIntoConstraints = false
        newView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
        newView.layer.cornerRadius = 5
        stackView.layoutIfNeeded() // needed to force update the layout before getting the width
        let width = stackView.frame.width
        print(width)
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        newView.addSubview(label)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.numberOfLines = 0
        label.textColor = UIColor.black
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.text = "This is \(i) line and it is very very long long long."
        for ii in 0...i{
            label.text! += "\n"+"This is new added \(ii) line and is also very very long long long"
        }
        label.sizeToFit()
        label.topAnchor.constraint(equalTo: newView.topAnchor).isActive = true
        label.leadingAnchor.constraint(equalTo: newView.leadingAnchor, constant: 3).isActive = true
        label.trailingAnchor.constraint(equalTo: newView.trailingAnchor, constant: 3).isActive = true
        label.bottomAnchor.constraint(equalTo: newView.bottomAnchor).isActive = true
        print(label.frame.size.height)
        newView.heightAnchor.constraint(equalToConstant: label.frame.size.height).isActive = true
    }

Хотя это работает и выполняет прокрутку, вы действительно должны использовать UICollectionView для пользовательских UICollectionViewCell для обработки прокрутки следующим образом.

0 голосов
/ 03 мая 2020

Ваше ограничение трейлинга отсутствует. правильно

label.trailingAnchor.constraint(equalTo: newView.trailingAnchor, constant: 3).isActive = true

выходит из newView ... установите его так, чтобы дать 3 очка заполнения

label.trailingAnchor.constraint(equalTo: newView.trailingAnchor, constant: -3).isActive = true
...