14

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

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

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

4

5 回答 5

23

您可以在此委托方法中调整框架,不要忘记将 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 答案

于 2012-11-21T13:00:48.007 回答
8

这是我的解决方案,使用自动布局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
    }
}
于 2015-04-06T09:26:34.600 回答
5

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

tableView.beginUpdates()
tableView.endUpdates()

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

于 2017-06-01T13:02:09.007 回答
5

首先为您的 TextView 设置最小高度约束:

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

(确保您设置了 greaterThanOrEqualTo 约束,以便如果内在内容高度大于此高度,则采用内在内容高度)

或简单常数

textView.heightAnchor.constraint(greaterThanOrEqualToConstant: someConstant)

配置 textView 时,将 isScrollEnabled 设置为 false

textView.isScrollEnabled = false

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

于 2017-09-13T07:39:28.607 回答
1

contentsize在 ios 7 中不起作用。试试这个:

CGFloat textViewContentHeight = textView.contentSize.height;

 textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9);
于 2014-01-27T07:55:37.237 回答