我有一个UITextView,当用户输入多行文本时会改变高度。我的问题是,当用户输入足够的行时,UITextView会被位于textview上方的UITableView所掩盖。当textview的高度增加时,有没有办法以编程方式移动tableview?
这就是改变textview的高度,它位于textViewDidChange函数中:
if (self.contentSize.height > self.frame.height && self.contentSize.height < 166){
self.frame.origin.y -= (self.contentSize.height - self.frame.height)
self.frame.size = self.contentSize
}else if (self.contentSize.height < self.frame.height){
self.frame.origin.y += self.frame.height - self.contentSize.height
self.frame.size = self.contentSize
}
答案 0 :(得分:1)
如果您使用的是故事板,只需使用NSLayoutConstraints即可轻松完成,您也可以在代码中执行此操作,但在stroyboard中会更容易。如果textview位于底部,则可以从其拖动到tablview并使用垂直间距。对于iMessage样式的文本视图,使用textview视图固定到VC视图底部并使用布局约束,并将其顶部固定到tableview的底部。您必须在VC中注册UIKeyBoardWillHide和UIKeyboardWillShow。然后实现一个像底部的方法。您可以在viewDidAppear中添加观察者,并在viewWillDisappear中删除它们。以下方法中的height变量是指我在textView的高度上设置的约束,bottomConstraint是我在storyboard中设置的textView的bottomConstraint的IBOutlet。
` func keyboardToggle(通知:NSNotification){
let info:AnyObject = notification.userInfo!
let keyboardHeight = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue().height
let duration = info[UIKeyboardAnimationDurationUserInfoKey] as Double
var height:CGFloat!
var botConst: CGFloat!
switch notification.name {
case UIKeyboardWillShowNotification:
height = textView.contentSize.height
botConst = keyboardHeight
case UIKeyboardWillHideNotification:
height = 40.0
botConst = 0.0
characterCountLabel.hidden = true
bottomConstraint.constant = botConst
view.layoutIfNeeded()
delegate.view.layoutIfNeeded()
UIView.animateWithDuration(duration, animations: { () -> Void in
self.view.layoutIfNeeded()
self.delegate.view.layoutIfNeeded()
})
`
答案 1 :(得分:0)
我最终采取了与上述答案略有不同的方法。我使用NSNotificationCenter发送文本已输入textview的通知,然后我更新了textview的大小并更新了tableview的y坐标。
这是更新textview和tableview的位置的函数:
func keyPressed(sender: NSNotification) {
if let text = textView{
if let messages = messageViews{
if (text.contentSize.height > text.frame.height){
messages.frame.origin.y -= (text.contentSize.height - text.frame.height)
text.frame.origin.y -= (text.contentSize.height - text.frame.height)
text.frame.size = text.contentSize
}else if(text.contentSize.height < text.frame.height){
messages.frame.origin.y += (text.frame.height - text.contentSize.height)
text.frame.origin.y += (text.frame.height - text.contentSize.height)
text.frame.size = text.contentSize
}
}
}
}