根据UITextView swift的大小上移子视图

时间:2015-02-01 04:55:17

标签: ios swift uitextview

我有一个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
    }

2 个答案:

答案 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
            }
        }
    }
}