如何在内部输入时调整UITextView的大小?

时间:2012-11-21 12:51:54

标签: iphone ios uitextview cgrect

我正在创建一个评论部分,就像Facebook在iOS应用程序中使用它的消息部分一样。我希望UITextView调整高度,以便我输入的文本适合它,而不是必须滚动才能看到溢出的文本。我有什么想法可以这样做吗?我调查过可能使用CGRect分配给文本视图的大小和高度,然后匹配内容大小:

CGRect textFrame = textView.frame;
textFrame.size.height = textView.contentSize.height;
textView.frame = textFrame;

我假设我需要某种功能来检测文本何时到达UITextView的边界然后调整视图的高度?有没有人在用同样的概念挣扎?

5 个答案:

答案 0 :(得分:22)

您可以在此委托方法中调整框架,不要忘记将textView的委托设置为self。

-(BOOL)textView:(UITextView *)_textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
      [self adjustFrames];  
      return YES;
}


-(void) adjustFrames
{
   CGRect textFrame = textView.frame;
   textFrame.size.height = textView.contentSize.height;
   textView.frame = textFrame;
}

此解决方案适用于iOS6,之前...适用于iOS7,请参阅此

StackOverflow Answer

答案 1 :(得分:6)

这是我的解决方案,使用自动布局textView.contentSize.height。在iOS8 Xcode6.3 beta4上测试。

最后有一个关于setContentOffset的问题。我把它放在线数改变时避免“错误的contentOffset”假象。它在最后一行下方添加了一个额外的不需要的空白区域,除非您在更改约束后立即将其设置回来,否则它看起来不太好。花了我几个小时来解决这个问题!

// set this up somewhere
let minTextViewHeight: CGFloat = 32
let maxTextViewHeight: CGFloat = 64

func textViewDidChange(textView: UITextView) {

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal

    if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height
        height = minTextViewHeight
    }
    if (height > maxTextViewHeight) { // max cap
        height = maxTextViewHeight
    }

    if height != textViewHeight.constant { // set when height changed
        textViewHeight.constant = height // change the value of NSLayoutConstraint
        textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
    }
}

答案 2 :(得分:4)

在包含UITextView的TableViewController上,更新放在单元格中的tableViewDataSource中的数据,然后简单地调用它:

tableView.beginUpdates()
tableView.endUpdates()

与tableView.reloadData()不同,这不会调用resignFirstResponder

答案 3 :(得分:2)

首先为TextView设置最小高度限制:

textView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor, multiplier: 0.20)

(确保你设置了greaterThanOrEqualTo Constraint,这样如果内部内容高度超过这个高度,则需要内在内容高度)

OR简单常量

textView.heightAnchor.constraint(greaterThanOrEqualToConstant: someConstant)

配置textView时,将isScrollEnabled设置为false

textView.isScrollEnabled = false

现在,当您在textView上键入内容时,其内在内容大小高度将会增加,并会自动将视图推送到其下方。

答案 4 :(得分:1)

contentsize无法在ios 7中使用。 试试这个:

CGFloat textViewContentHeight = textView.contentSize.height;

 textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9);