Изменяемый размер, а затем прокручиваемый UITextView, как Telegram - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу создать UITextView, который может одновременно изменять размер и прокручиваться, как в Telegram, Instagram или Whats App, которые позволяют UITextView увеличиваться до 8 строк, а затем вы можете прокрутить, если добавите в него больше текста возможность увеличить UITextView до 5 строк, но если они больше текста, я не вижу, так как свойство isScroll отключено

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

enter image description here

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

Вы можете достичь ожидаемого результата, выполнив следующие действия:

  1. Назначьте делегата textView вашему контроллеру
  2. По умолчанию отключить прокрутку textView
  3. В методе textViewDidChange измеряет высоту текста в соответствии с рамкой textView
  4. Присвойте соответствующую высоту текстовому просмотру и включите прокрутку, если содержание превышено (Максимальная высота в вашем случае - 8 строк)

Здесь ниже я прилагаю фрагмент кода, который может вам помочь:

let commentViewMinHeight: CGFloat = 45.0 
let commentViewMaxHeight: CGFloat = 120.0 //In your case it should be 8 lines

func textViewDidChange(_ textView: UITextView) {
     //Calculate text height 
     let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude))

     textViewHeightConstraint.constant = size.height.clamped(to: commentViewMinHeight...commentViewMaxHeight)

     if textView.contentSize.height < commentViewMaxHeight {
        textView.setContentOffset(CGPoint.zero, animated: false)
        if textView.isScrollEnabled {
           textView.isScrollEnabled = false
        }
     } else {
            if !textView.isScrollEnabled {
                textView.isScrollEnabled = true
            }
     }
} 

extension Comparable {
    func clamped(to limits: ClosedRange<Self>) -> Self {
        return min(max(self, limits.lowerBound), limits.upperBound)
    }
}
1 голос
/ 06 апреля 2019

Sagar ответ отличный, но я хочу немного его улучшить и добавить к нему анимацию:

необходимые вам шаги

  • получить выход к вашему textView
  • добавить ограничение высоты и получить к нему выход
  • внедрить textViewDidChange метод делегирования textView
  • в textViewDidChange
    • рассчитать новую высоту, используя textView.sizeThatFits(size)
    • установить постоянную ограничения высоты на новую высоту
    • [необязательно] анимировать изменение ограничения, чтобы сделать его более удобным для пользователя

вот пример

class ViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint!

    let maxTextHeight:CGFloat = 200
    let minTextHeight:CGFloat = 50

    let animationDuration:Double = 0.3

    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
        resizeTextViewToFitText()
    }

    func resizeTextViewToFitText() {
        let size = CGSize(width: textView.frame.width, height: .infinity)
        let expectedSize = textView.sizeThatFits(size)
        self.textViewHeightConstraint.constant = max(min(expectedSize.height, self.maxTextHeight), self.minTextHeight)
        self.textView.isScrollEnabled = expectedSize.height > self.maxTextHeight
        UIView.animate(withDuration: animationDuration) {
            self.view.layoutIfNeeded()
        }
    }
}

extension ViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
       resizeTextViewToFitText()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...