Поместите UITextView
в другое представление контейнера (здесь выделите красный цвет) и установите constraints
просмотра контейнера, как показано ниже:
UITextView
в пределах containerview
будет иметь ограничение leading
trailing
top
bottom
, выровненное по containerview
(красный1) здесь.
, после чего вы должны взять выходную ссылку ограничения height
и bottom
контейнера: представление (см. изображение ниже).
После этого поместите фрагмент кода, показанный ниже, в метод viewDilLoad
...
Затем простозапишите два метода, чтобы контролировать остальные вещи.И Хола !ты чемпион!Вы сделали это.
//MARK: TextView delegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if(text == "\n") {
textView.resignFirstResponder()
return false
}
return true
}
func textViewDidChange(_ textView: UITextView) {
let fixedWidth = textView.frame.size.width
textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
var newFrame = textView.frame
newFrame = CGRect.init(x: newFrame.origin.x, y: newFrame.origin.y+newFrame.height-newSize.height, width: max(newSize.width, fixedWidth), height: newSize.height)
let newHeight = newFrame.size.height as CGFloat
Swift.print("height: %f",newHeight)
if newHeight > 40 && newHeight <= 105
{
chatBoxContainerViewHeightConstraint.constant = newHeight + 16
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
else if newHeight <= 40
{
chatBoxContainerViewHeightConstraint.constant = 56
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
}
@objc func keyboardWillChangeFrame(_ notification: NSNotification) {
if let userInfo = notification.userInfo {
let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let endFrameY = endFrame?.origin.y ?? 0
let tabbarHeight = self.tabBarController?.tabBar.frame.size.height
if (endFrameY >= UIScreen.main.bounds.size.height) {
Swift.print("----< %f",endFrameY)
self.bottomViewBottomConstraint.constant = 0
} else {
Swift.print("----> %f",endFrameY)
self.bottomViewBottomConstraint.constant = -((endFrame?.size.height)!-tabbarHeight! )
}
UIView.animate(withDuration: duration,
delay: TimeInterval(0),
options: animationCurve,
animations: { self.view.layoutIfNeeded() },
completion: nil)
}
}