文字与TextView swift中的自定义按钮重叠

时间:2019-02-25 16:11:59

标签: swift xcode uibutton uitextview

问题:我正在尝试为我的应用构建“评论”组件。我设法创建了一个文本视图,该文本视图会随着输入更多文本而扩展,并且还创建了一个文本视图内的按钮,该按钮将始终保持右上角。但是,当我写文本时,该文本将位于按钮下方,并且不可见。我想要的是文本不与按钮重叠,而只是远离按钮。

问题 我怎样才能做到这一点?

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

            }
        }

    }

}

UPDATE 问题与Sh_Khan当前答案:

在键入将与按钮重叠的最后一个字符之前

输入最后一个与按钮重叠的字符

enter image description here

1 个答案:

答案 0 :(得分:0)

您需要

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
  

在您的情况下,请勿将rightTLR与LTR逻辑混合使用,将rightAnchor与TrailingAnchor结合使用

     

如果注释文本字段的UI是在情节提要/ xib中构建的,则不要再次为其设置约束


要让textView的宽度= 80%,请将其删除

button.heightAnchor.constraint(equalToConstant: 50),

并添加

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