Текст переходит при автоматическом изменении размера textView в Swift - PullRequest
0 голосов
/ 26 июня 2018

, если в моем приложении есть простой messageView. в messageView это контейнер ввода с textView. Размер textView должен изменяться в зависимости от его содержимого.

Пока это работает, но каждый раз при переносе на следующую строку текст «прыгает» для первого символа, но перемещается со вторым символом. это выглядит как: enter image description here

enter image description here

enter image description here

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

private let container: UIView = {
    let view = UIView()

    view.backgroundColor = UIColor.white
    view.layer.cornerRadius = 20
    view.layer.masksToBounds = true
    view.layer.borderColor = UIColor(red:0.90, green:0.90, blue:0.90, alpha:1.0).cgColor
    view.layer.borderWidth = 0.5
    view.translatesAutoresizingMaskIntoConstraints = false

    return view
}()

private lazy var inputTV: UITextView = {
    let tv = UITextView()

    tv.translatesAutoresizingMaskIntoConstraints = false
    tv.font = UIFont(name: "OpenSans-Light", size: 16)
    tv.backgroundColor = .red
    tv.delegate = self
    tv.textContainer.lineBreakMode = .byWordWrapping

    return tv
}()

override internal init(frame: CGRect) {
    super.init(frame: CGRect.zero)

    translatesAutoresizingMaskIntoConstraints = false

    addSubview(container)
    container.addSubview(inputTV)

    container.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -16).isActive = true
    container.leftAnchor.constraint(equalTo: leftAnchor , constant: 16).isActive = true
    container.rightAnchor.constraint(equalTo: rightAnchor, constant: -16).isActive = true
    containerHeightAnchor = container.heightAnchor.constraint(equalToConstant: 40)
    containerHeightAnchor?.isActive = true 

    inputTV.leftAnchor.constraint(equalTo: uploadButton.rightAnchor).isActive = true
    inputTV.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true
    inputTV.rightAnchor.constraint(equalTo: sendButton.leftAnchor, constant: -5).isActive = true
    textViewHeightAnchor = inputTV.heightAnchor.constraint(equalTo: container.heightAnchor)
    textViewHeightAnchor?.isActive = true
}

internal func textViewDidChange(_ textView: UITextView) {
    let contentHeight = textView.contentSize.height
    containerHeightAnchor?.constant = max(contentHeight, 40)
    inputTV.frame.size.height = contentHeight
}

Надеюсь, кто-нибудь сможет помочь. С уважением

1 Ответ

0 голосов
/ 27 июня 2018

благодаря @DonMag я действительно удаляю heightAnchor из textView, и это работает для меня. Новый код выглядит следующим образом:

  • отключить прокрутку в textView (isScrollEnabled = false)

    private lazy var inputTV: UITextView = {
        let tv = UITextView()
    
        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.font = UIFont(name: "OpenSans-Light", size: 16)
        tv.delegate = self
        tv.isScrollEnabled = false
    
        return tv
    }()
    
  • удалить метку якоря ( нет inputTV.heightAnchor или my textViewHeightAnchor)

    override internal init(frame: CGRect) {
        super.init(frame: CGRect.zero)
    
        translatesAutoresizingMaskIntoConstraints = false
    
        addSubview(container)
        container.addSubview(inputTV)
    
        ...
    
        inputTV.leftAnchor.constraint(equalTo: uploadButton.rightAnchor).isActive = true
        inputTV.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true
        inputTV.rightAnchor.constraint(equalTo: sendButton.leftAnchor, constant: -5).isActive = true
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...