Перекрытие текста с помощью пользовательской кнопки в TextView Swift - PullRequest
0 голосов
/ 25 февраля 2019

Проблема : Я пытаюсь создать компонент "комментарий" для моего приложения.Мне удалось создать текстовое представление, которое расширяется по мере ввода текста, а также я создал кнопку в текстовом виде, которая всегда будет оставаться в верхнем правом углу.Однако, когда я пишу текст, текст будет идти под кнопкой и не будет виден.Я хочу, чтобы текст не перекрывал кнопку, а просто держался подальше от кнопки.

Вопрос Как мне этого добиться?

enter image description here

Это мой код:

class ClickedOnPostViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

    var answersOf: Answer?


    @IBOutlet weak var tableView: UITableView!

    @IBOutlet weak var commentText: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()


        commentText.translatesAutoresizingMaskIntoConstraints = false
        [

            commentText.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            commentText.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            commentText.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            commentText.heightAnchor.constraint(equalToConstant: 43)
            ].forEach{ $0.isActive = true }


        commentText.addSubview(button)

        button.heightAnchor.constraint(equalToConstant: 50).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100).isActive = true
        button.topAnchor.constraint(equalTo: commentText.topAnchor).isActive = true
        button.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        view.bringSubview(toFront: button)


        commentText.delegate = self
        commentText.isScrollEnabled = false


        //Keyboard listeners

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)

        //  qNotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)





        // Do any additional setup after loading the view.
    }

    let button: UIButton = {
        let button = UIButton(type: .system)
        button.backgroundColor = .orange
        button.setTitle("Click Me", for: .normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()



    @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }

    @objc func keyboardWillHide(notification: NSNotification) {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y = 0
        }
    }



    @IBAction func refresh(_ sender: Any) {
    }


    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            commentText.resignFirstResponder()
            return false
        }
        return true
    }

    func textViewDidChange(_ textView: UITextView) {

        let size = CGSize(width: view.frame.width, height: .infinity)
        let estimatedSize = textView.sizeThatFits(size)

        textView.constraints.forEach { (constraints) in
            if constraints.firstAttribute == .height {

                constraints.constant = estimatedSize.height

            }
        }

    }

}

ОБНОВЛЕНИЕ проблемы сSh_Khan текущий ответ:

Перед вводом последнего символа, который будет перекрывать кнопку

Посленабрав последний символ, который будет перекрывать кнопку

enter image description here

1 Ответ

0 голосов
/ 25 февраля 2019

Вам нужно

commentText.translatesAutoresizingMaskIntoConstraints = false
button.translatesAutoresizingMaskIntoConstraints = false

view.addSubview(commentText)
view.addSubview(button)

NSLayoutConstraint.activate([ 
    commentText.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
    commentText.leadingAnchor.constraint(equalTo: view.leadingAnchor), 
    commentText.heightAnchor.constraint(equalToConstant: 43),
    button.heightAnchor.constraint(equalToConstant: 50),
    button.widthAnchor.constraint(equalToConstant: 100),
    button.topAnchor.constraint(equalTo: commentText.topAnchor),
    button.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    button.leadingAnchor.constraint(equalTo: commentText.trailingAnchor,constant:20)
])

commentText.delegate = self
commentText.isScrollEnabled = false

Не смешивайте RTL с логикой LTR в вашем случае, используя rightAnchor with trailingAnchor

Если пользовательский интерфейс текстового поля комментария встроен в раскадровку / xib, не устанавливайте для него ограничения снова


, чтобы ширина textView = 80%, удалите это

button.heightAnchor.constraint(equalToConstant: 50),

и добавьте это

commentText.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier:0.8,constant:-20),
...