Изменение / анимация MaximumNumberOfLines в UITextView? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть UITextView, и первоначально я хочу установить для него 4 строки, однако, когда пользователь нажимает кнопку «Читать далее», я хочу развернуть ее до полной длины, я предполагаю, что это либо путем получения *От 1003 * до 0 или до большого числа, скажем 30

Проблема в том, что после изменения строк с 4 на 0 (или 30) он не ретранслирует uitextview наего полная высота, кажется, ограничена 4 строками.

Я вызываю self.setNeedsLayout() и self.layoutIfNeeded(), чтобы вызвать макет, но он не вернется к своей полной высоте

У меня также естьпопробовал позвонить descriptionTextView.invalidateIntrinsicContentSize() после изменения количества строк без удачи

Что я здесь не так делаю?

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Возможно, вы неправильно делаете пару вещей ...

Во-первых, чтобы «автоматически изменить» высоту textView, у него должна быть прокрутка отключена .

Во-вторых, он не может иметь фиксированную высоту (ни ограничение по высоте, ни ограничение сверху и снизу).


Редактировать: Для пояснения ... Когда я говорю "нет нижнего ограничения", это не означает, что не может иметь нижнее ограничение. Скорее, нижнее ограничение не может быть установлено таким образом, чтобы препятствовал изменению высоты textView. Так, например, если textView находится в ячейке табличного представления, с нижним ограничением все в порядке, если ячейка спроектирована и используется таким образом, что высота textView контролирует (или способствует) высоту ячейки. .


Это простой пример, который переключает textView между 4 строками и нулевыми строками (показывая все текстовое содержимое):

class ExpandingTextViewViewController: UIViewController {

    let descriptionTextView: UITextView = {
        let v = UITextView()
        v.translatesAutoresizingMaskIntoConstraints = false
        // disable scrolling
        v.isScrollEnabled = false
        // give it a background color to make it easy to see the frame
        v.backgroundColor = .yellow
        return v
    }()

    let theButton: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .red
        v.setTitle("Toggle TextView", for: .normal)
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(theButton)
        view.addSubview(descriptionTextView)

        NSLayoutConstraint.activate([

            // button 40-pts from the top, centered horizontally
            theButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40.0),
            theButton.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),

            // textView 40-pts from bottom of button, 20-pts padding left and right
            //  NO height or bottom constraint
            descriptionTextView.topAnchor.constraint(equalTo: theButton.bottomAnchor, constant: 40.0),
            descriptionTextView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20.0),
            descriptionTextView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20.0),

            ])

        // give the textView some sample text
        descriptionTextView.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."

        // start with max number of lines set to 4
        descriptionTextView.textContainer.maximumNumberOfLines = 4

        theButton.addTarget(self, action: #selector(toggleTextView), for: .touchUpInside)

    }

    @objc func toggleTextView() -> Void {
        // toggle max number of lines between 4 and Zero
        descriptionTextView.textContainer.maximumNumberOfLines =
            (descriptionTextView.textContainer.maximumNumberOfLines == 4) ? 0 : 4
        // tell auto-layout abour the change
        descriptionTextView.invalidateIntrinsicContentSize()
    }

}

Результаты:

enter image description here

enter image description here

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

0 голосов
/ 12 июня 2019

Изменение количества строк на вашем textField влияет только на количество строк, которые ваш textField может использовать для отображения своего текста. Установка maximumNumberOfLines в 0 помещает текст в одну «строку» и обрезает его в конце его width, так что в действительности он не скрывает оставшийся текст.

Вместо того, чтобы изменять maximumNumberOfLines, лучше всего, чтобы текст заполнял естественное для него количество строк, и вместо этого анимировал UITextView heightAnchor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...